{"version":3,"sources":["constants/misc.ts","store.ts","helpers/useGestures.ts","assets/svg/SVD-10-arrow-down.svg","assets/svg/SVD-10-arrow-up.svg","components/NavArrows.tsx","components/PostcardZoom.tsx","constants/theme.ts","helpers/math.ts","helpers/Perlin.ts","components/Ring.tsx","components/Section.tsx","components/Galaxy.tsx","components/sections/intro/Intro.tsx","components/sections/photos/Photos.tsx","components/DynamicBackground.tsx","helpers/TextWrapper.js","helpers/useCursor.ts","helpers/useZoom.ts","components/sections/postcards/Postcard.tsx","components/sections/postcards/PostcardRack.tsx","components/sections/postcards/Postcards.tsx","components/sections/t-shirts/TShirtRack.tsx","components/sections/t-shirts/TShirts.tsx","components/Scene.tsx","components/sections/photos/gallery/Gallery.tsx","components/TwoPartText.tsx","components/SectionText.tsx","components/ShirtText.tsx","assets/images/SVD-10-arrow-go-v2.png","components/ShirtZoom.tsx","components/MainCanvas.tsx","assets/images/decade-loader.gif","App.tsx","reportWebVitals.ts","index.tsx"],"names":["numShirts","sectionPaths","store","i18n","shirts","postcards","photos","siteText","viewedPostcardId","lastViewedPostcardId","activeSection","viewedShirtId","lastViewedShirtId","activeShirtId","isShirtTextVisible","isAnimating","isDragging","snapToSection","snapToShirt","numCardsToRender","numRingsToRender","currentLanguage","history","isGalaxyReady","postcardTimer","ringTimer","isFirstPostcardView","setActiveSectionThrottled","throttle","index","setCursor","setViewedPostcard","setActiveShirt","mostRecentShirtId","setShirtTextVisible","setViewedShirt","setAnimating","push","leading","trailing","makeAutoObservable","this","i18next","use","initReactI18next","Cache","enabled","on","language","createHashHistory","a","loadData","init","resources","lng","interpolation","escapeValue","defaultNS","URLSearchParams","window","location","search","get","includes","changeLanguage","module","ResizeObserver","setInterval","length","clearInterval","when","isInitialised","processPath","matches","pathname","match","postcardId","parseInt","setActiveSection","setTimeout","shirtId","axios","response","processShirts","data","slice","processPostcards","processPhotos","processSiteText","rows","map","row","isReleased","isAvailable","shirtImageFilename","backgroundImageFilename","designer","title","en","es","de","fr","it","pt","description","storeUrl","imageFilename","year","filename","common","forEach","key","isViewingItem","change","animating","id","back","visible","clamp","range","find","cursor","document","body","style","dragging","context","createContext","useStore","useContext","getShirtForAngle","x","anglePerShirt","Math","PI","round","useGestures","props","useSpring","config","slow","onRest","shirtIndex","native","setX","sectionSmooth","onStart","section","setSectionSmooth","useCallback","sectionIndex","third","floor","diff","useGesture","onDrag","vxvy","vx","newX","onDragEnd","vy","changeSection","abs","onMouseUp","onWheel","drag","lockDirection","filterTaps","_extends","Object","assign","target","i","arguments","source","prototype","hasOwnProperty","call","apply","_objectWithoutProperties","excluded","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","type","className","width","height","_ref4","points","SvgSvd10ArrowDown","_ref","svgRef","titleId","xmlns","xmlnsXlink","y","viewBox","enableBackground","xmlSpace","ref","ForwardRef","SvgSvd10ArrowUp","sectionTitleKeys","observer","t","useTranslation","upKey","downKey","upArrowText","downArrowText","upTransition","useTransition","from","position","opacity","enter","leave","downTransition","item","div","onClick","isActive","value","duration","easing","easings","visibility","flex","primary","galaxy","scale","number","fromLeft","fromRight","toLeft","toRight","Perlin","perm","tmp","Array","random","concat","h","grad","i0","i1","x0","x1","t0","t1","drawCircularText","text","diameter","startAngle","align","textInside","inwardFacing","kerning","clockwise","toLowerCase","textHeight","split","reverse","join","save","translate","textBaseline","textAlign","j","charWid","measureText","rotate","fillText","restore","radius","innerText","outerText","SectionContext","activeAmount","gl","useThree","texture","useMemo","renderer","canvas","createElement","getContext","strokeStyle","fillStyle","font","beginPath","arc","lineWidth","stroke","CanvasTexture","anisotropy","capabilities","getMaxAnisotropy","drawCanvas","rotation","args","meshBasicMaterial","transparent","alphaTest","to","b","active","SpringValue","activeSectionWidth","activeSectionFadeTime","getActiveAmount","activeSectionSmooth","sectionNames","memo","children","noRing","Context","subtleMotion","useState","setActive","pow","group","useRef","useFrame","val","curr","next","ceil","isBigScreen","useMediaQuery","query","isMediumScreen","Provider","v","rotation-y","Ring","position-y","perlin","numRings","color","moveSpeed","lineThickness","dashSize","gapSize","lineWobble","positions","noiseOffset","angle","warpedRadius","getValue","cos","sin","geometry","LineGeometry","setPositions","hex","Color","getHex","material","LineMaterial","linewidth","vertexColors","dashed","fragmentShader","defines","USE_DASH","dashOffset","line","Line2","computeLineDistances","set","offset","frameSkip","current","resolution","innerWidth","innerHeight","object","depthWrite","gpu","useDetectGPU","tier","useEffect","setGalaxyReady","norm","theme","renderOrder","rotation-x","scale-y","Logo","useTexture","side","THREE","fallback","Section","Galaxy","initialParams","imageUrl","inputTexture","setInputTexture","warpTexture","wrapS","wrapT","RepeatWrapping","TextureLoader","load","scene","Scene","camera","OrthographicCamera","ShaderMaterial","vertexShader","uniforms","time","params","depthTest","lights","quad","Mesh","PlaneBufferGeometry","add","size","Vector2","getSize","mouseMovement","render","CanvasTextWrapper","options","defaults","sizeToFill","maxFontSizeToFill","lineHeight","allowNewLine","lineBreak","verticalAlign","justifyLines","paddingX","paddingY","fitParent","strokeText","renderHDPI","textDecoration","opts","devicePixelRatio","tempCtx","e","EL_WIDTH","parentNode","clientWidth","fontParts","EL_HEIGHT","clientHeight","MAX_TXT_WIDTH","MAX_TXT_HEIGHT","fontSize","textBlockHeight","lines","newLineIndexes","textPos","setFont","adjustFontSize","wrap","newLines","trim","idx","words","testString","sliced","leftover","word","k","splice","checkLength","breakText","underline","moveTo","lineTo","replace","handleMultipleNewline","isNaN","toString","TypeError","toLocaleLowerCase","validate","wordsCount","newFontSize","fontSizeHasLimit","maxLen","tokenLen","numWords","spaceLength","num","filler","delimiter","justify","skipLineOnMatch","multiNewLineDelimiter","drawText","useCursor","handleEnter","event","stopPropagation","handleExit","useZoom","isViewing","zoomDistance","zoomRef","originalParent","setOriginalParent","setPosition","setRotation","parent","attach","camForward","Vector3","getWorldDirection","newPosition","clone","multiplyScalar","newQuaternion","quaternion","toArray","reset","logoImage","Image","src","PostcardMaterial","frontTexture","FrontSide","postcard","isFlipped","setFlipped","handleClick","flip","flipped","newRotation","flipQuat","Quaternion","setFromEuler","Euler","multiply","isViewed","setFirstPostcardViewed","zoom","yearText","titleText","descriptionText","bottomText","padding","fillRect","toLocaleUpperCase","drawImage","onPointerOver","onPointerOut","cardHeight","undefined","scale-x","BackSide","numRows","handlePostcardClick","rowIndex","cardIndex","cardId","position-z","Postcard","lastViewedPostcard","DynamicBackground","PostcardRack","TShirt","shirt","shirtHeight","handleShirtClick","lastViewedShirt","TShirtRack","activeIndex","numSections","scale-z","Intro","Postcards","TShirts","Photos","Photo","photo","totalWidth","img","translateX","containerWidth","xOffset","getImageLeft","useMeasure","bounds","imageWidth","topText","bottomTextParts","part","topTextKey","bottomTextKey","TwoPartText","productPageUrl","href","arrow","marginLeft","domTarget","setSubtleMotion","useMove","xy","gpuTier","Gallery","concurrent","antialias","isMobile","pixelRatio","onPointerMissed","resize","polyfill","fov","near","far","onMouseDown","setDragging","Preload","all","SectionText","PostcardZoom","ShirtText","ShirtZoom","NavArrows","isLoaded","setLoaded","immediate","delay","MainCanvas","spinner","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.f0749282.chunk.js","sourcesContent":["export const dragYSensitivity = 0.7;\r\nexport const scrollYSensitivity = 0.001;\r\nexport const minSwipeVelocity = 0.1;\r\nexport const cameraMoveX = -0.1;\r\nexport const cameraMoveY = 0.1;\r\n\r\nexport const numSections = 4;\r\nexport const sectionScalePower = 3;\r\n\r\nexport const numParticles = 128;\r\n\r\nexport const numShirts = 10;\r\n","import axios from \"axios\";\r\nimport { createHashHistory, HashHistory, State } from \"history\";\r\nimport i18next, { i18n } from \"i18next\";\r\nimport range from \"lodash/range\";\r\nimport throttle from \"lodash/throttle\";\r\nimport { makeAutoObservable, when } from \"mobx\";\r\nimport { createContext, useContext } from \"react\";\r\nimport { initReactI18next } from \"react-i18next\";\r\nimport { Cache } from \"three\";\r\nimport clamp from \"lodash/clamp\";\r\n\r\nconst sectionPaths = [\"/\", \"/past\", \"/present\", \"/future\"];\r\n\r\ntype Languages = {\r\n en: string;\r\n es: string;\r\n de: string;\r\n it: string;\r\n fr: string;\r\n pt: string;\r\n [lang: string]: string;\r\n};\r\n\r\nexport type Shirt = {\r\n isReleased: boolean;\r\n isAvailable: boolean;\r\n shirtImageFilename: string;\r\n backgroundImageFilename: string;\r\n designer: string;\r\n title: Languages;\r\n description: Languages;\r\n storeUrl: Languages;\r\n};\r\n\r\nexport type Postcard = {\r\n imageFilename: string;\r\n backgroundImageFilename: string;\r\n year: number;\r\n title: Languages;\r\n description: Languages;\r\n};\r\n\r\nexport type Photo = {\r\n filename: string;\r\n};\r\n\r\nclass Store {\r\n i18n: i18n;\r\n shirts!: Shirt[];\r\n postcards!: Postcard[];\r\n photos!: Photo[];\r\n siteText: any;\r\n\r\n viewedPostcardId = -1;\r\n lastViewedPostcardId = -1;\r\n activeSection = 0;\r\n viewedShirtId = -1;\r\n lastViewedShirtId = -1;\r\n activeShirtId = 0;\r\n isShirtTextVisible = true;\r\n\r\n isAnimating = false;\r\n isDragging = false;\r\n\r\n snapToSection: any;\r\n snapToShirt: any;\r\n\r\n numCardsToRender = 1;\r\n numRingsToRender = 1;\r\n\r\n currentLanguage = \"en\";\r\n\r\n history: HashHistory;\r\n isGalaxyReady = false;\r\n\r\n postcardTimer: any;\r\n ringTimer: any;\r\n\r\n isFirstPostcardView = true;\r\n\r\n constructor() {\r\n makeAutoObservable(this);\r\n this.i18n = i18next.use(initReactI18next);\r\n\r\n Cache.enabled = true;\r\n\r\n this.i18n.on(\r\n \"languageChanged\",\r\n (language) => (this.currentLanguage = language)\r\n );\r\n\r\n this.history = createHashHistory();\r\n }\r\n\r\n async init() {\r\n await this.loadData();\r\n\r\n await this.i18n.init({\r\n resources: this.siteText,\r\n lng: \"en\",\r\n interpolation: {\r\n escapeValue: false,\r\n },\r\n defaultNS: \"common\",\r\n });\r\n\r\n const language = (new URLSearchParams(window.location.search)).get(\"lang\") || \"en\"\r\n\r\n if ([\"en\", \"es\", \"de\", \"fr\", \"it\", \"pt\"].includes(language))\r\n this.i18n.changeLanguage(language);\r\n\r\n if (\"ResizeObserver\" in window === false) {\r\n const module = await import(\"@juggle/resize-observer\");\r\n window.ResizeObserver = module.ResizeObserver;\r\n }\r\n\r\n this.setCursor(\"grab\");\r\n\r\n this.postcardTimer = setInterval(() => {\r\n this.numCardsToRender++;\r\n\r\n if (this.numCardsToRender >= this.postcards.length) {\r\n clearInterval(this.postcardTimer);\r\n }\r\n }, 50);\r\n\r\n when(\r\n () => this.isInitialised,\r\n () => {\r\n this.processPath();\r\n }\r\n );\r\n }\r\n\r\n setGalaxyReady() {\r\n this.isGalaxyReady = true;\r\n }\r\n\r\n get isInitialised() {\r\n return (\r\n this.postcards &&\r\n this.numCardsToRender >= this.postcards.length &&\r\n this.isGalaxyReady === true\r\n );\r\n }\r\n\r\n processPath() {\r\n let matches = this.history.location.pathname.match(\r\n /\\/past\\/postcard\\/(\\d+)/\r\n );\r\n if (matches) {\r\n const postcardId = parseInt(matches[1]);\r\n\r\n this.setActiveSection(1);\r\n\r\n setTimeout(() => {\r\n this.setViewedPostcard(postcardId);\r\n }, 1000);\r\n }\r\n\r\n matches = this.history.location.pathname.match(/\\/present\\/t-shirt\\/(\\d)/);\r\n if (matches) {\r\n const shirtId = parseInt(matches[1]);\r\n\r\n this.setActiveSection(2);\r\n this.setActiveShirt(shirtId);\r\n\r\n setTimeout(() => {\r\n this.setViewedShirt(shirtId);\r\n }, 1000);\r\n }\r\n\r\n matches = this.history.location.pathname.match(/\\/past/);\r\n if (matches) {\r\n this.setActiveSection(1);\r\n }\r\n\r\n matches = this.history.location.pathname.match(/\\/present/);\r\n if (matches) {\r\n this.setActiveSection(2);\r\n }\r\n\r\n matches = this.history.location.pathname.match(/\\/future/);\r\n if (matches) {\r\n this.setActiveSection(3);\r\n }\r\n }\r\n\r\n async loadData() {\r\n const response = await axios.get(\"/data.json\");\r\n\r\n this.processShirts(response.data[0].slice(1));\r\n this.processPostcards(response.data[1].slice(1));\r\n this.processPhotos(response.data[2]);\r\n this.processSiteText(response.data[3]);\r\n }\r\n\r\n processShirts(rows: any[][]) {\r\n this.shirts = rows.map((row) => ({\r\n isReleased: row[0],\r\n isAvailable: row[1],\r\n shirtImageFilename: row[2],\r\n backgroundImageFilename: row[3],\r\n designer: row[4],\r\n title: {\r\n en: row[5],\r\n es: row[6],\r\n de: row[7],\r\n fr: row[8],\r\n it: row[9],\r\n pt: row[10],\r\n },\r\n description: {\r\n en: row[11],\r\n es: row[12],\r\n de: row[13],\r\n fr: row[14],\r\n it: row[15],\r\n pt: row[16],\r\n },\r\n storeUrl: {\r\n en: row[17],\r\n es: row[18],\r\n de: row[19],\r\n fr: row[20],\r\n it: row[21],\r\n pt: row[22],\r\n },\r\n }));\r\n }\r\n\r\n processPostcards(rows: any[][]) {\r\n this.postcards = rows.map((row) => ({\r\n imageFilename: row[0],\r\n backgroundImageFilename: row[1],\r\n year: row[2],\r\n title: {\r\n en: row[3],\r\n es: row[4],\r\n de: row[5],\r\n fr: row[6],\r\n it: row[7],\r\n pt: row[8],\r\n },\r\n description: {\r\n en: row[9],\r\n es: row[10],\r\n de: row[11],\r\n fr: row[12],\r\n it: row[13],\r\n pt: row[14],\r\n },\r\n }));\r\n }\r\n\r\n processPhotos(rows: any[][]) {\r\n this.photos = rows.map((row) => ({\r\n filename: row[0],\r\n }));\r\n }\r\n\r\n processSiteText(rows: any[][]) {\r\n this.siteText = {\r\n en: { common: {} },\r\n es: { common: {} },\r\n de: { common: {} },\r\n it: { common: {} },\r\n fr: { common: {} },\r\n pt: { common: {} },\r\n };\r\n\r\n rows.forEach((row) => {\r\n const key = row[0];\r\n this.siteText.en.common[key] = row[1];\r\n this.siteText.es.common[key] = row[2];\r\n this.siteText.de.common[key] = row[3];\r\n this.siteText.fr.common[key] = row[4];\r\n this.siteText.it.common[key] = row[5];\r\n this.siteText.pt.common[key] = row[6];\r\n });\r\n }\r\n\r\n setActiveSection(index: number) {\r\n if (index < 0 || index >= 4 || this.isViewingItem) return;\r\n\r\n this.setActiveSectionThrottled(index);\r\n }\r\n\r\n setActiveSectionThrottled = throttle(\r\n (index: number) => {\r\n this.activeSection = index;\r\n\r\n this.snapToSection(index);\r\n\r\n if (index === 0 || index === 3) this.setCursor(\"grab\");\r\n\r\n if (index !== 1) this.setViewedPostcard(-1);\r\n if (index === 2) {\r\n this.setActiveShirt(this.mostRecentShirtId);\r\n this.setShirtTextVisible(true);\r\n } else this.setViewedShirt(-1);\r\n\r\n this.setAnimating(true);\r\n\r\n this.history.push(sectionPaths[index]);\r\n },\r\n 700,\r\n { leading: true, trailing: false }\r\n );\r\n\r\n changeSection(change: number) {\r\n this.setActiveSection(this.activeSection + change);\r\n }\r\n\r\n setAnimating(animating: boolean) {\r\n this.isAnimating = animating;\r\n }\r\n\r\n setViewedShirt(id: number) {\r\n if (this.viewedShirtId === id || (store.isViewingItem && id >= 0) || store.activeSection !== 2) return;\r\n\r\n this.viewedShirtId = id;\r\n\r\n if (id >= 0) {\r\n this.lastViewedShirtId = id;\r\n this.history.push(`/present/t-shirt/${id}`);\r\n this.setCursor(\"default\");\r\n } else {\r\n this.history.back();\r\n this.setShirtTextVisible(true);\r\n }\r\n }\r\n\r\n setActiveShirt(id: number) {\r\n if (id !== this.activeShirtId) {\r\n this.activeShirtId = id;\r\n this.setShirtTextVisible(true);\r\n this.snapToShirt(id);\r\n }\r\n }\r\n\r\n setShirtTextVisible(visible: boolean) {\r\n this.isShirtTextVisible = visible;\r\n }\r\n\r\n setViewedPostcard(id: number) {\r\n if (this.viewedPostcardId === id || (store.isViewingItem && id >= 0) || store.activeSection !== 1) return;\r\n\r\n this.viewedPostcardId = id;\r\n\r\n if (id >= 0) {\r\n this.lastViewedPostcardId = id;\r\n this.history.push(`/past/postcard/${id}`);\r\n this.setCursor(\"alias\");\r\n } else {\r\n this.history.back();\r\n }\r\n }\r\n\r\n setFirstPostcardViewed() {\r\n this.isFirstPostcardView = false;\r\n }\r\n\r\n get isViewingItem() {\r\n return this.viewedShirtId !== -1 || this.viewedPostcardId !== -1;\r\n }\r\n\r\n get mostRecentShirtId() {\r\n return clamp(\r\n range(this.shirts.length).find((id) => !store.shirts[id].isReleased)! - 1,\r\n 0,\r\n this.shirts.length - 1\r\n );\r\n }\r\n\r\n setCursor(cursor: string) {\r\n document.body.style.cursor = cursor;\r\n }\r\n\r\n setDragging(dragging: boolean) {\r\n this.isDragging = dragging;\r\n\r\n if (dragging)\r\n document.body.style.cursor === \"grab\" && store.setCursor(\"grabbing\");\r\n else document.body.style.cursor === \"grabbing\" && store.setCursor(\"grab\");\r\n }\r\n}\r\n\r\nexport const store = new Store();\r\n\r\nconst context = createContext(store);\r\n\r\nexport const useStore = () => {\r\n return useContext(context);\r\n};\r\n","import { config, useSpring } from \"@react-spring/core\";\r\nimport { useCallback } from \"react\";\r\nimport { useGesture } from \"react-use-gesture\";\r\nimport { minSwipeVelocity, numShirts } from \"../constants/misc\";\r\nimport { useStore } from \"../store\";\r\n\r\nfunction getShirtForAngle(x: number) {\r\n const anglePerShirt = (Math.PI * 2) / numShirts;\r\n const shirtIndex = Math.round((x + (2 * Math.PI) / 3) / anglePerShirt);\r\n\r\n return (shirtIndex + numShirts * 1000) % numShirts;\r\n}\r\n\r\nfunction getAngleForShirt(shirtIndex: number) {\r\n const anglePerShirt = (Math.PI * 2) / numShirts;\r\n return shirtIndex * anglePerShirt - (2 * Math.PI) / 3;\r\n}\r\n\r\nexport default function useGestures(props: any) {\r\n const store = useStore();\r\n\r\n const [{ x }, setX] = useSpring(() => ({\r\n x: 0,\r\n config: config.slow,\r\n\r\n onRest: () => {\r\n if (store.activeSection === 2) {\r\n let shirtIndex = getShirtForAngle(x.get());\r\n store.setActiveShirt(shirtIndex);\r\n }\r\n },\r\n native: true,\r\n }));\r\n\r\n const [{ sectionSmooth }, setSectionSmooth] = useSpring(() => ({\r\n sectionSmooth: 0,\r\n config: config.slow,\r\n onStart: () => {\r\n store.setAnimating(true);\r\n },\r\n onRest: () => {\r\n const section = Math.round(sectionSmooth.get());\r\n setSectionSmooth({ sectionSmooth: section });\r\n store.setAnimating(false);\r\n },\r\n native: true,\r\n }));\r\n\r\n const snapToSection = useCallback((sectionIndex: number) => {\r\n setSectionSmooth({\r\n sectionSmooth: sectionIndex,\r\n });\r\n\r\n const third = (Math.PI * 2) / 3;\r\n const newSectionX = sectionIndex * third;\r\n setX({\r\n x: newSectionX + Math.floor(x.get() / (Math.PI * 2)) * (Math.PI * 2),\r\n });\r\n }, []);\r\n\r\n const snapToShirt = useCallback((shirtId: number) => {\r\n const newX =\r\n (getAngleForShirt(shirtId) + Math.PI * 2 * 1000) % (Math.PI * 2);\r\n const diff = newX - ((x.get() + Math.PI * 2 * 1000) % (Math.PI * 2));\r\n\r\n setX({\r\n x: x.get() + diff,\r\n });\r\n }, []);\r\n\r\n useGesture(\r\n {\r\n onDrag: ({ vxvy: [vx, vy] }) => {\r\n if (!store.isViewingItem) {\r\n let newX = x.get() + vx;\r\n\r\n setX({\r\n x: newX,\r\n });\r\n }\r\n\r\n store.setShirtTextVisible(false);\r\n },\r\n onDragEnd: ({ vxvy: [vx, vy] }) => {\r\n let change = 0;\r\n if (vy > minSwipeVelocity) change = -1;\r\n else if (vy < -minSwipeVelocity) change = 1;\r\n\r\n if (change !== 0) {\r\n store.changeSection(change);\r\n } else {\r\n if (store.activeSection === 2 && Math.abs(vx) < 1) {\r\n let shirtIndex = getShirtForAngle(x.get());\r\n store.setActiveShirt(shirtIndex);\r\n snapToShirt(shirtIndex);\r\n }\r\n }\r\n },\r\n onMouseUp: () => {\r\n store.setShirtTextVisible(true);\r\n },\r\n onWheel: ({ vxvy: [vx, vy] }) => {\r\n if (store.isViewingItem) return;\r\n\r\n let change = 0;\r\n if (vy > 1) change = 1;\r\n else if (vy < -1) change = -1;\r\n\r\n if (change !== 0) {\r\n store.changeSection(change);\r\n }\r\n },\r\n },\r\n {\r\n ...props,\r\n drag: {\r\n lockDirection: true,\r\n // experimental_preventWindowScrollY: true,\r\n filterTaps: true, // prevent click when dragging\r\n },\r\n }\r\n );\r\n\r\n return { x, sectionSmooth, snapToSection, snapToShirt };\r\n}\r\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"style\", {\n type: \"text/css\"\n}, \"\\r\\n\\t.st0{fill:none;}\\r\\n\\t.st1{fill:#FFFFFF;}\\r\\n\");\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"rect\", {\n id: \"Bounds\",\n className: \"st0\",\n width: 30,\n height: 30\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Arrow\",\n className: \"st1\",\n points: \"9.2,10.8 7.8,12.2 14.8,19.2 15.2,19.2 22.2,12.2 20.8,10.8 15,16.6 \"\n});\n\nfunction SvgSvd10ArrowDown(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n id: \"arrow_down\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n x: \"0px\",\n y: \"0px\",\n width: \"30px\",\n height: \"30px\",\n viewBox: \"0 0 30 30\",\n style: {\n enableBackground: \"new 0 0 30 30\"\n },\n xmlSpace: \"preserve\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3, _ref4);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgSvd10ArrowDown);\nexport default __webpack_public_path__ + \"static/media/SVD-10-arrow-down.c90f557a.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"style\", {\n type: \"text/css\"\n}, \"\\r\\n\\t.st0{fill:none;}\\r\\n\\t.st1{fill:#FFFFFF;}\\r\\n\");\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"rect\", {\n id: \"Bounds\",\n className: \"st0\",\n width: 30,\n height: 30\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Arrow\",\n className: \"st1\",\n points: \"9.2,19.2 7.8,17.8 14.8,10.8 15.2,10.8 22.2,17.8 20.8,19.2 15,13.4 \"\n});\n\nfunction SvgSvd10ArrowUp(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n id: \"arrow_down\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n x: \"0px\",\n y: \"0px\",\n width: \"30px\",\n height: \"30px\",\n viewBox: \"0 0 30 30\",\n style: {\n enableBackground: \"new 0 0 30 30\"\n },\n xmlSpace: \"preserve\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3, _ref4);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgSvd10ArrowUp);\nexport default __webpack_public_path__ + \"static/media/SVD-10-arrow-up.e09d0f1c.svg\";\nexport { ForwardRef as ReactComponent };","import { a, useTransition } from \"@react-spring/web\";\r\nimport { observer } from \"mobx-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ReactComponent as DownArrow } from \"../assets/svg/SVD-10-arrow-down.svg\";\r\nimport { ReactComponent as UpArrow } from \"../assets/svg/SVD-10-arrow-up.svg\";\r\nimport { useStore } from \"../store\";\r\n\r\nconst sectionTitleKeys = [\"intro\", \"thePast\", \"thePresent\", \"theFuture\"];\r\n\r\nexport default observer(() => {\r\n const store = useStore();\r\n const { isViewingItem, activeSection } = store;\r\n\r\n const { t } = useTranslation();\r\n\r\n const upKey = sectionTitleKeys[activeSection - 1];\r\n const downKey = sectionTitleKeys[activeSection + 1];\r\n const upArrowText = upKey && !isViewingItem && t(upKey);\r\n const downArrowText = downKey && !isViewingItem && t(downKey);\r\n\r\n const upTransition = useTransition(upArrowText, {\r\n from: { position: \"absolute\", opacity: 0 },\r\n enter: { opacity: 1 },\r\n leave: { opacity: 0 },\r\n });\r\n\r\n const downTransition = useTransition(downArrowText, {\r\n from: { position: \"absolute\", opacity: 0 },\r\n enter: { opacity: 1 },\r\n leave: { opacity: 0 },\r\n });\r\n\r\n return (\r\n <>\r\n {upTransition(\r\n (style, item) =>\r\n item && (\r\n store.changeSection(-1)}\r\n >\r\n \r\n

{item}

\r\n \r\n )\r\n )}\r\n {downTransition(\r\n (style, item) =>\r\n item && (\r\n store.changeSection(1)}\r\n >\r\n

{item}

\r\n \r\n \r\n )\r\n )}\r\n \r\n );\r\n});\r\n","import { a, useSpring } from \"@react-spring/web\";\r\nimport * as easings from \"d3-ease\";\r\nimport { observer } from \"mobx-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useStore } from \"../store\";\r\n\r\ntype Props = {};\r\n\r\nexport default observer(({}: Props) => {\r\n const store = useStore();\r\n const { activeSection, viewedPostcardId, currentLanguage } = store;\r\n\r\n const { t } = useTranslation();\r\n\r\n const isActive = activeSection === 1 && viewedPostcardId >= 0;\r\n\r\n const opacity = useSpring({\r\n value: isActive ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n return (\r\n \r\n
\r\n store.setViewedPostcard(-1)}\r\n className=\"textButton\"\r\n >\r\n {t(\"return\")}\r\n \r\n \r\n );\r\n});\r\n","export default {\r\n primary: \"#0025b0\",\r\n galaxy: [\"#f1078e\", \"#c4ff0f\", \"#0722ef\"],\r\n};\r\n","export function scale(\r\n number: number,\r\n fromLeft: number,\r\n fromRight: number,\r\n toLeft: number,\r\n toRight: number\r\n) {\r\n return (\r\n toLeft + ((number - fromLeft) / (fromRight - fromLeft)) * (toRight - toLeft)\r\n );\r\n}\r\n","//@ts-nocheck\r\n\r\nexport default class Perlin {\r\n constructor() {\r\n // Quick and dirty permutation table\r\n this.perm = (() => {\r\n const tmp = Array.from({ length: 256 }, () =>\r\n Math.floor(Math.random() * 256)\r\n );\r\n return tmp.concat(tmp);\r\n })();\r\n }\r\n\r\n grad(i, x) {\r\n const h = i & 0xf;\r\n const grad = 1 + (h & 7);\r\n\r\n if ((h & 8) !== 0) {\r\n return -grad * x;\r\n }\r\n\r\n return grad * x;\r\n }\r\n\r\n getValue(x) {\r\n const i0 = Math.floor(x);\r\n const i1 = i0 + 1;\r\n\r\n const x0 = x - i0;\r\n const x1 = x0 - 1;\r\n\r\n let t0 = 1 - x0 * x0;\r\n t0 *= t0;\r\n\r\n let t1 = 1 - x1 * x1;\r\n t1 *= t1;\r\n\r\n const n0 = t0 * t0 * this.grad(this.perm[i0 & 0xff], x0);\r\n const n1 = t1 * t1 * this.grad(this.perm[i1 & 0xff], x1);\r\n\r\n return 0.395 * (n0 + n1); //Output is between -1 and 1.\r\n }\r\n}\r\n","import { a, useSpring, to } from \"@react-spring/three\";\r\nimport React, { useContext, useMemo } from \"react\";\r\nimport { Object3DNode, useThree } from \"react-three-fiber\";\r\nimport { CanvasTexture, Object3D } from \"three\";\r\nimport { useStore } from \"../store\";\r\nimport { SectionContext } from \"./Section\";\r\nimport * as easings from \"d3-ease\";\r\n\r\nfunction drawCanvas(innerText: string, outerText: string, renderer: any) {\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = canvas.height = 2048;\r\n\r\n const context = canvas.getContext(\"2d\")!;\r\n\r\n context.strokeStyle = \"white\";\r\n context.fillStyle = \"white\";\r\n const fontSize = 80;\r\n context.font = `${fontSize}px HelveticaNeue`;\r\n\r\n for (let i = 0; i < 3; i++) {\r\n drawCircularText(\r\n context,\r\n\r\n innerText,\r\n canvas.width / 2,\r\n canvas.height / 2,\r\n canvas.width / 2 + 850,\r\n -60 + i * 120,\r\n \"center\",\r\n false,\r\n false,\r\n -4\r\n );\r\n\r\n drawCircularText(\r\n context,\r\n outerText,\r\n canvas.width / 2,\r\n canvas.height / 2,\r\n canvas.width / 2 + 820,\r\n -60 + i * 120,\r\n \"center\",\r\n true,\r\n false,\r\n -4\r\n );\r\n }\r\n\r\n context.beginPath();\r\n context.arc(\r\n canvas.width / 2,\r\n canvas.height / 2,\r\n canvas.width / 2 - 100,\r\n 0,\r\n 2 * Math.PI,\r\n false\r\n );\r\n context.lineWidth = 10;\r\n context.strokeStyle = \"white\";\r\n context.stroke();\r\n // context.fill();\r\n\r\n const texture = new CanvasTexture(canvas);\r\n texture.anisotropy = renderer.capabilities.getMaxAnisotropy();\r\n\r\n return texture;\r\n}\r\n\r\nfunction drawCircularText(\r\n context: any,\r\n text: string,\r\n x: number,\r\n y: number,\r\n diameter: number,\r\n startAngle: number,\r\n align: string,\r\n textInside: boolean,\r\n inwardFacing: boolean,\r\n kerning: number\r\n) {\r\n align = align.toLowerCase();\r\n var clockwise = align === \"right\" ? 1 : -1; // draw clockwise for aligned right. Else Anticlockwise\r\n startAngle = startAngle * (Math.PI / 180); // convert to radians\r\n\r\n var textHeight = 90;\r\n\r\n // in cases where we are drawing outside diameter,\r\n // expand diameter to handle it\r\n if (!textInside) diameter += textHeight * 2;\r\n\r\n // canvas.width = diameter;\r\n // canvas.height = diameter;\r\n // omit next line for transparent background\r\n\r\n // Reverse letters for align Left inward, align right outward\r\n // and align center inward.\r\n if (\r\n ([\"left\", \"center\"].indexOf(align) > -1 && inwardFacing) ||\r\n (align === \"right\" && !inwardFacing)\r\n )\r\n text = text.split(\"\").reverse().join(\"\");\r\n\r\n // Setup letters and positioning\r\n context.save();\r\n context.translate(x, y); // Move to center\r\n startAngle += Math.PI * (inwardFacing ? 0 : 1); // Rotate 180 if outward\r\n context.textBaseline = \"middle\"; // Ensure we draw in exact center\r\n context.textAlign = \"center\"; // Ensure we draw in exact center\r\n\r\n // rotate 50% of total angle for center alignment\r\n if (align === \"center\") {\r\n for (var j = 0; j < text.length; j++) {\r\n var charWid = context.measureText(text[j]).width;\r\n startAngle +=\r\n ((charWid + (j === text.length - 1 ? 0 : kerning)) /\r\n (diameter / 2 - textHeight) /\r\n 2) *\r\n -clockwise;\r\n }\r\n }\r\n\r\n // Phew... now rotate into final start position\r\n context.rotate(startAngle);\r\n\r\n // Now for the fun bit: draw, rotate, and repeat\r\n for (var j = 0; j < text.length; j++) {\r\n var charWid = context.measureText(text[j]).width; // half letter\r\n // rotate half letter\r\n context.rotate((charWid / 2 / (diameter / 2 - textHeight)) * clockwise);\r\n // draw the character at \"top\" or \"bottom\"\r\n // depending on inward or outward facing\r\n context.fillText(\r\n text[j],\r\n 0,\r\n (inwardFacing ? 1 : -1) * (0 - diameter / 2 + textHeight / 2)\r\n );\r\n\r\n context.rotate(\r\n ((charWid / 2 + kerning) / (diameter / 2 - textHeight)) * clockwise\r\n ); // rotate half letter\r\n }\r\n\r\n context.restore();\r\n}\r\n\r\ntype Props = {\r\n radius: number;\r\n innerText: string;\r\n outerText: string;\r\n} & Object3DNode;\r\n\r\nexport default ({ radius, innerText, outerText, ...props }: Props) => {\r\n const { isViewingItem, activeSection } = useStore();\r\n\r\n const { index, activeAmount } = useContext(SectionContext);\r\n const { gl } = useThree();\r\n\r\n const texture = useMemo(() => {\r\n return drawCanvas(innerText, outerText, gl);\r\n }, [innerText, outerText]);\r\n\r\n const opacity = useSpring({\r\n value: !isViewingItem ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n a * b\r\n )}\r\n />\r\n \r\n \r\n );\r\n};\r\n","import { SpringValue } from \"@react-spring/core\";\r\nimport { a } from \"@react-spring/three\";\r\nimport React, {\r\n createContext,\r\n memo,\r\n ReactNode,\r\n Suspense,\r\n useContext,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useFrame } from \"react-three-fiber\";\r\nimport type { Group } from \"three\";\r\nimport { sectionScalePower } from \"../constants/misc\";\r\nimport { Context } from \"./MainCanvas\";\r\nimport Ring from \"./Ring\";\r\nimport { useMediaQuery } from \"react-responsive\";\r\n\r\ntype SectionContextType = {\r\n active: boolean;\r\n activeAmount: any;\r\n index: number;\r\n};\r\n\r\nexport const SectionContext = createContext({\r\n active: false,\r\n activeAmount: new SpringValue(),\r\n index: 0,\r\n});\r\n\r\nconst activeSectionWidth = 0.5;\r\nconst activeSectionFadeTime = 0.5;\r\n\r\nexport function getActiveAmount(\r\n activeSectionSmooth: number,\r\n sectionIndex: number\r\n) {\r\n // active\r\n if (\r\n activeSectionSmooth >= sectionIndex &&\r\n activeSectionSmooth < sectionIndex + activeSectionWidth\r\n )\r\n return 1;\r\n\r\n //fade out\r\n if (\r\n activeSectionSmooth >= sectionIndex + activeSectionWidth &&\r\n activeSectionSmooth <\r\n sectionIndex + activeSectionWidth + activeSectionFadeTime\r\n )\r\n return (\r\n 1 -\r\n (activeSectionSmooth - (sectionIndex + activeSectionWidth)) /\r\n activeSectionFadeTime\r\n );\r\n\r\n //fade in\r\n if (\r\n activeSectionSmooth >= sectionIndex - activeSectionFadeTime &&\r\n activeSectionSmooth < sectionIndex\r\n )\r\n return (\r\n (activeSectionSmooth - (sectionIndex - activeSectionFadeTime)) /\r\n activeSectionFadeTime\r\n );\r\n else return 0;\r\n}\r\n\r\nconst sectionNames = [\"intro\", \"past\", \"present\", \"future\"];\r\n\r\nexport type Props = {\r\n index: number;\r\n children?: ReactNode;\r\n noRing?: boolean;\r\n};\r\n\r\nexport default memo(({ children, index, noRing }: Props) => {\r\n const { activeSectionSmooth, subtleMotion } = useContext(Context);\r\n const { t } = useTranslation();\r\n const [active, setActive] = useState(true);\r\n\r\n const scale = Math.pow(sectionScalePower, index);\r\n\r\n const group = useRef();\r\n\r\n useFrame(() => {\r\n const val = activeSectionSmooth.get();\r\n const curr = Math.floor(val),\r\n next = Math.ceil(val);\r\n\r\n setActive(curr === index || next === index);\r\n });\r\n\r\n const isBigScreen = useMediaQuery({ query: \"(min-device-width: 1200px)\" });\r\n const isMediumScreen = useMediaQuery({ query: \"(min-device-width: 450px)\" });\r\n\r\n return (\r\n \r\n getActiveAmount(v, index)\r\n ),\r\n index,\r\n }}\r\n >\r\n \r\n {children}\r\n {!noRing && (\r\n \r\n )}\r\n \r\n \r\n );\r\n});\r\n","import { useDetectGPU } from \"@react-three/drei\";\r\nimport range from \"lodash/range\";\r\nimport { observer } from \"mobx-react\";\r\nimport { trace } from \"node:console\";\r\nimport React, { memo, useContext, useEffect, useMemo, useRef } from \"react\";\r\nimport { Object3DNode, useFrame, useThree } from \"react-three-fiber\";\r\nimport { Color, Group, Object3D } from \"three\";\r\nimport { Line2 } from \"three/examples/jsm/lines/Line2\";\r\nimport { LineGeometry } from \"three/examples/jsm/lines/LineGeometry\";\r\nimport { LineMaterial } from \"three/examples/jsm/lines/LineMaterial\";\r\nimport theme from \"../constants/theme\";\r\nimport { scale } from \"../helpers/math\";\r\nimport Perlin from \"../helpers/Perlin\";\r\nimport { useStore } from \"../store\";\r\nimport { SectionContext } from \"./Section\";\r\n\r\nconst numSegments = 50;\r\n\r\nconst perlin = new Perlin();\r\n\r\ntype Props = {\r\n numRings: number;\r\n index: number;\r\n color: string;\r\n radius: number;\r\n moveSpeed: number;\r\n lineThickness: number;\r\n dashSize: number;\r\n gapSize: number;\r\n lineWobble: number;\r\n} & Object3DNode;\r\n\r\nconst Ring = memo(\r\n ({\r\n numRings,\r\n index,\r\n color,\r\n radius,\r\n moveSpeed,\r\n lineThickness,\r\n dashSize,\r\n gapSize,\r\n lineWobble,\r\n ...props\r\n }: Props) => {\r\n const { activeAmount, active } = useContext(SectionContext);\r\n\r\n const ref = useRef();\r\n const [line, geometry, material] = useMemo(() => {\r\n const positions = [];\r\n\r\n const noiseOffset = Math.random() * 100;\r\n\r\n for (let i = 0; i <= numSegments; i++) {\r\n const angle = (i / numSegments) * Math.PI * 2;\r\n const warpedRadius =\r\n radius *\r\n scale(\r\n perlin.getValue(angle + noiseOffset),\r\n -lineWobble,\r\n lineWobble,\r\n 0.7,\r\n 1.3\r\n ) +\r\n (Math.cos(angle * 4) * 0.9 * index) / numRings;\r\n const x = Math.cos(angle) * warpedRadius;\r\n const y = Math.sin(angle) * warpedRadius;\r\n\r\n positions.push(\r\n x,\r\n y,\r\n perlin.getValue(angle + noiseOffset + 564123) * lineWobble * 0.1\r\n );\r\n }\r\n\r\n const geometry = new LineGeometry();\r\n geometry.setPositions(positions);\r\n\r\n const hex = new Color(color).getHex();\r\n\r\n const material = new LineMaterial({\r\n color: hex,\r\n linewidth: lineThickness,\r\n vertexColors: false,\r\n dashed: true,\r\n });\r\n\r\n material.fragmentShader = `\r\n uniform vec3 diffuse;\r\n\t\tuniform float opacity;\r\n\r\n\t\t#ifdef USE_DASH\r\n\r\n\t\t\tuniform float dashSize;\r\n\t\t\tuniform float dashOffset;\r\n\t\t\tuniform float gapSize;\r\n\r\n\t\t#endif\r\n\r\n\t\tvarying float vLineDistance;\r\n\r\n\t\t#include \r\n\t\t#include \r\n\t\t#include \r\n\t\t#include \r\n\t\t#include \r\n\r\n\t\tvarying vec2 vUv;\r\n\r\n\t\tvoid main() {\r\n\r\n\t\t\t// #include \r\n\r\n\t\t\t#ifdef USE_DASH\r\n\r\n\t\t\t\t// if ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\r\n\r\n\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\r\n\r\n\t\t\t#endif\r\n\r\n\t\t\tif ( abs( vUv.y ) > 1.0 ) {\r\n\r\n\t\t\t\tfloat a = vUv.x;\r\n\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\r\n\t\t\t\tfloat len2 = a * a + b * b;\r\n\r\n\t\t\t\t// if ( len2 > 1.0 ) discard;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvec4 diffuseColor = vec4( diffuse, opacity );\r\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, diffuseColor.a );\r\n\t\t}\r\n `;\r\n\r\n material.defines.USE_DASH = \"\";\r\n material.dashSize = dashSize;\r\n material.gapSize = gapSize;\r\n material.linewidth = lineThickness;\r\n\r\n material.dashOffset += Math.random() * 1000;\r\n\r\n const line = new Line2(geometry, material);\r\n line.computeLineDistances();\r\n line.scale.set(1, 1, 1);\r\n return [line, geometry, material];\r\n }, []);\r\n\r\n const offset = useRef(0);\r\n const frameSkip = useRef(Math.floor(Math.random() * 5 + 1));\r\n useFrame(() => {\r\n if (active) {\r\n if (offset.current % frameSkip.current == 0)\r\n material.dashOffset += moveSpeed * frameSkip.current;\r\n\r\n offset.current += 1;\r\n material.linewidth = lineThickness * activeAmount.get();\r\n material.resolution.set(window.innerWidth, window.innerHeight);\r\n }\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n);\r\n\r\nexport default () => {\r\n const store = useStore();\r\n const { active } = useContext(SectionContext);\r\n\r\n const group = useRef();\r\n\r\n const gpu = useDetectGPU();\r\n const numRingsToRender = (gpu?.tier || 1) * 30;\r\n\r\n useEffect(() => {\r\n store.setGalaxyReady();\r\n }, []);\r\n\r\n return (\r\n \r\n {range(numRingsToRender).map((i) => {\r\n const norm = i / numRingsToRender;\r\n const radius = norm * 2 + 2;\r\n\r\n const lineThickness = scale(Math.pow(norm, 0.6), 0, 1, 5, 2);\r\n\r\n const moveSpeed =\r\n scale(Math.pow(norm, 2), 0, 1, 0.3, 1.9) *\r\n 0.2 *\r\n (Math.random() > 0.5 ? -1 : 1);\r\n\r\n const group = Math.floor(i / (numRingsToRender / 6));\r\n const rotate = group % 2 == 0;\r\n const color = theme.galaxy[Math.floor(i / (numRingsToRender / 3))];\r\n\r\n const dashSize = scale(Math.random(), 0, 1, 0.3, 1);\r\n const gapSize = scale(Math.random(), 0, 1, 1, i * 1);\r\n\r\n return (\r\n 0.9 ? 6 : 3}\r\n />\r\n );\r\n })}\r\n \r\n );\r\n};\r\n","import { a } from \"@react-spring/three\";\r\nimport { useTexture } from \"@react-three/drei\";\r\nimport React, { Suspense, useContext } from \"react\";\r\nimport * as THREE from \"three\";\r\nimport Galaxy from \"../../Galaxy\";\r\nimport Section, { SectionContext } from \"../../Section\";\r\n\r\nconst Logo = () => {\r\n const texture = useTexture(\"images/SVD-10-logo-white.png\");\r\n const { activeAmount } = useContext(SectionContext);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default () => {\r\n return (\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n","import Section from \"../../Section\";\r\n\r\nexport default () => {\r\n return
;\r\n};\r\n","import { useSpring } from \"@react-spring/three\";\r\nimport { useTexture } from \"@react-three/drei\";\r\nimport * as easings from \"d3-ease\";\r\nimport { memo, useContext, useEffect, useMemo, useState } from \"react\";\r\nimport { useFrame } from \"react-three-fiber\";\r\nimport {\r\n Mesh,\r\n OrthographicCamera,\r\n PlaneBufferGeometry,\r\n RepeatWrapping,\r\n Scene,\r\n ShaderMaterial,\r\n Texture,\r\n TextureLoader,\r\n Vector2,\r\n} from \"three\";\r\nimport { Context } from \"./MainCanvas\";\r\n\r\nconst vertexShader = `\r\nvarying vec2 v_uv;\r\n \r\nvoid main() {\r\n v_uv = uv;\r\n gl_Position = vec4( position, 1.0 ); \r\n}\r\n`;\r\n\r\nconst fragmentShader = `\r\nvarying vec2 v_uv;\r\nuniform vec2 resolution;\r\nuniform vec4 params;\r\nuniform float time;\r\nuniform float opacity;\r\nuniform sampler2D inputTexture;\r\nuniform sampler2D warpTexture;\r\n\r\nconst vec4 backgroundColor = vec4(0.0, 0.10858, 0.67451, 1.0);\r\n\r\nvec2 perlin(vec2 uv, float f0, float fmul, float v0, float vmul){\r\n vec2 val = vec2(0.0, 0.0);\r\n float frq = f0;\r\n float wei = v0;\r\n\r\n for (float i=0.0; i<7.0; i+= 1.0) {\r\n val += wei * texture2D(warpTexture, uv * frq + time * 0.001 + params.xy).xy;\r\n frq *= fmul;\r\n wei *= vmul;\r\n }\r\n \r\n return val;\r\n}\r\n\r\nvec2 pdef(vec2 uv) {\r\n return perlin(uv, 0.05, 1.6, 0.3, 0.8);\r\n}\r\n\r\nvec2 warped(vec2 uv) {\r\n return uv + (pdef(uv+pdef(uv)) - 0.5) * 0.5;\r\n}\r\n\r\nvoid main()\r\n{\r\n vec2 uv = v_uv * resolution + (1.0 - resolution) * 0.5;\r\n\r\n vec4 color = texture2D(inputTexture, warped(uv));\r\n gl_FragColor = mix(color, backgroundColor, (1.0 - opacity * smoothstep(0.0, 0.1, color.r)) ); \r\n}\r\n\r\n`;\r\n\r\ntype Props = { visible: boolean; imageUrl: string };\r\n\r\nconst initialParams = [0.2, 0.5, 1, 1.6];\r\n\r\nexport default memo(({ visible, imageUrl }: Props) => {\r\n const { subtleMotion } = useContext(Context);\r\n const [inputTexture, setInputTexture] = useState(null);\r\n\r\n const warpTexture = useTexture(\"images/stone.jpg\");\r\n warpTexture.wrapS = warpTexture.wrapT = RepeatWrapping;\r\n\r\n useEffect(() => {\r\n setInputTexture(null);\r\n const loader = new TextureLoader();\r\n loader.load(imageUrl, (texture) => setInputTexture(texture));\r\n }, [imageUrl]);\r\n\r\n const opacity = useSpring({\r\n value: visible && inputTexture ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n const { camera, scene, uniforms } = useMemo(() => {\r\n const scene = new Scene();\r\n\r\n const camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1);\r\n\r\n const material = new ShaderMaterial({\r\n vertexShader,\r\n fragmentShader,\r\n uniforms: {\r\n time: { value: 21341.54354 },\r\n opacity: { value: 0 },\r\n resolution: {\r\n value: [1, 1],\r\n },\r\n params: {\r\n value: initialParams,\r\n },\r\n inputTexture: {\r\n value: inputTexture,\r\n },\r\n warpTexture: {\r\n value: warpTexture,\r\n },\r\n },\r\n depthWrite: false,\r\n depthTest: false,\r\n lights: false,\r\n transparent: false,\r\n });\r\n\r\n const quad = new Mesh(new PlaneBufferGeometry(2, 2, 1, 1), material);\r\n scene.add(quad);\r\n\r\n return {\r\n scene,\r\n camera,\r\n uniforms: material.uniforms,\r\n };\r\n }, []);\r\n\r\n useFrame(({ gl }) => {\r\n scene.visible = opacity.value.get() > 0;\r\n\r\n if (!gl || !scene.visible) return;\r\n\r\n uniforms.opacity.value = opacity.value.get();\r\n\r\n let size = new Vector2();\r\n gl.getSize(size);\r\n uniforms.resolution.value = [size.x / size.y, 1];\r\n\r\n uniforms.time.value += 0.02;\r\n\r\n uniforms.inputTexture.value = inputTexture;\r\n\r\n const mouseMovement = subtleMotion.value.get();\r\n uniforms.params.value = [\r\n initialParams[0] + mouseMovement[0] * 0.01,\r\n initialParams[1] + mouseMovement[1] * 0.01,\r\n initialParams[2],\r\n initialParams[3],\r\n ];\r\n gl.render(scene, camera);\r\n }, 0);\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n});\r\n","export function CanvasTextWrapper(canvas, text, options) {\r\n \"use strict\";\r\n\r\n var defaults = {\r\n font: \"18px HelveticaNeue, sans-serif\",\r\n sizeToFill: false,\r\n maxFontSizeToFill: false,\r\n lineHeight: 1,\r\n allowNewLine: true,\r\n lineBreak: \"auto\",\r\n textAlign: \"left\",\r\n verticalAlign: \"top\",\r\n justifyLines: false,\r\n paddingX: 0,\r\n paddingY: 0,\r\n fitParent: false,\r\n strokeText: false,\r\n renderHDPI: true,\r\n textDecoration: \"none\",\r\n };\r\n\r\n var opts = {};\r\n\r\n for (var key in defaults) {\r\n opts[key] = options.hasOwnProperty(key) ? options[key] : defaults[key];\r\n }\r\n\r\n opts.width = options.width;\r\n\r\n var context = canvas.getContext(\"2d\");\r\n context.font = opts.font;\r\n context.textBaseline = \"bottom\";\r\n\r\n var scale = 1;\r\n var devicePixelRatio = window.devicePixelRatio;\r\n\r\n if (opts.renderHDPI && devicePixelRatio > 1) {\r\n var tempCtx = {};\r\n\r\n // store context settings in a temp object before scaling otherwise they will be lost\r\n for (var key in context) {\r\n tempCtx[key] = context[key];\r\n }\r\n\r\n // restore context settings\r\n for (var key in tempCtx) {\r\n try {\r\n context[key] = tempCtx[key];\r\n } catch (e) {}\r\n }\r\n\r\n context.scale(scale, scale);\r\n }\r\n\r\n var EL_WIDTH =\r\n (!opts.fitParent ? canvas.width : canvas.parentNode.clientWidth) / scale;\r\n if (opts.width) EL_WIDTH = opts.width;\r\n var EL_HEIGHT =\r\n (!opts.fitParent ? canvas.height : canvas.parentNode.clientHeight) / scale;\r\n var MAX_TXT_WIDTH = EL_WIDTH - opts.paddingX * 2;\r\n var MAX_TXT_HEIGHT = EL_HEIGHT - opts.paddingY * 2;\r\n\r\n var fontSize = opts.font.match(/\\d+(px|em|%)/g)\r\n ? +opts.font.match(/\\d+(px|em|%)/g)[0].match(/\\d+/g)\r\n : 18;\r\n var textBlockHeight = 0;\r\n var lines = [];\r\n var newLineIndexes = [];\r\n var textPos = { x: 0, y: 0 };\r\n var lineHeight = 0;\r\n var fontParts;\r\n var multiNewLineDelimiter = \"\\u200B\";\r\n\r\n text = handleMultipleNewline(text);\r\n setFont(fontSize);\r\n setLineHeight();\r\n validate();\r\n render();\r\n\r\n function handleMultipleNewline(text) {\r\n do {\r\n text = text.replace(/\\n\\n/g, \"\\n\" + multiNewLineDelimiter + \"\\n\");\r\n } while (text.indexOf(\"\\n\\n\") > -1);\r\n return text;\r\n }\r\n\r\n function setFont(fontSize) {\r\n if (!fontParts)\r\n fontParts = !opts.sizeToFill\r\n ? opts.font.split(/\\b\\d+px\\b/i)\r\n : context.font.split(/\\b\\d+px\\b/i);\r\n context.font = fontParts[0] + fontSize + \"px\" + fontParts[1];\r\n }\r\n\r\n function setLineHeight() {\r\n if (!isNaN(opts.lineHeight)) {\r\n lineHeight = fontSize * opts.lineHeight;\r\n } else if (opts.lineHeight.toString().indexOf(\"px\") !== -1) {\r\n lineHeight = parseInt(opts.lineHeight);\r\n } else if (opts.lineHeight.toString().indexOf(\"%\") !== -1) {\r\n lineHeight = (parseInt(opts.lineHeight) / 100) * fontSize;\r\n }\r\n }\r\n\r\n function render() {\r\n if (opts.sizeToFill) {\r\n var wordsCount = text.trim().split(/\\s+/).length;\r\n var newFontSize = 0;\r\n var fontSizeHasLimit = opts.maxFontSizeToFill !== false;\r\n\r\n do {\r\n if (fontSizeHasLimit) {\r\n if (++newFontSize <= opts.maxFontSizeToFill) {\r\n adjustFontSize(newFontSize);\r\n } else {\r\n break;\r\n }\r\n } else {\r\n adjustFontSize(++newFontSize);\r\n }\r\n } while (\r\n textBlockHeight < MAX_TXT_HEIGHT &&\r\n lines.join(\" \").split(/\\s+/).length == wordsCount\r\n );\r\n\r\n adjustFontSize(--newFontSize);\r\n } else {\r\n wrap();\r\n }\r\n\r\n if (opts.justifyLines && opts.lineBreak === \"auto\") {\r\n justify();\r\n }\r\n\r\n setVertAlign();\r\n setHorizAlign();\r\n drawText();\r\n }\r\n\r\n function adjustFontSize(size) {\r\n setFont(size);\r\n lineHeight = size;\r\n wrap();\r\n }\r\n\r\n function wrap() {\r\n if (opts.allowNewLine) {\r\n var newLines = text.trim().split(\"\\n\");\r\n for (var i = 0, idx = 0; i < newLines.length - 1; i++) {\r\n idx += newLines[i].trim().split(/\\s+/).length;\r\n newLineIndexes.push(idx);\r\n }\r\n }\r\n\r\n var words = text.trim().split(/\\s+/);\r\n checkLength(words);\r\n breakText(words);\r\n\r\n textBlockHeight = lines.length * lineHeight;\r\n }\r\n\r\n function checkLength(words) {\r\n var testString, tokenLen, sliced, leftover;\r\n\r\n words.forEach(function (word, index) {\r\n testString = \"\";\r\n tokenLen = context.measureText(word).width;\r\n\r\n if (tokenLen > MAX_TXT_WIDTH) {\r\n for (\r\n var k = 0;\r\n context.measureText(testString + word[k]).width <= MAX_TXT_WIDTH &&\r\n k < word.length;\r\n k++\r\n ) {\r\n testString += word[k];\r\n }\r\n\r\n sliced = word.slice(0, k);\r\n leftover = word.slice(k);\r\n words.splice(index, 1, sliced, leftover);\r\n }\r\n });\r\n }\r\n\r\n function breakText(words) {\r\n lines = [];\r\n for (var i = 0, j = 0; i < words.length; j++) {\r\n lines[j] = \"\";\r\n\r\n if (opts.lineBreak === \"auto\") {\r\n if (context.measureText(lines[j] + words[i]).width > MAX_TXT_WIDTH) {\r\n break;\r\n } else {\r\n while (\r\n context.measureText(lines[j] + words[i]).width <= MAX_TXT_WIDTH &&\r\n i < words.length\r\n ) {\r\n lines[j] += words[i] + \" \";\r\n i++;\r\n\r\n if (opts.allowNewLine) {\r\n for (var k = 0; k < newLineIndexes.length; k++) {\r\n if (newLineIndexes[k] === i) {\r\n j++;\r\n lines[j] = \"\";\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n lines[j] = lines[j].trim();\r\n } else {\r\n lines[j] = words[i];\r\n i++;\r\n }\r\n }\r\n }\r\n\r\n function justify() {\r\n var maxLen, longestLineIndex, tokenLen;\r\n for (var i = 0; i < lines.length; i++) {\r\n tokenLen = context.measureText(lines[i]).width;\r\n\r\n if (!maxLen || tokenLen > maxLen) {\r\n maxLen = tokenLen;\r\n longestLineIndex = i;\r\n }\r\n }\r\n\r\n maxLen = canvas.width - opts.paddingX * 2;\r\n\r\n // fill lines with extra spaces\r\n var numWords, spaceLength, numOfSpaces, num, filler;\r\n var delimiter = \"\\u200A\";\r\n for (i = 0; i < lines.length; i++) {\r\n // if (i === longestLineIndex && lines.length !== 1) continue;\r\n\r\n numWords = lines[i].trim().split(/\\s+/).length;\r\n if (numWords <= 1) continue;\r\n\r\n lines[i] = lines[i].trim().split(/\\s+/).join(delimiter);\r\n\r\n spaceLength = context.measureText(delimiter).width;\r\n numOfSpaces =\r\n (maxLen - context.measureText(lines[i]).width) / spaceLength;\r\n num = numOfSpaces / (numWords - 1);\r\n\r\n filler = \"\";\r\n for (var j = 0; j < num; j++) {\r\n filler += delimiter;\r\n }\r\n\r\n lines[i] = lines[i].trim().split(delimiter).join(filler);\r\n }\r\n }\r\n\r\n function underline(text, x, y) {\r\n var width = context.measureText(text).width;\r\n\r\n switch (context.textAlign) {\r\n case \"center\":\r\n x -= width / 2;\r\n break;\r\n case \"right\":\r\n x -= width;\r\n break;\r\n }\r\n\r\n context.beginPath();\r\n context.moveTo(x, y);\r\n context.lineTo(x + width, y);\r\n context.stroke();\r\n }\r\n\r\n function drawText() {\r\n var skipLineOnMatch = multiNewLineDelimiter + \" \";\r\n for (var i = 0; i < lines.length; i++) {\r\n textPos.y = parseInt(textPos.y) + lineHeight;\r\n if (lines[i] !== skipLineOnMatch) {\r\n context.fillText(lines[i], textPos.x, textPos.y);\r\n\r\n if (opts.strokeText) {\r\n context.strokeText(lines[i], textPos.x, textPos.y);\r\n }\r\n\r\n if (opts.textDecoration.toLocaleLowerCase() === \"underline\") {\r\n underline(lines[i], textPos.x, textPos.y);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function setHorizAlign() {\r\n context.textAlign = opts.textAlign;\r\n\r\n if (opts.textAlign == \"center\") {\r\n textPos.x = EL_WIDTH / 2;\r\n } else if (opts.textAlign == \"right\") {\r\n textPos.x = EL_WIDTH - opts.paddingX;\r\n } else {\r\n textPos.x = opts.paddingX;\r\n }\r\n }\r\n\r\n function setVertAlign() {\r\n if (opts.verticalAlign == \"middle\") {\r\n textPos.y = (EL_HEIGHT - textBlockHeight) / 2;\r\n } else if (opts.verticalAlign == \"bottom\") {\r\n textPos.y = EL_HEIGHT - textBlockHeight - opts.paddingY;\r\n } else {\r\n textPos.y = opts.paddingY;\r\n }\r\n }\r\n\r\n function validate() {\r\n if (typeof text !== \"string\")\r\n throw new TypeError(\"The second parameter must be a String.\");\r\n\r\n if (isNaN(fontSize)) throw new TypeError('Cannot parse \"font\".');\r\n\r\n if (isNaN(lineHeight)) throw new TypeError('Cannot parse \"lineHeight\".');\r\n\r\n if (\r\n opts.textAlign.toLocaleLowerCase() !== \"left\" &&\r\n opts.textAlign.toLocaleLowerCase() !== \"center\" &&\r\n opts.textAlign.toLocaleLowerCase() !== \"right\"\r\n )\r\n throw new TypeError(\r\n 'Property \"textAlign\" must be set to either \"left\", \"center\", or \"right\".'\r\n );\r\n\r\n if (\r\n opts.verticalAlign.toLocaleLowerCase() !== \"top\" &&\r\n opts.verticalAlign.toLocaleLowerCase() !== \"middle\" &&\r\n opts.verticalAlign.toLocaleLowerCase() !== \"bottom\"\r\n )\r\n throw new TypeError(\r\n 'Property \"verticalAlign\" must be set to either \"top\", \"middle\", or \"bottom\".'\r\n );\r\n\r\n if (typeof opts.justifyLines !== \"boolean\")\r\n throw new TypeError('Property \"justifyLines\" must be a Boolean.');\r\n\r\n if (isNaN(opts.paddingX))\r\n throw new TypeError('Property \"paddingX\" must be a Number.');\r\n\r\n if (isNaN(opts.paddingY))\r\n throw new TypeError('Property \"paddingY\" must be a Number.');\r\n\r\n if (typeof opts.fitParent !== \"boolean\")\r\n throw new TypeError('Property \"fitParent\" must be a Boolean.');\r\n\r\n if (\r\n opts.lineBreak.toLocaleLowerCase() !== \"auto\" &&\r\n opts.lineBreak.toLocaleLowerCase() !== \"word\"\r\n )\r\n throw new TypeError(\r\n 'Property \"lineBreak\" must be set to either \"auto\" or \"word\".'\r\n );\r\n\r\n if (typeof opts.sizeToFill !== \"boolean\")\r\n throw new TypeError('Property \"sizeToFill\" must be a Boolean.');\r\n\r\n if (typeof opts.strokeText !== \"boolean\")\r\n throw new TypeError('Property \"strokeText\" must be a Boolean.');\r\n\r\n if (typeof opts.renderHDPI !== \"boolean\")\r\n throw new TypeError('Property \"renderHDPI\" must be a Boolean.');\r\n\r\n if (\r\n opts.textDecoration.toLocaleLowerCase() !== \"none\" &&\r\n opts.textDecoration.toLocaleLowerCase() !== \"underline\"\r\n )\r\n throw new TypeError(\r\n 'Property \"textDecoration\" must be set to either \"none\" or \"underline\".'\r\n );\r\n }\r\n\r\n return lines;\r\n}\r\n","import { useStore } from \"../store\";\r\n\r\nexport default function useCursor(isActive: boolean, cursor = \"pointer\") {\r\n const store = useStore();\r\n\r\n function handleEnter(event: any) {\r\n if (isActive) {\r\n event.stopPropagation();\r\n store.setCursor(cursor);\r\n }\r\n }\r\n\r\n function handleExit(event: any) {\r\n if (isActive) {\r\n event.stopPropagation();\r\n store.setCursor(store.isDragging ? \"grabbing\" : \"grab\");\r\n }\r\n }\r\n\r\n return [handleEnter, handleExit];\r\n}\r\n","import { config, useSpring } from \"@react-spring/three\";\r\nimport * as easings from \"d3-ease\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { useThree } from \"react-three-fiber\";\r\nimport { Object3D, Vector3 } from \"three\";\r\n\r\nexport default function useZoom(\r\n isViewing: boolean,\r\n zoomDistance: number,\r\n scale: number\r\n) {\r\n const zoomRef = useRef();\r\n const { scene, camera } = useThree();\r\n\r\n const [originalParent, setOriginalParent] = useState(null);\r\n\r\n const [position, setPosition] = useSpring(() => ({\r\n value: [0, 0, 0],\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n }));\r\n\r\n const [rotation, setRotation] = useSpring(() => ({\r\n value: [0, 0, 0, 0],\r\n config: config.slow,\r\n native: true,\r\n }));\r\n\r\n useEffect(() => {\r\n if (zoomRef.current) {\r\n if (isViewing) {\r\n setOriginalParent(zoomRef.current.parent!);\r\n scene.attach(zoomRef.current);\r\n\r\n var camForward = new Vector3();\r\n camera.getWorldDirection(camForward);\r\n\r\n const newPosition = camera.position\r\n .clone()\r\n .add(camForward.clone().multiplyScalar(zoomDistance));\r\n\r\n const newQuaternion = camera.quaternion.clone();\r\n\r\n setPosition({\r\n from: {\r\n value: zoomRef.current.position.toArray(),\r\n },\r\n value: newPosition.toArray(),\r\n reset: true,\r\n });\r\n\r\n setRotation({\r\n from: {\r\n value: zoomRef.current.quaternion.toArray(),\r\n },\r\n value: newQuaternion.toArray(),\r\n reset: true,\r\n });\r\n } else if (originalParent) {\r\n originalParent.attach(zoomRef.current);\r\n zoomRef.current.scale.set(1, 1, 1);\r\n\r\n setPosition({\r\n from: {\r\n value: zoomRef.current.position.toArray(),\r\n },\r\n value: [0, 0, 0],\r\n reset: true,\r\n });\r\n\r\n setRotation({\r\n from: {\r\n value: zoomRef.current.quaternion.toArray(),\r\n },\r\n value: [0, 0, 0, 1],\r\n reset: true,\r\n });\r\n }\r\n }\r\n }, [isViewing]);\r\n\r\n return { zoomRef, position, rotation, setPosition, setRotation };\r\n}\r\n","import { a, SpringValue, to, useSpring } from \"@react-spring/three\";\r\nimport { useTexture } from \"@react-three/drei\";\r\nimport React, {\r\n memo,\r\n Suspense,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useThree } from \"react-three-fiber\";\r\nimport { BackSide, CanvasTexture, Euler, FrontSide, Quaternion } from \"three\";\r\nimport { CanvasTextWrapper } from \"../../../helpers/TextWrapper\";\r\nimport useCursor from \"../../../helpers/useCursor\";\r\nimport useZoom from \"../../../helpers/useZoom\";\r\nimport { useStore } from \"../../../store\";\r\nimport { SectionContext } from \"../../Section\";\r\nimport { useMediaQuery } from \"react-responsive\";\r\nimport * as easings from \"d3-ease\";\r\nimport { Context } from \"../../MainCanvas\";\r\nimport { cameraMoveY, cameraMoveX } from \"../../../constants/misc\";\r\n\r\nconst cardWidthRatio = 0.666;\r\nconst cardHeight = 0.8;\r\nconst cardWidth = cardHeight * cardWidthRatio;\r\n\r\nconst logoImage = new Image();\r\nlogoImage.src = \"images/SVD-10-logo-black.png\";\r\n\r\nfunction drawCanvas(\r\n renderer: any,\r\n year: string,\r\n titleText: string,\r\n descriptionText: string,\r\n bottomText: string,\r\n height: number\r\n) {\r\n const canvas = document.createElement(\"canvas\");\r\n\r\n const context = canvas.getContext(\"2d\")!;\r\n context.canvas.height = height;\r\n context.canvas.width = canvas.height * cardWidthRatio;\r\n const scale = context.canvas.height / 2048;\r\n\r\n const padding = 60 * scale;\r\n\r\n context.fillStyle = \"white\";\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n context.fillStyle = \"black\";\r\n\r\n context.textBaseline = \"top\";\r\n context.textAlign = \"left\";\r\n context.font = `${30 * scale}px Arial`;\r\n context.fillText(year, padding, padding);\r\n\r\n CanvasTextWrapper(canvas, \"⠀\" + titleText.toLocaleUpperCase(), {\r\n font: `${180 * scale}px HelveticaNeue`,\r\n paddingX: padding,\r\n paddingY: padding,\r\n justifyLines: true,\r\n lineHeight: scale === 1 ? 0.9 : 4,\r\n });\r\n\r\n CanvasTextWrapper(canvas, descriptionText, {\r\n font: `${50 * scale}px HelveticaNeue`,\r\n verticalAlign: \"bottom\",\r\n paddingX: padding,\r\n paddingY: 200 * scale,\r\n width: canvas.width * 0.5 + padding,\r\n lineHeight: scale === 1 ? 1.2 : 0.3,\r\n });\r\n\r\n CanvasTextWrapper(canvas, bottomText.toLocaleUpperCase(), {\r\n font: `${30 * scale}px HelveticaNeue`,\r\n verticalAlign: \"bottom\",\r\n paddingX: padding,\r\n paddingY: padding,\r\n justifyLines: true,\r\n });\r\n\r\n context.drawImage(\r\n logoImage,\r\n canvas.width - 250 * scale - padding,\r\n canvas.height - 250 * scale - (padding + 100 * scale),\r\n 250 * scale,\r\n 250 * scale\r\n );\r\n\r\n const texture = new CanvasTexture(canvas);\r\n texture.anisotropy = renderer.capabilities.getMaxAnisotropy();\r\n\r\n return texture;\r\n}\r\n\r\ntype Props = {\r\n id: number;\r\n onClick: (id: number) => void;\r\n isViewing: boolean;\r\n};\r\n\r\ntype PostcardMaterialProps = {\r\n imageFilename: string;\r\n id: number;\r\n};\r\n\r\nconst PostcardMaterial = ({ id, imageFilename }: PostcardMaterialProps) => {\r\n const store = useStore();\r\n const { i18n, postcards, viewedPostcardId } = store;\r\n const { activeAmount, active } = useContext(SectionContext);\r\n\r\n const frontTexture = useTexture(`images/postcards/${imageFilename}`);\r\n\r\n const opacity = useSpring({\r\n value: viewedPostcardId === id || viewedPostcardId === -1 ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n return (\r\n a * b)}\r\n map={frontTexture}\r\n />\r\n );\r\n};\r\n\r\nexport default memo(({ id, onClick, isViewing }: Props) => {\r\n const { activeAmount, active } = useContext(SectionContext);\r\n const { subtleMotion } = useContext(Context);\r\n\r\n const store = useStore();\r\n const { i18n, postcards, viewedPostcardId } = store;\r\n\r\n const postcard = postcards[id];\r\n\r\n const { t } = useTranslation();\r\n\r\n const { camera } = useThree();\r\n\r\n const isBigScreen = useMediaQuery({ query: \"(min-device-width: 400px)\" });\r\n\r\n const { zoomRef, position, rotation, setPosition, setRotation } = useZoom(\r\n isViewing,\r\n isBigScreen ? 3.4 : 3.4,\r\n 1.8\r\n );\r\n\r\n const [isFlipped, setFlipped] = useState(false);\r\n\r\n function handleClick(event: any) {\r\n event.stopPropagation();\r\n\r\n if (!isViewing) {\r\n onClick(id);\r\n } else {\r\n flip();\r\n }\r\n }\r\n\r\n function flip() {\r\n setFlipped((flipped) => !flipped);\r\n const newRotation = camera.quaternion.clone();\r\n\r\n if (!isFlipped) {\r\n const flipQuat = new Quaternion();\r\n flipQuat.setFromEuler(new Euler(0, Math.PI, 0));\r\n newRotation.multiply(flipQuat);\r\n }\r\n setRotation({ value: newRotation.toArray() });\r\n }\r\n\r\n const isViewed = viewedPostcardId === id;\r\n\r\n useEffect(() => {\r\n if (store.isFirstPostcardView && isViewed) {\r\n setTimeout(() => flip(), 1000);\r\n store.setFirstPostcardViewed();\r\n }\r\n }, [store.isFirstPostcardView, isViewed]);\r\n\r\n const opacity = useSpring({\r\n value: isViewed || viewedPostcardId === -1 ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n\r\n native: true,\r\n });\r\n\r\n const zoom = useSpring({\r\n value: isViewed ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n const [handleEnter, handleExit] = useCursor(\r\n active,\r\n isViewed ? \"alias\" : \"pointer\"\r\n );\r\n\r\n const { gl } = useThree();\r\n\r\n const texture = useMemo(() => {\r\n const yearText = postcard.year + \"\";\r\n const titleText = postcard.title[i18n.language];\r\n const descriptionText = postcard.description[i18n.language];\r\n const bottomText = t(\"postcardBottom\");\r\n return drawCanvas(\r\n gl,\r\n yearText,\r\n titleText,\r\n descriptionText,\r\n bottomText,\r\n isViewing ? 2048 : 256\r\n );\r\n }, [isViewing]);\r\n\r\n return (\r\n \r\n {\r\n return (a[1] * 2 - 1) * 0.2 * b;\r\n })}\r\n rotation-y={to([subtleMotion.value, zoom.value], (a: any, b: any) => {\r\n return (a[0] * 2 - 1) * 0.2 * b;\r\n })}\r\n >\r\n \r\n \r\n \r\n \r\n a * b * 0.5\r\n )}\r\n />\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n a * b\r\n )}\r\n map={texture}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","import range from \"lodash/range\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, {\r\n Suspense,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useState,\r\n} from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useStore } from \"../../../store\";\r\nimport { SectionContext } from \"../../Section\";\r\nimport Postcard from \"./Postcard\";\r\n\r\nconst maxNumCardsPerRow = 6;\r\nconst rowHeight = 1;\r\n\r\nexport default observer(() => {\r\n const store = useStore();\r\n let { postcards, numCardsToRender } = store;\r\n const { active } = useContext(SectionContext);\r\n\r\n const numRows = Math.ceil(postcards.length / maxNumCardsPerRow);\r\n\r\n const handlePostcardClick = useCallback((id: number) => {\r\n store.setViewedPostcard(id);\r\n }, []);\r\n\r\n return (\r\n \r\n {range(numRows).map((rowIndex) => (\r\n \r\n {range(maxNumCardsPerRow).map((cardIndex) => {\r\n const cardId = rowIndex * maxNumCardsPerRow + cardIndex;\r\n\r\n if (cardId > numCardsToRender) return null;\r\n\r\n const postcard =\r\n postcards[rowIndex * maxNumCardsPerRow + cardIndex];\r\n\r\n return postcard ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : null;\r\n })}\r\n \r\n ))}\r\n
\r\n );\r\n});\r\n","import { observer } from \"mobx-react\";\r\nimport React, { Suspense } from \"react\";\r\nimport { useStore } from \"../../../store\";\r\nimport DynamicBackground from \"../../DynamicBackground\";\r\nimport Section from \"../../Section\";\r\nimport PostcardRack from \"./PostcardRack\";\r\n\r\nexport default observer(() => {\r\n const { lastViewedPostcardId, viewedPostcardId, postcards } = useStore();\r\n\r\n const lastViewedPostcard =\r\n lastViewedPostcardId !== -1 ? postcards[lastViewedPostcardId] : undefined;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n});\r\n","import { a, to, useSpring } from \"@react-spring/three\";\r\nimport { useTexture } from \"@react-three/drei\";\r\nimport * as easings from \"d3-ease\";\r\nimport range from \"lodash/range\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, { memo, useCallback, useContext, useRef } from \"react\";\r\nimport { useMediaQuery } from \"react-responsive\";\r\nimport { FrontSide, Material } from \"three\";\r\nimport { numShirts } from \"../../../constants/misc\";\r\nimport useCursor from \"../../../helpers/useCursor\";\r\nimport useZoom from \"../../../helpers/useZoom\";\r\nimport { useStore } from \"../../../store\";\r\nimport { Context } from \"../../MainCanvas\";\r\nimport { SectionContext } from \"../../Section\";\r\n\r\nconst ringRadius = 8.5;\r\nconst shirtHeight = 6;\r\nconst shirtWidth = shirtHeight * 0.9;\r\n\r\ntype Props = {\r\n id: number;\r\n onClick?: (id: number) => void;\r\n isViewing: boolean;\r\n};\r\n\r\nconst TShirt = memo(({ id, isViewing, onClick }: Props) => {\r\n const { viewedShirtId } = useStore();\r\n\r\n const { activeAmount, active } = useContext(SectionContext);\r\n const { subtleMotion } = useContext(Context);\r\n\r\n const material = useRef();\r\n\r\n const { shirts } = useStore();\r\n const shirt = shirts[id];\r\n\r\n const texture = useTexture(`images/shirts/${shirt.shirtImageFilename}`);\r\n\r\n const isBigScreen = useMediaQuery({ query: \"(min-device-width: 400px)\" });\r\n\r\n const { zoomRef, position, rotation, setPosition, setRotation } = useZoom(\r\n isViewing,\r\n isBigScreen ? 20 : 22,\r\n 1.5\r\n );\r\n\r\n const opacity = useSpring({\r\n value: viewedShirtId === id || viewedShirtId === -1 ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n const zoom = useSpring({\r\n value: viewedShirtId === id ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n const [handleEnter, handleExit] = useCursor(active && viewedShirtId === -1);\r\n\r\n function handleClick() {\r\n (viewedShirtId === id || viewedShirtId === -1) && onClick && onClick(id);\r\n }\r\n\r\n return (\r\n \r\n {\r\n return (a[1] * 2 - 1) * 0.2 * b;\r\n })}\r\n rotation-y={to([subtleMotion.value, zoom.value], (a: any, b: any) => {\r\n return (a[0] * 2 - 1) * 0.2 * b;\r\n })}\r\n >\r\n \r\n \r\n a * b\r\n )}\r\n side={FrontSide}\r\n />\r\n \r\n \r\n \r\n );\r\n});\r\n\r\nexport default observer(() => {\r\n const { active } = useContext(SectionContext);\r\n\r\n const store = useStore();\r\n\r\n const handleShirtClick = useCallback((id: number) => {\r\n store.setViewedShirt(id);\r\n }, []);\r\n\r\n return (\r\n \r\n {range(numShirts).map((shirtId) => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n
\r\n );\r\n});\r\n","import { observer } from \"mobx-react\";\r\nimport React, { Suspense } from \"react\";\r\nimport { useStore } from \"../../../store\";\r\nimport DynamicBackground from \"../../DynamicBackground\";\r\nimport Section from \"../../Section\";\r\nimport TShirtRack from \"./TShirtRack\";\r\n\r\nexport default observer(() => {\r\n const { lastViewedShirtId, viewedShirtId, shirts } = useStore();\r\n\r\n const lastViewedShirt =\r\n lastViewedShirtId !== -1 ? shirts[lastViewedShirtId] : undefined;\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n});\r\n","import { a } from \"@react-spring/three\";\r\nimport React, { memo, useContext } from \"react\";\r\nimport { useMediaQuery } from \"react-responsive\";\r\nimport { useFrame } from \"react-three-fiber\";\r\nimport {\r\n cameraMoveX,\r\n cameraMoveY,\r\n numSections,\r\n sectionScalePower,\r\n} from \"../constants/misc\";\r\nimport { Context } from \"./MainCanvas\";\r\nimport Intro from \"./sections/intro/Intro\";\r\nimport Photos from \"./sections/photos/Photos\";\r\nimport Postcards from \"./sections/postcards/Postcards\";\r\nimport TShirts from \"./sections/t-shirts/TShirts\";\r\n\r\nexport default memo(() => {\r\n const { x, activeSectionSmooth: activeIndex, subtleMotion } = useContext(\r\n Context\r\n );\r\n\r\n useFrame(({ gl, scene, camera }) => {\r\n gl && gl.render(scene, camera);\r\n }, 3);\r\n\r\n const isBigScreen = useMediaQuery({ query: \"(min-device-width: 400px)\" });\r\n\r\n return (\r\n (y * 2 - 1) * cameraMoveY)}\r\n rotation-y={subtleMotion.value.to((x, y) => (x * 2 - 1) * cameraMoveX)}\r\n scale={isBigScreen ? [1, 1, 1] : [1, 1, 1]}\r\n >\r\n Math.pow(sectionScalePower, v))}\r\n scale-y={activeIndex\r\n .to([0, numSections - 1], [0, -sectionScalePower])\r\n .to((v: any) => Math.pow(sectionScalePower, v))}\r\n scale-z={activeIndex\r\n .to([0, numSections - 1], [0, -sectionScalePower])\r\n .to((v: any) => Math.pow(sectionScalePower, v))}\r\n rotation-y={x}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","import { to } from \"@react-spring/three\";\r\nimport { a } from \"@react-spring/web\";\r\nimport React, { memo, useContext } from \"react\";\r\nimport useMeasure from \"react-use-measure\";\r\nimport { Photo as PhotoType, useStore } from \"../../../../store\";\r\nimport { Context } from \"../../../MainCanvas\";\r\nimport { getActiveAmount } from \"../../../Section\";\r\n\r\ntype PhotoProps = {\r\n photo: PhotoType;\r\n index: number;\r\n size: number[];\r\n totalWidth: number;\r\n};\r\n\r\nconst aspectRatio = 0.7;\r\n\r\nfunction getImageLeft(\r\n x: number,\r\n containerWidth: number,\r\n xOffset: number,\r\n width: number\r\n) {\r\n const wrappedToCircle = (x + Math.PI * 2 * 1000) % (Math.PI * 2);\r\n const normalized = wrappedToCircle / (Math.PI * 2);\r\n return (\r\n ((normalized * containerWidth + xOffset + width) % containerWidth) - width\r\n );\r\n}\r\n\r\nconst Photo = ({ photo, index, size, totalWidth }: PhotoProps) => {\r\n const { x, subtleMotion } = useContext(Context);\r\n\r\n return (\r\n \r\n getImageLeft(x + sx * 0.2, totalWidth, index * size[0], size[0])\r\n ),\r\n }}\r\n src={`images/photos/${photo.filename}`}\r\n />\r\n );\r\n};\r\n\r\nexport default memo(() => {\r\n const { photos } = useStore();\r\n const { activeSectionSmooth } = useContext(Context);\r\n\r\n const [ref, bounds] = useMeasure();\r\n\r\n const imageWidth = bounds.height * aspectRatio;\r\n const totalWidth = imageWidth * photos.length;\r\n\r\n return (\r\n \r\n getActiveAmount(v, 3)\r\n ) as any,\r\n }}\r\n >\r\n {photos.map((photo, i) => (\r\n \r\n ))}\r\n \r\n );\r\n});\r\n","import { a, SpringValue } from \"@react-spring/web\";\r\nimport { observer } from \"mobx-react\";\r\n\r\ntype Props = {\r\n opacity: SpringValue;\r\n topText: string;\r\n bottomText: string;\r\n};\r\n\r\nexport default observer(({ opacity, topText, bottomText }: Props) => {\r\n const bottomTextParts = bottomText.split(\"\\n\");\r\n return (\r\n \r\n
\r\n

