{"version":3,"file":"component---src-pages-projects-gymcoach-tsx-f8552c82fd17270f2232.js","mappings":"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","sources":["webpack://axon-division/./src/components/GatsbyImageAdaptor/GatsbyImageAdaptor.tsx","webpack://axon-division/./src/utils/css.utils.ts","webpack://axon-division/./src/components/ProjectPage/ProjectPage.tsx","webpack://axon-division/./src/content/projects/gymcoach.project.ts","webpack://axon-division/./src/components/SimpleEntryGallery/SimpleEntryGallery.tsx","webpack://axon-division/./src/components/ProjectURLButton/ProjectURLButton.tsx","webpack://axon-division/./src/pages/projects/gymcoach.tsx"],"sourcesContent":["import { GatsbyImage, GatsbyImageProps, getImage } from 'gatsby-plugin-image';\nimport React from 'react';\nimport { ImageWithMetaInfo } from '../../types/app.types';\nimport { ImageDataLike } from '../../types/gatsby.types';\n\ntype GatsbyImageAdaptorProps = {\n image: ImageWithMetaInfo | ImageDataLike,\n id?: string,\n title?: string,\n alt?: string,\n className?: string,\n objectFit?: GatsbyImageProps['objectFit'],\n objectPosition?: GatsbyImageProps['objectPosition'],\n backgroundColor?: string,\n}\n\n/**\n * A little adaptor component that automatically applies the getImage method for graphQL image query results.\n * It also accepts title/alt overrides.\n */\nconst GatsbyImageAdaptor: React.FC = props => {\n const image = props.image ? getImage(('image' in props.image || 'title' in props.image || 'alt' in props.image) ? props.image?.image : props.image) : null;\n return image ? : null;\n}\n\nexport default GatsbyImageAdaptor;","import { isBuildTime } from \"../env\";\nimport tick from \"./waiters.utils\";\n\nexport const getFontSize = (element?: HTMLElement, fallback: number = 16) => {\n if (isBuildTime) return fallback;\n return parseFloat(getComputedStyle(element ?? document.body).fontSize);\n}\n\nexport const disableSmoothScroll = () => {\n if (isBuildTime) return;\n document.documentElement.style.scrollBehavior = 'auto';\n return enableSmoothScroll;\n}\n\nexport const enableSmoothScroll = () => {\n if (isBuildTime) return;\n document.documentElement.style.scrollBehavior = 'smooth';\n}\n\nexport const disableSmoothScrollTemporarily = async () => {\n if (isBuildTime) return;\n document.documentElement.style.scrollBehavior = 'auto';\n await tick();\n document.documentElement.style.scrollBehavior = 'smooth';\n}","import { Observer } from 'mobx-react-lite';\nimport React, { ReactElement } from 'react';\nimport { useOnMount } from '../../hooks/lifecycle.hooks';\nimport { useAnimateTextEnterByLine } from '../../hooks/useAnimateTextEnterByLine.hook';\nimport { useObservableRef } from '../../hooks/useObservableRef.hook';\nimport { ProjectMetaInfoWithQueriedResources } from '../../types/app.types';\nimport { PageComponent } from '../../types/gatsby.types';\nimport joinClassName from '../../utils/className.utils';\nimport { disableSmoothScrollTemporarily } from '../../utils/css.utils';\nimport PageSection from '../PageSection/PageSection';\nimport PageTemplate from '../PageTemplate/PageTemplate';\nimport ProjectURLButton from '../ProjectURLButton/ProjectURLButton';\nimport StandardTextBlock from '../StandardTextBlock/StandardTextBlock';\nimport TricolorMorphDef from '../TricolorMorphDef/TricolorMorphDef';\nimport Widowless from '../Widowless/Widowless';\nimport './ProjectPage.scss';\n\ntype ProjectPageProps = {\n project: ProjectMetaInfoWithQueriedResources,\n sidebarExtraContent?: ReactElement,\n}\n\nconst ProjectPage: PageComponent = props => {\n const key = `ProjectPage--${props.project.name}`;\n useOnMount(disableSmoothScrollTemporarily);\n const pageHeadingGroupRef = useObservableRef();\n useAnimateTextEnterByLine(pageHeadingGroupRef, { \n animateTextEnter: { delay: 100 }\n });\n return (\n \n \n \n\n \n\n
\n {props.children}\n
\n\n \n \n )} />\n}\n\nexport default ProjectPage;","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { EntryMetaInfoWithQueriedResources, ImageWithMetaInfo, ProjectMetaInfo } from \"../../types/app.types\";\nimport { GymCoachImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoGymCoach: ProjectMetaInfo = {\n name: \"gymcoach\",\n displayName: \"GymCoach\",\n abbreviation: \"GymCoach\",\n subtitle: \"Health & Fitness App Design Concept\",\n // TODO\n description: `GymCoach is an internal app concept that is designed to be \"a personal trainer in your pocket\", with smart suggestions of gym plans and easy-to-use in-session tracker UIs, and carefully designed helpful analytics screens to visualise your progress.`,\n categories: [\n Category.apps,\n ],\n sectors: [\n Sector.healthAndFitness,\n ],\n hasPage: true,\n keywords: [\n 'app concept design',\n 'gym',\n 'fitness tracking app'\n ],\n}\nexport const useGymCoachInfo = () => {\n const GymCoachImages: GymCoachImagesQuery = useStaticQuery(graphql`\n query GymCoachImages {\n featuredImage: file(relativePath: {eq: \"images/gymcoach/gymcoach-project-background-two-persons-working-out-in-a-gym.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/gymcoach/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n mobileScreenshots: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/gymcoach/mobile-screenshots\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(\n width: 238\n )\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: 'GymCoach UI Designs',\n alt: 'GymCoach UI Designs',\n }\n ]\n const info: EntryMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoGymCoach,\n featuredImage: {\n image: GymCoachImages.featuredImage!.childImageSharp,\n title: 'GymCoach Featured Image',\n alt: 'GymCoach Project Image: Two persons working out in a gym'\n },\n gallery: GymCoachImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n })),\n // TODO: provide better title / alt values,\n mobileScreenshots: GymCoachImages.mobileScreenshots.edges.map((edge, i) => ({\n image: edge.node.childImageSharp,\n title: edge.node.name,\n alt: edge.node.name,\n }))\n }\n return info;\n}","import React, { ReactNode } from 'react';\nimport { EntryMetaInfoWithQueriedResources } from '../../types/app.types';\nimport joinClassName from '../../utils/className.utils';\nimport { isNumber } from '../../utils/typeChecks.utils';\nimport AppScreenshotSlider from '../AppScreenshotSlider/AppScreenshotSlider';\nimport GatsbyImageAdaptor from '../GatsbyImageAdaptor/GatsbyImageAdaptor';\nimport './SimpleEntryGallery.scss';\n\ntype SimpleEntryGalleryProps = {\n className?: string,\n entry: EntryMetaInfoWithQueriedResources,\n range?: [number, number],\n doNotRenderContainer?: boolean,\n autoAddMobileSlides?: boolean,\n mobileSlidesPosition?: number,\n}\n\nconst SimpleEntryGallery: React.FC = props => {\n const mobileScreenshots = props.entry.mobileScreenshots;\n const slides: ReactNode[] = (props.entry.gallery ?? []).slice(props.range?.[0] ?? 0, props.range?.[1] ?? (props.entry.gallery?.length ?? 0)).map((entry, i) => React.createElement(\n props.doNotRenderContainer ? 'div' : 'li',\n { \n key: i,\n className: \"SimpleEntryGalleryItem\",\n children: \n }\n ));\n if (mobileScreenshots && (props.autoAddMobileSlides || isNumber(props.mobileSlidesPosition))) slides.splice(props.mobileSlidesPosition ?? 1, 0, )\n if (props.doNotRenderContainer) return <>{slides}\n return
    \n { slides }\n
