refract-ui 0.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/RefractProvider-Bzz4G22S.cjs +25 -0
- package/dist/RefractProvider-Bzz4G22S.cjs.map +1 -0
- package/dist/RefractProvider-D__A8gQl.js +238 -0
- package/dist/RefractProvider-D__A8gQl.js.map +1 -0
- package/dist/assets/iphone-11.glb +0 -0
- package/dist/assets/macbook-pro.glb +0 -0
- package/dist/carousel.cjs +48 -1
- package/dist/carousel.cjs.map +1 -1
- package/dist/carousel.js +300 -0
- package/dist/carousel.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +10 -0
- package/dist/components/Breadcrumbs/index.d.ts +2 -0
- package/dist/components/Button/Button.d.ts +22 -0
- package/dist/components/Button/index.d.ts +2 -0
- package/dist/components/Carousel/Carousel.d.ts +21 -0
- package/dist/components/Carousel/index.d.ts +1 -0
- package/dist/components/Divider/Divider.d.ts +12 -0
- package/dist/components/Divider/index.d.ts +2 -0
- package/dist/components/Heading/Heading.d.ts +9 -0
- package/dist/components/Heading/index.d.ts +2 -0
- package/dist/components/Icon/Icon.d.ts +30 -0
- package/dist/components/Icon/index.d.ts +2 -0
- package/dist/components/Image/Image.d.ts +27 -0
- package/dist/components/Image/index.d.ts +1 -0
- package/dist/components/Input/Input.d.ts +21 -0
- package/dist/components/Input/TextArea.d.ts +11 -0
- package/dist/components/Input/index.d.ts +2 -0
- package/dist/components/Link/Link.d.ts +10 -0
- package/dist/components/Link/index.d.ts +1 -0
- package/dist/components/LinkProvider/LinkProvider.d.ts +11 -0
- package/dist/components/LinkProvider/index.d.ts +1 -0
- package/dist/components/List/List.d.ts +11 -0
- package/dist/components/List/index.d.ts +1 -0
- package/dist/components/Loader/Loader.d.ts +6 -0
- package/dist/components/Loader/index.d.ts +2 -0
- package/dist/components/Model/Model.d.ts +40 -0
- package/dist/components/Model/deviceModels.d.ts +29 -0
- package/dist/components/Model/index.d.ts +2 -0
- package/dist/components/RefractProvider/RefractProvider.d.ts +20 -0
- package/dist/components/RefractProvider/index.d.ts +1 -0
- package/dist/components/ScrambleReveal/ScrambleReveal.d.ts +9 -0
- package/dist/components/ScrambleReveal/index.d.ts +1 -0
- package/dist/components/Section/Section.d.ts +8 -0
- package/dist/components/Section/index.d.ts +1 -0
- package/dist/components/SegmentedControl/SegmentedControl.d.ts +15 -0
- package/dist/components/SegmentedControl/index.d.ts +1 -0
- package/dist/components/Table/Table.d.ts +11 -0
- package/dist/components/Table/index.d.ts +1 -0
- package/dist/components/ThemeProvider/ThemeProvider.d.ts +21 -0
- package/dist/components/ThemeProvider/index.d.ts +5 -0
- package/dist/components/ThemeProvider/theme.d.ts +138 -0
- package/dist/components/ThemeProvider/useTheme.d.ts +2 -0
- package/dist/components/Transition/Transition.d.ts +19 -0
- package/dist/components/Transition/index.d.ts +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +10 -0
- package/dist/components/VisuallyHidden/index.d.ts +2 -0
- package/dist/components/Wordmark/Wordmark.d.ts +5 -0
- package/dist/components/Wordmark/index.d.ts +2 -0
- package/dist/entries/carousel.d.ts +1 -1
- package/dist/entries/model.d.ts +1 -1
- package/dist/hooks/useFormInput.d.ts +11 -0
- package/dist/hooks/useFps.d.ts +8 -0
- package/dist/hooks/useHasMounted.d.ts +1 -0
- package/dist/hooks/useInViewport.d.ts +2 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +20 -0
- package/dist/index.js +914 -45
- package/dist/index.js.map +1 -1
- package/dist/model.cjs +4 -1
- package/dist/model.cjs.map +1 -1
- package/dist/model.js +267 -0
- package/dist/model.js.map +1 -1
- package/dist/style-CWBkJEps.cjs +2 -0
- package/dist/style-CWBkJEps.cjs.map +1 -0
- package/dist/style-uMN7vipQ.js +96 -0
- package/dist/style-uMN7vipQ.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/three-CWsiEOQZ.js +48 -0
- package/dist/three-CWsiEOQZ.js.map +1 -0
- package/dist/three-aeLbW1yA.cjs +2 -0
- package/dist/three-aeLbW1yA.cjs.map +1 -0
- package/dist/tokens.css +1 -0
- package/dist/utils/delay.d.ts +1 -0
- package/dist/utils/image.d.ts +31 -0
- package/dist/utils/three.d.ts +29 -0
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/style.ts","../src/components/Text/Text.tsx"],"sourcesContent":["import { CSSProperties } from 'react';\n\n/**\n * Media query breakpoints\n */\nexport const media = {\n desktop: 2080,\n laptop: 1680,\n tablet: 1040,\n mobile: 696,\n mobileS: 400,\n} as const;\n\n/**\n * Convert a px string to a number\n */\nexport const pxToNum = (px: string): number => Number(px.replace('px', ''));\n\n/**\n * Convert a number to a px string\n */\nexport const numToPx = (num: number): string => `${num}px`;\n\n/**\n * Convert pixel values to rem for a11y\n */\nexport const pxToRem = (px: number): string => `${px / 16}rem`;\n\n/**\n * Convert ms token values to a raw numbers for ReactTransitionGroup\n * Transition delay props\n */\nexport const msToNum = (msString: string): number => Number(msString.replace('ms', ''));\n\n/**\n * Convert a number to an ms string\n */\nexport const numToMs = (num: number): string => `${num}ms`;\n\n/**\n * Convert an rgb theme property (e.g. rgbBlack: '0 0 0')\n * to values that can be spread into a ThreeJS Color class\n */\nexport const rgbToThreeColor = (rgb: string | undefined): number[] =>\n rgb?.split(' ').map(value => Number(value) / 255) || [];\n\n/**\n * Convert a JS object into `--` prefixed css custom properties.\n * Optionally pass a second param for normal styles\n */\nexport function cssProps(\n props: Record<string, string | number>,\n style: CSSProperties = {}\n): Record<string, string | number> & CSSProperties {\n const result: Record<string, string | number> = {};\n\n const keys = Object.keys(props);\n\n for (const key of keys) {\n let value: string | number = props[key];\n\n if (typeof value === 'number' && key === 'delay') {\n value = numToMs(value);\n }\n\n if (typeof value === 'number' && key !== 'opacity') {\n value = numToPx(value);\n }\n\n result[`--${key}`] = value;\n }\n\n return { ...result, ...style };\n}\n\n/**\n * Concatenate classNames together\n */\nexport function classes(...args: (string | false | undefined | null)[]): string {\n return args.filter(Boolean).join(' ');\n}\n","import { type ComponentPropsWithoutRef, type ElementType, type ReactNode } from 'react';\nimport { classes } from '../../utils/style';\nimport styles from './Text.module.css';\n\nexport interface TextProps extends ComponentPropsWithoutRef<'span'> {\n children?: ReactNode;\n size?: 's' | 'm' | 'l' | 'xl';\n as?: ElementType;\n align?: string;\n weight?: string;\n secondary?: boolean;\n}\n\nexport const Text = ({\n children,\n size = 'm',\n as: Component = 'span',\n align = 'auto',\n weight = 'auto',\n secondary,\n className,\n ...rest\n}: TextProps) => {\n return (\n <Component\n className={classes(styles.text, className)}\n data-align={align}\n data-size={size}\n data-weight={weight}\n data-secondary={secondary}\n {...rest}\n >\n {children}\n </Component>\n );\n};\n"],"names":["media","pxToNum","px","numToPx","num","pxToRem","msToNum","msString","numToMs","rgbToThreeColor","rgb","value","cssProps","props","style","result","keys","key","classes","args","Text","children","size","Component","align","weight","secondary","className","rest","jsx","styles"],"mappings":";;AAKO,MAAMA,IAAQ;AAAA,EACnB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX,GAKaC,IAAU,CAACC,MAAuB,OAAOA,EAAG,QAAQ,MAAM,EAAE,CAAC,GAK7DC,IAAU,CAACC,MAAwB,GAAGA,CAAG,MAKzCC,IAAU,CAACH,MAAuB,GAAGA,IAAK,EAAE,OAM5CI,IAAU,CAACC,MAA6B,OAAOA,EAAS,QAAQ,MAAM,EAAE,CAAC,GAKzEC,IAAU,CAACJ,MAAwB,GAAGA,CAAG,MAMzCK,IAAkB,CAACC,OAC9BA,KAAA,gBAAAA,EAAK,MAAM,KAAK,IAAI,CAAAC,MAAS,OAAOA,CAAK,IAAI,SAAQ,CAAA;AAMhD,SAASC,EACdC,GACAC,IAAuB,IAC0B;AACjD,QAAMC,IAA0C,CAAA,GAE1CC,IAAO,OAAO,KAAKH,CAAK;AAE9B,aAAWI,KAAOD,GAAM;AACtB,QAAIL,IAAyBE,EAAMI,CAAG;AAEtC,IAAI,OAAON,KAAU,YAAYM,MAAQ,YACvCN,IAAQH,EAAQG,CAAK,IAGnB,OAAOA,KAAU,YAAYM,MAAQ,cACvCN,IAAQR,EAAQQ,CAAK,IAGvBI,EAAO,KAAKE,CAAG,EAAE,IAAIN;AAAA,EACvB;AAEA,SAAO,EAAE,GAAGI,GAAQ,GAAGD,EAAA;AACzB;AAKO,SAASI,KAAWC,GAAqD;AAC9E,SAAOA,EAAK,OAAO,OAAO,EAAE,KAAK,GAAG;AACtC;;;GCnEaC,IAAO,CAAC;AAAA,EACnB,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,IAAIC,IAAY;AAAA,EAChB,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAEI,gBAAAC;AAAA,EAACN;AAAA,EAAA;AAAA,IACC,WAAWL,EAAQY,EAAO,MAAMH,CAAS;AAAA,IACzC,cAAYH;AAAA,IACZ,aAAWF;AAAA,IACX,eAAaG;AAAA,IACb,kBAAgBC;AAAA,IACf,GAAGE;AAAA,IAEH,UAAAP;AAAA,EAAA;AAAA;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/Text/Text.tsx","../src/components/Heading/Heading.tsx","../src/components/Section/Section.tsx","../src/components/List/List.tsx","../src/components/Divider/Divider.tsx","../src/components/Table/Table.tsx","../src/components/VisuallyHidden/VisuallyHidden.tsx","../src/components/Transition/Transition.tsx","../src/components/Loader/Loader.tsx","../src/components/Icon/svg/arrow-left.svg","../src/components/Icon/svg/arrow-right.svg","../src/components/Icon/svg/articles.svg","../src/components/Icon/svg/check.svg","../src/components/Icon/svg/chevron-right.svg","../src/components/Icon/svg/close.svg","../src/components/Icon/svg/company.svg","../src/components/Icon/svg/copy.svg","../src/components/Icon/svg/download.svg","../src/components/Icon/svg/error.svg","../src/components/Icon/svg/figma.svg","../src/components/Icon/svg/github.svg","../src/components/Icon/svg/link.svg","../src/components/Icon/svg/linkedin.svg","../src/components/Icon/svg/menu.svg","../src/components/Icon/svg/pause.svg","../src/components/Icon/svg/play.svg","../src/components/Icon/svg/send.svg","../src/components/Icon/svg/skills.svg","../src/components/Icon/svg/storybook.svg","../src/components/Icon/svg/twitter.svg","../src/components/Icon/Icon.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Input/TextArea.tsx","../src/components/Input/Input.tsx","../src/components/Link/Link.tsx","../src/components/Button/Button.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/utils/delay.ts","../src/components/ScrambleReveal/ScrambleReveal.tsx","../src/components/Image/Image.tsx","../src/components/Wordmark/Wordmark.tsx"],"sourcesContent":["import { type ComponentPropsWithoutRef, type ElementType, type ReactNode } from 'react';\nimport { classes } from '../../utils/style';\nimport styles from './Text.module.css';\n\nexport interface TextProps extends ComponentPropsWithoutRef<'span'> {\n children?: ReactNode;\n size?: 's' | 'm' | 'l' | 'xl';\n as?: ElementType;\n align?: string;\n weight?: string;\n secondary?: boolean;\n}\n\nexport const Text = ({\n children,\n size = 'm',\n as: Component = 'span',\n align = 'auto',\n weight = 'auto',\n secondary,\n className,\n ...rest\n}: TextProps) => {\n return (\n <Component\n className={classes(styles.text, className)}\n data-align={align}\n data-size={size}\n data-weight={weight}\n data-secondary={secondary}\n {...rest}\n >\n {children}\n </Component>\n );\n};\n","import { Fragment, type ComponentPropsWithoutRef, type ElementType, type ReactNode } from 'react';\nimport { classes } from '../../utils/style';\nimport styles from './Heading.module.css';\n\nexport interface HeadingProps extends ComponentPropsWithoutRef<'h1'> {\n children?: ReactNode;\n level?: number;\n as?: ElementType;\n align?: string;\n weight?: string;\n}\n\nexport const Heading = ({\n children,\n level = 1,\n as,\n align = 'auto',\n weight = 'medium',\n className,\n ...rest\n}: HeadingProps) => {\n const clampedLevel = Math.min(Math.max(level, 0), 5);\n const Component = as || (`h${Math.max(clampedLevel, 1)}` as ElementType);\n\n return (\n <Fragment>\n <Component\n className={classes(styles.heading, className)}\n data-align={align}\n data-weight={weight}\n data-level={clampedLevel}\n {...rest}\n >\n {children}\n </Component>\n </Fragment>\n );\n};\n","import { forwardRef, type ElementType, type ReactNode, type Ref } from 'react';\nimport { classes } from '../../utils/style';\nimport styles from './Section.module.css';\n\ntype SectionProps = {\n as?: ElementType;\n children?: ReactNode;\n className?: string;\n} & Record<string, unknown>;\n\nexport const Section = forwardRef<HTMLElement | null, SectionProps>(\n ({ as: Component = 'div', children, className, ...rest }, ref) => {\n const Element = Component as ElementType;\n return (\n <Element\n className={classes(styles.section, className as string)}\n ref={ref as Ref<HTMLElement>}\n {...rest}\n >\n {children}\n </Element>\n );\n }\n);\n","import { type ReactNode, type ComponentPropsWithoutRef } from 'react';\nimport { classes } from '../../utils/style';\nimport styles from './List.module.css';\n\ninterface ListProps extends ComponentPropsWithoutRef<'ul'> {\n ordered?: boolean;\n children?: ReactNode;\n}\n\nexport const List = ({ ordered, children, className, ...rest }: ListProps) => {\n const Element = ordered ? 'ol' : 'ul';\n\n return (\n <Element className={classes(styles.list, className)} {...rest}>\n {children}\n </Element>\n );\n};\n\ninterface ListItemProps extends ComponentPropsWithoutRef<'li'> {\n children?: ReactNode;\n}\n\nexport const ListItem = ({ children, ...rest }: ListItemProps) => {\n return (\n <li className={styles.item} {...rest}>\n {children}\n </li>\n );\n};\n","import { type ComponentPropsWithoutRef } from 'react';\nimport { classes, cssProps, numToMs } from '../../utils/style';\nimport styles from './Divider.module.css';\n\nexport interface DividerProps extends ComponentPropsWithoutRef<'div'> {\n lineWidth?: string;\n lineHeight?: string;\n notchWidth?: string;\n notchHeight?: string;\n collapseDelay?: number;\n collapsed?: boolean;\n notch?: boolean;\n light?: boolean;\n}\n\nexport const Divider = ({\n lineWidth = '100%',\n lineHeight = '2px',\n notchWidth = '90px',\n notchHeight = '10px',\n collapseDelay = 0,\n collapsed = false,\n notch = true,\n light = false,\n className,\n style,\n ...rest\n}: DividerProps) => (\n <div\n className={classes(styles.divider, className)}\n data-light={light}\n style={cssProps(\n {\n lineWidth: lineWidth,\n lineHeight: lineHeight,\n notchWidth: notchWidth,\n notchHeight: notchHeight,\n collapseDelay: numToMs(collapseDelay),\n },\n style\n )}\n {...rest}\n >\n <div className={styles.line} data-collapsed={collapsed} />\n {notch && (\n <div\n className={styles.notch}\n data-collapsed={collapsed}\n style={cssProps({ collapseDelay: numToMs(collapseDelay + 160) })}\n />\n )}\n </div>\n);\n","import { type ReactNode } from 'react';\nimport styles from './Table.module.css';\n\ninterface TableChildProps {\n children?: ReactNode;\n}\n\nexport const Table = ({ children }: TableChildProps) => <table className={styles.table}>{children}</table>;\nexport const TableRow = ({ children }: TableChildProps) => <tr className={styles.row}>{children}</tr>;\nexport const TableHead = ({ children }: TableChildProps) => <thead className={styles.head}>{children}</thead>;\nexport const TableBody = ({ children }: TableChildProps) => <tbody className={styles.body}>{children}</tbody>;\nexport const TableHeadCell = ({ children }: TableChildProps) => <th className={styles.headCell}>{children}</th>;\nexport const TableCell = ({ children }: TableChildProps) => <td className={styles.cell}>{children}</td>;\n","import { forwardRef, type ComponentPropsWithoutRef, type ElementType, type ReactNode } from 'react';\nimport { classes } from '../../utils/style';\nimport styles from './VisuallyHidden.module.css';\n\nexport interface VisuallyHiddenProps extends ComponentPropsWithoutRef<'span'> {\n showOnFocus?: boolean;\n as?: ElementType;\n children?: ReactNode;\n visible?: boolean;\n href?: string;\n [key: string]: unknown;\n}\n\nexport const VisuallyHidden = forwardRef<HTMLElement, VisuallyHiddenProps>(\n ({ className, showOnFocus, as: Component = 'span', children, visible, ...rest }, ref) => {\n const Element = Component as ElementType;\n return (\n <Element\n className={classes(styles.hidden, className as string)}\n data-hidden={!visible && !showOnFocus}\n data-show-on-focus={showOnFocus}\n ref={ref}\n {...rest}\n >\n {children}\n </Element>\n );\n }\n);\n","import { AnimatePresence, usePresence } from 'framer-motion';\nimport { type MutableRefObject, type ReactNode, useEffect, useRef, useState } from 'react';\n\ntype TransitionTimeout = number | { enter: number; exit: number };\ntype TransitionStatus = 'entering' | 'entered' | 'exiting' | 'exited';\ntype TransitionRenderFn = (visible: boolean, status: TransitionStatus) => ReactNode;\n\ninterface TransitionProps {\n children: TransitionRenderFn;\n timeout?: TransitionTimeout;\n onEnter?: () => void;\n onEntered?: () => void;\n onExit?: () => void;\n onExited?: () => void;\n in?: boolean;\n unmount?: boolean;\n}\n\ninterface TransitionContentProps {\n children: TransitionRenderFn;\n timeout: TransitionTimeout;\n enterTimeout: MutableRefObject<ReturnType<typeof setTimeout> | undefined>;\n exitTimeout: MutableRefObject<ReturnType<typeof setTimeout> | undefined>;\n onEnter?: () => void;\n onEntered?: () => void;\n onExit?: () => void;\n onExited?: () => void;\n show?: boolean;\n}\n\nexport const Transition = ({\n children,\n timeout = 0,\n onEnter,\n onEntered,\n onExit,\n onExited,\n in: show,\n unmount,\n}: TransitionProps) => {\n const enterTimeout = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const exitTimeout = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n useEffect(() => {\n if (show) {\n clearTimeout(enterTimeout.current);\n } else {\n clearTimeout(exitTimeout.current);\n }\n }, [show]);\n\n return (\n <AnimatePresence>\n {(show || !unmount) && (\n <TransitionContent\n timeout={timeout}\n enterTimeout={enterTimeout}\n exitTimeout={exitTimeout}\n onEnter={onEnter}\n onEntered={onEntered}\n onExit={onExit}\n onExited={onExited}\n show={show}\n >\n {children}\n </TransitionContent>\n )}\n </AnimatePresence>\n );\n};\n\nconst TransitionContent = ({\n children,\n timeout,\n enterTimeout,\n exitTimeout,\n onEnter,\n onEntered,\n onExit,\n onExited,\n show,\n}: TransitionContentProps) => {\n const [status, setStatus] = useState<TransitionStatus>('exited');\n const [isPresent, safeToRemove] = usePresence();\n const [hasEntered, setHasEntered] = useState(false);\n const splitTimeout = typeof timeout === 'object';\n\n useEffect(() => {\n if (hasEntered || !show) return;\n\n const actualTimeout = splitTimeout ? timeout.enter : timeout;\n\n clearTimeout(enterTimeout.current);\n clearTimeout(exitTimeout.current);\n\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setHasEntered(true);\n setStatus('entering');\n onEnter?.();\n\n // eslint-disable-next-line react-hooks/immutability\n enterTimeout.current = setTimeout(() => {\n setStatus('entered');\n onEntered?.();\n }, actualTimeout);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onEnter, onEntered, timeout, status, show]);\n\n useEffect(() => {\n if (isPresent && show) return;\n\n const actualTimeout = splitTimeout ? timeout.exit : timeout;\n\n clearTimeout(enterTimeout.current);\n clearTimeout(exitTimeout.current);\n\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setStatus('exiting');\n onExit?.();\n\n // eslint-disable-next-line react-hooks/immutability\n exitTimeout.current = setTimeout(() => {\n setStatus('exited');\n safeToRemove?.();\n onExited?.();\n }, actualTimeout);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isPresent, onExit, safeToRemove, timeout, onExited, show]);\n\n return children(hasEntered && show ? isPresent : false, status);\n};\n","import { Text } from '../Text';\nimport { useRefractConfig } from '../RefractProvider';\nimport { VisuallyHidden } from '../VisuallyHidden';\nimport { useReducedMotion } from 'framer-motion';\nimport { useHasMounted } from '../../hooks/useHasMounted';\nimport { type ComponentPropsWithoutRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { classes, cssProps } from '../../utils/style';\nimport styles from './Loader.module.css';\n\nexport interface LoaderProps extends ComponentPropsWithoutRef<'div'> {\n size?: number;\n text?: string;\n}\n\nexport const Loader = ({\n className,\n style,\n size = 32,\n text = 'Loading...',\n ...rest\n}: LoaderProps) => {\n const reduceMotion = useReducedMotion();\n const hasMounted = useHasMounted();\n const { portalContainer } = useRefractConfig();\n\n const renderScreenReaderTextPortal = () => {\n if (!hasMounted) return null;\n\n const container = portalContainer();\n if (!container) return null;\n\n return createPortal(\n <VisuallyHidden className=\"loader-announcement\" aria-live=\"assertive\">\n {text}\n </VisuallyHidden>,\n container\n );\n };\n\n if (reduceMotion) {\n return (\n <Text className={classes(styles.text, className)} weight=\"medium\" {...rest}>\n {text}\n {renderScreenReaderTextPortal()}\n </Text>\n );\n }\n\n const gapSize = Math.round((size / 3) * 0.2);\n const spanSize = Math.round(size / 3 - gapSize * 2 - 1);\n\n return (\n <div\n className={classes(styles.loader, className)}\n style={cssProps({ size, spanSize, gapSize }, style)}\n {...rest}\n >\n <div className={styles.content}>\n <div className={styles.span} />\n <div className={styles.span} />\n <div className={styles.span} />\n </div>\n {renderScreenReaderTextPortal()}\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgArrowLeft = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m9.793 19.207-6.5-6.5L2.586 12l.707-.707 6.5-6.5 1.414 1.414L6.414 11H21v2H6.414l4.793 4.793-1.414 1.414Z\" }));\nexport default SvgArrowLeft;\n","import * as React from \"react\";\nconst SvgArrowRight = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M14.207 4.793l6.5 6.5.707.707-.707.707-6.5 6.5-1.414-1.414L17.586 13H3v-2h14.586l-4.793-4.793 1.414-1.414z\" }));\nexport default SvgArrowRight;\n","import * as React from \"react\";\nconst SvgArticles = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 128 128\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M35.34,16.5h72.75v30.73l-72.75,0V16.5L35.34,16.5z M23.42,91.7c-0.67,2.24-1.63,4.05-2.8,5.46l88.47,0l0.04,0 c3.19-0.18,5.57-1.03,7.16-2.54c1.56-1.48,2.43-3.69,2.62-6.62V3.97H24.36v80.06C24.36,87.43,24.4,88.42,23.42,91.7L23.42,91.7 L23.42,91.7z M13.15,101.13c-0.45,0.03-0.91,0.03-1.36,0.01c-1.82-0.11-3.61-0.67-5.23-1.62c-3.55-2.09-6.29-6.09-6.54-11.32 C0.01,88.12,0,88.03,0,87.95v-70.4c0-1.1,0.89-1.98,1.98-1.98l18.41,0V1.98c0-1.1,0.89-1.98,1.98-1.98l98.52,0 c1.1,0,1.98,0.89,1.98,1.98v86.07c0,0.11-0.01,0.21-0.02,0.31c-0.27,3.9-1.55,6.95-3.84,9.13c-2.28,2.17-5.5,3.38-9.67,3.62 c-0.08,0.01-0.17,0.02-0.26,0.02L13.15,101.13L13.15,101.13L13.15,101.13z M12.05,97.19c0.1-0.02,0.21-0.03,0.32-0.03h0.72 c0.79-0.08,1.56-0.3,2.28-0.68c4.41-2.31,5.02-7.95,5.02-12.42V19.53H3.97v68.41c0,0.02,0,0.05,0,0.07 c0.19,3.76,2.12,6.62,4.61,8.09c1.08,0.64,2.26,1.01,3.43,1.08L12.05,97.19L12.05,97.19L12.05,97.19z M40.87,24.15h3.9l5.07,8.52 v-8.52h3.94v15.42l-3.94,0l-5.04-8.47v8.47h-3.92V24.15L40.87,24.15z M57.21,24.15h11.17v3.3l-6.98,0v2.46l6.47,0v3.14H61.4v3.04 h7.19v3.49H57.21V24.15L57.21,24.15L57.21,24.15z M70.12,24.15h3.96l1.42,8.61l2.09-8.61h3.93l2.1,8.62l1.43-8.62H89l-2.98,15.42 l-4.09,0l-2.37-9.71l-2.36,9.71h-4.09L70.12,24.15L70.12,24.15L70.12,24.15z M90.31,34.48l3.96-0.28c0.08,0.73,0.26,1.29,0.52,1.67 c0.43,0.62,1.04,0.93,1.84,0.93c0.59,0,1.05-0.16,1.37-0.48c0.32-0.32,0.48-0.69,0.48-1.11c0-0.4-0.15-0.76-0.46-1.07 c-0.3-0.32-1.02-0.61-2.13-0.89c-1.83-0.47-3.13-1.09-3.91-1.87c-0.79-0.78-1.18-1.77-1.18-2.97c0-0.79,0.2-1.54,0.6-2.24 c0.4-0.71,1.01-1.26,1.81-1.66c0.81-0.4,1.92-0.6,3.32-0.6c1.73,0,3.04,0.37,3.95,1.1c0.91,0.73,1.44,1.9,1.62,3.5l-3.92,0.27 c-0.1-0.7-0.32-1.21-0.66-1.53c-0.34-0.32-0.8-0.48-1.39-0.48c-0.48,0-0.85,0.12-1.1,0.35c-0.25,0.23-0.37,0.52-0.37,0.86 c0,0.24,0.1,0.46,0.3,0.66c0.19,0.2,0.66,0.39,1.39,0.57c1.82,0.45,3.13,0.9,3.91,1.36c0.79,0.46,1.36,1.03,1.72,1.71 c0.36,0.68,0.54,1.44,0.54,2.28c0,0.99-0.24,1.9-0.72,2.74c-0.48,0.83-1.15,1.47-2.01,1.9c-0.86,0.43-1.94,0.65-3.25,0.65 c-2.3,0-3.89-0.51-4.77-1.52C90.93,37.31,90.43,36.03,90.31,34.48L90.31,34.48L90.31,34.48z M35.8,60.85 c-1.1,0-1.98-0.89-1.98-1.98s0.89-1.98,1.98-1.98h30.25c1.09,0,1.98,0.89,1.98,1.98s-0.89,1.98-1.98,1.98H35.8L35.8,60.85z M74.73,60.85c-1.1,0-1.99-0.89-1.99-1.99c0-1.1,0.89-1.99,1.99-1.99h32.63c1.1,0,1.99,0.89,1.99,1.99c0,1.1-0.89,1.99-1.99,1.99 H74.73L74.73,60.85z M74.73,72.36c-1.1,0-1.99-0.89-1.99-1.99s0.89-1.99,1.99-1.99h32.63c1.1,0,1.99,0.89,1.99,1.99 c0,1.1-0.89,1.99-1.99,1.99H74.73L74.73,72.36z M74.73,83.87c-1.1,0-1.99-0.89-1.99-1.99s0.89-1.99,1.99-1.99l32.63,0 c1.1,0,1.99,0.89,1.99,1.99c0,1.1-0.89,1.99-1.99,1.99L74.73,83.87L74.73,83.87z M35.8,83.87c-1.1,0-1.98-0.89-1.98-1.98 s0.89-1.98,1.98-1.98l30.25,0c1.09,0,1.98,0.89,1.98,1.98s-0.89,1.98-1.98,1.98L35.8,83.87L35.8,83.87z M36.76,72.36 c-1.1,0-1.98-0.89-1.98-1.98s0.89-1.98,1.98-1.98h30.25c1.1,0,1.98,0.89,1.98,1.98s-0.89,1.98-1.98,1.98H36.76L36.76,72.36z\" }));\nexport default SvgArticles;\n","import * as React from \"react\";\nconst SvgCheck = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m20.207 7.207-10 10-.707.707-.707-.707-5-5 1.414-1.414L9.5 15.086l9.293-9.293 1.414 1.414Z\" }));\nexport default SvgCheck;\n","import * as React from \"react\";\nconst SvgChevronRight = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M13.586 12L7.793 6.207l1.414-1.414 6.5 6.5.707.707-.707.707-6.5 6.5-1.414-1.414L13.586 12z\" }));\nexport default SvgChevronRight;\n","import * as React from \"react\";\nconst SvgClose = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" }));\nexport default SvgClose;\n","import * as React from \"react\";\nconst SvgCompany = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M14.763.075A.5.5 0 0 1 15 .5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5V14h-1v1.5a.5.5 0 0 1-.5.5h-9a.5.5 0 0 1-.5-.5V10a.5.5 0 0 1 .342-.474L6 7.64V4.5a.5.5 0 0 1 .276-.447l8-4a.5.5 0 0 1 .487.022zM6 8.694 1 10.36V15h5V8.694zM7 15h2v-1.5a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 .5.5V15h2V1.309l-7 3.5V15z\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M2 11h1v1H2v-1zm2 0h1v1H4v-1zm-2 2h1v1H2v-1zm2 0h1v1H4v-1zm4-4h1v1H8V9zm2 0h1v1h-1V9zm-2 2h1v1H8v-1zm2 0h1v1h-1v-1zm2-2h1v1h-1V9zm0 2h1v1h-1v-1zM8 7h1v1H8V7zm2 0h1v1h-1V7zm2 0h1v1h-1V7zM8 5h1v1H8V5zm2 0h1v1h-1V5zm2 0h1v1h-1V5zm0-2h1v1h-1V3z\" }));\nexport default SvgCompany;\n","import * as React from \"react\";\nconst SvgCopy = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M3 1H2v16h4v-2H4V3h10v2h2V1H3Zm5 6h14v12.414l-.293.293-3 3-.293.293H8V7Zm2 14h7.586L20 18.586V9H10v12Z\" }));\nexport default SvgCopy;\n","import * as React from \"react\";\nconst SvgDownload = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\" }));\nexport default SvgDownload;\n","import * as React from \"react\";\nconst SvgError = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M12 5.068 19.697 19H4.302L12 5.068Zm-.876-2.552-9.392 17L2.607 21h18.785l.875-1.484-9.392-17h-1.75ZM11 14v-4h2v4h-2Zm0 3v-2h2v2h-2Z\" }));\nexport default SvgError;\n","import * as React from \"react\";\nconst SvgFigma = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", d: \"M15 10a2 2 0 100 4 2 2 0 000-4zm-2 5.464A4 4 0 0017.646 9 4 4 0 0015 2H9a4 4 0 00-2.646 7 4.01 4.01 0 00-.818 1 4 4 0 00.818 5 3.977 3.977 0 00-.818 1A4 4 0 1013 18v-2.536zM11 16H9a2 2 0 102 2v-2zM9 8h2V4H9a2 2 0 100 4zm0 2a2 2 0 100 4h2v-4H9zm4-2V4h2a2 2 0 010 4h-2z\" }));\nexport default SvgFigma;\n","import * as React from \"react\";\nconst SvgGithub = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33.85 0 1.71.11 2.5.33 1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0012 2z\" }));\nexport default SvgGithub;\n","import * as React from \"react\";\nconst SvgLink = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M9 4 8 5v2h2V6h10v7H10v-2H8v3l1 1h12l1-1V5l-1-1H9Zm2 4H3L2 9v9l1 1h12l1-1v-2h-2v1H4v-7h10v2h2V9l-1-1h-4Z\" }));\nexport default SvgLink;\n","import * as React from \"react\";\nconst SvgLinkedin = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z\" }));\nexport default SvgLinkedin;\n","import * as React from \"react\";\nconst SvgMenu = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M22 6H2V4h20v2zM2 13h16v-2H2v2zm0 7h20v-2H2v2z\" }));\nexport default SvgMenu;\n","import * as React from \"react\";\nconst SvgPause = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" }));\nexport default SvgPause;\n","import * as React from \"react\";\nconst SvgPlay = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M8 5v14l11-7z\" }));\nexport default SvgPlay;\n","import * as React from \"react\";\nconst SvgSend = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M2.01 21L23 12 2.01 3 2 10l15 2-15 2 .01 7z\" }));\nexport default SvgSend;\n","import * as React from \"react\";\nconst SvgSkills = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 128 128\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M19,70.15c-4.75,1-9.66,1.1-14.42-3.79C1.4,63.1-.19,58.23,0,53.13c12.17,14.15,27-3.34,9-12.43,8.69-4.12,16.89-.25,21.24,7.76,2.06,3.78,3.29,5.76,4.86,7.11a8.58,8.58,0,0,0,.9.69A8.1,8.1,0,0,1,39.8,51.8,7.14,7.14,0,0,1,43.05,51c3.18,0,7.14,1.9,7.81,5.14h0a1.61,1.61,0,0,1,.44-.06h2.31a1.5,1.5,0,0,1,.37,0,5.6,5.6,0,0,1,5,4.59,1.65,1.65,0,0,1,.71-.16H62a1.5,1.5,0,0,1,.37,0c3.31.51,4.65,2.55,5.12,5.12l.26,0h2.31a1.5,1.5,0,0,1,.37,0c3.8.59,5.29,3.08,5.87,6.08,7-1.07,14.57-5.27,22,2.33a17.78,17.78,0,0,1,4.57,13.23c-12.17-14.15-27,3.34-9,12.43-7.47,3.54-14.59,1.17-19.2-4.66a30.06,30.06,0,0,1-2.34,4.92c-.38.62-.77,1.26-1.27,2.14a.16.16,0,0,0,0,.07,19.77,19.77,0,0,1-1.3,2h1.6a2.51,2.51,0,0,1,2.5,2.5v13.61a2.51,2.51,0,0,1-2.5,2.5H35.13a2.51,2.51,0,0,1-2.5-2.5V106.77a2.51,2.51,0,0,1,2.5-2.5H36a18,18,0,0,1-.9-3.79L22.64,80.07,22.58,80a22.48,22.48,0,0,1-2.5-4.24,12.37,12.37,0,0,1-1.08-4,10.22,10.22,0,0,1,0-1.57Zm92-33.29a2,2,0,0,0-.37-.74,1.51,1.51,0,0,0-.57-.46,1.61,1.61,0,0,0-.7-.22,2.62,2.62,0,0,0-.76.09l-.06,0-7.36,2.24a3,3,0,0,1-3.63-1.55c-.38-.64-.75-1.27-1.2-2s-1-1.38-1.39-2S94,31,93.4,30.38s-1-1.14-1.69-1.83A3.09,3.09,0,0,1,91.22,25l3.91-7.35a1.63,1.63,0,0,0,.13-1.46,2.07,2.07,0,0,0-.31-.65,1.82,1.82,0,0,0-.61-.49l-9.26-4.93a2.81,2.81,0,0,0-.68-.26,2.72,2.72,0,0,0-.82.11,1.31,1.31,0,0,0-.61.33,1.82,1.82,0,0,0-.49.61l-3.6,6.75a3.13,3.13,0,0,1-3.69,1.52c-.82-.21-1.59-.41-2.27-.55s-1.54-.28-2.36-.39a23.32,23.32,0,0,0-2.4-.19c-.84-.06-1.62,0-2.37-.06a3,3,0,0,1-3-2.18l-2.5-8.1c0-.06,0-.06,0-.1a2.52,2.52,0,0,0-.3-.66,2.09,2.09,0,0,0-1.26-.61,1.94,1.94,0,0,0-.82.11L48,9.48a1.9,1.9,0,0,0-.74.36,1.71,1.71,0,0,0-.47.57,1.5,1.5,0,0,0-.21.71,2.29,2.29,0,0,0,.09.75l0,.05,2.25,7.35a3.08,3.08,0,0,1-1.56,3.64c-.64.37-1.27.74-2,1.2s-1.38.95-2,1.39-1.3,1-1.91,1.54-1.15,1-1.83,1.7a3.1,3.1,0,0,1-3.59.48l-7.34-3.91a1.88,1.88,0,0,0-.75-.23,3.3,3.3,0,0,0-.69.07,1.31,1.31,0,0,0-.61.32,1.75,1.75,0,0,0-.49.62l-.4.74a24.3,24.3,0,0,0-6.73-.35l1.78-3.35a8.61,8.61,0,0,1,2-2.49,8.51,8.51,0,0,1,2.81-1.5,8.08,8.08,0,0,1,3.18-.33,8.57,8.57,0,0,1,3,1l5.43,2.9.4-.33c.7-.61,1.45-1.19,2.2-1.78s1.56-1.18,2.3-1.66l.26-.19-1.5-5.05a7.44,7.44,0,0,1-.33-3.17,7.84,7.84,0,0,1,.92-3.06,7.75,7.75,0,0,1,2-2.46,8.26,8.26,0,0,1,2.82-1.5L56.28.41l0,0A8.58,8.58,0,0,1,59.43,0a7.71,7.71,0,0,1,3.06.92A8.54,8.54,0,0,1,65,3a7.27,7.27,0,0,1,1.39,2.81l1.83,5.88a2.12,2.12,0,0,0,.43,0c.9.05,1.83.16,2.81.25s1.87.28,2.81.46a1,1,0,0,1,.39.1l2.46-4.63a7.84,7.84,0,0,1,4.82-3.92l.06,0a7.71,7.71,0,0,1,3.11-.31,8.44,8.44,0,0,1,3,.89l9.25,4.94a8.58,8.58,0,0,1,2.49,2,7.68,7.68,0,0,1,1.5,2.82,8,8,0,0,1,.33,3.17,8.31,8.31,0,0,1-1,3l-2.9,5.44c.11.11.23.28.34.39.6.71,1.19,1.45,1.77,2.2s1.19,1.56,1.66,2.3l.19.27,5.05-1.51a7.43,7.43,0,0,1,3.17-.32,8,8,0,0,1,3.06.91,7.67,7.67,0,0,1,2.46,2l0,.08a8.26,8.26,0,0,1,1.5,2.82l3,9.91.05,0a8.8,8.8,0,0,1,.35,3.13,7.87,7.87,0,0,1-.92,3.06,8.54,8.54,0,0,1-2,2.46A7.31,7.31,0,0,1,114.63,55l-5.88,1.83c0,.15,0,.32,0,.47,0,.91-.15,1.83-.24,2.71,0,0,0,.11,0,.15A26.84,26.84,0,0,1,108,63l-.07.34,4.67,2.49a7.52,7.52,0,0,1,2.47,2,8,8,0,0,1,1.45,2.79l0,.07a7.66,7.66,0,0,1,.31,3.1,8.25,8.25,0,0,1-.9,3l-.74,1.39-1.32-.71a25.71,25.71,0,0,0-4.34-7.75c-.14-.19-.29-.37-.45-.55a27.07,27.07,0,0,0-7.55-6.25c.09-.37.18-.75.26-1.13.13-.75.28-1.54.37-2.42,0,0,0-.11,0-.15.11-.81.17-1.54.23-2.27s.09-1.59.07-2.37a3,3,0,0,1,2.18-3l8.09-2.5s.07,0,.11,0a2.31,2.31,0,0,0,.65-.3,1.52,1.52,0,0,0,.41-.55,1.77,1.77,0,0,0,.21-.71,1.94,1.94,0,0,0-.11-.82L111,36.8l0,.06Zm-34-3.09a21.79,21.79,0,0,1,3.93,2.64,23.11,23.11,0,0,1,3.3,3.33,29.87,29.87,0,0,1,2.5,3.79,21.32,21.32,0,0,1,1.72,4.13,20.05,20.05,0,0,1,.86,4.44,20.89,20.89,0,0,1,0,4.54c0,.11,0,.19,0,.26a23,23,0,0,1-.68,3.77c-1.64.16-3.27.42-4.88.71l-1.48-.79c.13-.34.24-.69.35-1.05a18.63,18.63,0,0,0,.64-3.14.8.8,0,0,1,0-.22,17.14,17.14,0,0,0,0-3.44,17.56,17.56,0,0,0-.62-3.23,14.89,14.89,0,0,0-1.28-3,18.34,18.34,0,0,0-1.91-2.87A16.74,16.74,0,0,0,77,41.19a18.31,18.31,0,0,0-6.2-3.3,18.63,18.63,0,0,0-3.14-.64.57.57,0,0,1-.22,0,18.76,18.76,0,0,0-3.44,0,17.57,17.57,0,0,0-3.23.63,14.89,14.89,0,0,0-3,1.28,18.26,18.26,0,0,0-2.87,1.9,17.35,17.35,0,0,0-2.43,2.42c-.23.27-.46.56-.68.87l-5.46-2.91a20.4,20.4,0,0,1,1.42-1.9A22.63,22.63,0,0,1,51,36.26a28.91,28.91,0,0,1,3.79-2.51A24.63,24.63,0,0,1,59,32a22,22,0,0,1,4.39-.88,21.63,21.63,0,0,1,4.55,0c.1,0,.19.05.25,0a23.26,23.26,0,0,1,4.35.84,26.43,26.43,0,0,1,4.39,1.79l0,0Zm-37.89,24h0v.1h0l0,0V58h0v.21h0v.11h0v.11h0v.34h0V59h0v.12h0v.23h0v.13h0v.13h0V60h0v.13h0v.14h0v.25h0V79a1.68,1.68,0,1,1-3.35,0v-3.1h0a1.84,1.84,0,0,1-.25-.17L31.8,73.16l-4.34-3.57A6.52,6.52,0,0,0,26,68.66H24.87a2.57,2.57,0,0,0-1.45.06,1.46,1.46,0,0,0-.79.81h-.1a5.44,5.44,0,0,0-.2,2.11,8.87,8.87,0,0,0,.81,2.9A18.68,18.68,0,0,0,25.26,78s.07.1.1.16l12.7,20.76a1.68,1.68,0,0,1,.28.76h0a11.41,11.41,0,0,0,1.31,4.59H65a11,11,0,0,0,3.08-3.63.47.47,0,0,1,.06-.09c.36-.62.84-1.41,1.31-2.18a29.64,29.64,0,0,0,2.86-6.82v0l0-.06,0-.1,0-.06v0l0-.1,0-.07v0l0-.1.06-.2,0-.1h0l0-.09,0-.1v0l0-.07,0-.1v-.1l0-.1V90l0-.1,0-.09h0l0-.1,0-.1h0l0-.08,0-.1v0l0-.07,0-.1v-.1l0-.1,0-.07v0l0-.1,0-.08v0l0-.09,0-.1h0l0-.09,0-.1v-.1l0-.09v-.29l0-.1v-.1l0-.09v-.1h0v-.09l0-.1v-.84h0v-1l-.13-5.7a1.94,1.94,0,0,1,0-.24c0-.08,0-.62,0-1.34v-.18h0V76.84h0v-.19h0V75.36h0v-.19h0V74.1h0v-.17h0v-.18h0v-.19l0-.09v-.64l0-.08,0-.09,0-.09h0v-.09l0-.07h0l0-.09v-.08l0-.09V72a3.67,3.67,0,0,0-2.89-3H67.74c0,.47,0,.93,0,1.4h0v0h0v0h0v0h0v.1h0v0h0v.08h0V71h0v0h0v0h0v.1h0v0h0v0h0v0h0v.07h0v0h0v0h0v0h0v0h0v.05h0v0h0v0h0v0h0v0h0v.05h0v0h0v0h0v0h0v0h0v0h0v0h0v0h0v.05c-.06.93-.11,1.84-.11,2.7a1.68,1.68,0,0,1-3.36,0c0-.86.07-1.86.13-2.9v-.33h0v-.17h0v-.15h0v-.33h0v-.17h0v-.15h0v-.17h0V70.2h0v-.34h0v-.33h0V69.2h0V69c0-2.52-.45-4.71-2.48-5.08H59.7a1.37,1.37,0,0,1-.36,0c0,.94,0,1.92-.08,2.87v1c-.06.93-.11,1.83-.11,2.69a1.68,1.68,0,1,1-3.36,0c0-.86.07-1.86.13-2.9v-.17h0v-.15h0v-.16h0v-.17h0v-.17h0v-.17h0v-.32h0v-.16h0v-.17h0v-.14h0v-.17h0v-.17h0v-.07c.08-2.84-.23-5.46-2.47-5.87H51.29a1.49,1.49,0,0,1-.43-.06v6.49a1.68,1.68,0,0,1-3.36,0v-8.2c0-2.32-2.3-3.32-4.45-3.32a3.85,3.85,0,0,0-1.74.42,5,5,0,0,0-2.26,3ZM35.29,70l-1.58-.65a19.89,19.89,0,0,0-2.2-.75l2.41,2,1.37,1.12V70Z\" }));\nexport default SvgSkills;\n","import * as React from \"react\";\nconst SvgStorybook = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M16.71.243l-.12 2.71a.18.18 0 00.29.15l1.06-.8.9.7a.18.18 0 00.28-.14l-.1-2.76 1.33-.1a1.2 1.2 0 011.279 1.2v21.596a1.2 1.2 0 01-1.26 1.2l-16.096-.72a1.2 1.2 0 01-1.15-1.16l-.75-19.797a1.2 1.2 0 011.13-1.27L16.7.222zM13.64 9.3c0 .47 3.16.24 3.59-.08 0-3.2-1.72-4.89-4.859-4.89-3.15 0-4.899 1.72-4.899 4.29 0 4.45 5.999 4.53 5.999 6.959 0 .7-.32 1.1-1.05 1.1-.96 0-1.35-.49-1.3-2.16 0-.36-3.649-.48-3.769 0-.27 4.03 2.23 5.2 5.099 5.2 2.79 0 4.969-1.49 4.969-4.18 0-4.77-6.099-4.64-6.099-6.999 0-.97.72-1.1 1.13-1.1.45 0 1.25.07 1.19 1.87z\" }));\nexport default SvgStorybook;\n","import * as React from \"react\";\nconst SvgTwitter = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M22.92 6c-.77.35-1.6.58-2.46.69.88-.53 1.56-1.37 1.88-2.38-.83.5-1.75.85-2.72 1.05C18.83 4.5 17.72 4 16.46 4c-2.35 0-4.27 1.92-4.27 4.29 0 .34.04.67.11.98-3.56-.18-6.73-1.89-8.84-4.48-.37.63-.58 1.37-.58 2.15 0 1.49.75 2.81 1.91 3.56-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.22 4.22 0 01-1.93.07 4.28 4.28 0 004 2.98 8.521 8.521 0 01-5.33 1.84c-.34 0-.68-.02-1.02-.06C3.9 20.29 6.16 21 8.58 21c7.88 0 12.21-6.54 12.21-12.21 0-.19 0-.37-.01-.56.84-.6 1.56-1.36 2.14-2.23z\" }));\nexport default SvgTwitter;\n","import { classes } from '../../utils/style';\nimport styles from './Icon.module.css';\nimport ArrowLeft from './svg/arrow-left.svg';\nimport ArrowRight from './svg/arrow-right.svg';\nimport Article from './svg/articles.svg';\nimport Check from './svg/check.svg';\nimport ChevronRight from './svg/chevron-right.svg';\nimport Close from './svg/close.svg';\nimport Company from './svg/company.svg';\nimport Copy from './svg/copy.svg';\nimport Download from './svg/download.svg';\nimport Error from './svg/error.svg';\nimport Figma from './svg/figma.svg';\nimport Github from './svg/github.svg';\nimport Link from './svg/link.svg';\nimport Linkedin from './svg/linkedin.svg';\nimport Menu from './svg/menu.svg';\nimport Pause from './svg/pause.svg';\nimport Play from './svg/play.svg';\nimport Send from './svg/send.svg';\nimport Skills from './svg/skills.svg';\nimport Storybook from './svg/storybook.svg';\nimport Twitter from './svg/twitter.svg';\n\nexport const icons = {\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n articles: Article,\n company: Company,\n check: Check,\n chevronRight: ChevronRight,\n close: Close,\n copy: Copy,\n download: Download,\n error: Error,\n figma: Figma,\n github: Github,\n link: Link,\n linkedin: Linkedin,\n menu: Menu,\n pause: Pause,\n play: Play,\n send: Send,\n skills: Skills,\n storybook: Storybook,\n twitter: Twitter,\n};\n\nexport type IconName = keyof typeof icons;\n\nexport interface IconProps {\n icon: IconName;\n className?: string;\n [key: string]: unknown;\n}\n\nexport const Icon = ({ icon, className, ...rest }: IconProps) => {\n const IconComponent = icons[icon];\n\n return (\n <IconComponent aria-hidden className={classes(styles.icon, className)} {...rest} />\n );\n};\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport type { KeyboardEvent, ReactNode, RefObject } from 'react';\nimport { VisuallyHidden } from '../VisuallyHidden';\nimport { cssProps } from '../../utils/style';\nimport styles from './SegmentedControl.module.css';\n\ninterface SegmentedControlContextValue {\n optionRefs: { current: RefObject<HTMLButtonElement>[] };\n currentIndex: number;\n onChange: (index: number) => void;\n registerOption: (optionRef: RefObject<HTMLButtonElement>) => void;\n unRegisterOption: (optionRef: RefObject<HTMLButtonElement>) => void;\n}\n\nconst SegmentedControlContext = createContext<SegmentedControlContextValue>(\n {} as SegmentedControlContextValue\n);\n\ninterface SegmentedControlProps {\n children: ReactNode;\n currentIndex: number;\n onChange: (index: number) => void;\n label: string;\n [key: string]: unknown;\n}\n\nexport const SegmentedControl = ({\n children,\n currentIndex,\n onChange,\n label,\n ...props\n}: SegmentedControlProps) => {\n const id = useId();\n const labelId = `${id}segmented-control-label`;\n const optionRefs = useRef<RefObject<HTMLButtonElement>[]>([]);\n const [indicator, setIndicator] = useState<{ width?: number; left?: number }>();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const { length } = optionRefs.current;\n const prevIndex = (currentIndex - 1 + length) % length;\n const nextIndex = (currentIndex + 1) % length;\n\n if (['ArrowLeft', 'ArrowUp'].includes(event.key)) {\n onChange(prevIndex);\n optionRefs.current[prevIndex].current?.focus();\n } else if (['ArrowRight', 'ArrowDown'].includes(event.key)) {\n onChange(nextIndex);\n optionRefs.current[nextIndex].current?.focus();\n }\n };\n\n const registerOption = useCallback((optionRef: RefObject<HTMLButtonElement>) => {\n optionRefs.current = [...optionRefs.current, optionRef];\n }, []);\n\n const unRegisterOption = useCallback((optionRef: RefObject<HTMLButtonElement>) => {\n optionRefs.current = optionRefs.current.filter(ref => ref !== optionRef);\n }, []);\n\n useEffect(() => {\n const currentOption = optionRefs.current[currentIndex]?.current;\n if (!currentOption) return;\n\n const resizeObserver = new ResizeObserver(() => {\n const rect = currentOption.getBoundingClientRect();\n const left = currentOption.offsetLeft;\n setIndicator({ width: rect.width, left });\n });\n\n resizeObserver.observe(currentOption);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [currentIndex]);\n\n return (\n <SegmentedControlContext.Provider\n value={{ optionRefs, currentIndex, onChange, registerOption, unRegisterOption }}\n >\n <div\n className={styles.container}\n role=\"radiogroup\"\n aria-labelledby={labelId}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <VisuallyHidden as=\"label\" id={labelId}>\n {label}\n </VisuallyHidden>\n <div className={styles.options}>\n {!!indicator && (\n <div\n className={styles.indicator}\n // Options register themselves into this ref on mount; length is\n // correct by the time this re-renders after registration settles.\n // eslint-disable-next-line react-hooks/refs\n data-last={currentIndex === optionRefs.current.length - 1}\n style={cssProps(indicator)}\n />\n )}\n {children}\n </div>\n </div>\n </SegmentedControlContext.Provider>\n );\n};\n\ninterface SegmentedControlOptionProps {\n children: ReactNode;\n [key: string]: unknown;\n}\n\nexport const SegmentedControlOption = ({ children, ...props }: SegmentedControlOptionProps) => {\n const { optionRefs, currentIndex, onChange, registerOption, unRegisterOption } =\n useContext(SegmentedControlContext);\n const optionRef = useRef<HTMLButtonElement>(null);\n // Same as above: the parent's ref collection settles by the time this\n // re-renders after this option registers itself on mount.\n // eslint-disable-next-line react-hooks/refs\n const index = optionRefs.current.indexOf(optionRef as RefObject<HTMLButtonElement>);\n const isSelected = currentIndex === index;\n\n useEffect(() => {\n registerOption(optionRef as RefObject<HTMLButtonElement>);\n\n return () => {\n unRegisterOption(optionRef as RefObject<HTMLButtonElement>);\n };\n }, [registerOption, unRegisterOption]);\n\n return (\n <button\n className={styles.button}\n tabIndex={isSelected ? 0 : -1}\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => onChange(index)}\n ref={optionRef}\n {...props}\n >\n {children}\n </button>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\nimport type { ChangeEvent, TextareaHTMLAttributes } from 'react';\nimport { classes, cssProps } from '../../utils/style';\nimport styles from './TextArea.module.css';\n\ninterface TextAreaDimensions {\n lineHeight: number;\n paddingHeight: number;\n}\n\ninterface TextAreaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange'> {\n className?: string;\n resize?: string;\n value?: string;\n onChange: (event: ChangeEvent<HTMLTextAreaElement>) => void;\n minRows?: number;\n maxRows?: number;\n}\n\nexport const TextArea = ({\n className,\n resize = 'none',\n value,\n onChange,\n minRows = 1,\n maxRows,\n ...rest\n}: TextAreaProps) => {\n const [rows, setRows] = useState(minRows);\n const [textareaDimensions, setTextareaDimensions] = useState<TextAreaDimensions>();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n const style = getComputedStyle(textareaRef.current!);\n const lineHeight = parseInt(style.lineHeight, 10);\n const paddingHeight =\n parseInt(style.paddingTop, 10) + parseInt(style.paddingBottom, 10);\n setTextareaDimensions({ lineHeight, paddingHeight });\n }, []);\n\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange(event);\n\n const { lineHeight, paddingHeight } = textareaDimensions!;\n const previousRows = event.target.rows;\n event.target.rows = minRows;\n\n const currentRows = ~~((event.target.scrollHeight - paddingHeight) / lineHeight);\n\n if (currentRows === previousRows) {\n event.target.rows = currentRows;\n }\n\n if (maxRows && currentRows >= maxRows) {\n event.target.rows = maxRows;\n event.target.scrollTop = event.target.scrollHeight;\n }\n\n setRows(maxRows && currentRows > maxRows ? maxRows : currentRows);\n };\n\n return (\n <textarea\n className={classes(styles.textarea, className)}\n ref={textareaRef}\n onChange={handleChange}\n style={cssProps({ resize })}\n rows={rows}\n value={value}\n {...rest}\n />\n );\n};\n","import React, { useId, useRef, useState } from 'react';\nimport type { ChangeEvent, ElementType, FocusEvent } from 'react';\nimport { Icon } from '../Icon';\nimport { tokens } from '../ThemeProvider';\nimport { Transition } from '../Transition';\nimport { classes, cssProps, msToNum } from '../../utils/style';\nimport styles from './Input.module.css';\nimport { TextArea } from './TextArea';\n\nexport interface InputProps {\n id?: string;\n label?: string;\n value?: string;\n multiline?: boolean;\n className?: string;\n style?: React.CSSProperties;\n error?: string | null;\n onBlur?: (event: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n autoComplete?: string;\n required?: boolean;\n maxLength?: number;\n type?: string;\n placeholder?: string;\n /** Multiline only: cap the auto-grow at this many rows, then scroll inside. */\n maxRows?: number;\n onChange?: (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n [key: string]: unknown;\n}\n\nexport const Input = ({\n id,\n label,\n value,\n multiline,\n className,\n style,\n error,\n onBlur,\n autoComplete,\n required,\n maxLength,\n type,\n placeholder,\n maxRows,\n onChange,\n ...rest\n}: InputProps) => {\n const [focused, setFocused] = useState(false);\n const generatedId = useId();\n const errorRef = useRef<HTMLDivElement>(null);\n const inputId = id || `${generatedId}input`;\n const labelId = `${inputId}-label`;\n const errorId = `${inputId}-error`;\n const InputElement = (multiline ? TextArea : 'input') as ElementType;\n\n const handleBlur = (event: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFocused(false);\n\n if (onBlur) {\n onBlur(event);\n }\n };\n\n return (\n <div\n className={classes(styles.container, className)}\n data-error={!!error}\n data-multiline={!!multiline}\n style={style}\n {...rest}\n >\n <div className={styles.content}>\n <label\n className={styles.label}\n data-focused={focused}\n data-filled={!!value}\n data-placeholder={!!placeholder}\n id={labelId}\n htmlFor={inputId}\n >\n {label}\n </label>\n <InputElement\n className={styles.input}\n id={inputId}\n aria-labelledby={labelId}\n aria-describedby={error ? errorId : undefined}\n onFocus={() => setFocused(true)}\n onBlur={handleBlur}\n value={value}\n onChange={onChange}\n autoComplete={autoComplete}\n required={required}\n maxLength={maxLength}\n type={type}\n placeholder={placeholder}\n {...(multiline ? { maxRows } : {})}\n />\n <div className={styles.underline} data-focused={focused} />\n </div>\n <Transition unmount in={!!error} timeout={msToNum(tokens.base.durationM)}>\n {(visible: boolean) => (\n <div\n className={styles.error}\n data-visible={visible}\n id={errorId}\n role=\"alert\"\n style={cssProps({\n height: visible ? errorRef.current?.getBoundingClientRect().height ?? 0 : 0,\n })}\n >\n <div className={styles.errorMessage} ref={errorRef}>\n <Icon icon=\"error\" />\n {error}\n </div>\n </div>\n )}\n </Transition>\n </div>\n );\n};\n","import { forwardRef, type ReactNode, type ComponentPropsWithoutRef } from 'react';\nimport { useLinkComponent, type LinkComponent } from '../LinkProvider';\nimport { classes } from '../../utils/style';\nimport styles from './Link.module.css';\n\nconst VALID_EXT = ['txt', 'png', 'jpg'];\n\nfunction isAnchor(href?: string): boolean {\n const isValidExtension = VALID_EXT.includes(href?.split('.').pop() ?? '');\n return !!href?.includes('://') || href?.[0] === '#' || isValidExtension;\n}\n\ninterface LinkProps extends ComponentPropsWithoutRef<'a'> {\n secondary?: boolean;\n children?: ReactNode;\n /** Overrides the LinkProvider-supplied component for this instance only. */\n linkComponent?: LinkComponent;\n}\n\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\n ({ rel, target, children, secondary, className, href, linkComponent, ...rest }, ref) => {\n const ContextLink = useLinkComponent();\n const RouterLink = linkComponent ?? ContextLink;\n const isExternal = href?.includes('://');\n const relValue = rel || (isExternal ? 'noreferrer noopener' : undefined);\n const targetValue = target || (isExternal ? '_blank' : undefined);\n const linkProps = {\n className: classes(styles.link, className),\n 'data-secondary': secondary,\n rel: relValue,\n href,\n target: targetValue,\n ref,\n ...rest,\n };\n\n if (isAnchor(href)) {\n return <a {...linkProps}>{children}</a>;\n }\n\n return (\n <RouterLink {...linkProps} href={href ?? ''}>\n {children}\n </RouterLink>\n );\n }\n);\n","import { forwardRef, type ComponentPropsWithoutRef, type ElementType, type ReactNode } from 'react';\nimport { Icon } from '../Icon';\nimport { useLinkComponent, type LinkComponent } from '../LinkProvider';\nimport { Loader } from '../Loader';\nimport { Transition } from '../Transition';\nimport type { icons } from '../Icon';\nimport { classes } from '../../utils/style';\nimport styles from './Button.module.css';\n\nfunction isExternalLink(href?: string): boolean {\n return !!href?.includes('://');\n}\n\nexport interface ButtonProps extends ComponentPropsWithoutRef<'button'> {\n href?: string;\n as?: ElementType;\n secondary?: boolean;\n loading?: boolean;\n loadingText?: string;\n icon?: keyof typeof icons;\n iconEnd?: keyof typeof icons;\n iconHoverShift?: boolean;\n iconOnly?: boolean;\n children?: ReactNode;\n rel?: string;\n target?: string;\n disabled?: boolean;\n download?: string;\n /** Overrides the LinkProvider-supplied component for this instance only. */\n linkComponent?: LinkComponent;\n}\n\nexport const Button = forwardRef<HTMLElement, ButtonProps>(\n ({ href, linkComponent, ...rest }, ref) => {\n const ContextLink = useLinkComponent();\n const RouterLink = linkComponent ?? ContextLink;\n\n if (isExternalLink(href) || !href) {\n return <ButtonContent href={href} ref={ref} {...rest} />;\n }\n\n return <ButtonContent as={RouterLink} href={href} ref={ref} {...rest} />;\n }\n);\n\nconst ButtonContent = forwardRef<HTMLElement, ButtonProps>(\n (\n {\n className,\n as,\n secondary,\n loading,\n loadingText = 'loading',\n icon,\n iconEnd,\n iconHoverShift,\n iconOnly,\n children,\n rel,\n target,\n href,\n disabled,\n ...rest\n },\n ref\n ) => {\n const isExternal = isExternalLink(href);\n const defaultComponent = href ? 'a' : 'button';\n const Component = as || defaultComponent;\n\n return (\n <Component\n className={classes(styles.button, className)}\n data-loading={loading}\n data-icon-only={iconOnly}\n data-secondary={secondary}\n data-icon={icon}\n href={href}\n rel={rel || isExternal ? 'noopener noreferrer' : undefined}\n target={target || isExternal ? '_blank' : undefined}\n disabled={disabled}\n ref={ref}\n {...rest}\n >\n {!!icon && (\n <Icon\n className={styles.icon}\n data-start={!iconOnly}\n data-shift={iconHoverShift}\n icon={icon}\n />\n )}\n {!!children && <span className={styles.text}>{children}</span>}\n {!!iconEnd && (\n <Icon\n className={styles.icon}\n data-end={!iconOnly}\n data-shift={iconHoverShift}\n icon={iconEnd}\n />\n )}\n <Transition unmount in={loading}>\n {(visible: boolean) => (\n <Loader\n className={styles.loader}\n size={32}\n text={loadingText}\n data-visible={visible}\n />\n )}\n </Transition>\n </Component>\n );\n }\n);\n","import { Icon } from '../Icon';\nimport { Link } from '../Link';\nimport { classes } from '../../utils/style';\nimport styles from './Breadcrumbs.module.css';\n\nexport interface BreadcrumbItem {\n label: string;\n href: string;\n}\n\ninterface BreadcrumbsProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport const Breadcrumbs = ({ items, className }: BreadcrumbsProps) => {\n return (\n <nav aria-label=\"Breadcrumb\" className={classes(styles.breadcrumbs, className)}>\n <ol className={styles.list}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li key={item.href} className={styles.item}>\n {index > 0 && (\n <Icon\n className={styles.separator}\n icon=\"chevronRight\"\n aria-hidden=\"true\"\n />\n )}\n {isLast ? (\n <span className={styles.current} aria-current=\"page\">\n {item.label}\n </span>\n ) : (\n <Link className={styles.link} href={item.href}>\n {item.label}\n </Link>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n","export async function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import { VisuallyHidden } from '../VisuallyHidden';\nimport { useReducedMotion, useSpring } from 'framer-motion';\nimport { memo, useEffect, useRef } from 'react';\nimport { delay } from '../../utils/delay';\nimport { classes } from '../../utils/style';\nimport styles from './ScrambleReveal.module.css';\n\n// Standalone-renderable Devanagari only — no matras/conjuncts (they render\n// broken with a dotted-circle placeholder when shown in isolation).\n// prettier-ignore\nconst glyphs = [\n // Independent vowels\n 'अ', 'आ', 'इ', 'ई', 'उ',\n 'ऊ', 'ऋ', 'ए', 'ऐ', 'ओ', 'औ',\n // Consonants\n 'क', 'ख', 'ग', 'घ', 'ङ',\n 'च', 'छ', 'ज', 'झ', 'ञ',\n 'ट', 'ठ', 'ड', 'ढ', 'ण',\n 'त', 'थ', 'द', 'ध', 'न',\n 'प', 'फ', 'ब', 'भ', 'म',\n 'य', 'र', 'ल', 'व', 'श',\n 'ष', 'स', 'ह', 'ळ',\n // Devanagari digits\n '०', '१', '२', '३', '४',\n '५', '६', '७', '८', '९',\n];\n\nconst CharType = {\n Glyph: 'glyph',\n Value: 'value',\n} as const;\n\ninterface CharItem {\n type: (typeof CharType)[keyof typeof CharType];\n value: string;\n}\n\nfunction shuffle(content: string[], output: CharItem[], position: number): CharItem[] {\n return content.map((value, index) => {\n if (index < position) {\n return { type: CharType.Value, value };\n }\n\n if (position % 1 < 0.5) {\n const rand = Math.floor(Math.random() * glyphs.length);\n return { type: CharType.Glyph, value: glyphs[rand] };\n }\n\n return { type: CharType.Glyph, value: output[index].value };\n });\n}\n\ninterface ScrambleRevealProps {\n text: string;\n start?: boolean;\n delay?: number;\n className?: string;\n [key: string]: unknown;\n}\n\nexport const ScrambleReveal = memo(\n ({ text, start = true, delay: startDelay = 0, className, ...rest }: ScrambleRevealProps) => {\n const output = useRef<CharItem[]>([{ type: CharType.Glyph, value: '' }]);\n const container = useRef<HTMLSpanElement>(null);\n const reduceMotion = useReducedMotion();\n const decoderSpring = useSpring(0, { stiffness: 8, damping: 5 });\n\n useEffect(() => {\n const containerInstance = container.current;\n const content = text.split('');\n let animation: number | undefined;\n\n const renderOutput = () => {\n const characterMap = output.current.map(item => {\n return `<span class=\"${styles[item.type]}\">${item.value}</span>`;\n });\n\n if (containerInstance) {\n containerInstance.innerHTML = characterMap.join('');\n }\n };\n\n const unsubscribeSpring = decoderSpring.on('change', (value: number) => {\n output.current = shuffle(content, output.current, value);\n renderOutput();\n });\n\n const startSpring = async () => {\n await delay(startDelay);\n decoderSpring.set(content.length);\n };\n\n if (start && !animation && !reduceMotion) {\n startSpring();\n }\n\n if (reduceMotion) {\n output.current = content.map((value, index) => ({\n type: CharType.Value,\n value: content[index],\n }));\n renderOutput();\n }\n\n return () => {\n unsubscribeSpring?.();\n };\n }, [decoderSpring, reduceMotion, start, startDelay, text]);\n\n return (\n <span className={classes(styles.text, className)} {...rest}>\n <VisuallyHidden className={styles.label}>{text}</VisuallyHidden>\n <span aria-hidden className={styles.content} ref={container} />\n </span>\n );\n }\n);\n","import { Button } from '../Button';\nimport { Icon } from '../Icon';\nimport { useTheme } from '../ThemeProvider';\nimport { useReducedMotion } from 'framer-motion';\nimport { useHasMounted } from '../../hooks/useHasMounted';\nimport { useInViewport } from '../../hooks/useInViewport';\nimport { Fragment, useCallback, useEffect, useRef, useState } from 'react';\nimport type { CSSProperties, HTMLAttributes, ReactEventHandler, VideoHTMLAttributes } from 'react';\nimport { resolveSrcFromSrcSet, srcSetToString } from '../../utils/image';\nimport { classes, cssProps, numToMs } from '../../utils/style';\nimport styles from './Image.module.css';\n\ninterface ImageSrc {\n src: string;\n width?: number;\n height?: number;\n}\n\ninterface SrcSetItem {\n src: string;\n width: number;\n}\n\ninterface ImageProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n style?: CSSProperties;\n reveal?: boolean;\n delay?: number;\n raised?: boolean;\n src?: ImageSrc;\n srcSet?: SrcSetItem[];\n placeholder?: ImageSrc;\n alt?: string;\n play?: boolean;\n restartOnPause?: boolean;\n sizes?: string;\n noPauseButton?: boolean;\n}\n\nexport const Image = ({\n className,\n style,\n reveal,\n delay = 0,\n raised,\n src: baseSrc,\n srcSet,\n placeholder,\n ...rest\n}: ImageProps) => {\n const [loaded, setLoaded] = useState(false);\n const { themeId } = useTheme();\n const containerRef = useRef<HTMLDivElement>(null);\n const src = baseSrc || srcSet?.[0];\n const inViewport = useInViewport(containerRef, !getIsVideo(src));\n\n const onLoad = useCallback(() => {\n setLoaded(true);\n }, []);\n\n return (\n <div\n className={classes(styles.image, className)}\n data-visible={inViewport || loaded}\n data-reveal={reveal}\n data-raised={raised}\n data-theme={themeId}\n style={cssProps({ delay: numToMs(delay) }, style)}\n ref={containerRef}\n >\n <ImageElements\n delay={delay}\n onLoad={onLoad}\n loaded={loaded}\n inViewport={inViewport}\n reveal={reveal}\n src={src}\n srcSet={srcSet}\n placeholder={placeholder}\n {...rest}\n />\n </div>\n );\n};\n\ninterface ImageElementsProps {\n onLoad: ReactEventHandler;\n loaded: boolean;\n inViewport: boolean;\n srcSet?: SrcSetItem[];\n placeholder?: ImageSrc;\n delay: number;\n src?: ImageSrc | SrcSetItem;\n alt?: string;\n play?: boolean;\n restartOnPause?: boolean;\n reveal?: boolean;\n sizes?: string;\n noPauseButton?: boolean;\n [key: string]: unknown;\n}\n\nconst ImageElements = ({\n onLoad,\n loaded,\n inViewport,\n srcSet,\n placeholder,\n delay,\n src,\n alt,\n play = true,\n restartOnPause,\n reveal,\n sizes,\n noPauseButton,\n ...rest\n}: ImageElementsProps) => {\n const reduceMotion = useReducedMotion();\n const [showPlaceholder, setShowPlaceholder] = useState(true);\n const [playing, setPlaying] = useState(!reduceMotion);\n const [videoSrc, setVideoSrc] = useState<string>();\n const [videoInteracted, setVideoInteracted] = useState(false);\n const placeholderRef = useRef<HTMLImageElement>(null);\n const videoRef = useRef<HTMLVideoElement>(null);\n const isVideo = getIsVideo(src);\n const showFullRes = inViewport;\n const srcSetString = srcSetToString(srcSet);\n const hasMounted = useHasMounted();\n\n useEffect(() => {\n const resolveVideoSrc = async () => {\n const resolvedVideoSrc = await resolveSrcFromSrcSet({ srcSet, sizes });\n setVideoSrc(resolvedVideoSrc);\n };\n\n if (isVideo && srcSet) {\n resolveVideoSrc();\n } else if (isVideo) {\n // Sync counterpart to the async branch above; kept in the same effect\n // so `videoSrc` always resolves the same way regardless of source shape.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setVideoSrc((src as ImageSrc).src);\n }\n }, [isVideo, sizes, src, srcSet]);\n\n useEffect(() => {\n if (!videoRef.current || !videoSrc) return;\n\n const playVideo = () => {\n setPlaying(true);\n videoRef.current!.play();\n };\n\n const pauseVideo = () => {\n setPlaying(false);\n videoRef.current!.pause();\n };\n\n if (!play) {\n pauseVideo();\n\n if (restartOnPause) {\n videoRef.current.currentTime = 0;\n }\n }\n\n if (videoInteracted) return;\n\n if (!inViewport) {\n pauseVideo();\n } else if (inViewport && !reduceMotion && play) {\n playVideo();\n }\n }, [inViewport, play, reduceMotion, restartOnPause, videoInteracted, videoSrc]);\n\n const togglePlaying = (event: React.MouseEvent) => {\n event.preventDefault();\n\n setVideoInteracted(true);\n\n if (videoRef.current!.paused) {\n setPlaying(true);\n videoRef.current!.play();\n } else {\n setPlaying(false);\n videoRef.current!.pause();\n }\n };\n\n return (\n <div\n className={styles.elementWrapper}\n data-reveal={reveal}\n data-visible={inViewport || loaded}\n style={cssProps({ delay: numToMs(delay + 1000) })}\n >\n {isVideo && hasMounted && (\n <Fragment>\n <video\n muted\n loop\n playsInline\n className={styles.element}\n data-loaded={loaded}\n autoPlay={!reduceMotion}\n role=\"img\"\n onLoadStart={onLoad as ReactEventHandler<HTMLVideoElement>}\n src={videoSrc}\n aria-label={alt}\n ref={videoRef}\n {...(rest as VideoHTMLAttributes<HTMLVideoElement>)}\n />\n {!noPauseButton && (\n <Button className={styles.button} onClick={togglePlaying}>\n <Icon icon={playing ? 'pause' : 'play'} />\n {playing ? 'Pause' : 'Play'}\n </Button>\n )}\n </Fragment>\n )}\n {!isVideo && (\n <img\n className={styles.element}\n data-loaded={loaded}\n onLoad={onLoad}\n decoding=\"async\"\n src={showFullRes ? (src as ImageSrc)?.src : undefined}\n srcSet={showFullRes ? srcSetString : undefined}\n width={(src as ImageSrc)?.width}\n height={(src as ImageSrc)?.height}\n alt={alt}\n sizes={sizes}\n {...(rest as React.ImgHTMLAttributes<HTMLImageElement>)}\n />\n )}\n {showPlaceholder && placeholder && (\n <img\n aria-hidden\n className={styles.placeholder}\n data-loaded={loaded}\n style={cssProps({ delay: numToMs(delay) })}\n ref={placeholderRef}\n src={placeholder.src}\n width={placeholder.width}\n height={placeholder.height}\n onTransitionEnd={() => setShowPlaceholder(false)}\n decoding=\"async\"\n alt=\"\"\n role=\"presentation\"\n />\n )}\n </div>\n );\n};\n\nfunction getIsVideo(src?: ImageSrc | SrcSetItem): boolean {\n if (!src) return false;\n return typeof (src as ImageSrc).src === 'string' && (src as ImageSrc).src.endsWith('.mp4');\n}\n","import { forwardRef, useId, type SVGProps } from 'react';\nimport { classes } from '../../utils/style';\nimport styles from './Wordmark.module.css';\n\nexport interface WordmarkProps extends SVGProps<SVGSVGElement> {\n highlight?: boolean;\n}\n\nexport const Wordmark = forwardRef<SVGSVGElement, WordmarkProps>(\n ({ highlight, className, ...props }, ref) => {\n const id = useId();\n const clipId = `${id}wordmark-clip`;\n\n return (\n <svg\n aria-hidden\n className={classes(styles.wordmark, className)}\n width=\"46\"\n height=\"29\"\n viewBox=\"0 0 46 29\"\n ref={ref}\n {...props}\n >\n <defs>\n <clipPath id={clipId}>\n <path\n d=\"M 10.3281 17.7888 l 4.4875 -11.4688 l 0.0019 -0.0006 l 6.075 11.5263 a 0.5238 0.5238 90 0 0 0.9525 -0.0581 l 2.1187 -5.515 a 0.5288 0.5288 90 0 0 -0.025 -0.4288 L 18.9419 2.2531 A 4.1863 4.1863 90 0 0 15.2294 0 h -2.875 a 0.525 0.525 90 0 0 -0.4625 0.7688 l 2.2687 4.3044 l -2.2844 5.7188 l -4.45 -8.5388 A 4.1863 4.1863 90 0 0 3.7138 0 h -2.875 a 0.5262 0.5262 90 0 0 -0.4675 0.7688 L 9.375 17.8462 a 0.5244 0.5244 90 0 0 0.9525 -0.0575 z M 26.495 5.5037 a 0.5219 0.5219 90 0 0 0.2419 -0.2787 v 0.0006 l 1.6687 -4.5188 a 0.5238 0.5238 90 0 0 -0.4906 -0.7056 h -4.1113 a 0.5231 0.5231 90 0 0 -0.46 0.7737 l 2.4419 4.5163 c 0.1375 0.2562 0.4556 0.35 0.7094 0.2125 z M 39.375 0 l 0 18.125 L 34.375 18.125 l 0 -11.875 A 4.1863 4.1863 90 0 0 34.375 18.125 L 34.375 18.125 L 34.375 0 z z\"\n transform=\"rotate(180 23 15)\"\n />\n </clipPath>\n </defs>\n <rect clipPath={`url(#${clipId})`} width=\"100%\" height=\"100%\" />\n {highlight && (\n <g clipPath={`url(#${clipId})`}>\n <rect className={styles.highlight} width=\"100%\" height=\"100%\" />\n </g>\n )}\n </svg>\n );\n }\n);\n"],"names":["Text","children","size","Component","align","weight","secondary","className","rest","jsx","classes","styles","Heading","level","as","clampedLevel","Fragment","Section","forwardRef","ref","List","ordered","ListItem","Divider","lineWidth","lineHeight","notchWidth","notchHeight","collapseDelay","collapsed","notch","light","style","jsxs","cssProps","numToMs","Table","TableRow","TableHead","TableBody","TableHeadCell","TableCell","VisuallyHidden","showOnFocus","visible","Transition","timeout","onEnter","onEntered","onExit","onExited","show","unmount","enterTimeout","useRef","exitTimeout","useEffect","AnimatePresence","TransitionContent","status","setStatus","useState","isPresent","safeToRemove","usePresence","hasEntered","setHasEntered","splitTimeout","actualTimeout","Loader","text","reduceMotion","useReducedMotion","hasMounted","useHasMounted","portalContainer","useRefractConfig","renderScreenReaderTextPortal","container","createPortal","gapSize","spanSize","SvgArrowLeft","props","React","SvgArrowRight","SvgArticles","SvgCheck","SvgChevronRight","SvgClose","SvgCompany","SvgCopy","SvgDownload","SvgError","SvgFigma","SvgGithub","SvgLink","SvgLinkedin","SvgMenu","SvgPause","SvgPlay","SvgSend","SvgSkills","SvgStorybook","SvgTwitter","icons","ArrowLeft","ArrowRight","Article","Company","Check","ChevronRight","Close","Copy","Download","Error","Figma","Github","Link","Linkedin","Menu","Pause","Play","Send","Skills","Storybook","Twitter","Icon","icon","IconComponent","SegmentedControlContext","createContext","SegmentedControl","currentIndex","onChange","label","labelId","useId","optionRefs","indicator","setIndicator","handleKeyDown","event","length","prevIndex","nextIndex","_a","_b","registerOption","useCallback","optionRef","unRegisterOption","currentOption","resizeObserver","rect","left","SegmentedControlOption","useContext","index","isSelected","TextArea","resize","value","minRows","maxRows","rows","setRows","textareaDimensions","setTextareaDimensions","textareaRef","paddingHeight","handleChange","previousRows","currentRows","Input","id","multiline","error","onBlur","autoComplete","required","maxLength","type","placeholder","focused","setFocused","generatedId","errorRef","inputId","errorId","InputElement","handleBlur","msToNum","tokens","VALID_EXT","isAnchor","href","isValidExtension","rel","target","linkComponent","ContextLink","useLinkComponent","RouterLink","isExternal","relValue","targetValue","linkProps","isExternalLink","Button","ButtonContent","loading","loadingText","iconEnd","iconHoverShift","iconOnly","disabled","Breadcrumbs","items","item","isLast","delay","ms","resolve","glyphs","CharType","shuffle","content","output","position","rand","ScrambleReveal","memo","start","startDelay","decoderSpring","useSpring","containerInstance","renderOutput","characterMap","unsubscribeSpring","Image","reveal","raised","baseSrc","srcSet","loaded","setLoaded","themeId","useTheme","containerRef","src","inViewport","useInViewport","getIsVideo","onLoad","ImageElements","alt","play","restartOnPause","sizes","noPauseButton","showPlaceholder","setShowPlaceholder","playing","setPlaying","videoSrc","setVideoSrc","videoInteracted","setVideoInteracted","placeholderRef","videoRef","isVideo","showFullRes","srcSetString","srcSetToString","resolvedVideoSrc","resolveSrcFromSrcSet","playVideo","pauseVideo","togglePlaying","Wordmark","highlight","clipId"],"mappings":"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"}
|
package/dist/model.cjs
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
"use client";"use strict";
|
|
1
|
+
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const J=require("react/jsx-runtime"),P=require("framer-motion"),e=require("react"),O=require("./style-CWBkJEps.cjs"),r=require("three"),te=require("three-stdlib"),z=require("./three-aeLbW1yA.cjs"),he=require("./RefractProvider-Bzz4G22S.cjs"),ne=9;function ge(y=!0){const w=e.useRef(0),v=e.useRef(0),i=e.useRef(0),f=e.useRef([]),b=e.useRef(!1);return e.useEffect(()=>{typeof window>"u"||(v.current=performance.now(),i.current=0,f.current=[])},[y]),{measureFps:e.useCallback(()=>{const L=performance.now();i.current=i.current+1,L>=v.current+100&&(w.current=i.current*100/(L-v.current)*10,f.current.push(w.current),v.current=L,i.current=0),!(f.current.length<=ne)&&(f.current=f.current.slice(-ne),f.current.every(T=>T<60)&&(b.current=!0),f.current.every(T=>T>70)&&(b.current=!1))},[]),fps:w,isLowFps:b}}const ye="_model_1mfwq_1",we="_canvas_1mfwq_10",ce={model:ye,canvas:we},H={SpringUp:"spring-up",LaptopOpen:"laptop-open"},K={phone:"iphone-11.glb",laptop:"macbook-pro.glb"};function oe(y="/models/"){return{phone:{url:`${y}${K.phone}`,width:374,height:512,position:{x:0,y:0,z:0},animation:H.SpringUp},laptop:{url:`${y}${K.laptop}`,width:1280,height:800,position:{x:0,y:0,z:0},animation:H.LaptopOpen}}}const ve=oe(),se={Frame:"Frame",Screen:"Screen"},ae={stiffness:40,damping:20,mass:1.4,restSpeed:.001},Me=({models:y,show:w=!0,showDelay:v=0,cameraPosition:i={x:0,y:0,z:8},style:f,className:b,alt:W,decoderPath:L,...T})=>{const{dracoDecoderPath:D}=he.useRefractConfig(),V=L??D,[A,M]=e.useState(!1),l=e.useRef(null),E=e.useRef(null),t=e.useRef(),a=e.useRef(),u=e.useRef(),n=e.useRef(),m=e.useRef(),R=e.useRef(),d=e.useRef(),p=e.useRef(),o=e.useRef(),c=e.useRef(),x=e.useRef(),S=e.useRef(),k=e.useRef(),g=e.useRef(),j=e.useRef(),N=O.useInViewport(l,!1,{threshold:.2}),Q=P.useReducedMotion(),F=P.useSpring(0,ae),G=P.useSpring(0,ae),{measureFps:ee,isLowFps:re}=ge(N);e.useEffect(()=>{const{clientWidth:s,clientHeight:h}=l.current;n.current=new r.WebGLRenderer({canvas:E.current,alpha:!0,antialias:!1,powerPreference:"high-performance",failIfMajorPerformanceCaveat:!0}),n.current.setPixelRatio(2),n.current.setSize(s,h),n.current.outputColorSpace=r.SRGBColorSpace,t.current=new r.PerspectiveCamera(36,s/h,.1,100),t.current.position.set(i.x,i.y,i.z),u.current=new r.Scene,a.current=new r.Group,u.current.add(a.current);const C=new r.AmbientLight(16777215,1.2),_=new r.DirectionalLight(16777215,1.1),q=new r.DirectionalLight(16777215,.8);q.position.set(-6,2,2),_.position.set(.5,0,.866),k.current=[C,_,q],k.current.forEach(I=>u.current.add(I)),m.current=new r.Group,u.current.add(m.current),m.current.position.set(0,0,-.8),m.current.rotateX(Math.PI/2);const U=512,$=8,Y=8,ie=1.5,ue=.8,le=3;R.current=new r.WebGLRenderTarget(U,U),R.current.texture.generateMipmaps=!1,d.current=new r.WebGLRenderTarget(U,U),d.current.texture.generateMipmaps=!1;const Z=new r.PlaneGeometry($,Y).rotateX(Math.PI/2),de=new r.MeshBasicMaterial({map:R.current.texture,opacity:ue,transparent:!0});S.current=new r.Mesh(Z,de),S.current.scale.y=-1,m.current.add(S.current),g.current=new r.Mesh(Z),g.current.visible=!1,m.current.add(g.current);const pe=new r.MeshBasicMaterial({color:16777215,opacity:0,transparent:!0});j.current=new r.Mesh(Z,pe),j.current.rotateX(Math.PI),j.current.position.y-=1e-5,m.current.add(j.current),p.current=new r.OrthographicCamera(-$/2,$/2,Y/2,-Y/2,0,ie),p.current.rotation.x=Math.PI/2,m.current.add(p.current),o.current=new r.MeshDepthMaterial,o.current.userData.darkness={value:le},o.current.onBeforeCompile=I=>{I.uniforms.darkness=o.current.userData.darkness,I.fragmentShader=`
|
|
2
|
+
uniform float darkness;
|
|
3
|
+
${I.fragmentShader.replace("gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );","gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * darkness );")}
|
|
4
|
+
`},o.current.depthTest=!1,o.current.depthWrite=!1,c.current=new r.ShaderMaterial(te.HorizontalBlurShader),c.current.depthTest=!1,x.current=new r.ShaderMaterial(te.VerticalBlurShader),x.current.depthTest=!1;const fe=F.onChange(B),me=G.onChange(B);return()=>{R.current.dispose(),d.current.dispose(),z.removeLights(k.current),z.cleanScene(u.current),z.cleanRenderer(n.current),fe(),me()}},[]);const X=e.useCallback(s=>{g.current.visible=!0,g.current.material=c.current,g.current.material.uniforms.tDiffuse.value=R.current.texture,c.current.uniforms.h.value=s*(1/256),n.current.setRenderTarget(d.current),n.current.render(g.current,p.current),g.current.material=x.current,g.current.material.uniforms.tDiffuse.value=d.current.texture,x.current.uniforms.v.value=s*(1/256),n.current.setRenderTarget(R.current),n.current.render(g.current,p.current),g.current.visible=!1},[]),B=e.useCallback(()=>{const h=u.current.background;u.current.background=null,u.current.overrideMaterial=o.current,n.current.setRenderTarget(R.current),n.current.render(u.current,p.current),u.current.overrideMaterial=null,X(5),X(5*.4),n.current.setRenderTarget(null),u.current.background=h,a.current.rotation.x=F.get(),a.current.rotation.y=G.get(),n.current.render(u.current,t.current),ee(),re.current?n.current.setPixelRatio(1):n.current.setPixelRatio(2)},[X,re,ee,F,G]);return e.useEffect(()=>{const s=h=>{const{innerWidth:C,innerHeight:_}=window,q={x:(h.clientX-C/2)/C,y:(h.clientY-_/2)/_};G.set(q.x/2),F.set(q.y/2)};return N&&!Q&&window.addEventListener("mousemove",s),()=>{window.removeEventListener("mousemove",s)}},[N,Q,F,G]),e.useEffect(()=>{const s=()=>{if(!l.current)return;const{clientWidth:h,clientHeight:C}=l.current;n.current.setSize(h,C),t.current.aspect=h/C,t.current.updateProjectionMatrix(),B()};return window.addEventListener("resize",s),s(),()=>{window.removeEventListener("resize",s)}},[B]),J.jsxs("div",{className:O.classes(ce.model,b),"data-loaded":A,style:O.cssProps({delay:O.numToMs(v)},f),ref:l,role:"img","aria-label":W,...T,children:[J.jsx("canvas",{className:ce.canvas,ref:E}),y.map((s,h)=>J.jsx(Re,{renderer:n,modelGroup:a,show:w,showDelay:v,renderFrame:B,index:h,setLoaded:M,model:s,decoderPath:V},JSON.stringify(s.position)))]})},Re=({renderer:y,model:w,modelGroup:v,renderFrame:i,index:f,showDelay:b,setLoaded:W,show:L,decoderPath:T})=>{const[D,V]=e.useState(),A=P.useReducedMotion(),M=e.createRef();return e.useEffect(()=>{const l=async(t,a)=>{t.colorSpace=r.SRGBColorSpace,t.flipY=!1,t.anisotropy=y.current.capabilities.getMaxAnisotropy(),t.generateMipmaps=!1,await y.current.initTexture(t),a.material.color=new r.Color(16777215),a.material.transparent=!0,a.material.map=t};V({start:async()=>{const{texture:t,position:a,url:u}=w;let n=async()=>{},m=()=>{};const[R,d]=await Promise.all([z.textureLoader.loadAsync(typeof t.placeholder=="string"?t.placeholder:t.placeholder.src),z.getModelLoader(T).loadAsync(u)]);v.current.add(d.scene),d.scene.traverse(async o=>{const c=o;c.material&&(c.material.color=new r.Color(2039845)),c.name===se.Screen&&(M.current=c.clone(),M.current.material=c.material.clone(),c.parent.add(M.current),M.current.material.opacity=1,M.current.position.z+=.001,l(R,M.current),n=async()=>{const x=await O.resolveSrcFromSrcSet({srcSet:t.srcSet,sizes:t.sizes}),S=await z.textureLoader.loadAsync(x);await l(S,c),P.animate(1,0,{onUpdate:k=>{M.current.material.opacity=k,i()}})})});const p=new r.Vector3(a.x,a.y,a.z);return A&&d.scene.position.set(...p.toArray()),w.animation===H.SpringUp&&(m=()=>{const o=new r.Vector3(p.x,p.y-1,p.z);d.scene.position.set(...o.toArray()),P.animate(o.y,p.y,{type:"spring",delay:(300*f+b)/1e3,stiffness:60,damping:20,mass:1,restSpeed:1e-4,restDelta:1e-4,onUpdate:c=>{d.scene.position.y=c,i()}})}),w.animation===H.LaptopOpen&&(m=()=>{const o=d.scene.children.find(S=>S.name===se.Frame),c=new r.Vector3(r.MathUtils.degToRad(90),0,0),x=new r.Vector3(0,0,0);return d.scene.position.set(...p.toArray()),o.rotation.set(...c.toArray()),P.animate(c.x,x.x,{type:"spring",delay:(300*f+b+300)/1e3,stiffness:80,damping:20,restSpeed:1e-4,restDelta:1e-4,onUpdate:S=>{o.rotation.x=S,i()}})}),{loadFullResTexture:n,playAnimation:m}}})},[]),e.useEffect(()=>{if(!D||!L)return;let l;const E=async()=>{const{loadFullResTexture:t,playAnimation:a}=await D.start();W(!0),A||(l=a()),await t(),A&&i()};return e.startTransition(()=>{E()}),()=>{l==null||l.stop()}},[D,L]),null};exports.MODEL_FILES=K;exports.Model=Me;exports.ModelAnimationType=H;exports.createDeviceModels=oe;exports.deviceModels=ve;
|
|
2
5
|
//# sourceMappingURL=model.cjs.map
|
package/dist/model.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"model.cjs","sources":["../src/hooks/useFps.ts","../src/components/Model/deviceModels.ts","../src/components/Model/Model.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, type MutableRefObject } from 'react';\n\nconst HISTORY_LENGTH = 9;\n\ninterface UseFpsReturn {\n measureFps: () => void;\n fps: MutableRefObject<number>;\n isLowFps: MutableRefObject<boolean>;\n}\n\nexport function useFps(running = true): UseFpsReturn {\n const fps = useRef(0);\n const prevTime = useRef(0);\n const frames = useRef(0);\n const frameHistory = useRef<number[]>([]);\n const isLowFps = useRef(false);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n prevTime.current = performance.now();\n frames.current = 0;\n frameHistory.current = [];\n }, [running]);\n\n const measureFps = useCallback(() => {\n const currentTime = performance.now();\n frames.current = frames.current + 1;\n\n // Measure fps every 100ms\n if (currentTime >= prevTime.current + 100) {\n fps.current = ((frames.current * 100) / (currentTime - prevTime.current)) * 10;\n frameHistory.current.push(fps.current);\n prevTime.current = currentTime;\n frames.current = 0;\n }\n\n if (frameHistory.current.length <= HISTORY_LENGTH) return;\n frameHistory.current = frameHistory.current.slice(-HISTORY_LENGTH);\n\n // Below 60 is considered low fps\n if (frameHistory.current.every(item => item < 60)) {\n isLowFps.current = true;\n }\n\n if (frameHistory.current.every(item => item > 70)) {\n isLowFps.current = false;\n }\n }, []);\n\n return { measureFps, fps, isLowFps };\n}\n","export const ModelAnimationType = {\n SpringUp: 'spring-up',\n LaptopOpen: 'laptop-open',\n} as const;\n\nexport type ModelAnimationTypeValue = typeof ModelAnimationType[keyof typeof ModelAnimationType];\n\nexport interface DeviceModelConfig {\n url: string;\n width: number;\n height: number;\n position: { x: number; y: number; z: number };\n animation: ModelAnimationTypeValue;\n}\n\n/** The device model filenames this module knows how to serve, relative to `basePath`. */\nexport const MODEL_FILES = {\n phone: 'iphone-11.glb',\n laptop: 'macbook-pro.glb',\n} as const;\n\n/**\n * Builds the device model config, resolving each model's `.glb` against\n * `basePath` rather than bundling it — so the host app controls where the\n * files are served from (defaults to `/models/`, matching `public/models/`).\n */\nexport function createDeviceModels(basePath = '/models/'): Record<string, DeviceModelConfig> {\n return {\n phone: {\n url: `${basePath}${MODEL_FILES.phone}`,\n width: 374,\n height: 512,\n position: { x: 0, y: 0, z: 0 },\n animation: ModelAnimationType.SpringUp,\n },\n laptop: {\n url: `${basePath}${MODEL_FILES.laptop}`,\n width: 1280,\n height: 800,\n position: { x: 0, y: 0, z: 0 },\n animation: ModelAnimationType.LaptopOpen,\n },\n };\n}\n\n/** Convenience export for the default `/models/` layout. */\nexport const deviceModels: Record<string, DeviceModelConfig> = createDeviceModels();\n","import { useRefractConfig } from '../RefractProvider';\nimport { animate, useReducedMotion, useSpring } from 'framer-motion';\nimport { useFps } from '../../hooks/useFps';\nimport { useInViewport } from '../../hooks/useInViewport';\nimport {\n createRef,\n startTransition,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport type { CSSProperties, HTMLAttributes, RefObject } from 'react';\nimport {\n AmbientLight,\n Color,\n DirectionalLight,\n Group,\n MathUtils,\n Mesh,\n MeshBasicMaterial,\n MeshDepthMaterial,\n OrthographicCamera,\n PerspectiveCamera,\n PlaneGeometry,\n Scene,\n ShaderMaterial,\n SRGBColorSpace,\n Vector3,\n WebGLRenderTarget,\n WebGLRenderer,\n} from 'three';\nimport type { Light, Texture } from 'three';\nimport { HorizontalBlurShader, VerticalBlurShader } from 'three-stdlib';\nimport { resolveSrcFromSrcSet } from '../../utils/image';\nimport { classes, cssProps, numToMs } from '../../utils/style';\nimport {\n cleanRenderer,\n cleanScene,\n getModelLoader,\n removeLights,\n textureLoader,\n} from '../../utils/three';\nimport styles from './Model.module.css';\nimport { ModelAnimationType } from './deviceModels';\nimport type { ModelAnimationTypeValue } from './deviceModels';\n\nconst MeshType = {\n Frame: 'Frame',\n Logo: 'Logo',\n Screen: 'Screen',\n} as const;\n\nconst rotationSpringConfig = {\n stiffness: 40,\n damping: 20,\n mass: 1.4,\n restSpeed: 0.001,\n};\n\ninterface ImageLike {\n src: string;\n width?: number;\n height?: number;\n}\n\ninterface ModelTexture {\n placeholder: string | ImageLike;\n srcSet?: (string | ImageLike)[];\n src?: ImageLike;\n sizes?: string;\n}\n\ninterface ModelConfig {\n texture: ModelTexture;\n position: { x: number; y: number; z: number };\n url: string;\n animation: ModelAnimationTypeValue;\n}\n\ninterface ModelProps extends HTMLAttributes<HTMLDivElement> {\n models: ModelConfig[];\n show?: boolean;\n showDelay?: number;\n cameraPosition?: { x: number; y: number; z: number };\n style?: CSSProperties;\n className?: string;\n alt?: string;\n /** Path to the draco decoder assets, e.g. served at /draco/. */\n decoderPath?: string;\n}\n\nexport const Model = ({\n models,\n show = true,\n showDelay = 0,\n cameraPosition = { x: 0, y: 0, z: 8 },\n style,\n className,\n alt,\n decoderPath,\n ...rest\n}: ModelProps) => {\n const { dracoDecoderPath } = useRefractConfig();\n const resolvedDecoderPath = decoderPath ?? dracoDecoderPath;\n const [loaded, setLoaded] = useState(false);\n const container = useRef<HTMLDivElement>(null);\n const canvas = useRef<HTMLCanvasElement>(null);\n const camera = useRef<PerspectiveCamera>();\n const modelGroup = useRef<Group>();\n const scene = useRef<Scene>();\n const renderer = useRef<WebGLRenderer>();\n const shadowGroup = useRef<Group>();\n const renderTarget = useRef<WebGLRenderTarget>();\n const renderTargetBlur = useRef<WebGLRenderTarget>();\n const shadowCamera = useRef<OrthographicCamera>();\n const depthMaterial = useRef<MeshDepthMaterial>();\n const horizontalBlurMaterial = useRef<ShaderMaterial>();\n const verticalBlurMaterial = useRef<ShaderMaterial>();\n const plane = useRef<Mesh>();\n const lights = useRef<Light[]>();\n const blurPlane = useRef<Mesh>();\n const fillPlane = useRef<Mesh>();\n const isInViewport = useInViewport(container, false, { threshold: 0.2 });\n const reduceMotion = useReducedMotion();\n const rotationX = useSpring(0, rotationSpringConfig);\n const rotationY = useSpring(0, rotationSpringConfig);\n const { measureFps, isLowFps } = useFps(isInViewport);\n\n useEffect(() => {\n const { clientWidth, clientHeight } = container.current!;\n\n renderer.current = new WebGLRenderer({\n canvas: canvas.current!,\n alpha: true,\n antialias: false,\n powerPreference: 'high-performance',\n failIfMajorPerformanceCaveat: true,\n });\n\n renderer.current.setPixelRatio(2);\n renderer.current.setSize(clientWidth, clientHeight);\n renderer.current.outputColorSpace = SRGBColorSpace;\n\n camera.current = new PerspectiveCamera(36, clientWidth / clientHeight, 0.1, 100);\n camera.current.position.set(cameraPosition.x, cameraPosition.y, cameraPosition.z);\n scene.current = new Scene();\n\n modelGroup.current = new Group();\n scene.current.add(modelGroup.current);\n\n const ambientLight = new AmbientLight(0xffffff, 1.2);\n const keyLight = new DirectionalLight(0xffffff, 1.1);\n const fillLight = new DirectionalLight(0xffffff, 0.8);\n\n fillLight.position.set(-6, 2, 2);\n keyLight.position.set(0.5, 0, 0.866);\n lights.current = [ambientLight, keyLight, fillLight];\n lights.current.forEach(light => scene.current!.add(light));\n\n shadowGroup.current = new Group();\n scene.current.add(shadowGroup.current);\n shadowGroup.current.position.set(0, 0, -0.8);\n shadowGroup.current.rotateX(Math.PI / 2);\n\n const renderTargetSize = 512;\n const planeWidth = 8;\n const planeHeight = 8;\n const cameraHeight = 1.5;\n const shadowOpacity = 0.8;\n const shadowDarkness = 3;\n\n renderTarget.current = new WebGLRenderTarget(renderTargetSize, renderTargetSize);\n renderTarget.current.texture.generateMipmaps = false;\n\n renderTargetBlur.current = new WebGLRenderTarget(renderTargetSize, renderTargetSize);\n renderTargetBlur.current.texture.generateMipmaps = false;\n\n const planeGeometry = new PlaneGeometry(planeWidth, planeHeight).rotateX(\n Math.PI / 2\n );\n\n const planeMaterial = new MeshBasicMaterial({\n map: renderTarget.current.texture,\n opacity: shadowOpacity,\n transparent: true,\n });\n\n plane.current = new Mesh(planeGeometry, planeMaterial);\n plane.current.scale.y = -1;\n shadowGroup.current.add(plane.current);\n\n blurPlane.current = new Mesh(planeGeometry);\n blurPlane.current.visible = false;\n shadowGroup.current.add(blurPlane.current);\n\n const fillMaterial = new MeshBasicMaterial({\n color: 0xffffff,\n opacity: 0,\n transparent: true,\n });\n\n fillPlane.current = new Mesh(planeGeometry, fillMaterial);\n fillPlane.current.rotateX(Math.PI);\n fillPlane.current.position.y -= 0.00001;\n shadowGroup.current.add(fillPlane.current);\n\n shadowCamera.current = new OrthographicCamera(\n -planeWidth / 2,\n planeWidth / 2,\n planeHeight / 2,\n -planeHeight / 2,\n 0,\n cameraHeight\n );\n shadowCamera.current.rotation.x = Math.PI / 2;\n shadowGroup.current.add(shadowCamera.current);\n\n depthMaterial.current = new MeshDepthMaterial();\n depthMaterial.current.userData.darkness = { value: shadowDarkness };\n depthMaterial.current.onBeforeCompile = shader => {\n shader.uniforms.darkness = depthMaterial.current!.userData.darkness;\n shader.fragmentShader = `\n uniform float darkness;\n ${shader.fragmentShader.replace(\n 'gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );',\n 'gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * darkness );'\n )}\n `;\n };\n depthMaterial.current.depthTest = false;\n depthMaterial.current.depthWrite = false;\n\n horizontalBlurMaterial.current = new ShaderMaterial(HorizontalBlurShader);\n horizontalBlurMaterial.current.depthTest = false;\n\n verticalBlurMaterial.current = new ShaderMaterial(VerticalBlurShader);\n verticalBlurMaterial.current.depthTest = false;\n\n // eslint-disable-next-line react-hooks/immutability\n const unsubscribeX = rotationX.onChange(renderFrame);\n const unsubscribeY = rotationY.onChange(renderFrame);\n\n return () => {\n renderTarget.current!.dispose();\n renderTargetBlur.current!.dispose();\n removeLights(lights.current!);\n cleanScene(scene.current!);\n cleanRenderer(renderer.current!);\n unsubscribeX();\n unsubscribeY();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const blurShadow = useCallback((amount: number) => {\n blurPlane.current!.visible = true;\n\n blurPlane.current!.material = horizontalBlurMaterial.current!;\n (blurPlane.current!.material as ShaderMaterial).uniforms.tDiffuse.value = renderTarget.current!.texture;\n horizontalBlurMaterial.current!.uniforms.h.value = amount * (1 / 256);\n\n renderer.current!.setRenderTarget(renderTargetBlur.current!);\n renderer.current!.render(blurPlane.current!, shadowCamera.current!);\n\n blurPlane.current!.material = verticalBlurMaterial.current!;\n (blurPlane.current!.material as ShaderMaterial).uniforms.tDiffuse.value = renderTargetBlur.current!.texture;\n verticalBlurMaterial.current!.uniforms.v.value = amount * (1 / 256);\n\n renderer.current!.setRenderTarget(renderTarget.current!);\n renderer.current!.render(blurPlane.current!, shadowCamera.current!);\n\n blurPlane.current!.visible = false;\n }, []);\n\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n const renderFrame = useCallback(() => {\n const blurAmount = 5;\n\n const initialBackground = scene.current!.background;\n scene.current!.background = null;\n\n scene.current!.overrideMaterial = depthMaterial.current!;\n\n renderer.current!.setRenderTarget(renderTarget.current!);\n renderer.current!.render(scene.current!, shadowCamera.current!);\n\n scene.current!.overrideMaterial = null;\n\n blurShadow(blurAmount);\n\n blurShadow(blurAmount * 0.4);\n\n renderer.current!.setRenderTarget(null);\n scene.current!.background = initialBackground;\n\n modelGroup.current!.rotation.x = rotationX.get();\n modelGroup.current!.rotation.y = rotationY.get();\n\n renderer.current!.render(scene.current!, camera.current!);\n measureFps();\n\n if (isLowFps.current) {\n renderer.current!.setPixelRatio(1);\n } else {\n renderer.current!.setPixelRatio(2);\n }\n }, [blurShadow, isLowFps, measureFps, rotationX, rotationY]);\n\n useEffect(() => {\n const onMouseMove = (event: globalThis.MouseEvent) => {\n const { innerWidth, innerHeight } = window;\n\n const position = {\n x: (event.clientX - innerWidth / 2) / innerWidth,\n y: (event.clientY - innerHeight / 2) / innerHeight,\n };\n\n rotationY.set(position.x / 2);\n rotationX.set(position.y / 2);\n };\n\n if (isInViewport && !reduceMotion) {\n window.addEventListener('mousemove', onMouseMove);\n }\n\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n };\n }, [isInViewport, reduceMotion, rotationX, rotationY]);\n\n useEffect(() => {\n const handleResize = () => {\n if (!container.current) return;\n\n const { clientWidth, clientHeight } = container.current;\n\n renderer.current!.setSize(clientWidth, clientHeight);\n camera.current!.aspect = clientWidth / clientHeight;\n camera.current!.updateProjectionMatrix();\n\n renderFrame();\n };\n\n window.addEventListener('resize', handleResize);\n handleResize();\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [renderFrame]);\n\n return (\n <div\n className={classes(styles.model, className)}\n data-loaded={loaded}\n style={cssProps({ delay: numToMs(showDelay) }, style)}\n ref={container}\n role=\"img\"\n aria-label={alt}\n {...rest}\n >\n <canvas className={styles.canvas} ref={canvas} />\n {models.map((model, index) => (\n <Device\n key={JSON.stringify(model.position)}\n renderer={renderer}\n modelGroup={modelGroup}\n show={show}\n showDelay={showDelay}\n renderFrame={renderFrame}\n index={index}\n setLoaded={setLoaded}\n model={model}\n decoderPath={resolvedDecoderPath}\n />\n ))}\n </div>\n );\n};\n\ninterface DeviceProps {\n renderer: RefObject<WebGLRenderer | undefined>;\n model: ModelConfig;\n modelGroup: RefObject<Group | undefined>;\n renderFrame: () => void;\n index: number;\n showDelay: number;\n setLoaded: (loaded: boolean) => void;\n show: boolean;\n decoderPath?: string;\n}\n\ninterface LoadResult {\n loadFullResTexture: () => Promise<void>;\n playAnimation: () => { stop: () => void } | void;\n}\n\nconst Device = ({\n renderer,\n model,\n modelGroup,\n renderFrame,\n index,\n showDelay,\n setLoaded,\n show,\n decoderPath,\n}: DeviceProps) => {\n const [loadDevice, setLoadDevice] = useState<{ start: () => Promise<LoadResult> }>();\n const reduceMotion = useReducedMotion();\n const placeholderScreen = createRef<Mesh>();\n\n useEffect(() => {\n const applyScreenTexture = async (texture: Texture, node: Mesh) => {\n texture.colorSpace = SRGBColorSpace;\n texture.flipY = false;\n texture.anisotropy = renderer.current!.capabilities.getMaxAnisotropy();\n texture.generateMipmaps = false;\n\n await renderer.current!.initTexture(texture);\n\n (node.material as MeshBasicMaterial).color = new Color(0xffffff);\n (node.material as MeshBasicMaterial).transparent = true;\n (node.material as MeshBasicMaterial).map = texture;\n };\n\n const load = async (): Promise<LoadResult> => {\n const { texture, position, url } = model;\n let loadFullResTexture: () => Promise<void> = async () => {};\n let playAnimation: () => { stop: () => void } | void = () => {};\n\n const [placeholder, gltf] = await Promise.all([\n textureLoader.loadAsync(\n typeof texture.placeholder === 'string' ? texture.placeholder : texture.placeholder.src\n ),\n getModelLoader(decoderPath).loadAsync(url),\n ]);\n\n modelGroup.current!.add(gltf.scene);\n\n gltf.scene.traverse(async (node: unknown) => {\n const meshNode = node as Mesh;\n if (meshNode.material) {\n (meshNode.material as MeshBasicMaterial).color = new Color(0x1f2025);\n }\n\n if (meshNode.name === MeshType.Screen) {\n (placeholderScreen as { current: Mesh | null }).current = meshNode.clone();\n (placeholderScreen.current!.material as MeshBasicMaterial) = (meshNode.material as MeshBasicMaterial).clone();\n meshNode.parent!.add(placeholderScreen.current!);\n (placeholderScreen.current!.material as MeshBasicMaterial).opacity = 1;\n placeholderScreen.current!.position.z += 0.001;\n\n applyScreenTexture(placeholder, placeholderScreen.current!);\n\n loadFullResTexture = async () => {\n const image = await resolveSrcFromSrcSet({\n srcSet: texture.srcSet as unknown as string | { src: string; width: number }[],\n sizes: texture.sizes,\n });\n const fullSize = await textureLoader.loadAsync(image);\n await applyScreenTexture(fullSize, meshNode);\n\n animate(1, 0, {\n onUpdate: (value: number) => {\n (placeholderScreen.current!.material as MeshBasicMaterial).opacity = value;\n renderFrame();\n },\n });\n };\n }\n });\n\n const targetPosition = new Vector3(position.x, position.y, position.z);\n\n if (reduceMotion) {\n gltf.scene.position.set(...targetPosition.toArray());\n }\n\n if (model.animation === ModelAnimationType.SpringUp) {\n playAnimation = () => {\n const startPosition = new Vector3(\n targetPosition.x,\n targetPosition.y - 1,\n targetPosition.z\n );\n\n gltf.scene.position.set(...startPosition.toArray());\n\n animate(startPosition.y, targetPosition.y, {\n type: 'spring',\n delay: (300 * index + showDelay) / 1000,\n stiffness: 60,\n damping: 20,\n mass: 1,\n restSpeed: 0.0001,\n restDelta: 0.0001,\n onUpdate: (value: number) => {\n gltf.scene.position.y = value;\n renderFrame();\n },\n });\n };\n }\n\n if (model.animation === ModelAnimationType.LaptopOpen) {\n playAnimation = () => {\n const frameNode = gltf.scene.children.find(\n (child: { name: string }) => child.name === MeshType.Frame\n )!;\n const startRotation = new Vector3(MathUtils.degToRad(90), 0, 0);\n const endRotation = new Vector3(0, 0, 0);\n\n gltf.scene.position.set(...targetPosition.toArray());\n frameNode.rotation.set(...startRotation.toArray());\n\n return animate(startRotation.x, endRotation.x, {\n type: 'spring',\n delay: (300 * index + showDelay + 300) / 1000,\n stiffness: 80,\n damping: 20,\n restSpeed: 0.0001,\n restDelta: 0.0001,\n onUpdate: (value: number) => {\n frameNode.rotation.x = value;\n renderFrame();\n },\n });\n };\n }\n\n return { loadFullResTexture, playAnimation };\n };\n\n setLoadDevice({ start: load });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (!loadDevice || !show) return;\n let animation: { stop: () => void } | void;\n\n const onLoad = async () => {\n const { loadFullResTexture, playAnimation } = await loadDevice.start();\n\n setLoaded(true);\n\n if (!reduceMotion) {\n animation = playAnimation();\n }\n\n await loadFullResTexture();\n\n if (reduceMotion) {\n renderFrame();\n }\n };\n\n startTransition(() => {\n onLoad();\n });\n\n return () => {\n animation?.stop();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadDevice, show]);\n\n return null;\n};\n"],"names":["HISTORY_LENGTH","useFps","running","fps","useRef","prevTime","frames","frameHistory","isLowFps","useEffect","useCallback","currentTime","item","ModelAnimationType","MODEL_FILES","createDeviceModels","basePath","deviceModels","MeshType","rotationSpringConfig","Model","models","show","showDelay","cameraPosition","style","className","alt","decoderPath","rest","dracoDecoderPath","useRefractConfig","resolvedDecoderPath","loaded","setLoaded","useState","container","canvas","camera","modelGroup","scene","renderer","shadowGroup","renderTarget","renderTargetBlur","shadowCamera","depthMaterial","horizontalBlurMaterial","verticalBlurMaterial","plane","lights","blurPlane","fillPlane","isInViewport","useInViewport","reduceMotion","useReducedMotion","rotationX","useSpring","rotationY","measureFps","clientWidth","clientHeight","WebGLRenderer","SRGBColorSpace","PerspectiveCamera","Scene","Group","ambientLight","AmbientLight","keyLight","DirectionalLight","fillLight","light","renderTargetSize","planeWidth","planeHeight","cameraHeight","shadowOpacity","shadowDarkness","WebGLRenderTarget","planeGeometry","PlaneGeometry","planeMaterial","MeshBasicMaterial","Mesh","fillMaterial","OrthographicCamera","MeshDepthMaterial","shader","ShaderMaterial","HorizontalBlurShader","VerticalBlurShader","unsubscribeX","renderFrame","unsubscribeY","removeLights","cleanScene","cleanRenderer","blurShadow","amount","initialBackground","onMouseMove","event","innerWidth","innerHeight","position","handleResize","jsxs","classes","styles","cssProps","numToMs","jsx","model","index","Device","loadDevice","setLoadDevice","placeholderScreen","createRef","applyScreenTexture","texture","node","Color","url","loadFullResTexture","playAnimation","placeholder","gltf","textureLoader","getModelLoader","meshNode","image","resolveSrcFromSrcSet","fullSize","animate","value","targetPosition","Vector3","startPosition","frameNode","child","startRotation","MathUtils","endRotation","animation","onLoad","startTransition"],"mappings":"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"}
|
package/dist/model.js
CHANGED
|
@@ -1,2 +1,269 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { jsxs as Te, jsx as re } from "react/jsx-runtime";
|
|
3
|
+
import { useReducedMotion as he, useSpring as te, animate as q } from "framer-motion";
|
|
4
|
+
import { useRef as e, useEffect as z, useCallback as J, useState as ge, createRef as Re, startTransition as ze } from "react";
|
|
5
|
+
import { u as Pe, c as Ce, n as Ae, a as De, r as ke } from "./style-uMN7vipQ.js";
|
|
6
|
+
import { WebGLRenderer as Fe, SRGBColorSpace as we, PerspectiveCamera as _e, Scene as Be, Group as ne, AmbientLight as Ee, DirectionalLight as ae, WebGLRenderTarget as oe, PlaneGeometry as Ge, MeshBasicMaterial as ce, Mesh as Z, OrthographicCamera as He, MeshDepthMaterial as Ie, ShaderMaterial as se, Color as ie, Vector3 as U, MathUtils as Oe } from "three";
|
|
7
|
+
import { HorizontalBlurShader as Ue, VerticalBlurShader as We } from "three-stdlib";
|
|
8
|
+
import { r as Ne, c as Xe, a as Ye, t as ue, g as $e } from "./three-CWsiEOQZ.js";
|
|
9
|
+
import { u as je } from "./RefractProvider-D__A8gQl.js";
|
|
10
|
+
const le = 9;
|
|
11
|
+
function Ve(g = !0) {
|
|
12
|
+
const w = e(0), y = e(0), s = e(0), d = e([]), x = e(!1);
|
|
13
|
+
return z(() => {
|
|
14
|
+
typeof window > "u" || (y.current = performance.now(), s.current = 0, d.current = []);
|
|
15
|
+
}, [g]), { measureFps: J(() => {
|
|
16
|
+
const L = performance.now();
|
|
17
|
+
s.current = s.current + 1, L >= y.current + 100 && (w.current = s.current * 100 / (L - y.current) * 10, d.current.push(w.current), y.current = L, s.current = 0), !(d.current.length <= le) && (d.current = d.current.slice(-le), d.current.every((T) => T < 60) && (x.current = !0), d.current.every((T) => T > 70) && (x.current = !1));
|
|
18
|
+
}, []), fps: w, isLowFps: x };
|
|
19
|
+
}
|
|
20
|
+
const qe = "_model_1mfwq_1", Ze = "_canvas_1mfwq_10", pe = {
|
|
21
|
+
model: qe,
|
|
22
|
+
canvas: Ze
|
|
23
|
+
}, W = {
|
|
24
|
+
SpringUp: "spring-up",
|
|
25
|
+
LaptopOpen: "laptop-open"
|
|
26
|
+
}, de = {
|
|
27
|
+
phone: "iphone-11.glb",
|
|
28
|
+
laptop: "macbook-pro.glb"
|
|
29
|
+
};
|
|
30
|
+
function Je(g = "/models/") {
|
|
31
|
+
return {
|
|
32
|
+
phone: {
|
|
33
|
+
url: `${g}${de.phone}`,
|
|
34
|
+
width: 374,
|
|
35
|
+
height: 512,
|
|
36
|
+
position: { x: 0, y: 0, z: 0 },
|
|
37
|
+
animation: W.SpringUp
|
|
38
|
+
},
|
|
39
|
+
laptop: {
|
|
40
|
+
url: `${g}${de.laptop}`,
|
|
41
|
+
width: 1280,
|
|
42
|
+
height: 800,
|
|
43
|
+
position: { x: 0, y: 0, z: 0 },
|
|
44
|
+
animation: W.LaptopOpen
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const sr = Je(), me = {
|
|
49
|
+
Frame: "Frame",
|
|
50
|
+
Screen: "Screen"
|
|
51
|
+
}, fe = {
|
|
52
|
+
stiffness: 40,
|
|
53
|
+
damping: 20,
|
|
54
|
+
mass: 1.4,
|
|
55
|
+
restSpeed: 1e-3
|
|
56
|
+
}, ir = ({
|
|
57
|
+
models: g,
|
|
58
|
+
show: w = !0,
|
|
59
|
+
showDelay: y = 0,
|
|
60
|
+
cameraPosition: s = { x: 0, y: 0, z: 8 },
|
|
61
|
+
style: d,
|
|
62
|
+
className: x,
|
|
63
|
+
alt: H,
|
|
64
|
+
decoderPath: L,
|
|
65
|
+
...T
|
|
66
|
+
}) => {
|
|
67
|
+
const { dracoDecoderPath: P } = je(), N = L ?? P, [C, v] = ge(!1), u = e(null), A = e(null), r = e(), o = e(), i = e(), t = e(), m = e(), S = e(), l = e(), p = e(), c = e(), n = e(), b = e(), M = e(), D = e(), h = e(), I = e(), X = Pe(u, !1, { threshold: 0.2 }), K = he(), k = te(0, fe), F = te(0, fe), { measureFps: Q, isLowFps: ee } = Ve(X);
|
|
68
|
+
z(() => {
|
|
69
|
+
const { clientWidth: a, clientHeight: f } = u.current;
|
|
70
|
+
t.current = new Fe({
|
|
71
|
+
canvas: A.current,
|
|
72
|
+
alpha: !0,
|
|
73
|
+
antialias: !1,
|
|
74
|
+
powerPreference: "high-performance",
|
|
75
|
+
failIfMajorPerformanceCaveat: !0
|
|
76
|
+
}), t.current.setPixelRatio(2), t.current.setSize(a, f), t.current.outputColorSpace = we, r.current = new _e(36, a / f, 0.1, 100), r.current.position.set(s.x, s.y, s.z), i.current = new Be(), o.current = new ne(), i.current.add(o.current);
|
|
77
|
+
const R = new Ee(16777215, 1.2), B = new ae(16777215, 1.1), E = new ae(16777215, 0.8);
|
|
78
|
+
E.position.set(-6, 2, 2), B.position.set(0.5, 0, 0.866), D.current = [R, B, E], D.current.forEach((G) => i.current.add(G)), m.current = new ne(), i.current.add(m.current), m.current.position.set(0, 0, -0.8), m.current.rotateX(Math.PI / 2);
|
|
79
|
+
const O = 512, $ = 8, j = 8, ye = 1.5, ve = 0.8, Se = 3;
|
|
80
|
+
S.current = new oe(O, O), S.current.texture.generateMipmaps = !1, l.current = new oe(O, O), l.current.texture.generateMipmaps = !1;
|
|
81
|
+
const V = new Ge($, j).rotateX(
|
|
82
|
+
Math.PI / 2
|
|
83
|
+
), Me = new ce({
|
|
84
|
+
map: S.current.texture,
|
|
85
|
+
opacity: ve,
|
|
86
|
+
transparent: !0
|
|
87
|
+
});
|
|
88
|
+
M.current = new Z(V, Me), M.current.scale.y = -1, m.current.add(M.current), h.current = new Z(V), h.current.visible = !1, m.current.add(h.current);
|
|
89
|
+
const xe = new ce({
|
|
90
|
+
color: 16777215,
|
|
91
|
+
opacity: 0,
|
|
92
|
+
transparent: !0
|
|
93
|
+
});
|
|
94
|
+
I.current = new Z(V, xe), I.current.rotateX(Math.PI), I.current.position.y -= 1e-5, m.current.add(I.current), p.current = new He(
|
|
95
|
+
-$ / 2,
|
|
96
|
+
$ / 2,
|
|
97
|
+
j / 2,
|
|
98
|
+
-j / 2,
|
|
99
|
+
0,
|
|
100
|
+
ye
|
|
101
|
+
), p.current.rotation.x = Math.PI / 2, m.current.add(p.current), c.current = new Ie(), c.current.userData.darkness = { value: Se }, c.current.onBeforeCompile = (G) => {
|
|
102
|
+
G.uniforms.darkness = c.current.userData.darkness, G.fragmentShader = `
|
|
103
|
+
uniform float darkness;
|
|
104
|
+
${G.fragmentShader.replace(
|
|
105
|
+
"gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );",
|
|
106
|
+
"gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * darkness );"
|
|
107
|
+
)}
|
|
108
|
+
`;
|
|
109
|
+
}, c.current.depthTest = !1, c.current.depthWrite = !1, n.current = new se(Ue), n.current.depthTest = !1, b.current = new se(We), b.current.depthTest = !1;
|
|
110
|
+
const Le = k.onChange(_), be = F.onChange(_);
|
|
111
|
+
return () => {
|
|
112
|
+
S.current.dispose(), l.current.dispose(), Ne(D.current), Xe(i.current), Ye(t.current), Le(), be();
|
|
113
|
+
};
|
|
114
|
+
}, []);
|
|
115
|
+
const Y = J((a) => {
|
|
116
|
+
h.current.visible = !0, h.current.material = n.current, h.current.material.uniforms.tDiffuse.value = S.current.texture, n.current.uniforms.h.value = a * (1 / 256), t.current.setRenderTarget(l.current), t.current.render(h.current, p.current), h.current.material = b.current, h.current.material.uniforms.tDiffuse.value = l.current.texture, b.current.uniforms.v.value = a * (1 / 256), t.current.setRenderTarget(S.current), t.current.render(h.current, p.current), h.current.visible = !1;
|
|
117
|
+
}, []), _ = J(() => {
|
|
118
|
+
const f = i.current.background;
|
|
119
|
+
i.current.background = null, i.current.overrideMaterial = c.current, t.current.setRenderTarget(S.current), t.current.render(i.current, p.current), i.current.overrideMaterial = null, Y(5), Y(5 * 0.4), t.current.setRenderTarget(null), i.current.background = f, o.current.rotation.x = k.get(), o.current.rotation.y = F.get(), t.current.render(i.current, r.current), Q(), ee.current ? t.current.setPixelRatio(1) : t.current.setPixelRatio(2);
|
|
120
|
+
}, [Y, ee, Q, k, F]);
|
|
121
|
+
return z(() => {
|
|
122
|
+
const a = (f) => {
|
|
123
|
+
const { innerWidth: R, innerHeight: B } = window, E = {
|
|
124
|
+
x: (f.clientX - R / 2) / R,
|
|
125
|
+
y: (f.clientY - B / 2) / B
|
|
126
|
+
};
|
|
127
|
+
F.set(E.x / 2), k.set(E.y / 2);
|
|
128
|
+
};
|
|
129
|
+
return X && !K && window.addEventListener("mousemove", a), () => {
|
|
130
|
+
window.removeEventListener("mousemove", a);
|
|
131
|
+
};
|
|
132
|
+
}, [X, K, k, F]), z(() => {
|
|
133
|
+
const a = () => {
|
|
134
|
+
if (!u.current) return;
|
|
135
|
+
const { clientWidth: f, clientHeight: R } = u.current;
|
|
136
|
+
t.current.setSize(f, R), r.current.aspect = f / R, r.current.updateProjectionMatrix(), _();
|
|
137
|
+
};
|
|
138
|
+
return window.addEventListener("resize", a), a(), () => {
|
|
139
|
+
window.removeEventListener("resize", a);
|
|
140
|
+
};
|
|
141
|
+
}, [_]), /* @__PURE__ */ Te(
|
|
142
|
+
"div",
|
|
143
|
+
{
|
|
144
|
+
className: De(pe.model, x),
|
|
145
|
+
"data-loaded": C,
|
|
146
|
+
style: Ce({ delay: Ae(y) }, d),
|
|
147
|
+
ref: u,
|
|
148
|
+
role: "img",
|
|
149
|
+
"aria-label": H,
|
|
150
|
+
...T,
|
|
151
|
+
children: [
|
|
152
|
+
/* @__PURE__ */ re("canvas", { className: pe.canvas, ref: A }),
|
|
153
|
+
g.map((a, f) => /* @__PURE__ */ re(
|
|
154
|
+
Ke,
|
|
155
|
+
{
|
|
156
|
+
renderer: t,
|
|
157
|
+
modelGroup: o,
|
|
158
|
+
show: w,
|
|
159
|
+
showDelay: y,
|
|
160
|
+
renderFrame: _,
|
|
161
|
+
index: f,
|
|
162
|
+
setLoaded: v,
|
|
163
|
+
model: a,
|
|
164
|
+
decoderPath: N
|
|
165
|
+
},
|
|
166
|
+
JSON.stringify(a.position)
|
|
167
|
+
))
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
}, Ke = ({
|
|
172
|
+
renderer: g,
|
|
173
|
+
model: w,
|
|
174
|
+
modelGroup: y,
|
|
175
|
+
renderFrame: s,
|
|
176
|
+
index: d,
|
|
177
|
+
showDelay: x,
|
|
178
|
+
setLoaded: H,
|
|
179
|
+
show: L,
|
|
180
|
+
decoderPath: T
|
|
181
|
+
}) => {
|
|
182
|
+
const [P, N] = ge(), C = he(), v = Re();
|
|
183
|
+
return z(() => {
|
|
184
|
+
const u = async (r, o) => {
|
|
185
|
+
r.colorSpace = we, r.flipY = !1, r.anisotropy = g.current.capabilities.getMaxAnisotropy(), r.generateMipmaps = !1, await g.current.initTexture(r), o.material.color = new ie(16777215), o.material.transparent = !0, o.material.map = r;
|
|
186
|
+
};
|
|
187
|
+
N({ start: async () => {
|
|
188
|
+
const { texture: r, position: o, url: i } = w;
|
|
189
|
+
let t = async () => {
|
|
190
|
+
}, m = () => {
|
|
191
|
+
};
|
|
192
|
+
const [S, l] = await Promise.all([
|
|
193
|
+
ue.loadAsync(
|
|
194
|
+
typeof r.placeholder == "string" ? r.placeholder : r.placeholder.src
|
|
195
|
+
),
|
|
196
|
+
$e(T).loadAsync(i)
|
|
197
|
+
]);
|
|
198
|
+
y.current.add(l.scene), l.scene.traverse(async (c) => {
|
|
199
|
+
const n = c;
|
|
200
|
+
n.material && (n.material.color = new ie(2039845)), n.name === me.Screen && (v.current = n.clone(), v.current.material = n.material.clone(), n.parent.add(v.current), v.current.material.opacity = 1, v.current.position.z += 1e-3, u(S, v.current), t = async () => {
|
|
201
|
+
const b = await ke({
|
|
202
|
+
srcSet: r.srcSet,
|
|
203
|
+
sizes: r.sizes
|
|
204
|
+
}), M = await ue.loadAsync(b);
|
|
205
|
+
await u(M, n), q(1, 0, {
|
|
206
|
+
onUpdate: (D) => {
|
|
207
|
+
v.current.material.opacity = D, s();
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
const p = new U(o.x, o.y, o.z);
|
|
213
|
+
return C && l.scene.position.set(...p.toArray()), w.animation === W.SpringUp && (m = () => {
|
|
214
|
+
const c = new U(
|
|
215
|
+
p.x,
|
|
216
|
+
p.y - 1,
|
|
217
|
+
p.z
|
|
218
|
+
);
|
|
219
|
+
l.scene.position.set(...c.toArray()), q(c.y, p.y, {
|
|
220
|
+
type: "spring",
|
|
221
|
+
delay: (300 * d + x) / 1e3,
|
|
222
|
+
stiffness: 60,
|
|
223
|
+
damping: 20,
|
|
224
|
+
mass: 1,
|
|
225
|
+
restSpeed: 1e-4,
|
|
226
|
+
restDelta: 1e-4,
|
|
227
|
+
onUpdate: (n) => {
|
|
228
|
+
l.scene.position.y = n, s();
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}), w.animation === W.LaptopOpen && (m = () => {
|
|
232
|
+
const c = l.scene.children.find(
|
|
233
|
+
(M) => M.name === me.Frame
|
|
234
|
+
), n = new U(Oe.degToRad(90), 0, 0), b = new U(0, 0, 0);
|
|
235
|
+
return l.scene.position.set(...p.toArray()), c.rotation.set(...n.toArray()), q(n.x, b.x, {
|
|
236
|
+
type: "spring",
|
|
237
|
+
delay: (300 * d + x + 300) / 1e3,
|
|
238
|
+
stiffness: 80,
|
|
239
|
+
damping: 20,
|
|
240
|
+
restSpeed: 1e-4,
|
|
241
|
+
restDelta: 1e-4,
|
|
242
|
+
onUpdate: (M) => {
|
|
243
|
+
c.rotation.x = M, s();
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}), { loadFullResTexture: t, playAnimation: m };
|
|
247
|
+
} });
|
|
248
|
+
}, []), z(() => {
|
|
249
|
+
if (!P || !L) return;
|
|
250
|
+
let u;
|
|
251
|
+
const A = async () => {
|
|
252
|
+
const { loadFullResTexture: r, playAnimation: o } = await P.start();
|
|
253
|
+
H(!0), C || (u = o()), await r(), C && s();
|
|
254
|
+
};
|
|
255
|
+
return ze(() => {
|
|
256
|
+
A();
|
|
257
|
+
}), () => {
|
|
258
|
+
u == null || u.stop();
|
|
259
|
+
};
|
|
260
|
+
}, [P, L]), null;
|
|
261
|
+
};
|
|
262
|
+
export {
|
|
263
|
+
de as MODEL_FILES,
|
|
264
|
+
ir as Model,
|
|
265
|
+
W as ModelAnimationType,
|
|
266
|
+
Je as createDeviceModels,
|
|
267
|
+
sr as deviceModels
|
|
268
|
+
};
|
|
2
269
|
//# sourceMappingURL=model.js.map
|