{topText}

\r\n
\r\n {bottomTextParts.map((part, i) => (\r\n

{part}

\r\n ))}\r\n
\r\n
\r\n \r\n );\r\n});\r\n","import { a, useSpring } from \"@react-spring/web\";\r\nimport * as easings from \"d3-ease\";\r\nimport { observer } from \"mobx-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useStore } from \"../store\";\r\nimport TwoPartText from \"./TwoPartText\";\r\n\r\ntype Props = {\r\n sectionIndex: number;\r\n topTextKey: string;\r\n bottomTextKey: string;\r\n};\r\n\r\nexport default observer(\r\n ({ sectionIndex, topTextKey, bottomTextKey }: Props) => {\r\n const { isViewingItem, activeSection } = useStore();\r\n\r\n const { t } = useTranslation();\r\n\r\n const opacity = useSpring({\r\n value: activeSection === sectionIndex && !isViewingItem ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n return (\r\n \r\n );\r\n }\r\n);\r\n","import { a, useSpring } from \"@react-spring/web\";\r\nimport * as easings from \"d3-ease\";\r\nimport { observer } from \"mobx-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useStore } from \"../store\";\r\nimport TwoPartText from \"./TwoPartText\";\r\n\r\ntype Props = {};\r\n\r\nexport default observer(({}: Props) => {\r\n const {\r\n isViewingItem,\r\n activeSection,\r\n activeShirtId,\r\n isShirtTextVisible,\r\n shirts,\r\n currentLanguage,\r\n } = useStore();\r\n\r\n const { t } = useTranslation();\r\n\r\n const shirt = shirts[activeShirtId];\r\n\r\n const opacity = useSpring({\r\n value: activeSection === 2 && !isViewingItem && isShirtTextVisible ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n const topText = shirt.title[currentLanguage];\r\n const bottomText = shirt.isReleased\r\n ? `${t(\"by\")} ${shirt.designer}\\n${shirt.description[currentLanguage]}`\r\n : t(\"comingSoon\");\r\n\r\n return (\r\n \r\n );\r\n});\r\n","export default __webpack_public_path__ + \"static/media/SVD-10-arrow-go-v2.9f47929b.png\";","import { a, useSpring } from \"@react-spring/web\";\r\nimport * as easings from \"d3-ease\";\r\nimport { observer } from \"mobx-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ReactComponent as GoArrow } from \"../assets/svg/SVD-10-arrow-go-v2.svg\";\r\nimport { useStore } from \"../store\";\r\nimport arrow from \"../assets/images/SVD-10-arrow-go-v2.png\";\r\n\r\ntype Props = {};\r\n\r\nexport default observer(({}: Props) => {\r\n const store = useStore();\r\n const {\r\n viewedShirtId,\r\n activeSection,\r\n activeShirtId,\r\n\r\n shirts,\r\n currentLanguage,\r\n } = store;\r\n\r\n const { t } = useTranslation();\r\n\r\n const shirt = shirts[viewedShirtId];\r\n\r\n const isActive = activeSection === 2 && viewedShirtId >= 0;\r\n\r\n const opacity = useSpring({\r\n value: isActive ? 1 : 0,\r\n config: {\r\n duration: 500,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n const productPageUrl = shirt?.storeUrl[currentLanguage];\r\n\r\n return (\r\n \r\n {\r\n \r\n \r\n \r\n }\r\n \r\n \r\n );\r\n});\r\n","import { ResizeObserver } from \"@juggle/resize-observer\";\r\nimport { config, SpringValue, useSpring } from \"@react-spring/three\";\r\nimport { Preload, Stats, useDetectGPU } from \"@react-three/drei\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, { createContext, Suspense } from \"react\";\r\nimport { Canvas } from \"react-three-fiber\";\r\nimport { useMove } from \"react-use-gesture\";\r\nimport { State } from \"react-use-gesture/dist/types\";\r\nimport useGestures from \"../helpers/useGestures\";\r\nimport { useStore } from \"../store\";\r\nimport NavArrows from \"./NavArrows\";\r\nimport PostcardZoom from \"./PostcardZoom\";\r\nimport Scene from \"./Scene\";\r\nimport Gallery from \"./sections/photos/gallery/Gallery\";\r\nimport SectionText from \"./SectionText\";\r\nimport ShirtText from \"./ShirtText\";\r\nimport ShirtZoom from \"./ShirtZoom\";\r\n\r\nexport type NavigationValues = {\r\n activeSectionSmooth: SpringValue;\r\n x: SpringValue;\r\n subtleMotion: { value: SpringValue };\r\n};\r\n\r\nexport const Context = createContext({\r\n x: new SpringValue(),\r\n subtleMotion: { value: new SpringValue() },\r\n activeSectionSmooth: new SpringValue(),\r\n});\r\n\r\nexport default observer(() => {\r\n const { x, sectionSmooth, snapToSection, snapToShirt } = useGestures({\r\n domTarget: window,\r\n });\r\n const store = useStore();\r\n\r\n store.snapToSection = snapToSection;\r\n store.snapToShirt = snapToShirt;\r\n\r\n function onBackgroundClick() {\r\n store.setViewedPostcard(-1);\r\n store.setViewedShirt(-1);\r\n }\r\n\r\n const [subtleMotion, setSubtleMotion] = useSpring(() => ({\r\n value: [0, 0],\r\n config: config.slow,\r\n native: true,\r\n }));\r\n\r\n function handleMouseMove({ xy: [x, y], vxvy: [vx, vy] }: State[\"move\"]) {\r\n setSubtleMotion({\r\n value: [x / window.innerWidth, y / window.innerHeight],\r\n });\r\n }\r\n\r\n useMove(handleMouseMove, { domTarget: window });\r\n\r\n const gpuTier = useDetectGPU();\r\n\r\n return (\r\n \r\n <>\r\n {/* \r\n SVD\r\n */}\r\n \r\n store.setDragging(true)}\r\n onMouseUp={() => store.setDragging(false)}\r\n >\r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","export default __webpack_public_path__ + \"static/media/decade-loader.07c2e3fa.gif\";","import { a, useSpring } from \"@react-spring/web\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport \"./App.css\";\r\nimport MainCanvas from \"./components/MainCanvas\";\r\nimport { useStore } from \"./store\";\r\nimport * as easings from \"d3-ease\";\r\nimport spinner from \"./assets/images/decade-loader.gif\";\r\n\r\nexport default observer(() => {\r\n const store = useStore();\r\n const [isLoaded, setLoaded] = useState(false);\r\n\r\n async function init() {\r\n await store.init();\r\n setLoaded(true);\r\n }\r\n\r\n useEffect(() => {\r\n init();\r\n }, []);\r\n\r\n const opacity = useSpring({\r\n value: store.isInitialised ? 0 : 1,\r\n immediate: !store.isInitialised,\r\n config: {\r\n duration: 500,\r\n delay: 1000,\r\n easing: easings.easeCubicInOut,\r\n },\r\n native: true,\r\n });\r\n\r\n return (\r\n <>\r\n {isLoaded && }\r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./index.css\";\r\nimport App from \"./App\";\r\nimport reportWebVitals from \"./reportWebVitals\";\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}