{"version":3,"sources":["globals.js","serviceWorker.js","components/BlinkingBadge/index.js","components/Effects/index.js","components/Stats/index.js","utils/loadingManager/FontResource.js","components/LoadingScreen/index.js","assets/fonts/pt-mono/ptm55ft.fnt","assets/fonts/pt-mono/ptm55ft.png","utils/clamp.js","utils/loadingManager/Resource.js","utils/loadingManager/FetchResource.js","utils/loadingManager/index.js","utils/loadingManager/LoadingManager.js","components/FlatText/index.js","utils/config.js","utils/isInView.js","components/Commit/index.js","components/Branch/BranchGeometry.js","components/Branch/BranchMaterial.js","components/Branch/index.js","components/CameraOperator/index.js","components/Debris/index.js","utils/hsb2rgb.js","utils/rgb2hex.js","utils/getBranchColor.js","components/Surf/useBranches.js","components/Surf/index.js","hooks/useRepo.js","utils/isEnvironment.js","components/App/index.js","index.js"],"names":["window","THREE","Boolean","location","hostname","match","BlinkingBadge","className","children","extend","EffectComposer","RenderPass","UnrealBloomPass","stats","textureLoader","Effects","composer","useRef","useThree","scene","gl","size","camera","useEffect","current","setSize","width","height","useFrame","render","ref","args","attachArray","undefined","MESSAGES","LoadingScreen","isLoaded","loaded","targetProgress","progress","progressContainer","animation","useState","messageIndex","setMessageIndex","isVisible","setIsVisible","isFullyLoaded","handleTransitionEnd","useCallback","handleProgressAnimation","newProgressValue","Math","round","textContent","newMessageIndex","floor","length","raf","requestAnimationFrame","cancelAnimationFrame","classnames","onTransitionEnd","SwitchTransition","CSSTransition","key","timeout","classNames","Stats","StatsJS","showPanel","document","body","appendChild","dom","remove","update","clamp","v","min","max","result","Resource","data","manager","this","request","response","onLoaded","f","Promise","resolve","FontResource","TextureLoader","onProgress","font","image","loadFont","e","definition","console","log","Error","load","atlas","setResponse","total","FetchResource","url","xhr","XMLHttpRequest","addEventListener","json","JSON","parse","open","send","loadingManager","options","registerResource","type","res","resources","push","reduce","sum","resource","handleProgress","onStart","onLoad","onError","THREELoadingManager","handleStart","handleLoad","handleError","forEach","ptMono","ptMonoFont","ptMonoImage","DEFAULT_ATLAS","Texture","FlatText","memo","props","isActive","active","color","meshProps","setFont","colorObject","useMemo","Color","text","join","MSDFShader","createMSDFShader","transparent","opacity","a","get","geometry","createTextGeometry","lineHeight","useSpring","spring","set","scale","rawShaderMaterial","attach","uniforms-color-value","uniforms-map-value","defaultProps","create","commit","radius","emissiveIntensity","track","position","x","y","z","distanceFromHead","near","far","fov","xVariation","yVariation","variationDuration","speed","waitOnFirstCommit","commitsDistance","branchesDistance","isOrbitControlsEnabled","useConfig","DatGui","handleUpdate","config","onUpdate","path","label","step","title","frustum","Frustum","cameraViewProjectionMatrix","Matrix4","isInView","object","updateMatrixWorld","matrixWorldInverse","getInverse","matrixWorld","multiplyMatrices","projectionMatrix","setFromMatrix","containsPoint","intersectsObject","commitsBuffer","makeCommitMesh","CircleBufferGeometry","material","MeshLambertMaterial","emissive","depthTest","Mesh","Commit","renderOrder","sha","message","isReady","c","defaultColor","groupRef","commitRef","isGone","setIsGone","rotation","slow","find","isAvailable","index","mesh","getAvailableCommitFromBuffer","add","getValue","textPosition","textRotation","PI","substr","CommitWrapper","currentCommit","useContext","SurfContext","BranchGeometry","setMatrixWorld","setGeometry","g","widthCallback","positions","counters","j","vertices","Float32Array","Array","process","raycast","raycaster","intersects","precision","linePrecision","precisionSq","boundingSphere","computeBoundingSphere","raycastSphere","copy","applyMatrix4","ray","intersectSphere","raycastInverseMatrix","raycastRay","vStart","vEnd","interSegment","interRay","attributes","indices","array","i","l","b","fromArray","distanceSqToSegment","distance","origin","distanceTo","point","clone","face","faceIndex","nbVertices","compareV3","aa","ab","copyV3","w","previous","next","side","indices_array","uvs","n","copyArray","needsUpdate","uv","Uint16Array","setAttribute","setIndex","advance","memcpy","src","srcOffset","dst","dstOffset","subarray","slice","buffer","BranchMaterial","parameters","uniforms","common","specularmap","envmap","aomap","lightmap","emissivemap","fog","lights","lineWidth","value","map","useMap","alphaMap","useAlphaMap","resolution","sizeAttenuation","dashArray","dashOffset","dashRatio","useDash","visibility","alphaTest","repeat","vertexShader","branch_vert","fragmentShader","branch_frag","source","isBranchMaterial","Object","defineProperties","enumerable","diffuse","setValues","Branch","commits","skipLastCommit","skipFirstCommit","vv","lastIndex","ci","deltaIndex","Vector3","minIndex","clock","waitToBranch","elapsedTime","self","parent","getPoints","FrontSide","CAMERA_UP_DAMPING","CameraOperator","commitsCount","distanceFromHeadOnRun","lookPosition","mass","tension","friction","timeToMove","timeToAlmostEnd","timeToEnd","tte","alpha","headZ","targetDistanceFromHead","targetUp","newX","cos","newY","sin","newZ","up","toArray","upX","upY","upZ","newUp","lookAt","dummy","Object3D","Debris","instancedMesh","debris","fill","_","t","random","updateMatrix","setMatrixAt","matrix","instanceMatrix","frustumCulled","hsb2rgb","h0","s","R","G","B","X","C","h","r","abs","rgb2hex","toString","BASE_COLOR","getBranchColor","rgb","branchIndex2Position","ceil","useBranches","pendingBranches","parents","branches","currentBranch","name","range","Infinity","evaluatedCommits","shift","pathIndex","head","groupCollapsed","indexOf","nextCommitSha","forkBranch","findIndex","groupEnd","positionIndex","found","getAvailableIndex","createContext","Surf","owner","repo","setCurrentCommit","isEnded","setIsEnded","ti","Provider","useRepo","setCommits","parts","pathname","replace","split","getRepoParamsFromPath","fetchedCommitsResource","fetchedCommits","fetch","env","URLSearchParams","search","isDevelopment","backgroundColor","App","isCanvasReady","setIsCanvasReady","setIsLoaded","setProgress","error","setError","init","useLoadingState","handleCanvasCreate","gammaInput","setClearColor","setTimeout","cameraSettings","onCreated","pixelRatio","devicePixelRatio","updateDefaultCamera","intensity","ReactDOM","getElementById","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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ACA,yBACA,yBACA,yBACA,8BACA,wBACA,6BACA,yBACA,2BACA,4BACA,2BACA,4BACA,2BACA,uBACA,GACA,oBACA,2BACA,4BACA,+BACA,GACA,sBACA,+BACA,kCACA,SACA,GACA,GACA,oBACA,qBACA,qCACA,iCACA,8BACA,+BACA,+BACA,oCACA,iCACA,oCACA,uCACA,yCACA,kCACA,mBACA,+BACA,+BACA,qCACA,sCACA,uCACA,uCACA,2CACA,GACA,gBACA,GACA,0CACA,GACA,oDAGA,4GACA,6CACA,GACA,sCACA,GACA,yEACA,uFACA,gDAKA,2BACA,oGACA,QACA,GACA,sCACA,sCACA,GACA,sBACA,uFACA,GACA,0BACA,6FACA,YACA,wDACA,aACA,GACA,mCACA,GACA,kFACA,GACA,0BACA,oFACA,YACA,kDACA,aACA,GACA,kGACA,GACA,oBACA,gCACA,GACA,kHACA,GACA,iCACA,GACA,0DACA,GACA,qDACA,GACA,sCACA,oCACA,8BACA,8CACA,oCACA,GACA,KACAwJ,KAAK,Q,IAEc6K,G,kDACnB,WAAYC,GAAa,IAAD,gCACtB,cAAM,CACJC,SAAS,wHACJvU,cAAkBwU,QAClBxU,cAAkByU,aAClBzU,cAAkB0U,QAClB1U,cAAkB2U,OAClB3U,cAAkB4U,UAClB5U,cAAkB6U,aAClB7U,cAAkB8U,KAClB9U,cAAkB+U,QARf,IASNC,UAAW,CAAEC,MAAO,GACpBC,IAAK,CAAED,MAAO,MACdE,OAAQ,CAAEF,MAAO,GACjBG,SAAU,CAAEH,MAAO,MACnBI,YAAa,CAAEJ,MAAO,GACtBpH,SAAU,CAAEoH,MAAO,IAAIjV,QAAY,IACnC4J,QAAS,CAAEqL,MAAO,GAClBK,WAAY,CAAEL,MAAO,IAAIjV,UAAc,EAAG,IAC1CuV,gBAAiB,CAAEN,MAAO,GAC1B5J,KAAM,CAAE4J,MAAO,GACf3J,IAAK,CAAE2J,MAAO,GACdO,UAAW,CAAEP,MAAO,GACpBQ,WAAY,CAAER,MAAO,GACrBS,UAAW,CAAET,MAAO,IACpBU,QAAS,CAAEV,MAAO,GAClBW,WAAY,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","file":"static/js/main.97db9780.chunk.js","sourcesContent":["import * as THREE from \"three\";\n\nwindow.THREE = THREE;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === \"[::1]\" ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service \" +\n \"worker. To learn more, visit https://bit.ly/CRA-PWA\"\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://bit.ly/CRA-PWA.\"\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error(\"Error during service worker registration:\", error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n );\n });\n}\n\nexport function unregister() {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from \"react\";\nimport \"./style.scss\";\n\nconst BlinkingBadge = ({ className = \"\", children = \"beta\" }) => (\n
{children}
\n);\n\nexport default BlinkingBadge;\n","import React, { useRef, useEffect } from \"react\";\nimport { extend, useThree, useFrame } from \"react-three-fiber\";\nimport { EffectComposer } from \"three/examples/jsm/postprocessing/EffectComposer\";\nimport { RenderPass } from \"three/examples/jsm/postprocessing/RenderPass\";\nimport { UnrealBloomPass } from \"three/examples/jsm/postprocessing/UnrealBloomPass\";\n\nextend({ EffectComposer, RenderPass, UnrealBloomPass });\n\nconst Effects = () => {\n const composer = useRef();\n const { scene, gl, size, camera } = useThree();\n\n useEffect(() => composer.current.setSize(size.width, size.height), [size]);\n\n useFrame(() => composer.current.render(), 2);\n\n return (\n \n \n \n \n );\n};\n\nexport default Effects;\n","import { useEffect } from \"react\";\nimport { useFrame } from \"react-three-fiber\";\nimport StatsJS from \"stats.js\";\n\nlet stats;\n\nconst Stats = () => {\n useEffect(() => {\n stats = new StatsJS();\n stats.showPanel(0);\n document.body.appendChild(stats.dom);\n\n return () => {\n stats.dom.remove();\n };\n }, []);\n\n useFrame(() => {\n stats.update();\n });\n\n return null;\n};\n\nexport default Stats;\n","import loadFont from \"load-bmfont\";\nimport { TextureLoader } from \"three\";\n\nimport clamp from \"utils/clamp\";\nimport Resource from \"./Resource\";\n\nlet textureLoader;\n\nexport default class FontResource extends Resource {\n constructor(...args) {\n super(...args);\n\n if (!textureLoader) {\n textureLoader = new TextureLoader(this.manager);\n }\n this.textureLoader = textureLoader;\n }\n load(onProgress) {\n const { font, image } = this.request;\n\n loadFont(font, (e, definition) => {\n if (e) {\n console.log(\"Error loading font.\", { font }, e);\n throw new Error(e);\n }\n\n this.textureLoader.load(\n image,\n atlas => {\n this.setResponse({ definition, atlas });\n onProgress();\n },\n ({ loaded, total }) => {\n this.progress = !total\n ? 1\n : clamp(loaded / total, { min: 0, max: 1 });\n console.log(\"progress font\", this.progress);\n\n onProgress();\n },\n e => {\n console.log(\"Error loading font atlas.\", { font, image }, e);\n throw new Error(e);\n }\n );\n });\n }\n}\n","import classnames from \"classnames\";\nimport React, { useRef, useState, useCallback, useEffect } from \"react\";\nimport { SwitchTransition, CSSTransition } from \"react-transition-group\";\n\nimport \"./style.scss\";\n\nconst MESSAGES = [\"status\", \"fetch\", \"checkout\", \"pull\", \"log\"];\n\nconst LoadingScreen = ({ loaded: isLoaded, progress: targetProgress }) => {\n const progressContainer = useRef();\n const progress = useRef(0);\n const animation = useRef(null);\n const [messageIndex, setMessageIndex] = useState(0);\n const [isVisible, setIsVisible] = useState(true);\n\n const isFullyLoaded = progress.current === 1 && isLoaded;\n\n const handleTransitionEnd = useCallback(() => {\n if (!isFullyLoaded) {\n return;\n }\n\n setIsVisible(false);\n }, [isFullyLoaded]);\n\n const handleProgressAnimation = useCallback(() => {\n if (\n !animation.current ||\n animation.current.targetProgress === progress.current\n ) {\n // target reached, interrupt animation\n animation.current = null;\n return;\n }\n\n // update progress\n progress.current +=\n (animation.current.targetProgress - progress.current) * 0.05;\n const newProgressValue = Math.round(progress.current * 100);\n if (newProgressValue === 100) {\n // if round value is 100, update progress to 1 and interrupt animation\n progress.current = 1;\n }\n progressContainer.current.textContent = newProgressValue;\n\n // check for new message\n const newMessageIndex = Math.floor(\n progress.current * (MESSAGES.length - 1)\n );\n\n if (newMessageIndex !== animation.current.messageIndex) {\n // if message changed fire new render\n setMessageIndex(newMessageIndex);\n }\n\n animation.current.raf = requestAnimationFrame(handleProgressAnimation);\n }, []);\n\n useEffect(() => {\n if (!animation.current) {\n animation.current = {\n raf: requestAnimationFrame(handleProgressAnimation),\n targetProgress,\n messageIndex\n };\n }\n\n return () => {\n if (animation.current) {\n cancelAnimationFrame(animation.current.raf);\n animation.current = null;\n }\n };\n }, [handleProgressAnimation, targetProgress, messageIndex]);\n\n if (!isVisible) {\n return null;\n }\n\n return (\n \n
\n
\n {Math.round(progress.current * 100)}\n
\n
\n \n \n
\n {MESSAGES[messageIndex]}\n
\n \n
\n
\n
\n \n );\n};\n\nexport default LoadingScreen;\n","export default __webpack_public_path__ + \"static/media/ptm55ft.b3ebeb2b.fnt\";","export default __webpack_public_path__ + \"static/media/ptm55ft.4a6b2055.png\";","const clamp = (v, { min, max }) => {\n let result = v;\n\n if (min !== undefined && result < min) {\n v = min;\n } else if (max !== undefined && result > max) {\n v = max;\n }\n\n return result;\n};\n\nexport default clamp;\n","export default class Resource {\n constructor(data, { manager }) {\n this.request = data;\n this.progress = 0;\n this.response = {};\n this.manager = manager;\n this.isLoaded = false;\n this.onLoaded = f => f;\n }\n\n setResponse(response) {\n this.response = response;\n this.isLoaded = true;\n this.progress = 1;\n\n this.onLoaded(this.response);\n }\n\n async get() {\n if (!this.isLoaded) {\n return new Promise(resolve => {\n this.onLoaded = resolve;\n });\n }\n\n return this.response;\n }\n\n load() {}\n}\n","import clamp from \"utils/clamp\";\nimport Resource from \"./Resource\";\n\nexport default class FetchResource extends Resource {\n load(onProgress) {\n const url = this.request;\n\n const xhr = new XMLHttpRequest();\n xhr.addEventListener(\"load\", e => {\n const json = JSON.parse(xhr.response);\n\n this.setResponse(json);\n onProgress();\n });\n xhr.addEventListener(\"progress\", ({ loaded, total }) => {\n this.progress = !total ? 1 : clamp(loaded / total, { min: 0, max: 1 });\n console.log(\"progress fetch\", this.progress);\n onProgress();\n });\n xhr.addEventListener(\"error\", e => {\n console.log(\"Error fetching url.\", { url }, e);\n throw new Error(e);\n });\n xhr.addEventListener(\"abort\", e => {\n console.log(\"Fetching url has been aborted.\", { url }, e);\n throw new Error(e);\n });\n xhr.open(\"GET\", url);\n xhr.send();\n }\n}\n","import { useState, useCallback, useEffect } from \"react\";\n\nimport LoadingManager from \"./LoadingManager\";\nexport { RESOURCE_TYPE_FETCH, RESOURCE_TYPE_FONT } from \"./LoadingManager\";\n\nconst loadingManager = new LoadingManager();\n\nexport const useLoadingState = () => {\n const [progress, setProgress] = useState(0);\n const [error, setError] = useState(false);\n\n const handleStart = useCallback(() => {\n console.log(\"Start loading...\");\n }, []);\n const handleProgress = useCallback(\n progress => {\n setProgress(progress);\n },\n [setProgress]\n );\n const handleLoad = useCallback(() => {\n console.log(\"Loading complete! 👌\");\n setProgress(1);\n }, [setProgress]);\n const handleError = useCallback(\n url => {\n console.log(`Error loading \"${url}\" 👌`);\n setError(true);\n },\n [setError]\n );\n\n useEffect(() => {\n loadingManager.init({\n onStart: handleStart,\n onProgress: handleProgress,\n onLoad: handleLoad,\n onError: handleError\n });\n }, [handleStart, handleProgress, handleLoad, handleError]);\n\n return { progress, error };\n};\n\nexport default loadingManager;\n","import { LoadingManager as THREELoadingManager } from \"three\";\n\nimport clamp from \"utils/clamp\";\n\nimport FontResource from \"./FontResource\";\nimport FetchResource from \"./FetchResource\";\n\nexport const RESOURCE_TYPE_FONT = 0;\nexport const RESOURCE_TYPE_FETCH = 1;\n\nexport default class LoadingManager {\n constructor(options) {\n const { onStart, onProgress, onLoad, onError } = options || {};\n\n this.manager = new THREELoadingManager();\n this.resources = [];\n\n this.handleStart = onStart || (f => f);\n this.handleProgress = onProgress || (f => f);\n this.handleLoad = onLoad || (f => f);\n this.handleError = onError || (f => f);\n\n this.manager.onStart = this.handleStart;\n this.manager.onLoad = this.handleLoad;\n this.manager.onError = this.handleError;\n }\n\n init(options) {\n const { onStart, onProgress, onLoad, onError } = options || {};\n\n this.handleStart = onStart || (f => f);\n this.handleProgress = onProgress || (f => f);\n this.handleLoad = onLoad || (f => f);\n this.handleError = onError || (f => f);\n\n this.manager.onStart = this.handleStart;\n this.manager.onLoad = this.handleLoad;\n this.manager.onError = this.handleError;\n }\n\n registerResource = (data, type) => {\n let res;\n\n switch (type) {\n case RESOURCE_TYPE_FONT:\n res = new FontResource(data, { manager: this.manager });\n break;\n case RESOURCE_TYPE_FETCH:\n res = new FetchResource(data, { manager: this.manager });\n break;\n default:\n return;\n }\n\n this.resources.push(res);\n\n return res;\n };\n\n progress = () => {\n const progress = clamp(\n this.resources.length\n ? this.resources.reduce((sum, resource) => sum + resource.progress, 0) /\n this.resources.length\n : 1,\n {\n min: 0,\n max: 1\n }\n );\n\n this.handleProgress(progress);\n };\n\n load() {\n console.log(\n `loading ${this.resources.length} resources...`,\n this.resources\n );\n\n this.resources.forEach(resource => {\n resource.load(this.progress);\n });\n }\n}\n","import React, { memo, useRef, useEffect, useState, useMemo } from \"react\";\nimport { useSpring, a } from \"react-spring/three\";\nimport { Color, Texture } from \"three\";\nimport createMSDFShader from \"three-bmfont-text/shaders/msdf\";\nimport createTextGeometry from \"three-bmfont-text\";\n\nimport ptMonoFont from \"assets/fonts/pt-mono/ptm55ft.fnt\";\nimport ptMonoImage from \"assets/fonts/pt-mono/ptm55ft.png\";\nimport loadingManager, { RESOURCE_TYPE_FONT } from \"utils/loadingManager\";\n\nconst ptMono = loadingManager.registerResource(\n {\n font: ptMonoFont,\n image: ptMonoImage\n },\n RESOURCE_TYPE_FONT\n);\n\nconst DEFAULT_ATLAS = new Texture();\nconst DEFAULT_COLOR = \"#FFFFFF\";\n\nconst FlatText = memo(props => {\n const { active: isActive, children, color, width, ...meshProps } = props;\n\n const ref = useRef(null);\n const [font, setFont] = useState(null);\n\n const colorObject = useMemo(() => new Color(color), [color]);\n const text = useMemo(() => children.join(\"\\n\"), [children]);\n const MSDFShader = useMemo(\n () =>\n createMSDFShader({\n transparent: true,\n color: \"#FFFFFF\",\n opacity: 0\n }),\n []\n );\n\n useEffect(() => {\n const f = async () => {\n const { definition, atlas } = await ptMono.get();\n\n // create text geometry\n const geometry = createTextGeometry({\n text,\n font: definition, // the bitmap font definition\n width, // width for word-wrap\n lineHeight: 48\n });\n\n setFont({ definition, atlas, geometry });\n };\n\n f();\n }, [text, setFont, width]);\n\n const [spring, set] = useSpring(() => ({ \"uniforms-opacity-value\": 0 }));\n useEffect(() => {\n if (isActive) {\n // show\n set({ \"uniforms-opacity-value\": 1 });\n } else {\n // hide\n set({ \"uniforms-opacity-value\": 0 });\n }\n }, [isActive, set]);\n\n if (!font || !font.geometry) {\n return null;\n }\n\n return (\n \n \n \n \n \n );\n});\n\nFlatText.defaultProps = {\n color: DEFAULT_COLOR,\n width: 960\n};\n\nexport default FlatText;\n","import React from \"react\";\nimport ReactDatGui, {\n DatFolder,\n DatNumber,\n DatColor,\n DatBoolean\n} from \"react-dat-gui\";\nimport \"react-dat-gui/dist/index.css\";\nimport create from \"zustand\";\n\nexport const [useConfig] = create(set => ({\n commit: {\n radius: 5,\n color: \"#8ACB67\",\n emissiveIntensity: 1\n },\n track: {\n width: 6,\n color: \"#8ACB67\",\n emissiveIntensity: 1\n },\n camera: {\n position: {\n x: 0,\n y: 25,\n z: -150\n },\n distanceFromHead: 150,\n near: 0.01,\n far: 1000,\n fov: 70,\n xVariation: 10,\n yVariation: 20,\n variationDuration: 15\n },\n speed: 0.8,\n waitOnFirstCommit: 1.5,\n commitsDistance: 75,\n branchesDistance: 20,\n isOrbitControlsEnabled: false,\n set\n}));\n\nexport const DatGui = () => {\n const data = useConfig();\n const handleUpdate = useConfig(config => config.set);\n\n return (\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n \n );\n};\n","import { Frustum, Matrix4 } from \"three\";\n\nconst frustum = new Frustum();\nconst cameraViewProjectionMatrix = new Matrix4();\n\nconst isInView = (object, camera) => {\n // make sure the camera matrix is updated\n camera.updateMatrixWorld();\n camera.matrixWorldInverse.getInverse(camera.matrixWorld);\n\n // evaluate camera/view projection matrix\n cameraViewProjectionMatrix.multiplyMatrices(\n camera.projectionMatrix,\n camera.matrixWorldInverse\n );\n\n // evaluate frustum\n frustum.setFromMatrix(cameraViewProjectionMatrix);\n\n return object.type === \"Group\"\n ? frustum.containsPoint(object.position)\n : frustum.intersectsObject(object);\n};\n\nexport default isInView;\n","import React, { useRef, useState, useEffect, useContext, useMemo } from \"react\";\nimport { useSpring, config } from \"react-spring/three\";\nimport { useFrame } from \"react-three-fiber\";\nimport { Mesh, CircleBufferGeometry, MeshLambertMaterial } from \"three\";\n\nimport FlatText from \"components/FlatText\";\nimport { SurfContext } from \"components/Surf\";\nimport { useConfig } from \"utils/config\";\nimport isInView from \"utils/isInView\";\n\nconst commitsBuffer = [];\nconst getAvailableCommitFromBuffer = () => {\n let commit = commitsBuffer.find(c => c.isAvailable);\n if (!commit) {\n commit = {\n index: commitsBuffer.length,\n mesh: makeCommitMesh(),\n isAvailable: false\n };\n commitsBuffer.push(commit);\n } else {\n commit.isAvailable = false;\n }\n\n return commit;\n};\nconst makeCommitMesh = () => {\n // create geometry\n const geometry = new CircleBufferGeometry(5, 32);\n // create material\n const material = new MeshLambertMaterial({\n emissive: \"#8ACB67\",\n emissiveIntensity: 1,\n depthTest: false,\n transparent: true,\n opacity: 0\n });\n\n return new Mesh(geometry, material);\n};\nconst freeCommitOnBuffer = commit => {\n if (!commit) {\n return;\n }\n\n commit.isAvailable = true;\n};\n\nconst Commit = props => {\n const {\n position,\n color,\n renderOrder = 0,\n sha,\n message,\n isReady,\n isActive\n } = props;\n\n const { radius, color: defaultColor, emissiveIntensity } = useConfig(\n c => c.commit\n );\n\n const groupRef = useRef();\n const commitRef = useRef();\n const [isGone, setIsGone] = useState(false);\n\n const [spring, set] = useSpring(() => ({\n scale: [0.01, 0.01, 0.01],\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n config: config.slow\n }));\n\n useEffect(() => {\n if (isReady) {\n // open it\n set({ scale: [1, 1, 1] });\n }\n }, [isReady, set]);\n\n useEffect(() => {\n if (isActive) {\n // open it\n set({ scale: [1.2, 1.2, 1.2], position: [0, 1, 0] });\n } else {\n // close it\n set({ scale: [1, 1, 1], position: [0, 0, 0] });\n }\n }, [isActive, set]);\n\n useFrame(({ camera }) => {\n if (isGone) {\n return;\n }\n\n if (!commitRef.current && isReady && isInView(groupRef.current, camera)) {\n // the commit needs to be positioned (is in view)\n commitRef.current = getAvailableCommitFromBuffer();\n groupRef.current.add(commitRef.current.mesh);\n } else if (commitRef.current && !isInView(commitRef.current.mesh, camera)) {\n // the commit is out of view can be recycled\n groupRef.current.remove(commitRef.current.mesh);\n freeCommitOnBuffer(commitRef.current);\n commitRef.current = null;\n setIsGone(true);\n }\n\n if (!commitRef.current) {\n return;\n }\n\n // update mesh\n commitRef.current.mesh.renderOrder = renderOrder;\n const scale = spring.scale.getValue();\n commitRef.current.mesh.scale.x = scale[0];\n commitRef.current.mesh.scale.y = scale[1];\n commitRef.current.mesh.scale.z = scale[2];\n const position = spring.position.getValue();\n commitRef.current.mesh.position.x = position[0];\n commitRef.current.mesh.position.y = position[1];\n commitRef.current.mesh.position.z = position[2];\n const rotation = spring.rotation.getValue();\n commitRef.current.mesh.rotation.x = rotation[0];\n commitRef.current.mesh.rotation.y = rotation[1];\n commitRef.current.mesh.rotation.z = rotation[2];\n\n // update geometry radius\n // commitRef.current.mesh.geometry.parameters.radius = radius;\n\n // update material\n commitRef.current.mesh.material.emissive.set(color || defaultColor);\n commitRef.current.mesh.material.emissiveIntensity = emissiveIntensity;\n commitRef.current.mesh.material.opacity = 1;\n });\n\n const textPosition = useMemo(() => [-radius, 0, 5], [radius]);\n const textRotation = useMemo(() => [-Math.PI / 2, Math.PI, 0], []);\n const text = useMemo(() => [sha.substr(0, 7), \"\", message], [message, sha]);\n\n return (\n \n \n {text}\n \n \n );\n};\n\nconst CommitWrapper = ({\n index,\n color,\n position,\n renderOrder = 0,\n sha,\n message\n}) => {\n const { currentCommit } = useContext(SurfContext);\n const isReady = index < currentCommit + 1;\n const isActive = index > currentCommit - 3 && index <= currentCommit;\n\n return useMemo(\n () => (\n \n ),\n [index, position, renderOrder, sha, message, color, isReady, isActive]\n );\n};\n\nexport default CommitWrapper;\n","import * as THREE from \"three\";\n\nexport default class BranchGeometry {\n constructor() {\n this.positions = [];\n\n this.previous = [];\n this.next = [];\n this.side = [];\n this.width = [];\n this.indices_array = [];\n this.uvs = [];\n this.counters = [];\n this.geometry = new THREE.BufferGeometry();\n\n this.widthCallback = null;\n\n // Used to raycast\n this.matrixWorld = new THREE.Matrix4();\n\n this.raycastInverseMatrix = new THREE.Matrix4();\n this.raycastRay = new THREE.Ray();\n this.raycastSphere = new THREE.Sphere();\n }\n\n setMatrixWorld = matrixWorld => {\n this.matrixWorld = matrixWorld;\n };\n\n setGeometry = (g, c) => {\n this.widthCallback = c;\n\n this.positions = [];\n this.counters = [];\n // g.computeBoundingBox();\n // g.computeBoundingSphere();\n\n // set the normals\n // g.computeVertexNormals();\n if (g instanceof THREE.Geometry) {\n for (let j = 0; j < g.vertices.length; j++) {\n let v = g.vertices[j];\n let c = j / g.vertices.length;\n this.positions.push(v.x, v.y, v.z);\n this.positions.push(v.x, v.y, v.z);\n this.counters.push(c);\n this.counters.push(c);\n }\n }\n\n if (g instanceof THREE.BufferGeometry) {\n // read attribute positions ?\n }\n\n if (g instanceof Float32Array || g instanceof Array) {\n for (let j = 0; j < g.length; j += 3) {\n const c = j / g.length;\n this.positions.push(g[j], g[j + 1], g[j + 2]);\n this.positions.push(g[j], g[j + 1], g[j + 2]);\n this.counters.push(c);\n this.counters.push(c);\n }\n }\n\n this.process();\n };\n\n raycast = (raycaster, intersects) => {\n var precision = raycaster.linePrecision;\n var precisionSq = precision * precision;\n\n var geometry = this.geometry;\n\n if (geometry.boundingSphere === null) geometry.computeBoundingSphere();\n\n // Checking boundingSphere distance to ray\n\n this.raycastSphere.copy(geometry.boundingSphere);\n this.raycastSphere.applyMatrix4(this.matrixWorld);\n\n if (raycaster.ray.intersectSphere(this.raycastSphere) === false) {\n return;\n }\n\n this.raycastInverseMatrix.getInverse(this.matrixWorld);\n this.raycastRay.copy(raycaster.ray).applyMatrix4(this.raycastInverseMatrix);\n\n var vStart = new THREE.Vector3();\n var vEnd = new THREE.Vector3();\n var interSegment = new THREE.Vector3();\n var interRay = new THREE.Vector3();\n var step = this instanceof THREE.LineSegments ? 2 : 1;\n\n if (geometry instanceof THREE.BufferGeometry) {\n var index = geometry.index;\n var attributes = geometry.attributes;\n\n if (index !== null) {\n var indices = index.array;\n var positions = attributes.position.array;\n\n for (var i = 0, l = indices.length - 1; i < l; i += step) {\n var a = indices[i];\n var b = indices[i + 1];\n\n vStart.fromArray(positions, a * 3);\n vEnd.fromArray(positions, b * 3);\n\n var distSq = this.raycastRay.distanceSqToSegment(\n vStart,\n vEnd,\n interRay,\n interSegment\n );\n\n if (distSq > precisionSq) continue;\n\n interRay.applyMatrix4(this.matrixWorld); //Move back to world space for distance calculation\n\n var distance = raycaster.ray.origin.distanceTo(interRay);\n\n if (distance < raycaster.near || distance > raycaster.far) continue;\n\n intersects.push({\n distance: distance,\n // What do we want? intersection point on the ray or on the segment??\n // point: raycaster.ray.at( distance ),\n point: interSegment.clone().applyMatrix4(this.matrixWorld),\n index: i,\n face: null,\n faceIndex: null,\n object: this\n });\n }\n } else {\n const positions = attributes.position.array;\n\n for (let i = 0, l = positions.length / 3 - 1; i < l; i += step) {\n vStart.fromArray(positions, 3 * i);\n vEnd.fromArray(positions, 3 * i + 3);\n\n const distSq = this.raycastRay.distanceSqToSegment(\n vStart,\n vEnd,\n interRay,\n interSegment\n );\n\n if (distSq > precisionSq) continue;\n\n interRay.applyMatrix4(this.matrixWorld); //Move back to world space for distance calculation\n\n const distance = raycaster.ray.origin.distanceTo(interRay);\n\n if (distance < raycaster.near || distance > raycaster.far) continue;\n\n intersects.push({\n distance: distance,\n // What do we want? intersection point on the ray or on the segment??\n // point: raycaster.ray.at( distance ),\n point: interSegment.clone().applyMatrix4(this.matrixWorld),\n index: i,\n face: null,\n faceIndex: null,\n object: this\n });\n }\n }\n } else if (geometry instanceof THREE.Geometry) {\n var vertices = geometry.vertices;\n var nbVertices = vertices.length;\n\n for (let i = 0; i < nbVertices - 1; i += step) {\n const distSq = this.raycastRay.distanceSqToSegment(\n vertices[i],\n vertices[i + 1],\n interRay,\n interSegment\n );\n\n if (distSq > precisionSq) continue;\n\n interRay.applyMatrix4(this.matrixWorld); //Move back to world space for distance calculation\n\n const distance = raycaster.ray.origin.distanceTo(interRay);\n\n if (distance < raycaster.near || distance > raycaster.far) continue;\n\n intersects.push({\n distance: distance,\n // What do we want? intersection point on the ray or on the segment??\n // point: raycaster.ray.at( distance ),\n point: interSegment.clone().applyMatrix4(this.matrixWorld),\n index: i,\n face: null,\n faceIndex: null,\n object: this\n });\n }\n }\n };\n\n compareV3 = (a, b) => {\n const aa = a * 6;\n const ab = b * 6;\n\n return (\n this.positions[aa] === this.positions[ab] &&\n this.positions[aa + 1] === this.positions[ab + 1] &&\n this.positions[aa + 2] === this.positions[ab + 2]\n );\n };\n\n copyV3 = a => {\n const aa = a * 6;\n\n return [this.positions[aa], this.positions[aa + 1], this.positions[aa + 2]];\n };\n\n process = () => {\n const l = this.positions.length / 6;\n\n this.previous = [];\n this.next = [];\n this.side = [];\n this.width = [];\n this.indices_array = [];\n this.uvs = [];\n\n for (let j = 0; j < l; j++) {\n this.side.push(1);\n this.side.push(-1);\n }\n\n let w;\n for (let j = 0; j < l; j++) {\n if (this.widthCallback) w = this.widthCallback(j / (l - 1));\n else w = 1;\n this.width.push(w);\n this.width.push(w);\n }\n\n for (var j = 0; j < l; j++) {\n this.uvs.push(j / (l - 1), 0);\n this.uvs.push(j / (l - 1), 1);\n }\n\n var v;\n\n if (this.compareV3(0, l - 1)) {\n v = this.copyV3(l - 2);\n } else {\n v = this.copyV3(0);\n }\n this.previous.push(v[0], v[1], v[2]);\n this.previous.push(v[0], v[1], v[2]);\n for (let j = 0; j < l - 1; j++) {\n v = this.copyV3(j);\n this.previous.push(v[0], v[1], v[2]);\n this.previous.push(v[0], v[1], v[2]);\n }\n\n for (let j = 1; j < l; j++) {\n v = this.copyV3(j);\n this.next.push(v[0], v[1], v[2]);\n this.next.push(v[0], v[1], v[2]);\n }\n\n if (this.compareV3(l - 1, 0)) {\n v = this.copyV3(1);\n } else {\n v = this.copyV3(l - 1);\n }\n this.next.push(v[0], v[1], v[2]);\n this.next.push(v[0], v[1], v[2]);\n\n for (let j = 0; j < l - 1; j++) {\n var n = j * 2;\n this.indices_array.push(n, n + 1, n + 2);\n this.indices_array.push(n + 2, n + 1, n + 3);\n }\n\n if (!this.attributes) {\n this.attributes = {\n position: new THREE.BufferAttribute(\n new Float32Array(this.positions),\n 3\n ),\n previous: new THREE.BufferAttribute(new Float32Array(this.previous), 3),\n next: new THREE.BufferAttribute(new Float32Array(this.next), 3),\n side: new THREE.BufferAttribute(new Float32Array(this.side), 1),\n width: new THREE.BufferAttribute(new Float32Array(this.width), 1),\n uv: new THREE.BufferAttribute(new Float32Array(this.uvs), 2),\n index: new THREE.BufferAttribute(\n new Uint16Array(this.indices_array),\n 1\n ),\n counters: new THREE.BufferAttribute(new Float32Array(this.counters), 1)\n };\n } else {\n this.attributes.position.copyArray(new Float32Array(this.positions));\n this.attributes.position.needsUpdate = true;\n this.attributes.previous.copyArray(new Float32Array(this.previous));\n this.attributes.previous.needsUpdate = true;\n this.attributes.next.copyArray(new Float32Array(this.next));\n this.attributes.next.needsUpdate = true;\n this.attributes.side.copyArray(new Float32Array(this.side));\n this.attributes.side.needsUpdate = true;\n this.attributes.width.copyArray(new Float32Array(this.width));\n this.attributes.width.needsUpdate = true;\n this.attributes.uv.copyArray(new Float32Array(this.uvs));\n this.attributes.uv.needsUpdate = true;\n this.attributes.index.copyArray(new Uint16Array(this.indices_array));\n this.attributes.index.needsUpdate = true;\n }\n\n this.geometry.setAttribute(\"position\", this.attributes.position);\n this.geometry.setAttribute(\"previous\", this.attributes.previous);\n this.geometry.setAttribute(\"next\", this.attributes.next);\n this.geometry.setAttribute(\"side\", this.attributes.side);\n this.geometry.setAttribute(\"width\", this.attributes.width);\n this.geometry.setAttribute(\"uv\", this.attributes.uv);\n this.geometry.setAttribute(\"counters\", this.attributes.counters);\n\n this.geometry.setIndex(this.attributes.index);\n };\n\n memcpy(src, srcOffset, dst, dstOffset, length) {\n var i;\n\n src = src.subarray || src.slice ? src : src.buffer;\n dst = dst.subarray || dst.slice ? dst : dst.buffer;\n\n src = srcOffset\n ? src.subarray\n ? src.subarray(srcOffset, length && srcOffset + length)\n : src.slice(srcOffset, length && srcOffset + length)\n : src;\n\n if (dst.set) {\n dst.set(src, dstOffset);\n } else {\n for (i = 0; i < src.length; i++) {\n dst[i + dstOffset] = src[i];\n }\n }\n\n return dst;\n }\n\n advance = position => {\n let positions = this.attributes.position.array;\n const previous = this.attributes.previous.array;\n let next = this.attributes.next.array;\n const l = positions.length;\n\n // PREVIOUS\n this.memcpy(positions, 0, previous, 0, l);\n\n // POSITIONS\n this.memcpy(positions, 6, positions, 0, l - 6);\n\n positions[l - 6] = position.x;\n positions[l - 5] = position.y;\n positions[l - 4] = position.z;\n positions[l - 3] = position.x;\n positions[l - 2] = position.y;\n positions[l - 1] = position.z;\n\n // NEXT\n this.memcpy(positions, 6, next, 0, l - 6);\n\n next[l - 6] = position.x;\n next[l - 5] = position.y;\n next[l - 4] = position.z;\n next[l - 3] = position.x;\n next[l - 2] = position.y;\n next[l - 1] = position.z;\n\n this.attributes.position.needsUpdate = true;\n this.attributes.previous.needsUpdate = true;\n this.attributes.next.needsUpdate = true;\n };\n}\n","import * as THREE from \"three\";\n\nTHREE.ShaderChunk[\"branch_vert\"] = [\n \"\",\n \"attribute float side;\",\n \"attribute float width;\",\n \"attribute float counters;\",\n \"\",\n \"uniform vec2 resolution;\",\n \"uniform float lineWidth;\",\n \"uniform vec3 diffuse;\",\n \"uniform float opacity;\",\n \"uniform float near;\",\n \"uniform float far;\",\n \"uniform float sizeAttenuation;\",\n \"\",\n \"varying vec2 vUV;\",\n \"varying float vCounters;\",\n\n \"varying vec3 vLightFront;\",\n \"varying vec3 vIndirectFront;\",\n \"\",\n \"#ifdef DOUBLE_SIDED\",\n \"\tvarying vec3 vLightBack;\",\n \"\tvarying vec3 vIndirectBack;\",\n \"#endif\",\n \"\",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n\n \"\",\n \"void main() {\",\n \"\",\n \" #include \",\n \" #include \",\n \" #include \",\n \"\",\n \" #include \",\n \" #include \",\n \"\",\n \" #include \",\n \"\",\n \" vUV = uv;\",\n \" vCounters = counters;\",\n \"\",\n \" float w = lineWidth * width;\",\n \" transformed = vec3(position.x - side * w * 0.5, 0.0, position.z);\",\n \"\",\n \" #include \",\n \" #include \",\n \" #include \",\n \"\",\n \" #include \",\n \" #include \",\n \" #include \",\n \" #include \",\n \" #include \",\n \"\",\n \"}\"\n].join(\"\\r\\n\");\n\nTHREE.ShaderChunk[\"branch_frag\"] = [\n \"\",\n \"uniform vec3 diffuse;\",\n \"uniform vec3 emissive;\",\n \"uniform float opacity;\",\n \"uniform sampler2D map;\",\n \"uniform sampler2D alphaMap;\",\n \"uniform float useMap;\",\n \"uniform float useAlphaMap;\",\n \"uniform float useDash;\",\n \"uniform float dashArray;\",\n \"uniform float dashOffset;\",\n \"uniform float dashRatio;\",\n \"uniform float visibility;\",\n \"uniform float alphaTest;\",\n \"uniform vec2 repeat;\",\n \"\",\n \"varying vec2 vUV;\",\n \"varying float vCounters;\",\n \"varying vec3 vLightFront;\",\n \"varying vec3 vIndirectFront;\",\n \"\",\n \"#ifdef DOUBLE_SIDED\",\n \" varying vec3 vLightBack;\",\n \" varying vec3 vIndirectBack;\",\n \"#endif\",\n \"\",\n \"\",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"#include \",\n \"\",\n \"void main() {\",\n \"\",\n \" #include \",\n \"\",\n \" vec4 diffuseColor = vec4( diffuse, opacity );\",\n // \" vec4 diffuseColor = vColor;\",\n\n \" ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\",\n \" vec3 totalEmissiveRadiance = emissive;\",\n \"\",\n \" #include \",\n \"\",\n \" if( useMap == 1. ) diffuseColor *= texture2D( map, vUV * repeat );\",\n \" if( useAlphaMap == 1. ) diffuseColor.a *= texture2D( alphaMap, vUV * repeat ).a;\",\n \" if( diffuseColor.a < alphaTest ) discard;\",\n // // \" #include \",\n // // \" #include \",\n // // \" #include \",\n // // \" #include \",\n \" if( useDash == 1. ){\",\n \" diffuseColor.a *= ceil(mod(vCounters + dashOffset, dashArray) - (dashArray * dashRatio));\",\n \" }\",\n \"\",\n \" #include \",\n \" #include \",\n \"\",\n \" // accumulation\",\n \" reflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\",\n \"\",\n \" #ifdef DOUBLE_SIDED\",\n \" reflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\",\n \" #else\",\n \" reflectedLight.indirectDiffuse += vIndirectFront;\",\n \" #endif\",\n \"\",\n \" #include \",\n \"\",\n \" reflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\",\n \"\",\n \" #ifdef DOUBLE_SIDED\",\n \" reflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\",\n \" #else\",\n \" reflectedLight.directDiffuse = vLightFront;\",\n \" #endif\",\n \"\",\n \" reflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\",\n \"\",\n \" // modulation\",\n \" #include \",\n \"\",\n \" vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\",\n \"\",\n \" #include \",\n \"\",\n \" gl_FragColor = vec4(outgoingLight, diffuseColor.a);\",\n \"\",\n \" gl_FragColor.a *= step(vCounters, visibility);\",\n \"\",\n \" #include \",\n \" #include \",\n \" #include \",\n \" #include \",\n \" #include \",\n \"\",\n \"}\"\n].join(\"\\r\\n\");\n\nexport default class BranchMaterial extends THREE.ShaderMaterial {\n constructor(parameters) {\n super({\n uniforms: {\n ...THREE.UniformsLib.common,\n ...THREE.UniformsLib.specularmap,\n ...THREE.UniformsLib.envmap,\n ...THREE.UniformsLib.aomap,\n ...THREE.UniformsLib.lightmap,\n ...THREE.UniformsLib.emissivemap,\n ...THREE.UniformsLib.fog,\n ...THREE.UniformsLib.lights,\n lineWidth: { value: 1 },\n map: { value: null },\n useMap: { value: 0 },\n alphaMap: { value: null },\n useAlphaMap: { value: 0 },\n emissive: { value: new THREE.Color(0x000000) },\n opacity: { value: 1 },\n resolution: { value: new THREE.Vector2(1, 1) },\n sizeAttenuation: { value: 1 },\n near: { value: 1 },\n far: { value: 1 },\n dashArray: { value: 0 },\n dashOffset: { value: 0 },\n dashRatio: { value: 0.5 },\n useDash: { value: 0 },\n visibility: { value: 1 },\n alphaTest: { value: 0 },\n repeat: { value: new THREE.Vector2(1, 1) }\n },\n\n vertexShader: THREE.ShaderChunk.branch_vert,\n fragmentShader: THREE.ShaderChunk.branch_frag\n });\n\n this.type = \"BranchMaterial\";\n this.isBranchMaterial = true;\n this.lights = true;\n\n Object.defineProperties(this, {\n emissive: {\n enumerable: true,\n get: () => this.uniforms.emissive.value,\n set: value => (this.uniforms.emissive.value = value)\n },\n\n lineWidth: {\n enumerable: true,\n get: () => this.uniforms.lineWidth.value,\n set: value => (this.uniforms.lineWidth.value = value)\n },\n map: {\n enumerable: true,\n get: () => this.uniforms.map.value,\n set: value => (this.uniforms.map.value = value)\n },\n useMap: {\n enumerable: true,\n get: () => this.uniforms.useMap.value,\n set: value => (this.uniforms.useMap.value = value)\n },\n alphaMap: {\n enumerable: true,\n get: () => this.uniforms.alphaMap.value,\n set: value => (this.uniforms.alphaMap.value = value)\n },\n useAlphaMap: {\n enumerable: true,\n get: () => this.uniforms.useAlphaMap.value,\n set: value => (this.uniforms.useAlphaMap.value = value)\n },\n color: {\n enumerable: true,\n get: () => this.uniforms.diffuse.value,\n set: value => (this.uniforms.diffuse.value = value)\n },\n opacity: {\n enumerable: true,\n get: () => this.uniforms.opacity.value,\n set: value => (this.uniforms.opacity.value = value)\n },\n resolution: {\n enumerable: true,\n get: () => this.uniforms.resolution.value,\n set: value => this.uniforms.resolution.value.copy(value)\n },\n sizeAttenuation: {\n enumerable: true,\n get: () => this.uniforms.sizeAttenuation.value,\n set: value => (this.uniforms.sizeAttenuation.value = value)\n },\n near: {\n enumerable: true,\n get: () => this.uniforms.near.value,\n set: value => (this.uniforms.near.value = value)\n },\n far: {\n enumerable: true,\n get: () => this.uniforms.far.value,\n set: value => (this.uniforms.far.value = value)\n },\n dashArray: {\n enumerable: true,\n get: () => this.uniforms.dashArray.value,\n set: value => {\n this.uniforms.dashArray.value = value;\n this.useDash = value !== 0 ? 1 : 0;\n }\n },\n dashOffset: {\n enumerable: true,\n get: () => this.uniforms.dashOffset.value,\n set: value => (this.uniforms.dashOffset.value = value)\n },\n dashRatio: {\n enumerable: true,\n get: () => this.uniforms.dashRatio.value,\n set: value => (this.uniforms.dashRatio.value = value)\n },\n useDash: {\n enumerable: true,\n get: () => this.uniforms.useDash.value,\n set: value => (this.uniforms.useDash.value = value)\n },\n visibility: {\n enumerable: true,\n get: () => this.uniforms.visibility.value,\n set: value => (this.uniforms.visibility.value = value)\n },\n alphaTest: {\n enumerable: true,\n get: () => this.uniforms.alphaTest.value,\n set: value => (this.uniforms.alphaTest.value = value)\n },\n repeat: {\n enumerable: true,\n get: () => this.uniforms.repeat.value,\n set: value => this.uniforms.repeat.value.copy(value)\n }\n });\n\n this.setValues(parameters);\n }\n\n copy = source => {\n super.copy(source);\n\n this.lineWidth = source.lineWidth;\n this.map = source.map;\n this.useMap = source.useMap;\n this.alphaMap = source.alphaMap;\n this.useAlphaMap = source.useAlphaMap;\n this.color.copy(source.color);\n this.opacity = source.opacity;\n this.resolution.copy(source.resolution);\n this.sizeAttenuation = source.sizeAttenuation;\n this.near = source.near;\n this.far = source.far;\n this.dashArray.copy(source.dashArray);\n this.dashOffset.copy(source.dashOffset);\n this.dashRatio.copy(source.dashRatio);\n this.useDash = source.useDash;\n this.visibility = source.visibility;\n this.alphaTest = source.alphaTest;\n this.repeat.copy(source.repeat);\n\n return this;\n };\n}\n","import React, { memo, useRef, useMemo } from \"react\";\nimport { useFrame, extend, useThree } from \"react-three-fiber\";\nimport { Vector3, FrontSide } from \"three\";\n\nimport Commit from \"components/Commit\";\nimport { useConfig } from \"utils/config\";\n\nimport BranchGeometry from \"./BranchGeometry\";\nimport BranchMaterial from \"./BranchMaterial\";\n\nextend({ BranchGeometry, BranchMaterial });\n\nconst Branch = memo(({ color, commits, skipLastCommit, skipFirstCommit }) => {\n const material = useRef();\n\n const speed = useConfig(c => c.speed);\n const commitsDistance = useConfig(c => c.commitsDistance);\n const waitOnFirstCommit = useConfig(c => c.waitOnFirstCommit);\n const { width, color: defaultColor } = useConfig(c => c.track);\n const { camera } = useThree();\n\n const vertices = useMemo(() => {\n const vv = [];\n let lastIndex = commits[0].index - 1;\n\n commits.forEach((c, ci) => {\n const deltaIndex = lastIndex - c.index;\n\n if (deltaIndex > 1) {\n // if the gap is bigger then 1\n for (let i = deltaIndex - 1; i > 0; i--) {\n // add missing points\n vv.push(\n new Vector3(\n c.position.x,\n c.position.y,\n c.position.z + commitsDistance * i\n )\n );\n }\n }\n\n vv.push(c.position);\n\n lastIndex = c.index;\n });\n\n return vv;\n }, [commits, commitsDistance]);\n\n // commit are in reverse order\n const minIndex = commits[commits.length - 1].index;\n\n useFrame(({ clock }) => {\n const waitToBranch = minIndex / speed;\n // update dash offset\n material.current.uniforms.dashOffset.value = Math.min(\n Math.max(\n ((clock.elapsedTime - waitOnFirstCommit - waitToBranch) * speed -\n 0.66) /\n vertices.length,\n 0\n ),\n 1\n );\n });\n\n return (\n <>\n \n {/* MeshLine and CMRCurve are a OOP factories, not scene objects */}\n (self.parent.geometry = self.geometry)}\n >\n self.parent.setGeometry(self)}>\n \n (self.parent.vertices = self.getPoints(vertices.length * 10))\n }\n />\n \n \n\n \n \n\n {commits.map((c, i) => {\n if (\n (!i && skipLastCommit) ||\n (i === commits.length - 1 && skipFirstCommit)\n ) {\n // do not render fork and merge commits (they have already been rendered their brnach)\n return null;\n }\n\n return (\n \n );\n })}\n \n );\n});\n\nexport default Branch;\n","import { useRef, useMemo } from \"react\";\nimport { useFrame } from \"react-three-fiber\";\nimport { useSpring } from \"react-spring/three\";\n\nimport { useConfig } from \"utils/config\";\n\nconst DISTANCE_FROM_HEAD_DAMPING = 0.02;\nconst CAMERA_UP_DAMPING = 0.001;\n\nconst CameraOperator = ({ commitsCount }) => {\n const distanceFromHead = useRef(0);\n const speed = useConfig(c => c.speed);\n const waitOnFirstCommit = useConfig(c => c.waitOnFirstCommit);\n const commitsDistance = useConfig(c => c.commitsDistance);\n const isOrbitControlsEnabled = useConfig(c => c.isOrbitControlsEnabled);\n const {\n position: { x, y },\n xVariation,\n yVariation,\n variationDuration,\n distanceFromHead: distanceFromHeadOnRun\n } = useConfig(c => c.camera);\n\n const [spring, set] = useSpring(() => ({\n position: [0, 10, -0.1],\n lookPosition: [0, 0.1, 0],\n config: {\n mass: 1,\n tension: 280,\n friction: 200\n }\n }));\n\n // {waitOnFirstCommit}s wait + time to reach the second commit\n const timeToMove = useMemo(() => waitOnFirstCommit + 1 / speed, [\n waitOnFirstCommit,\n speed\n ]);\n // last commit is reached with the camera\n const timeToAlmostEnd = useMemo(\n () => waitOnFirstCommit + (commitsCount - 1) / speed,\n [waitOnFirstCommit, speed, commitsCount]\n );\n // the camera reach the max elevation on last commit\n const timeToEnd = useMemo(() => {\n const tte = waitOnFirstCommit + commitsCount / speed;\n const ttq = variationDuration - (tte % variationDuration);\n\n return tte + ttq - variationDuration / 2;\n }, [waitOnFirstCommit, speed, commitsCount, variationDuration]);\n\n useFrame(({ camera, clock }) => {\n if (isOrbitControlsEnabled) {\n // skip camera update\n return;\n }\n\n // angle used for position variation\n const alpha =\n -Math.PI / 2 +\n (Math.max(0, Math.min(clock.elapsedTime - timeToMove, timeToEnd)) /\n variationDuration) *\n Math.PI *\n 2;\n\n let headZ = 0;\n let targetDistanceFromHead = -distanceFromHeadOnRun / 2;\n let targetUp = [0, 0, 1];\n\n // We have four time windows\n // 1. Before everithing starts | the camera z is same as first commt z | no\n // movement.\n // 2. Camera starts moving ahead taking a certain distance from the current\n // commit, the last commit is not reached yet.\n // 3. The latest commit is reached but the camera still moves to get the\n // final position.\n // 4. Camera is in it's final position observing the last commit.\n if (clock.elapsedTime > timeToMove) {\n headZ = (clock.elapsedTime - timeToMove) * speed * commitsDistance;\n headZ = Math.min(headZ, (commitsCount - 1) * commitsDistance);\n targetDistanceFromHead = -distanceFromHeadOnRun;\n }\n\n if (clock.elapsedTime > timeToMove + 1 / speed) {\n targetUp = [0, 1, 0];\n }\n\n if (clock.elapsedTime > timeToAlmostEnd) {\n targetDistanceFromHead = -1;\n }\n\n if (clock.elapsedTime > timeToEnd - variationDuration / 2) {\n targetUp = [-1, 0, 0];\n }\n\n distanceFromHead.current +=\n (targetDistanceFromHead - distanceFromHead.current) *\n DISTANCE_FROM_HEAD_DAMPING;\n\n // calc new position\n const newX = x + xVariation * Math.cos(alpha);\n const newY = y + yVariation * Math.sin(alpha);\n const newZ = headZ + 1 + distanceFromHead.current;\n\n const headX = 0;\n\n const [upX, upY, upZ] = camera.up.toArray();\n const newUp = [\n upX + (targetUp[0] - upX) * CAMERA_UP_DAMPING,\n upY + (targetUp[1] - upY) * CAMERA_UP_DAMPING,\n upZ + (targetUp[2] - upZ) * CAMERA_UP_DAMPING\n ];\n\n // update spring\n set({\n position: [newX, newY, newZ],\n lookPosition: [headX, 0.1, headZ]\n });\n\n // update position\n camera.position.set(...spring.position.getValue());\n\n // update look position\n camera.lookAt(...spring.lookPosition.getValue());\n camera.up.set(...newUp);\n });\n\n return null;\n};\n\nexport default CameraOperator;\n","import React, { useRef, useEffect, useMemo } from \"react\";\nimport { useConfig } from \"utils/config\";\nimport { Vector3, Object3D } from \"three\";\n\nconst dummy = new Object3D();\n\nconst Debris = ({ commitsCount }) => {\n const instancedMesh = useRef();\n const commitsDistance = useConfig(c => c.commitsDistance);\n const debris = useMemo(\n () =>\n new Array(commitsCount * 35).fill().map((_, i) => {\n const t = Math.random();\n const radius = commitsDistance * 2;\n\n const position = new Vector3(\n -radius + Math.random() * radius * 2,\n -radius + Math.random() * radius * 2,\n commitsDistance * (i % commitsCount) -\n radius +\n Math.random() * radius * 2\n );\n\n const speed = 0.1 + Math.random();\n\n return {\n index: i,\n scale: 0.25 + Math.random() * 0.5,\n position,\n speed,\n radius,\n t\n };\n }),\n [commitsCount, commitsDistance]\n );\n\n useEffect(() => {\n debris.forEach(({ position, scale }, i) => {\n dummy.position.copy(position);\n dummy.scale.set(scale, scale, scale);\n dummy.rotation.set(\n Math.sin(Math.random()) * Math.PI,\n Math.sin(Math.random()) * Math.PI,\n Math.cos(Math.random()) * Math.PI\n );\n dummy.updateMatrix();\n instancedMesh.current.setMatrixAt(i, dummy.matrix);\n });\n instancedMesh.current.instanceMatrix.needsUpdate = true;\n }, []);\n\n return (\n \n \n \n \n );\n};\n\nexport default Debris;\n","const hsb2rgb = (h0, s, v) => {\n let h = h0 * 360;\n var R, G, B, X, C;\n h = (h % 360) / 60;\n C = v * s;\n X = C * (1 - Math.abs((h % 2) - 1));\n R = G = B = v - C;\n\n h = ~~h;\n R += [C, X, 0, 0, X, C][h];\n G += [X, C, C, X, 0, 0][h];\n B += [0, 0, X, C, C, X][h];\n\n return { r: R, g: G, b: B };\n};\n\nexport default hsb2rgb;\n","const round = x => (x + 0.5) | 0;\n\nconst rgb2hex = (r, g, b) =>\n \"#\" +\n (16777216 | round(b * 255) | (round(g * 255) << 8) | (round(r * 255) << 16))\n .toString(16)\n .slice(1);\n\nexport default rgb2hex;\n","import hsb2rgb from \"./hsb2rgb\";\nimport rgb2hex from \"./rgb2hex\";\nconst COLOR_STEP = 0.2222;\nconst BASE_COLOR = { h: 0.275766017, s: 0.49, b: 0.8 }; // #8ACB67\n\nconst getBranchColor = index => {\n let h = BASE_COLOR.h + COLOR_STEP * index;\n let s = BASE_COLOR.s;\n const b = BASE_COLOR.b;\n\n while (h > 1) {\n h -= 1;\n s -= 0.1;\n }\n\n while (s < 0) {\n s += 1;\n }\n\n const rgb = hsb2rgb(h, s, b);\n return rgb2hex(rgb.r, rgb.g, rgb.b);\n};\n\nexport default getBranchColor;\n","import { useMemo } from \"react\";\nimport { Vector3 } from \"three\";\n\nimport { useConfig } from \"utils/config\";\nimport getBranchColor from \"utils/getBranchColor\";\n\nconst branchIndex2Position = index => {\n let position = Math.ceil(index / 2);\n if (index % 2 === 0) {\n position *= -1;\n }\n\n return position;\n};\n\nconst getAvailableIndex = (currentBranch, branches) => {\n let positionIndex = -1;\n let position = null;\n\n do {\n positionIndex += 1;\n\n position = branchIndex2Position(positionIndex);\n console.log(\"Checking for position\", position);\n } while (\n branches.find(\n // eslint-disable-next-line no-loop-func\n b => {\n const found =\n b.position === position &&\n ((b.range[0] > currentBranch.range[0] &&\n b.range[1] < currentBranch.range[1]) ||\n (b.range[0] < currentBranch.range[0] &&\n b.range[1] > currentBranch.range[0]) ||\n (b.range[0] < currentBranch.range[1] &&\n b.range[1] > currentBranch.range[1]));\n\n if (found) {\n console.log(\n ` Position ${position} not available: [${currentBranch.range[0]}, ${\n currentBranch.range[1]\n }] X [${b.range[0]}, ${b.range[1]}]`\n );\n }\n\n return found;\n }\n )\n );\n\n console.log(`%cPosition ${position} available`, \"background: yellow;\");\n\n return positionIndex;\n};\n\nconst useBranches = commits => {\n const commitsDistance = useConfig(c => c.commitsDistance);\n const branchesDistance = useConfig(c => c.branchesDistance);\n\n return useMemo(() => {\n const pendingBranches = commits.length\n ? commits[0].parents.map((_, i) => [commits[0].sha, i])\n : [];\n let branches = [];\n let currentBranch = {\n name: null,\n color: null,\n commits: [],\n skipFirstCommit: false,\n skipLastCommit: false,\n index: null,\n position: null,\n range: [Infinity, 0]\n };\n const evaluatedCommits = [];\n\n while (pendingBranches.length) {\n const [sha, pathIndex] = pendingBranches.shift();\n const head = commits.find(c => c.sha === sha);\n\n if (head.parents.length <= pathIndex) {\n continue;\n }\n\n // that's the head/merge-commit\n currentBranch.commits.push(head);\n\n // if this is not the first branch\n if (branches.length) {\n currentBranch.skipLastCommit = true;\n }\n\n // update range\n if (currentBranch.range[0] > head.index) {\n currentBranch.range[0] = head.index;\n }\n if (currentBranch.range[1] < head.index) {\n currentBranch.range[1] = head.index;\n }\n\n let commit = commits.find(c => c.sha === head.parents[pathIndex]);\n\n if (!commit) {\n // commit was not found\n currentBranch.commits = [];\n continue;\n }\n\n currentBranch.name = `${sha}--${pathIndex}`;\n\n console.groupCollapsed(`Branch ${currentBranch.name}`);\n console.log(\"head\", head);\n console.groupCollapsed(\"Commits\");\n\n while (commit && evaluatedCommits.indexOf(commit.sha) < 0) {\n currentBranch.commits.push(commit);\n evaluatedCommits.push(commit.sha);\n\n // update range\n if (currentBranch.range[0] > commit.index) {\n currentBranch.range[0] = commit.index;\n }\n if (currentBranch.range[1] < commit.index) {\n currentBranch.range[1] = commit.index;\n }\n\n console.log(`${commit.sha} #${commit.index}`, commit);\n\n if (commit.parents.length) {\n const nextCommitSha = commit.parents[0];\n\n for (let i = 1; i < commit.parents.length; i++) {\n // console.log(`%cFound new branch \"${commit.sha}\"`, \"color: gold;\");\n pendingBranches.push([commit.sha, i]);\n }\n\n commit = commits.find(c => c.sha === nextCommitSha);\n } else {\n commit = null;\n }\n }\n\n // Add fork commit if needed\n if (commit) {\n currentBranch.commits.push(commit);\n\n currentBranch.skipFirstCommit = true;\n\n // update range\n if (currentBranch.range[0] > commit.index) {\n currentBranch.range[0] = commit.index;\n }\n if (currentBranch.range[1] < commit.index) {\n currentBranch.range[1] = commit.index;\n }\n\n if (branches.length && currentBranch.commits.length <= 2) {\n // this branch has only fork and merge commits\n // set index as the fork commit branch index\n\n console.log(\"This branch has only fork and merge commits\");\n console.log(\"Searching for fork branch index...\");\n\n const forkBranch = branches.find(b => {\n const i = b.commits.findIndex(c => c.sha === commit.sha);\n\n return b.index ? i > 0 && i < b.commits.length - 1 : i > -1;\n });\n\n if (forkBranch) {\n console.log(`... \"${forkBranch.name}\" found`, forkBranch);\n currentBranch.index = forkBranch.index;\n }\n }\n }\n console.groupEnd(\"Commits\");\n\n if (currentBranch.index === null) {\n currentBranch.index = getAvailableIndex(currentBranch, branches);\n }\n\n currentBranch.position = branchIndex2Position(currentBranch.index);\n currentBranch.color = getBranchColor(currentBranch.index);\n\n console.log(\n `%ccolor ${currentBranch.color}`,\n `background-color: ${currentBranch.color}`\n );\n console.log(\"range\", currentBranch.range);\n console.log(\"position\", currentBranch.position);\n\n // eslint-disable-next-line no-loop-func\n currentBranch.commits.forEach(c => {\n if (c.position) {\n return;\n }\n\n c.position = new Vector3(\n currentBranch.position * branchesDistance,\n 0,\n c.index * commitsDistance\n );\n });\n\n branches.push(currentBranch);\n console.groupEnd(`Branch ${currentBranch.name}`);\n\n currentBranch = {\n name: null,\n color: null,\n commits: [],\n skipFirstCommit: false,\n skipLastCommit: false,\n index: null,\n position: null,\n range: [Infinity, 0]\n };\n }\n\n return branches;\n }, [commits, branchesDistance, commitsDistance]);\n};\n\nexport default useBranches;\n","import React, { createContext, useState } from \"react\";\nimport { useFrame } from \"react-three-fiber\";\n\nimport Branch from \"components/Branch\";\nimport CameraOperator from \"components/CameraOperator\";\nimport Debris from \"components/Debris\";\nimport FlatText from \"components/FlatText\";\nimport { useConfig } from \"utils/config\";\n\nimport useBranches from \"./useBranches\";\n\nexport const SurfContext = createContext({ currentCommit: -1 });\n\nconst Surf = ({ owner, repo, commits }) => {\n const branches = useBranches(commits);\n\n const [currentCommit, setCurrentCommit] = useState(0);\n const [isEnded, setIsEnded] = useState(false);\n const speed = useConfig(c => c.speed);\n const waitOnFirstCommit = useConfig(c => c.waitOnFirstCommit);\n\n useFrame(({ clock }) => {\n const ti = Math.max(\n 0,\n Math.round((clock.elapsedTime - waitOnFirstCommit) * speed) - 1\n );\n const index = Math.min(ti, commits.length - 1);\n\n if (currentCommit < index) {\n setCurrentCommit(index);\n }\n\n if (!isEnded && ti > commits.length + 2) {\n setIsEnded(true);\n }\n });\n\n return (\n \n {branches.map((b, i) => (\n \n ))}\n\n {commits.length && }\n\n {/* Repo name at the end of the experience */}\n {commits.length && (\n \n {repo}\n {`@${owner}`}\n \n )}\n\n {commits.length && }\n \n );\n};\n\nexport default Surf;\n","import { useState, useEffect } from \"react\";\n\nimport loadingManager, { RESOURCE_TYPE_FETCH } from \"utils/loadingManager\";\n\nconst getRepoParamsFromPath = () => {\n const parts = window.location.pathname.replace(/^\\/+|\\/+$/g, \"\").split(\"/\");\n if (parts.length < 2) {\n return {\n owner: undefined,\n repo: undefined\n };\n }\n\n return {\n owner: parts[0],\n repo: parts[1]\n };\n};\n\nconst useRepo = () => {\n const [commits, setCommits] = useState([]);\n\n const { owner = \"splact\", repo = \"morbido\" } = getRepoParamsFromPath();\n\n useEffect(() => {\n async function fetch() {\n const fetchedCommitsResource = loadingManager.registerResource(\n `${process.env.REACT_APP_API_BASE_URL}/github/${owner}/${repo}`,\n RESOURCE_TYPE_FETCH\n );\n\n // get response as soon as available\n const fetchedCommits = await fetchedCommitsResource.get();\n // commits = commits.slice(41, 60);\n // commits.forEach((c, i) => (c.index = commits.length - i - 1));\n\n setCommits(fetchedCommits);\n }\n\n if (owner !== \"\" && repo !== \"\") {\n fetch();\n }\n }, [owner, repo]);\n\n return { owner, repo, commits };\n};\n\nexport default useRepo;\n","const urlParams = new URLSearchParams(window.location.search);\n\nlet env = urlParams.get(\"env\");\n\nif (!env || [\"development\", \"test\", \"production\"].indexOf(env) === -1) {\n env = process.env.NODE_ENV;\n}\n\nexport const isDevelopment = env === \"development\";\nexport const isTest = env === \"test\";\nexport const isProduction = env === \"production\";\n","import React, { useState, useCallback, useEffect } from \"react\";\nimport { Canvas } from \"react-three-fiber\";\nimport * as THREE from \"three\";\n\nimport BlinkingBadge from \"components/BlinkingBadge\";\nimport Effects from \"components/Effects\";\nimport LoadingScreen from \"components/LoadingScreen\";\nimport Stats from \"components/Stats\";\nimport Surf from \"components/Surf\";\nimport useRepo from \"hooks/useRepo\";\nimport { DatGui, useConfig } from \"utils/config\";\nimport loadingManager, { useLoadingState } from \"utils/loadingManager\";\nimport { isDevelopment } from \"utils/isEnvironment\";\n\nimport \"./style.scss\";\n\nconst backgroundColor = new THREE.Color(\"#0C0E16\");\n\nconst App = () => {\n const [isCanvasReady, setIsCanvasReady] = useState(false);\n const [isLoaded, setIsLoaded] = useState(false);\n const { owner, repo, commits } = useRepo();\n const { progress } = useLoadingState();\n\n const handleCanvasCreate = useCallback(\n ({ gl }) => {\n gl.gammaInput = true;\n gl.setClearColor(backgroundColor);\n setIsCanvasReady(true);\n },\n [setIsCanvasReady]\n );\n\n useEffect(() => {\n loadingManager.load();\n }, []);\n\n useEffect(() => {\n if (!isLoaded && progress === 1) {\n setTimeout(() => {\n setIsLoaded(true);\n }, 1000);\n }\n }, [isLoaded, progress]);\n\n const cameraSettings = useConfig(c => ({\n near: c.camera.near,\n far: c.camera.far,\n fov: c.camera.fov,\n position: [0, 0, -0.1]\n }));\n\n return (\n <>\n {isLoaded && progress === 1 && (\n \n \n \n\n \n\n \n\n {isDevelopment && }\n \n )}\n\n \n\n {isDevelopment && }\n\n Preview\n \n );\n};\n\nexport default App;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport \"./globals\";\nimport * as serviceWorker from \"./serviceWorker\";\n\nimport App from \"components/App\";\nimport \"styles/index.scss\";\n\nReactDOM.render(, document.getElementById(\"root\"));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}