\n}\n\nexport default SimpleEntryGallery;","import React from 'react';\nimport { useAppContext } from '../../controllers/app.controller';\nimport { ProjectMetaInfo } from '../../types/app.types';\nimport joinClassName from '../../utils/className.utils';\nimport CTAButton, { CTAButtonProps } from '../CTAButton/CTAButton';\n// import './ProjectURLButton.scss';\n\ntype ProjectURLButtonProps = Omit & {\n project: ProjectMetaInfo,\n drawLine?: 'left' | 'right' | false,\n}\n\nconst ProjectURLButton: React.FC = props => {\n const { UI } = useAppContext();\n return 768 ? 'left' : 'right'))}\n >Visit Site\n}\n\nexport default ProjectURLButton;","import React from 'react';\nimport ProjectPage from '../../components/ProjectPage/ProjectPage';\nimport SimpleEntryGallery from '../../components/SimpleEntryGallery/SimpleEntryGallery';\nimport { useGymCoachInfo } from '../../content/projects/gymcoach.project';\nimport { PageComponent } from '../../types/gatsby.types';\nimport './ProjectPageGymCoach.scss';\n\ntype ProjectPageGymCoachProps = {}\n\nconst ProjectPageGymCoach: PageComponent = props => {\n const metaInfo = useGymCoachInfo();\n return \n \n \n}\n\nexport default ProjectPageGymCoach;"],"names":["props","_props$image","_props$title","_props$image2","_ref","_props$alt","_props$image3","image","getImage","_jsx","GatsbyImage","_objectSpread","id","title","alt","backgroundColor","disableSmoothScrollTemporarily","async","isBuildTime","document","documentElement","style","scrollBehavior","tick","key","project","name","useOnMount","pageHeadingGroupRef","useObservableRef","useAnimateTextEnterByLine","animateTextEnter","delay","Observer","children","_props$project$pageBa","_jsxs","PageTemplate","className","joinClassName","displayName","description","keywords","entryMeta","backgroundImage","pageBackgroundImage","featuredImage","TricolorMorphDef","PageSection","as","ref","Widowless","subtitle","StandardTextBlock","url","ProjectURLButton","ribbons","sidebarExtraContent","ProjectMetaInfoGymCoach","abbreviation","categories","Category","apps","sectors","Sector","healthAndFitness","hasPage","useGymCoachInfo","GymCoachImages","useStaticQuery","imageMetaData","childImageSharp","gallery","edges","map","edge","i","_edge$node$childImage","node","gatsbyImageData","mobileScreenshots","_props$entry$gallery","_props$range$","_props$range","_props$range$2","_props$range2","_props$entry$gallery$","_props$entry$gallery2","_props$mobileSlidesPo","entry","slides","slice","range","length","React","doNotRenderContainer","GatsbyImageAdaptor","autoAddMobileSlides","isNumber","mobileSlidesPosition","splice","AppScreenshotSlider","_Fragment","_props$drawLine","UI","useAppContext","CTAButton","to","rel","target","drawLine","undefined","viewport","width","metaInfo","ProjectPage","SimpleEntryGallery"],"sourceRoot":""}