@nous-research/ui 0.13.2 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/dist/assets/filler-bg0.webp +0 -0
- package/dist/assets.d.ts +38 -0
- package/dist/fonts.d.ts +0 -1
- package/dist/fonts.js +5 -7
- package/dist/hooks/use-capped-frame.d.ts +0 -1
- package/dist/hooks/use-capped-frame.js +12 -13
- package/dist/hooks/use-css-var-dims.d.ts +0 -1
- package/dist/hooks/use-css-var-dims.js +26 -21
- package/dist/hooks/use-gpu-tier.d.ts +0 -1
- package/dist/hooks/use-gpu-tier.js +90 -110
- package/dist/hooks/use-render-loop.d.ts +0 -1
- package/dist/hooks/use-render-loop.js +58 -58
- package/dist/hooks/use-smooth-controls.d.ts +0 -1
- package/dist/hooks/use-smooth-controls.js +204 -206
- package/dist/index.d.ts +0 -1
- package/dist/index.js +84 -58
- package/dist/ui/basic-page.d.ts +1 -2
- package/dist/ui/basic-page.js +15 -7
- package/dist/ui/build.css +1 -0
- package/dist/ui/components/animated-count.d.ts +1 -2
- package/dist/ui/components/animated-count.js +109 -85
- package/dist/ui/components/ascii.d.ts +2 -3
- package/dist/ui/components/ascii.js +75 -59
- package/dist/ui/components/badge.d.ts +1 -2
- package/dist/ui/components/badge.js +35 -18
- package/dist/ui/components/badges/nous-girl.d.ts +1 -2
- package/dist/ui/components/badges/nous-girl.js +80 -3
- package/dist/ui/components/blend-mode.d.ts +1 -2
- package/dist/ui/components/blend-mode.js +55 -63
- package/dist/ui/components/blink.d.ts +1 -2
- package/dist/ui/components/blink.js +15 -6
- package/dist/ui/components/button.d.ts +2 -3
- package/dist/ui/components/button.js +139 -90
- package/dist/ui/components/command-block.d.ts +2 -3
- package/dist/ui/components/command-block.js +52 -24
- package/dist/ui/components/cursor.d.ts +1 -2
- package/dist/ui/components/cursor.js +93 -54
- package/dist/ui/components/dropdown-menu.d.ts +1 -2
- package/dist/ui/components/dropdown-menu.js +99 -51
- package/dist/ui/components/fit-text/index.d.ts +0 -1
- package/dist/ui/components/fit-text/index.js +21 -13
- package/dist/ui/components/graphs/bar-chart.d.ts +1 -2
- package/dist/ui/components/graphs/bar-chart.js +116 -63
- package/dist/ui/components/graphs/index.d.ts +0 -1
- package/dist/ui/components/graphs/index.js +3 -4
- package/dist/ui/components/graphs/line-chart.d.ts +1 -2
- package/dist/ui/components/graphs/line-chart.js +159 -102
- package/dist/ui/components/graphs/utils.d.ts +2 -3
- package/dist/ui/components/graphs/utils.js +147 -114
- package/dist/ui/components/grid/index.d.ts +0 -1
- package/dist/ui/components/grid/index.js +12 -9
- package/dist/ui/components/hover-bg.d.ts +0 -1
- package/dist/ui/components/hover-bg.js +11 -6
- package/dist/ui/components/icons/arrow.d.ts +1 -2
- package/dist/ui/components/icons/arrow.js +42 -5
- package/dist/ui/components/icons/chevron.d.ts +1 -2
- package/dist/ui/components/icons/chevron.js +49 -5
- package/dist/ui/components/icons/discord.d.ts +1 -2
- package/dist/ui/components/icons/discord.js +12 -4
- package/dist/ui/components/icons/eye.d.ts +1 -2
- package/dist/ui/components/icons/eye.js +5 -3
- package/dist/ui/components/icons/gear.d.ts +1 -2
- package/dist/ui/components/icons/gear.js +28 -14
- package/dist/ui/components/icons/github.d.ts +1 -2
- package/dist/ui/components/icons/github.js +12 -4
- package/dist/ui/components/icons/hamburger.d.ts +1 -2
- package/dist/ui/components/icons/hamburger.js +54 -5
- package/dist/ui/components/icons/heart.d.ts +1 -2
- package/dist/ui/components/icons/heart.js +8 -3
- package/dist/ui/components/icons/index.d.ts +0 -1
- package/dist/ui/components/icons/index.js +11 -12
- package/dist/ui/components/icons/link.d.ts +1 -2
- package/dist/ui/components/icons/link.js +10 -3
- package/dist/ui/components/icons/minus.d.ts +1 -2
- package/dist/ui/components/icons/minus.js +10 -3
- package/dist/ui/components/icons/search.d.ts +1 -2
- package/dist/ui/components/icons/search.js +30 -3
- package/dist/ui/components/image-distortion.d.ts +1 -2
- package/dist/ui/components/image-distortion.js +300 -265
- package/dist/ui/components/leva-client.d.ts +1 -2
- package/dist/ui/components/leva-client.js +9 -10
- package/dist/ui/components/list-item.d.ts +0 -1
- package/dist/ui/components/list-item.js +26 -10
- package/dist/ui/components/modal/index.d.ts +1 -2
- package/dist/ui/components/modal/index.js +33 -14
- package/dist/ui/components/overlays/blend-modes.d.ts +0 -1
- package/dist/ui/components/overlays/blend-modes.js +11 -12
- package/dist/ui/components/overlays/glitch.d.ts +1 -2
- package/dist/ui/components/overlays/glitch.js +115 -110
- package/dist/ui/components/overlays/greys.d.ts +1 -2
- package/dist/ui/components/overlays/greys.js +200 -179
- package/dist/ui/components/overlays/index.d.ts +1 -2
- package/dist/ui/components/overlays/index.js +31 -17
- package/dist/ui/components/overlays/lens-layers.d.ts +1 -2
- package/dist/ui/components/overlays/lens-layers.js +89 -65
- package/dist/ui/components/overlays/lens.d.ts +0 -1
- package/dist/ui/components/overlays/lens.js +46 -52
- package/dist/ui/components/overlays/noise.d.ts +1 -2
- package/dist/ui/components/overlays/noise.js +112 -113
- package/dist/ui/components/overlays/vignette.d.ts +1 -2
- package/dist/ui/components/overlays/vignette.js +44 -38
- package/dist/ui/components/poster.d.ts +1 -2
- package/dist/ui/components/poster.js +240 -87
- package/dist/ui/components/progress.d.ts +1 -2
- package/dist/ui/components/progress.js +52 -12
- package/dist/ui/components/scene-canvas.d.ts +1 -2
- package/dist/ui/components/scene-canvas.js +169 -119
- package/dist/ui/components/scramble.d.ts +1 -2
- package/dist/ui/components/scramble.js +60 -59
- package/dist/ui/components/segmented.d.ts +2 -3
- package/dist/ui/components/segmented.js +47 -12
- package/dist/ui/components/select.d.ts +1 -2
- package/dist/ui/components/select.js +207 -120
- package/dist/ui/components/selection-switcher.d.ts +0 -1
- package/dist/ui/components/selection-switcher.js +29 -25
- package/dist/ui/components/shader.d.ts +1 -2
- package/dist/ui/components/shader.js +56 -38
- package/dist/ui/components/socials.d.ts +1 -2
- package/dist/ui/components/socials.js +18 -7
- package/dist/ui/components/spinner.d.ts +1 -2
- package/dist/ui/components/spinner.js +36 -25
- package/dist/ui/components/stats.d.ts +1 -2
- package/dist/ui/components/stats.js +33 -9
- package/dist/ui/components/switch.d.ts +0 -1
- package/dist/ui/components/switch.js +35 -11
- package/dist/ui/components/tabs.d.ts +3 -4
- package/dist/ui/components/tabs.js +38 -12
- package/dist/ui/components/terminal-demo.d.ts +1 -2
- package/dist/ui/components/terminal-demo.js +119 -74
- package/dist/ui/components/theme-toggle.d.ts +1 -2
- package/dist/ui/components/theme-toggle.js +63 -8
- package/dist/ui/components/tier-card.d.ts +1 -2
- package/dist/ui/components/tier-card.js +144 -24
- package/dist/ui/components/tv.d.ts +1 -2
- package/dist/ui/components/tv.js +138 -90
- package/dist/ui/components/typography/h1.d.ts +0 -1
- package/dist/ui/components/typography/h1.js +17 -8
- package/dist/ui/components/typography/h2.d.ts +0 -1
- package/dist/ui/components/typography/h2.js +17 -8
- package/dist/ui/components/typography/index.d.ts +0 -1
- package/dist/ui/components/typography/index.js +35 -24
- package/dist/ui/components/typography/legend.d.ts +1 -2
- package/dist/ui/components/typography/legend.js +18 -6
- package/dist/ui/components/typography/small.d.ts +0 -1
- package/dist/ui/components/typography/small.js +8 -7
- package/dist/ui/components/watchlist.d.ts +1 -2
- package/dist/ui/components/watchlist.js +77 -25
- package/dist/ui/fonts.css +7 -7
- package/dist/ui/footer.d.ts +1 -2
- package/dist/ui/footer.js +61 -25
- package/dist/ui/globals.css +5 -1
- package/dist/ui/header.d.ts +1 -2
- package/dist/ui/header.js +255 -60
- package/dist/ui/layout-wrapper.d.ts +1 -2
- package/dist/ui/layout-wrapper.js +5 -4
- package/dist/utils/color.d.ts +0 -1
- package/dist/utils/color.js +8 -9
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +37 -38
- package/dist/utils/poly.d.ts +0 -1
- package/dist/utils/poly.js +1 -2
- package/package.json +42 -24
- package/dist/assets/filler-bg0.jpg +0 -0
- package/dist/fonts.d.ts.map +0 -1
- package/dist/fonts.js.map +0 -1
- package/dist/hooks/use-capped-frame.d.ts.map +0 -1
- package/dist/hooks/use-capped-frame.js.map +0 -1
- package/dist/hooks/use-css-var-dims.d.ts.map +0 -1
- package/dist/hooks/use-css-var-dims.js.map +0 -1
- package/dist/hooks/use-gpu-tier.d.ts.map +0 -1
- package/dist/hooks/use-gpu-tier.js.map +0 -1
- package/dist/hooks/use-render-loop.d.ts.map +0 -1
- package/dist/hooks/use-render-loop.js.map +0 -1
- package/dist/hooks/use-smooth-controls.d.ts.map +0 -1
- package/dist/hooks/use-smooth-controls.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/ui/basic-page.d.ts.map +0 -1
- package/dist/ui/basic-page.js.map +0 -1
- package/dist/ui/components/animated-count.d.ts.map +0 -1
- package/dist/ui/components/animated-count.js.map +0 -1
- package/dist/ui/components/ascii.d.ts.map +0 -1
- package/dist/ui/components/ascii.js.map +0 -1
- package/dist/ui/components/badge.d.ts.map +0 -1
- package/dist/ui/components/badge.js.map +0 -1
- package/dist/ui/components/badges/nous-girl.d.ts.map +0 -1
- package/dist/ui/components/badges/nous-girl.js.map +0 -1
- package/dist/ui/components/blend-mode.d.ts.map +0 -1
- package/dist/ui/components/blend-mode.js.map +0 -1
- package/dist/ui/components/blink.d.ts.map +0 -1
- package/dist/ui/components/blink.js.map +0 -1
- package/dist/ui/components/button.d.ts.map +0 -1
- package/dist/ui/components/button.js.map +0 -1
- package/dist/ui/components/command-block.d.ts.map +0 -1
- package/dist/ui/components/command-block.js.map +0 -1
- package/dist/ui/components/cursor.d.ts.map +0 -1
- package/dist/ui/components/cursor.js.map +0 -1
- package/dist/ui/components/dropdown-menu.d.ts.map +0 -1
- package/dist/ui/components/dropdown-menu.js.map +0 -1
- package/dist/ui/components/fit-text/index.d.ts.map +0 -1
- package/dist/ui/components/fit-text/index.js.map +0 -1
- package/dist/ui/components/graphs/bar-chart.d.ts.map +0 -1
- package/dist/ui/components/graphs/bar-chart.js.map +0 -1
- package/dist/ui/components/graphs/index.d.ts.map +0 -1
- package/dist/ui/components/graphs/index.js.map +0 -1
- package/dist/ui/components/graphs/line-chart.d.ts.map +0 -1
- package/dist/ui/components/graphs/line-chart.js.map +0 -1
- package/dist/ui/components/graphs/utils.d.ts.map +0 -1
- package/dist/ui/components/graphs/utils.js.map +0 -1
- package/dist/ui/components/grid/index.d.ts.map +0 -1
- package/dist/ui/components/grid/index.js.map +0 -1
- package/dist/ui/components/hover-bg.d.ts.map +0 -1
- package/dist/ui/components/hover-bg.js.map +0 -1
- package/dist/ui/components/icons/arrow.d.ts.map +0 -1
- package/dist/ui/components/icons/arrow.js.map +0 -1
- package/dist/ui/components/icons/chevron.d.ts.map +0 -1
- package/dist/ui/components/icons/chevron.js.map +0 -1
- package/dist/ui/components/icons/discord.d.ts.map +0 -1
- package/dist/ui/components/icons/discord.js.map +0 -1
- package/dist/ui/components/icons/eye.d.ts.map +0 -1
- package/dist/ui/components/icons/eye.js.map +0 -1
- package/dist/ui/components/icons/gear.d.ts.map +0 -1
- package/dist/ui/components/icons/gear.js.map +0 -1
- package/dist/ui/components/icons/github.d.ts.map +0 -1
- package/dist/ui/components/icons/github.js.map +0 -1
- package/dist/ui/components/icons/hamburger.d.ts.map +0 -1
- package/dist/ui/components/icons/hamburger.js.map +0 -1
- package/dist/ui/components/icons/heart.d.ts.map +0 -1
- package/dist/ui/components/icons/heart.js.map +0 -1
- package/dist/ui/components/icons/index.d.ts.map +0 -1
- package/dist/ui/components/icons/index.js.map +0 -1
- package/dist/ui/components/icons/link.d.ts.map +0 -1
- package/dist/ui/components/icons/link.js.map +0 -1
- package/dist/ui/components/icons/minus.d.ts.map +0 -1
- package/dist/ui/components/icons/minus.js.map +0 -1
- package/dist/ui/components/icons/search.d.ts.map +0 -1
- package/dist/ui/components/icons/search.js.map +0 -1
- package/dist/ui/components/image-distortion.d.ts.map +0 -1
- package/dist/ui/components/image-distortion.js.map +0 -1
- package/dist/ui/components/leva-client.d.ts.map +0 -1
- package/dist/ui/components/leva-client.js.map +0 -1
- package/dist/ui/components/list-item.d.ts.map +0 -1
- package/dist/ui/components/list-item.js.map +0 -1
- package/dist/ui/components/modal/index.d.ts.map +0 -1
- package/dist/ui/components/modal/index.js.map +0 -1
- package/dist/ui/components/overlays/blend-modes.d.ts.map +0 -1
- package/dist/ui/components/overlays/blend-modes.js.map +0 -1
- package/dist/ui/components/overlays/glitch.d.ts.map +0 -1
- package/dist/ui/components/overlays/glitch.js.map +0 -1
- package/dist/ui/components/overlays/greys.d.ts.map +0 -1
- package/dist/ui/components/overlays/greys.js.map +0 -1
- package/dist/ui/components/overlays/index.d.ts.map +0 -1
- package/dist/ui/components/overlays/index.js.map +0 -1
- package/dist/ui/components/overlays/lens-layers.d.ts.map +0 -1
- package/dist/ui/components/overlays/lens-layers.js.map +0 -1
- package/dist/ui/components/overlays/lens.d.ts.map +0 -1
- package/dist/ui/components/overlays/lens.js.map +0 -1
- package/dist/ui/components/overlays/noise.d.ts.map +0 -1
- package/dist/ui/components/overlays/noise.js.map +0 -1
- package/dist/ui/components/overlays/vignette.d.ts.map +0 -1
- package/dist/ui/components/overlays/vignette.js.map +0 -1
- package/dist/ui/components/poster.d.ts.map +0 -1
- package/dist/ui/components/poster.js.map +0 -1
- package/dist/ui/components/progress.d.ts.map +0 -1
- package/dist/ui/components/progress.js.map +0 -1
- package/dist/ui/components/scene-canvas.d.ts.map +0 -1
- package/dist/ui/components/scene-canvas.js.map +0 -1
- package/dist/ui/components/scramble.d.ts.map +0 -1
- package/dist/ui/components/scramble.js.map +0 -1
- package/dist/ui/components/segmented.d.ts.map +0 -1
- package/dist/ui/components/segmented.js.map +0 -1
- package/dist/ui/components/select.d.ts.map +0 -1
- package/dist/ui/components/select.js.map +0 -1
- package/dist/ui/components/selection-switcher.d.ts.map +0 -1
- package/dist/ui/components/selection-switcher.js.map +0 -1
- package/dist/ui/components/shader.d.ts.map +0 -1
- package/dist/ui/components/shader.js.map +0 -1
- package/dist/ui/components/socials.d.ts.map +0 -1
- package/dist/ui/components/socials.js.map +0 -1
- package/dist/ui/components/spinner.d.ts.map +0 -1
- package/dist/ui/components/spinner.js.map +0 -1
- package/dist/ui/components/stats.d.ts.map +0 -1
- package/dist/ui/components/stats.js.map +0 -1
- package/dist/ui/components/switch.d.ts.map +0 -1
- package/dist/ui/components/switch.js.map +0 -1
- package/dist/ui/components/tabs.d.ts.map +0 -1
- package/dist/ui/components/tabs.js.map +0 -1
- package/dist/ui/components/terminal-demo.d.ts.map +0 -1
- package/dist/ui/components/terminal-demo.js.map +0 -1
- package/dist/ui/components/theme-toggle.d.ts.map +0 -1
- package/dist/ui/components/theme-toggle.js.map +0 -1
- package/dist/ui/components/tier-card.d.ts.map +0 -1
- package/dist/ui/components/tier-card.js.map +0 -1
- package/dist/ui/components/tv.d.ts.map +0 -1
- package/dist/ui/components/tv.js.map +0 -1
- package/dist/ui/components/typography/h1.d.ts.map +0 -1
- package/dist/ui/components/typography/h1.js.map +0 -1
- package/dist/ui/components/typography/h2.d.ts.map +0 -1
- package/dist/ui/components/typography/h2.js.map +0 -1
- package/dist/ui/components/typography/index.d.ts.map +0 -1
- package/dist/ui/components/typography/index.js.map +0 -1
- package/dist/ui/components/typography/legend.d.ts.map +0 -1
- package/dist/ui/components/typography/legend.js.map +0 -1
- package/dist/ui/components/typography/small.d.ts.map +0 -1
- package/dist/ui/components/typography/small.js.map +0 -1
- package/dist/ui/components/watchlist.d.ts.map +0 -1
- package/dist/ui/components/watchlist.js.map +0 -1
- package/dist/ui/footer.d.ts.map +0 -1
- package/dist/ui/footer.js.map +0 -1
- package/dist/ui/header.d.ts.map +0 -1
- package/dist/ui/header.js.map +0 -1
- package/dist/ui/layout-wrapper.d.ts.map +0 -1
- package/dist/ui/layout-wrapper.js.map +0 -1
- package/dist/utils/color.d.ts.map +0 -1
- package/dist/utils/color.js.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/poly.d.ts.map +0 -1
- package/dist/utils/poly.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hamburger.js","sourceRoot":"","sources":["../../../../src/ui/components/icons/hamburger.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAEnC,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,EACT,IAAI,GAAG,KAAK,EACZ,GAAG,KAAK,EACW;IACnB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAClC,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,aAAa,EAAC,OAAO,EACrB,WAAW,EAAE,GAAG,EAChB,OAAO,EAAC,WAAW,KACf,KAAK,aAET,eACE,SAAS,EAAC,0DAA0D,EACpE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,EAAE,EACjE,EAAE,EAAE,CAAC,EACL,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,EAAE,GACN,EAEF,eACE,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAChC,EAAE,EAAE,CAAC,EACL,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,EAAE,GACN,EAEF,eACE,SAAS,EAAC,0DAA0D,EACpE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,EAAE,EACjE,EAAE,EAAE,CAAC,EACL,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,EAAE,GACN,IACE,CACP,CAAA;AACH,CAAC","sourcesContent":["import type { SVGProps } from 'react'\n\nimport { cn } from '../../../utils'\n\nexport function HamburgerIcon({\n className,\n open = false,\n ...props\n}: HamburgerIconProps) {\n return (\n <svg\n className={cn('size-5', className)}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth={1.5}\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <line\n className=\"origin-center transition-transform duration-200 ease-out\"\n style={{ transform: open ? 'rotate(45deg)' : 'translateY(-4px)' }}\n x1={4}\n x2={20}\n y1={12}\n y2={12}\n />\n\n <line\n className=\"transition-opacity duration-200 ease-out\"\n style={{ opacity: open ? 0 : 1 }}\n x1={4}\n x2={20}\n y1={12}\n y2={12}\n />\n\n <line\n className=\"origin-center transition-transform duration-200 ease-out\"\n style={{ transform: open ? 'rotate(-45deg)' : 'translateY(4px)' }}\n x1={4}\n x2={20}\n y1={12}\n y2={12}\n />\n </svg>\n )\n}\n\ninterface HamburgerIconProps extends SVGProps<SVGSVGElement> {\n open?: boolean\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"heart.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/icons/heart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAErC,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,2CASvD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"heart.js","sourceRoot":"","sources":["../../../../src/ui/components/icons/heart.tsx"],"names":[],"mappings":";AAEA,MAAM,UAAU,SAAS,CAAC,KAA8B;IACtD,OAAO,CACL,cAAK,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,KAAK,KAAK,YAC5C,eACE,CAAC,EAAC,gJAAgJ,EAClJ,IAAI,EAAC,cAAc,GACnB,GACE,CACP,CAAA;AACH,CAAC","sourcesContent":["import type { SVGProps } from 'react'\n\nexport function HeartIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg fill=\"none\" viewBox=\"0 0 14 12\" {...props}>\n <path\n d=\"M13.2 0v5.65714h-1.8857v1.88572H9.42857v1.88571H7.54286v1.88573H5.65714V9.42857H3.77143V7.54286H1.88571V5.65714H0V0h5.65714v1.88571h1.88572V0z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/icons/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,OAAO,CAAA;AACrB,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/components/icons/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,OAAO,CAAA;AACrB,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA","sourcesContent":["export * from './arrow'\nexport * from './chevron'\nexport * from './discord'\nexport * from './eye'\nexport * from './gear'\nexport * from './github'\nexport * from './hamburger'\nexport * from './heart'\nexport * from './link'\nexport * from './minus'\nexport * from './search'\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/icons/link.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAErC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,2CAWtD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../../src/ui/components/icons/link.tsx"],"names":[],"mappings":";AAEA,MAAM,UAAU,QAAQ,CAAC,KAA8B;IACrD,OAAO,CACL,cAAK,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,UAAU,KAAK,KAAK,YAC3C,eACE,CAAC,EAAC,2PAA2P,EAC7P,IAAI,EAAC,cAAc,EACnB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,IAAI,GAChB,GACE,CACP,CAAA;AACH,CAAC","sourcesContent":["import type { SVGProps } from 'react'\n\nexport function LinkIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg fill=\"none\" viewBox=\"0 0 17 7\" {...props}>\n <path\n d=\"M.264191.25061 6.27068.265071V2.26334h3.96512v1.99578l4.0238.00091.043-2.06986-4.0381.07302-.0142-2.01254L16.271.250649l-.0144 6.006381h-5.992l-.0287-1.9981-3.96528-.0002v1.99826l-6.02085-.0001zM6.24063 2.26197l-3.97944-.01436v1.99827l3.97954.01446z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\".5\"\n />\n </svg>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"minus.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/icons/minus.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAErC,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,2CAWvD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"minus.js","sourceRoot":"","sources":["../../../../src/ui/components/icons/minus.tsx"],"names":[],"mappings":";AAEA,MAAM,UAAU,SAAS,CAAC,KAA8B;IACtD,OAAO,CACL,cAAK,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,UAAU,KAAK,KAAK,YAC3C,eACE,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,iCAAiC,EACnC,IAAI,EAAC,cAAc,EACnB,QAAQ,EAAC,SAAS,GAClB,GACE,CACP,CAAA;AACH,CAAC","sourcesContent":["import type { SVGProps } from 'react'\n\nexport function MinusIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg fill=\"none\" viewBox=\"0 0 12 3\" {...props}>\n <path\n clipRule=\"evenodd\"\n d=\"M12 0 0-5.2e-7-1e-7 2.50075H12z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n />\n </svg>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/icons/search.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAErC,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,2CAyBxD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/ui/components/icons/search.tsx"],"names":[],"mappings":";AAEA,MAAM,UAAU,UAAU,CAAC,KAA8B;IACvD,OAAO,CACL,eAAK,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,KAAK,KAAK,aAC5C,eACE,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,4EAA4E,EAC9E,IAAI,EAAC,cAAc,EACnB,QAAQ,EAAC,SAAS,GAClB,EAEF,eACE,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,wOAAwO,EAC1O,IAAI,EAAC,cAAc,EACnB,QAAQ,EAAC,SAAS,GAClB,EAEF,eACE,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,4QAA4Q,EAC9Q,IAAI,EAAC,cAAc,EACnB,QAAQ,EAAC,SAAS,GAClB,IACE,CACP,CAAA;AACH,CAAC","sourcesContent":["import type { SVGProps } from 'react'\n\nexport function SearchIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg fill=\"none\" viewBox=\"0 0 20 21\" {...props}>\n <path\n clipRule=\"evenodd\"\n d=\"M7.49773 1.6664h6.66637V0H7.49773zM14.1641 15.0001H7.49773v1.6664h6.66637z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n />\n\n <path\n clipRule=\"evenodd\"\n d=\"M5.8336 3.33278H7.5v-1.6664H5.8336zM15.8359 13.3329h-1.6671v1.6672h1.6671zM4.16877 5.00017h1.66717V3.33301H4.16877zM17.5 11.6665h-1.6664v1.6664H17.5zM4.16406 11.6665V5.00012h-1.6664v6.66638zM17.4977 5.00012v6.66638h1.6664V5.00012z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n />\n\n <path\n clipRule=\"evenodd\"\n d=\"M17.5 5.00017V3.33301h-1.6664v1.66716zM15.8359 3.33278v-1.6664h-1.6671v1.6664zM15.8359 10.0002V6.6665h-1.6671v3.3337zM14.1641 6.6664V5h-1.6664v1.6664zM5.8335 13.3328v-1.6664H4.16633V15H7.5v-1.6671zM4.16406 16.6664V15h-1.6664v1.6664zM2.5 18.3331v-1.6664H.8336v1.6664z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n />\n </svg>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image-distortion.d.ts","sourceRoot":"","sources":["../../../src/ui/components/image-distortion.tsx"],"names":[],"mappings":"AAmJA,wBAAgB,eAAe,CAAC,EAC9B,MAAa,EACb,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,GAAG,EACH,KAAK,EACL,IAAI,EACJ,YAAY,EACb,EAAE,oBAAoB,2CAmUtB;AAED,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE/D,UAAU,oBAAoB;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CACpD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image-distortion.js","sourceRoot":"","sources":["../../../src/ui/components/image-distortion.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useGpuTier } from '../../hooks/use-gpu-tier'\nimport { cn, hexToRgb } from '../../utils'\n\nconst NUM_BANDS = 12\n\nconst VERT = `attribute vec2 a;varying vec2 vUv;void main(){vUv=vec2(a.x*.5+.5,.5-a.y*.5);gl_Position=vec4(a,0,1);}`\n\nconst FRAG = `precision highp float;\nuniform float t;\nuniform vec2 r,imgSize,vel;\nuniform sampler2D tex;\nuniform float bands[${NUM_BANDS}];\nuniform vec3 tint;\nuniform float tintStrength;\nvarying vec2 vUv;\n\nfloat h(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}\n\n// cover-style UV: crops the image to fill the canvas, centered\nvec2 coverUV(vec2 uv){\n float canvasAspect=r.x/r.y;\n float imgAspect=imgSize.x/imgSize.y;\n vec2 scale=canvasAspect>imgAspect\n ?vec2(1.0,imgAspect/canvasAspect)\n :vec2(canvasAspect/imgAspect,1.0);\n return(uv-0.5)*scale+0.5;\n}\n\nvoid main(){\n vec2 uv=coverUV(vUv);\n float scanY=floor(vUv.y*r.y);\n\n float bandF=vUv.y*${NUM_BANDS}.0;\n int bandIdx=int(floor(bandF));\n float bandFrac=fract(bandF);\n\n float strength=0.0;\n for(int i=0;i<${NUM_BANDS};i++){\n if(i==bandIdx) strength=bands[i];\n }\n\n float neighborStr=0.0;\n int neighborIdx=bandFrac>.5?bandIdx+1:bandIdx-1;\n for(int i=0;i<${NUM_BANDS};i++){\n if(i==neighborIdx) neighborStr=bands[i];\n }\n float edgeBlend=abs(bandFrac-.5)*2.0;\n edgeBlend*=edgeBlend;\n strength=mix(strength,neighborStr,edgeBlend*.3);\n\n float speed=length(vel);\n float dirBlend=smoothstep(0.0,0.02,speed);\n vec2 dir=speed>.0001?vel/speed:vec2(0);\n dir*=dirBlend;\n\n float rowSeed=h(vec2(scanY,floor(t*3.)+float(bandIdx)*7.));\n float rowVar=mix(.4,1.0,rowSeed);\n\n float ySmooth=vUv.y*6.0+t*0.7;\n float yNoise=mix(h(vec2(floor(ySmooth),13.)),h(vec2(floor(ySmooth)+1.0,13.)),smoothstep(0.0,1.0,fract(ySmooth)));\n float colVar=mix(.4,1.0,yNoise);\n\n float tearShiftX=dir.x*strength*rowVar*0.15;\n float tearShiftY=dir.y*strength*colVar*0.10;\n\n float bandSeed=h(vec2(float(bandIdx),42.));\n tearShiftX+=strength*(.5-bandSeed)*0.05;\n\n float yJitter=mix(h(vec2(floor(ySmooth),73.)),h(vec2(floor(ySmooth)+1.0,73.)),smoothstep(0.0,1.0,fract(ySmooth)));\n tearShiftY+=strength*(.5-yJitter)*0.035;\n\n uv.x+=tearShiftX;\n uv.y+=tearShiftY;\n\n float sortGate=step(.5,strength)*step(.4,rowSeed);\n uv.x+=dir.x*sortGate*strength*0.03;\n uv.y+=dir.y*sortGate*strength*0.02;\n\n float caX=abs(tearShiftX)*2.5+sortGate*strength*0.01;\n float caY=abs(tearShiftY)*2.5+sortGate*strength*0.01;\n float cr=texture2D(tex,vec2(uv.x+caX,uv.y+caY)).r;\n float cg=texture2D(tex,uv).g;\n float cb=texture2D(tex,vec2(uv.x-caX,uv.y-caY)).b;\n\n vec3 col=vec3(cr,cg,cb);\n\n col*=.97+.03*sin(vUv.y*r.y*3.14159);\n\n float bandEdge=smoothstep(.02,.0,min(bandFrac,1.0-bandFrac));\n col+=vec3(bandEdge*strength*.1);\n\n col=mix(col,col*tint,tintStrength);\n\n gl_FragColor=vec4(col,1.0);\n}`\n\n/**\n * Choreographed motion patterns used when `autoPlay` is set. Each pattern\n * returns a synthetic pointer position in [0,1] and a hover intensity in\n * [0,1] for the current time (seconds). They drive the shader without\n * requiring a real pointer, which is what lets us record the distortion\n * as a GIF / screenshot / poster.\n */\nconst AUTOPLAY_PATTERNS: Record<\n AutoPlayPattern,\n (t: number) => { hover: number; mx: number; my: number }\n> = {\n aggressive: t => {\n const cycle = 1.4\n const phase = (t % cycle) / cycle\n const stab = Math.exp(-((phase - 0.15) ** 2) * 260)\n const angle = Math.floor(t / cycle) * 1.37\n const mx = 0.5 + Math.cos(angle) * 0.42 * (stab + 0.15)\n const my = 0.5 + Math.sin(angle) * 0.38 * (stab + 0.15)\n\n return { hover: 0.55 + stab * 0.45, mx, my }\n },\n gentle: t => ({\n hover: 0.45 + Math.sin(t * 0.9) * 0.1,\n mx: 0.5 + Math.sin(t * 0.5) * 0.28,\n my: 0.5 + Math.cos(t * 0.37) * 0.22\n }),\n slash: t => {\n // Long breath -> sword slash -> recoil twitch, repeating.\n const cycle = 3.6\n const phase = (t % cycle) / cycle\n const slash = Math.exp(-((phase - 0.28) ** 2) * 180)\n const micro = Math.exp(-((phase - 0.7) ** 2) * 340)\n\n const driftX = 0.5 + Math.sin(t * 0.7) * 0.16\n const driftY = 0.55 + Math.cos(t * 0.5) * 0.14\n\n // Slash trajectory: bottom-left up into the giant's chest (top-right).\n const slashX = -0.15 + phase * 1.55\n const slashY = 0.95 - phase * 1.35\n\n const mx = driftX * (1 - slash) + slashX * slash\n const my = driftY * (1 - slash) + slashY * slash\n\n return { hover: 0.5 + slash * 0.5 + micro * 0.35, mx, my }\n }\n}\n\nexport function ImageDistortion({\n active = true,\n autoPlay,\n className,\n fallbackClassName,\n src,\n style,\n tint,\n tintStrength\n}: ImageDistortionProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const tier = useGpuTier()\n const [loaded, setLoaded] = useState(false)\n\n const activeRef = useRef(active)\n activeRef.current = active\n const tintStrengthRef = useRef(tintStrength)\n tintStrengthRef.current = tintStrength\n const autoPlayRef = useRef(autoPlay)\n autoPlayRef.current = autoPlay\n\n const state = useRef({\n bandTargets: new Float32Array(NUM_BANDS),\n bands: new Float32Array(NUM_BANDS),\n hoverTarget: 0,\n imgH: 1,\n imgW: 1,\n mx: 0.5,\n my: 0.5,\n prevMx: 0.5,\n prevMy: 0.5,\n vx: 0,\n vy: 0\n })\n\n useEffect(() => {\n if (tier === 0) {\n return\n }\n\n const c = canvasRef.current\n\n if (!c) {\n return\n }\n\n const gl = c.getContext('webgl')\n\n if (!gl) {\n return\n }\n\n const compile = (type: number, source: string) => {\n const s = gl.createShader(type)!\n gl.shaderSource(s, source)\n gl.compileShader(s)\n\n return s\n }\n\n const prog = gl.createProgram()!\n gl.attachShader(prog, compile(gl.VERTEX_SHADER, VERT))\n gl.attachShader(prog, compile(gl.FRAGMENT_SHADER, FRAG))\n gl.linkProgram(prog)\n gl.useProgram(prog)\n\n gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer())\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]),\n gl.STATIC_DRAW\n )\n\n const a = gl.getAttribLocation(prog, 'a')\n gl.enableVertexAttribArray(a)\n gl.vertexAttribPointer(a, 2, gl.FLOAT, false, 0, 0)\n\n const uT = gl.getUniformLocation(prog, 't')\n const uR = gl.getUniformLocation(prog, 'r')\n const uImgSize = gl.getUniformLocation(prog, 'imgSize')\n const uVel = gl.getUniformLocation(prog, 'vel')\n const uTex = gl.getUniformLocation(prog, 'tex')\n const uTint = gl.getUniformLocation(prog, 'tint')\n const uTintStrength = gl.getUniformLocation(prog, 'tintStrength')\n const uBands: (null | WebGLUniformLocation)[] = []\n\n for (let i = 0; i < NUM_BANDS; i++) {\n uBands.push(gl.getUniformLocation(prog, `bands[${i}]`))\n }\n\n const texture = gl.createTexture()!\n gl.bindTexture(gl.TEXTURE_2D, texture)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n 1,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n new Uint8Array([0, 0, 0, 255])\n )\n\n const img = new Image()\n img.crossOrigin = 'anonymous'\n\n img.onload = () => {\n state.current.imgW = img.naturalWidth\n state.current.imgH = img.naturalHeight\n gl.bindTexture(gl.TEXTURE_2D, texture)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n img\n )\n setLoaded(true)\n }\n\n img.src = src\n\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, texture)\n gl.uniform1i(uTex, 0)\n\n const resize = () => {\n const rect = c.getBoundingClientRect()\n const dpr = Math.min(devicePixelRatio, 2)\n c.width = rect.width * dpr\n c.height = rect.height * dpr\n gl.viewport(0, 0, c.width, c.height)\n }\n\n resize()\n const ro = new ResizeObserver(resize)\n ro.observe(c)\n\n const onMove = (e: PointerEvent) => {\n const rect = c.getBoundingClientRect()\n state.current.mx = (e.clientX - rect.left) / rect.width\n state.current.my = (e.clientY - rect.top) / rect.height\n }\n\n const onEnter = () => {\n state.current.hoverTarget = 1\n }\n\n const onLeave = () => {\n state.current.hoverTarget = 0\n }\n\n // When autoPlay drives the distortion we want the poster to look\n // alive regardless of whether a pointer is near the canvas, so we\n // skip the real pointer listeners entirely.\n if (!autoPlayRef.current) {\n c.addEventListener('pointermove', onMove)\n c.addEventListener('pointerenter', onEnter)\n c.addEventListener('pointerleave', onLeave)\n }\n\n const bandEaseRates = new Float32Array(NUM_BANDS)\n\n for (let i = 0; i < NUM_BANDS; i++) {\n bandEaseRates[i] = 0.02 + Math.random() * 0.06\n }\n\n const tintVec: readonly [number, number, number] = tint\n ? (() => {\n const [tr, tg, tb] = hexToRgb(tint)\n\n return [tr / 255, tg / 255, tb / 255] as const\n })()\n : ([1, 1, 1] as const)\n\n const t0 = performance.now()\n let raf = 0\n let visible = !document.hidden\n let inView = true\n\n const loop = () => {\n raf = requestAnimationFrame(loop)\n const s = state.current\n\n const pattern = autoPlayRef.current\n ? AUTOPLAY_PATTERNS[autoPlayRef.current]\n : null\n\n if (pattern) {\n const driven = pattern((performance.now() - t0) / 1e3)\n s.mx = driven.mx\n s.my = driven.my\n s.hoverTarget = driven.hover\n }\n\n const dvx = s.mx - s.prevMx\n const dvy = s.my - s.prevMy\n s.vx += (dvx * 8 - s.vx) * 0.1\n s.vy += (dvy * 8 - s.vy) * 0.1\n s.prevMx = s.mx\n s.prevMy = s.my\n\n const speed = Math.sqrt(s.vx * s.vx + s.vy * s.vy)\n\n for (let i = 0; i < NUM_BANDS; i++) {\n const bandCenter = (i + 0.5) / NUM_BANDS\n const dist = Math.abs(s.my - bandCenter)\n const proximity = Math.max(0, 1 - dist / 0.3)\n const activation =\n s.hoverTarget * proximity * (0.4 + Math.min(speed, 1) * 0.6)\n s.bandTargets[i] = activation\n }\n\n for (let i = 0; i < NUM_BANDS; i++) {\n const rate = bandEaseRates[i]!\n const current = s.bands[i] ?? 0\n const target = s.bandTargets[i] ?? 0\n s.bands[i] = current + (target - current) * rate\n\n if (s.bands[i]! < 0.001) {\n s.bands[i] = 0\n }\n }\n\n gl.uniform1f(uT, (performance.now() - t0) / 1e3)\n gl.uniform2f(uR, c.width, c.height)\n gl.uniform2f(uImgSize, s.imgW, s.imgH)\n gl.uniform2f(uVel, s.vx, s.vy)\n gl.uniform3f(uTint, tintVec[0], tintVec[1], tintVec[2])\n\n const ts = tintStrengthRef.current\n const defaultStrength = tint ? 0.35 : 0\n const defaultInactive = tint ? 0.15 : 0\n gl.uniform1f(\n uTintStrength,\n activeRef.current\n ? (ts?.active ?? defaultStrength)\n : (ts?.inactive ?? defaultInactive)\n )\n\n for (let i = 0; i < NUM_BANDS; i++) {\n gl.uniform1f(uBands[i]!, s.bands[i]!)\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture)\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n }\n\n const start = () => {\n if (visible && inView && !raf) {\n raf = requestAnimationFrame(loop)\n }\n }\n\n const stop = () => {\n if (raf) {\n cancelAnimationFrame(raf)\n raf = 0\n }\n }\n\n const onVisibility = () => {\n visible = !document.hidden\n visible ? start() : stop()\n }\n\n const io = new IntersectionObserver(\n entries => {\n inView = entries.some(e => e.isIntersecting)\n inView ? start() : stop()\n },\n { threshold: 0 }\n )\n\n io.observe(c)\n document.addEventListener('visibilitychange', onVisibility)\n\n start()\n\n return () => {\n stop()\n io.disconnect()\n document.removeEventListener('visibilitychange', onVisibility)\n ro.disconnect()\n c.removeEventListener('pointermove', onMove)\n c.removeEventListener('pointerenter', onEnter)\n c.removeEventListener('pointerleave', onLeave)\n gl.deleteTexture(texture)\n gl.deleteProgram(prog)\n setLoaded(false)\n }\n // autoPlay is intentionally omitted so toggling it at runtime doesn't\n // tear down the shader pipeline. The ref-driven loop reads the live\n // value each frame, so listener attach/detach is handled once on mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src, tier, tint])\n\n if (tier === 0) {\n return (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n alt=\"\"\n className={cn(\n 'absolute inset-0 h-full w-full object-cover',\n fallbackClassName ?? className\n )}\n src={src}\n style={{ mixBlendMode: 'overlay', ...style }}\n />\n )\n }\n\n return (\n <canvas\n className={cn(\n 'absolute inset-0 h-full w-full transition-opacity duration-500',\n className\n )}\n ref={canvasRef}\n style={{\n mixBlendMode: 'overlay',\n opacity: loaded ? 1 : 0,\n ...style\n }}\n />\n )\n}\n\nexport type AutoPlayPattern = 'aggressive' | 'gentle' | 'slash'\n\ninterface ImageDistortionProps {\n active?: boolean\n /**\n * Drive the distortion with a choreographed motion pattern instead of\n * waiting for a real pointer. Useful for posters, social clips, and any\n * context where the image needs to feel alive on its own.\n */\n autoPlay?: AutoPlayPattern\n className?: string\n fallbackClassName?: string\n src: string\n style?: React.CSSProperties\n tint?: string\n tintStrength?: { active: number; inactive: number }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"leva-client.d.ts","sourceRoot":"","sources":["../../../src/ui/components/leva-client.tsx"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,4CAQzB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"leva-client.js","sourceRoot":"","sources":["../../../src/ui/components/leva-client.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE1C,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;IACpE,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,KAAC,IAAI,IAAO,MAAM,GAAM,CAAA;AACjC,CAAC","sourcesContent":["'use client'\n\nimport { Leva } from 'leva'\nimport { useEffect, useState } from 'react'\n\nexport function LevaClient() {\n const [hidden, setHidden] = useState(true)\n\n useEffect(() => {\n setHidden(!new URLSearchParams(window.location.search).has('dev'))\n }, [])\n\n return <Leva {...{ hidden }} />\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list-item.d.ts","sourceRoot":"","sources":["../../../src/ui/components/list-item.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAI7D,eAAO,MAAM,QAAQ,6GA0BpB,CAAA;AAED,UAAU,aAAc,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IACrE,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list-item.js","sourceRoot":"","sources":["../../../src/ui/components/list-item.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,UAAU,EAA6B,MAAM,OAAO,CAAA;AAE7D,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAChC,SAAS,QAAQ,CACf,EAAE,MAAM,GAAG,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,EAClE,GAAG;IAEH,OAAO,CACL,iBACE,SAAS,EAAE,EAAE,CACX,mEAAmE,EACnE,uDAAuD,EACvD,iFAAiF,EACjF,iDAAiD,EACjD,MAAM;YACJ,CAAC,CAAC,gCAAgC;YAClC,CAAC,CAAC,6DAA6D,EACjE,SAAS,CACV,iBACY,MAAM,IAAI,SAAS,EAChC,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,KACN,KAAK,YAER,QAAQ,GACF,CACV,CAAA;AACH,CAAC,CACF,CAAA","sourcesContent":["'use client'\n\nimport { forwardRef, type ButtonHTMLAttributes } from 'react'\n\nimport { cn } from '../../utils'\n\nexport const ListItem = forwardRef<HTMLButtonElement, ListItemProps>(\n function ListItem(\n { active = false, children, className, type = 'button', ...props },\n ref\n ) {\n return (\n <button\n className={cn(\n 'group relative flex w-full items-center gap-2 px-3 py-2 text-left',\n 'font-courier text-sm transition-colors cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n active\n ? 'bg-midground/10 text-midground'\n : 'text-midground/70 hover:text-midground hover:bg-midground/5',\n className\n )}\n data-active={active || undefined}\n ref={ref}\n type={type}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\n\ninterface ListItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n active?: boolean\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/modal/index.tsx"],"names":[],"mappings":"AAOA,wBAAgB,KAAK,CAAC,EACpB,QAAQ,EACR,SAAS,EACT,EAAE,EACF,OAAO,EACP,GAAG,KAAK,EACT,EAAE,UAAU,2CA2BZ;AAED,UAAU,UAAW,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACvE,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClB,KAAK,EAAE,MAAM,IAAI,CAAA;QACjB,IAAI,EAAE,MAAM,IAAI,CAAA;KACjB,KAAK,KAAK,CAAC,SAAS,CAAA;CACtB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/components/modal/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAEnC,MAAM,UAAU,KAAK,CAAC,EACpB,QAAQ,EACR,SAAS,EACT,EAAE,EACF,OAAO,EACP,GAAG,KAAK,EACG;IACX,MAAM,GAAG,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAA;IAC3C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE7C,SAAS,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAErC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;IAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;IAEzD,OAAO,CACL,8BACG,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAExB,OAAO;gBACN,YAAY,CACV,iBACE,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EACjC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,aAAa,IAAI,KAAK,EAAE,EAC/C,EAAE,EAAE,GAAG,KACT,KAAK,YAET,cAAK,SAAS,EAAC,iBAAiB,YAAE,QAAQ,GAAO,GAC1C,EACT,QAAQ,CAAC,IAAI,CACd,IACF,CACJ,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { cn } from '../../../utils'\n\nexport function Modal({\n children,\n className,\n id,\n trigger,\n ...props\n}: ModalProps) {\n const ref = useRef<HTMLDialogElement>(null)\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => setMounted(true), [])\n\n const open = useCallback(() => ref.current?.showModal(), [])\n const close = useCallback(() => ref.current?.close(), [])\n\n return (\n <>\n {trigger({ close, open })}\n\n {mounted &&\n createPortal(\n <dialog\n className={cn('modal', className)}\n onClick={e => e.target === e.currentTarget && close()}\n {...{ id, ref }}\n {...props}\n >\n <div className=\"modal-body post\">{children}</div>\n </dialog>,\n document.body\n )}\n </>\n )\n}\n\ninterface ModalProps extends Omit<React.ComponentProps<'dialog'>, 'open'> {\n trigger: (controls: {\n close: () => void\n open: () => void\n }) => React.ReactNode\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blend-modes.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/overlays/blend-modes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,EAYR,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blend-modes.js","sourceRoot":"","sources":["../../../../src/ui/components/overlays/blend-modes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS;IACT,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,QAAQ;IACR,SAAS;CAC0C,CAAA","sourcesContent":["export const BLEND_MODES = [\n 'overlay',\n 'multiply',\n 'screen',\n 'difference',\n 'exclusion',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'darken',\n 'lighten'\n] as unknown as React.CSSProperties['mixBlendMode'][]\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glitch.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/overlays/glitch.tsx"],"names":[],"mappings":"AA4GA,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,WAAW,kDAiIvD;AAED,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glitch.js","sourceRoot":"","sources":["../../../../src/ui/components/overlays/glitch.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { useEffect, useRef } from 'react'\nimport * as THREE from 'three'\n\nimport { $gpuTier, useGpuTier } from '../../../hooks/use-gpu-tier'\nimport { runRenderLoop } from '../../../hooks/use-render-loop'\nimport { useSmoothControls } from '../../../hooks/use-smooth-controls'\nimport { cn } from '../../../utils'\n\nimport { BLEND_MODES } from './blend-modes'\n\nconst vert = /*glsl*/ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n`\n\nconst frag = /*glsl*/ `\n uniform float uTime, uAlpha, uIntensity, uChroma, uSpeed, uSparsity;\n uniform vec3 uColor;\n varying vec2 vUv;\n\n float hash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }\n\n vec2 hash2(vec2 p) {\n vec3 q = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));\n q += dot(q, q.yzx + 33.33);\n return fract((q.xx + q.yz) * q.zy);\n }\n\n float dither(vec2 p, float a) {\n return step(mod(floor(p.x) + floor(p.y) * 2.0, 4.0) / 4.0, a);\n }\n\n void main() {\n vec3 col = vec3(0.0);\n float t = uTime * uSpeed;\n float tSlow = floor(t / 3.0);\n float dit = dither(gl_FragCoord.xy * 0.5, 0.7);\n\n for (float i = 0.0; i < 6.0; i++) {\n float seed = i * 137.3;\n float epoch = floor((t + hash(vec2(seed, 77.7)) * 200.0) / (4.0 + hash(vec2(seed, 0.0)) * 6.0));\n float life = fract((t + hash(vec2(seed, 77.7)) * 200.0) / (4.0 + hash(vec2(seed, 0.0)) * 6.0));\n\n if (hash(vec2(epoch, seed)) > 1.0 - uSparsity * 0.7) continue;\n\n vec2 center = vec2(hash(vec2(epoch, seed + 13.1)), hash(vec2(epoch, seed + 27.3)));\n vec2 size = vec2(0.015 + hash(vec2(epoch, seed + 41.5)) * 0.08, 0.008 + hash(vec2(epoch, seed + 53.7)) * 0.04);\n vec2 d = abs(vUv - center);\n\n if (d.x < size.x && d.y < size.y) {\n float fade = smoothstep(0.0, 0.05, life) * smoothstep(1.0, 0.95, life);\n vec2 gUV = vUv + (hash2(vec2(epoch, seed + 200.0)) - 0.5) * 0.08 * uIntensity;\n float shift = uChroma * 0.015 * (sin(t * 2.0 + hash(vec2(epoch, seed)) * 6.28) * 0.3 + 0.7);\n\n col += uColor * vec3(\n hash(gUV * 50.0 + vec2(shift, 0.0) + epoch),\n hash(gUV * 50.0 + epoch),\n hash(gUV * 50.0 - vec2(shift, 0.0) + epoch)\n ) * dither(gl_FragCoord.xy * 0.5, fade * 0.8 + 0.2) * uIntensity * 0.7;\n }\n }\n\n for (float i = 0.0; i < 12.0; i++) {\n float seed = i * 211.7 + 1000.0;\n float epoch = floor((t + hash(vec2(seed, 77.7)) * 150.0) / (3.0 + hash(vec2(seed, 0.0)) * 5.0));\n float life = fract((t + hash(vec2(seed, 77.7)) * 150.0) / (3.0 + hash(vec2(seed, 0.0)) * 5.0));\n\n if (hash(vec2(epoch, seed)) > 1.0 - uSparsity * 0.5) continue;\n\n vec2 pos = vec2(hash(vec2(epoch, seed + 13.1)), hash(vec2(epoch, seed + 27.3)));\n float px = 0.003 + hash(vec2(epoch, seed + 41.5)) * 0.008;\n\n if (abs(vUv.x - pos.x) < px && abs(vUv.y - pos.y) < px) {\n float fade = smoothstep(0.0, 0.1, life) * smoothstep(1.0, 0.9, life);\n vec3 c = uColor;\n float cs = hash(vec2(epoch, seed + 700.0));\n\n if (cs < 0.2) c.r *= 1.8 * uChroma;\n else if (cs < 0.4) c.b *= 1.8 * uChroma;\n\n col += c * dither(gl_FragCoord.xy * 0.5, fade * 0.9) * uIntensity;\n }\n }\n\n float tearSize = 25.0 + uSparsity * 10.0;\n float tearThresh = 0.85 + uSparsity * 0.1;\n\n float hY = floor(vUv.y * tearSize);\n if (step(tearThresh, hash(vec2(hY, tSlow))) > 0.0) {\n float shift = (hash(vec2(hY, tSlow + 50.0)) - 0.5) * 0.25 * uIntensity;\n col += uColor * step(0.4, hash(vec2(vUv.x + shift, hY + tSlow))) * dit * uIntensity * 0.5;\n }\n\n float vX = floor(vUv.x * tearSize);\n if (step(tearThresh, hash(vec2(vX, tSlow + 100.0))) > 0.0) {\n float shift = (hash(vec2(vX, tSlow + 150.0)) - 0.5) * 0.25 * uIntensity;\n col += uColor * step(0.4, hash(vec2(vX + tSlow, vUv.y + shift))) * dit * uIntensity * 0.5;\n }\n\n gl_FragColor = vec4(col * uAlpha, max(col.r, max(col.g, col.b)) * uAlpha);\n }\n`\n\nexport function Glitch({ className, style }: GlitchProps) {\n const gpuTier = useGpuTier()\n\n const c = useSmoothControls(\n 'Effects/Glitch',\n {\n alpha: { max: 2, min: 0, step: 0.01, value: 0.25 },\n blend: { options: BLEND_MODES, value: 'difference' },\n chroma: { max: 3, min: 0, step: 0.01, value: 1.17 },\n color: { value: '#ffe6cb' },\n enabled: { value: true },\n intensity: { max: 1, min: 0, step: 0.01, value: 0.59 },\n sparsity: { max: 1, min: 0, step: 0.01, value: 0.21 },\n speed: { max: 10, min: 0.1, step: 0.1, value: 1 }\n },\n { collapsed: true }\n )\n\n const ref = useRef<HTMLCanvasElement>(null)\n const cRef = useRef(c)\n cRef.current = c\n\n const enabled = c.enabled && gpuTier > 0\n\n useEffect(() => {\n if (!ref.current || !enabled) {\n return\n }\n\n let renderer: THREE.WebGLRenderer\n\n try {\n renderer = new THREE.WebGLRenderer({\n alpha: true,\n canvas: ref.current\n })\n } catch {\n // See note in noise.tsx — eager gpu-tier detection should keep us\n // out of here, but if the driver fails the renderer constructor\n // anyway, downgrade so other overlays stop trying too.\n $gpuTier.set(0)\n\n return\n }\n\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1)\n const geo = new THREE.PlaneGeometry(2, 2)\n const scene = new THREE.Scene()\n\n const mat = new THREE.ShaderMaterial({\n fragmentShader: frag,\n transparent: true,\n uniforms: {\n uAlpha: { value: c.alpha },\n uChroma: { value: c.chroma },\n uColor: { value: new THREE.Color(c.color) },\n uIntensity: { value: c.intensity },\n uSparsity: { value: c.sparsity },\n uSpeed: { value: c.speed },\n uTime: { value: 0 }\n },\n vertexShader: vert\n })\n\n scene.add(new THREE.Mesh(geo, mat))\n\n const resize = () => {\n renderer.setSize(innerWidth, innerHeight)\n // Cap DPR at 1.5 — at full retina (2x) the glitch shader is one\n // of the heaviest fillrate consumers in the app, and the visual\n // difference is tiny because it's a chromatic-noise effect.\n renderer.setPixelRatio(Math.min(devicePixelRatio, 1.5))\n }\n\n resize()\n window.addEventListener('resize', resize)\n\n let time = 0\n\n // gpu-tier 1 → ~10fps (legacy), gpu-tier 2 → ~30fps (was 60fps).\n // Glitch is a background ambient effect; users won't notice 30 vs\n // 60 but the GPU absolutely will.\n const minIntervalMs = gpuTier === 1 ? 100 : 33\n\n const dispose = runRenderLoop({\n el: ref.current,\n minIntervalMs,\n onFrame: deltaSeconds => {\n time += deltaSeconds\n\n const v = cRef.current\n\n mat.uniforms.uTime.value = time\n mat.uniforms.uAlpha.value = v.alpha\n mat.uniforms.uChroma.value = v.chroma\n mat.uniforms.uIntensity.value = v.intensity\n mat.uniforms.uSparsity.value = v.sparsity\n mat.uniforms.uSpeed.value = v.speed\n mat.uniforms.uColor.value.set(v.color)\n\n renderer.render(scene, camera)\n }\n })\n\n return () => {\n window.removeEventListener('resize', resize)\n dispose()\n\n mat.dispose()\n geo.dispose()\n renderer.dispose()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, gpuTier])\n\n if (!enabled) {\n return null\n }\n\n return (\n <canvas\n className={cn('h-full w-full', className)}\n ref={ref}\n style={{\n mixBlendMode: c.blend as React.CSSProperties['mixBlendMode'],\n ...style\n }}\n />\n )\n}\n\ninterface GlitchProps {\n className?: string\n style?: React.CSSProperties\n}"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"greys.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/overlays/greys.tsx"],"names":[],"mappings":"AAoKA,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,UAAU,kDAwNrD;AAED,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"greys.js","sourceRoot":"","sources":["../../../../src/ui/components/overlays/greys.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport * as THREE from 'three'\n\nimport { $gpuTier, useGpuTier } from '../../../hooks/use-gpu-tier'\nimport { runRenderLoop } from '../../../hooks/use-render-loop'\nimport { useSmoothControls } from '../../../hooks/use-smooth-controls'\nimport { cn } from '../../../utils'\n\nimport { BLEND_MODES } from './blend-modes'\n\nconst vert = /*glsl*/ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n`\n\nconst sourceFrag = /*glsl*/ `\n uniform sampler2D uTex0, uTex1, uTex2, uTex3;\n uniform float uTime, uZoom, uSpeed, uRotate, uFolds, uDrift;\n varying vec2 vUv;\n\n vec3 gray(vec3 c) { return vec3(dot(c, vec3(.299, .587, .114))); }\n vec2 rot(vec2 p, float a) { return vec2(p.x * cos(a) - p.y * sin(a), p.x * sin(a) + p.y * cos(a)); }\n\n vec2 kaleid(vec2 p, float n) {\n float a = mod(atan(p.y, p.x), 6.28318 / n) - 3.14159 / n;\n return length(p) * vec2(cos(a), sin(a));\n }\n\n vec4 tex(int i, vec2 uv) {\n if (i == 0) return texture2D(uTex0, uv);\n if (i == 1) return texture2D(uTex1, uv);\n if (i == 2) return texture2D(uTex2, uv);\n return texture2D(uTex3, uv);\n }\n\n void main() {\n vec2 uv = rot(vUv - .5, uTime * uRotate * .05);\n if (uFolds > 1.) uv = kaleid(uv, uFolds);\n\n float dt = uTime * uDrift * .1;\n uv = uv / uZoom + .5 + vec2(sin(dt * .7) * cos(dt * .3), cos(dt * .5) * sin(dt * .9)) * .15 * uDrift;\n\n float cycle = mod(uTime * uSpeed * .01, 4.);\n int i0 = int(floor(cycle)), i1 = int(mod(float(i0) + 1., 4.));\n float t = smoothstep(0., 1., fract(cycle));\n\n vec3 base = mix(gray(vec3(1.) - tex(i0, uv).rgb), gray(vec3(1.) - tex(i1, uv).rgb), t);\n vec2 uvF = vec2(1. - uv.x, uv.y);\n vec3 flip = mix(gray(vec3(1.) - tex(i0, uvF).rgb), gray(vec3(1.) - tex(i1, uvF).rgb), t);\n\n gl_FragColor = vec4(mix(base, flip, .3 + sin(uTime * .2) * .2), 1.);\n }\n`\n\nconst moshFrag = /*glsl*/ `\n uniform sampler2D uCurrent, uPrev, uTex0, uTex1, uTex2, uTex3;\n uniform float uTime, uIntensity, uMotion, uZoom, uSpeed;\n uniform vec2 uRes;\n varying vec2 vUv;\n\n float hash(vec2 p) { return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453); }\n vec2 hash2(vec2 p) { return fract(sin(vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)))) * 43758.5453); }\n\n float noise(vec2 p) {\n vec2 i = floor(p), f = fract(p) * fract(p) * (3. - 2. * fract(p));\n return mix(mix(hash(i), hash(i + vec2(1., 0.)), f.x), mix(hash(i + vec2(0., 1.)), hash(i + vec2(1., 1.)), f.x), f.y);\n }\n\n vec3 gray(vec3 c) { return vec3(dot(c, vec3(.299, .587, .114))); }\n\n vec2 distort(vec2 uv, float k, float t) {\n float n1 = noise(uv * 8. + t * .5), n2 = noise(uv * 12. + t * .7), flow = noise(uv * 4. + t * .3);\n return uv + vec2(cos(n1 * 6.28 + t * 1.2), sin(n2 * 6.28 + t * .9)) * .02 * k\n + vec2(cos(flow * 6.28 + uv.y * 10.), sin(flow * 6.28 + uv.x * 10.)) * .015 * k;\n }\n\n vec3 tex(int i, vec2 uv) {\n vec2 zuv = (uv - .5) / uZoom + .5;\n if (i == 0) return gray(vec3(1.) - texture2D(uTex0, zuv).rgb);\n if (i == 1) return gray(vec3(1.) - texture2D(uTex1, zuv).rgb);\n if (i == 2) return gray(vec3(1.) - texture2D(uTex2, zuv).rgb);\n return gray(vec3(1.) - texture2D(uTex3, zuv).rgb);\n }\n\n void main() {\n vec2 uv = vUv;\n float t = uTime * uSpeed, tS = floor(t * .1), pS = 80.;\n float amt = uIntensity * uMotion * .8 * (.7 + (sin(t * .5) * .5 + .5) * .3);\n\n vec2 mUV = distort(uv, uIntensity * .4, t);\n\n float hS = floor(uv.y * pS), hA = smoothstep(0., .8, hash(vec2(hS, tS)));\n float hO = (hash(vec2(hS, tS + 50.)) - .5) * .25 * hA * amt;\n float vS = floor(uv.x * pS), vA = smoothstep(0., .8, hash(vec2(vS, tS + 100.)));\n float vO = (hash(vec2(vS, tS + 150.)) - .5) * .25 * vA * amt;\n mUV += vec2(hO, vO);\n\n float bS = pS * .25;\n float hBA = step(.5, hash(vec2(floor(uv.y * bS), tS + 200.)));\n float hBO = (hash(vec2(floor(uv.y * bS), 200.)) - .5) * .35 * hBA * amt;\n float vBA = step(.5, hash(vec2(floor(uv.x * bS), tS + 300.)));\n float vBO = (hash(vec2(floor(uv.x * bS), 250.)) - .5) * .35 * vBA * amt;\n mUV += vec2(hBO, vBO);\n\n vec2 blk = floor(uv * pS * .15);\n mUV += (hash2(vec2(blk.x, blk.y + 500.)) - .5) * .4 * step(.7, hash(vec2(blk.x, blk.y + tS))) * amt;\n mUV = clamp(mUV, 0., 1.);\n\n vec3 prev = texture2D(uPrev, mUV).rgb;\n prev = mix(prev, texture2D(uPrev, clamp(uv + vec2(hBO, vBO), 0., 1.)).rgb, max(hBA, vBA) * .9);\n\n float tY = floor(uv.y * pS * .4);\n if (hash(vec2(tY, tS + 400.)) > .75) {\n prev = mix(prev, texture2D(uPrev, clamp(vec2(uv.x + (hash(vec2(tY, 400.)) - .5) * .5 * amt, uv.y), 0., 1.)).rgb, .85);\n }\n\n if (hA > 0. && amt > .01) {\n prev = mix(prev, gray(texture2D(uPrev, clamp(vec2(uv.x + (gray(prev).r - uv.x) * amt + hO, uv.y), 0., 1.)).rgb), hA);\n }\n\n float d = mix(mix(.97, .99, noise(uv * 8. + t * .2)), 0., step(.994, hash(vec2(tS, 0.))));\n gl_FragColor = vec4(mix(texture2D(uCurrent, uv).rgb, prev, d), 1.);\n }\n`\n\nconst outputFrag = /*glsl*/ `\n uniform sampler2D uInput;\n uniform float uTime, uAlpha, uHue;\n uniform vec3 uColor;\n varying vec2 vUv;\n\n float hash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }\n\n vec3 hueShift(vec3 c, float h) {\n float a = h * 6.28318, s = sin(a), co = cos(a);\n vec3 w = vec3(.299, .587, .114);\n return clamp(vec3(\n dot(c, w) + dot(c, vec3(.701, -.587, -.114) * co + vec3(.168, .330, -.497) * s),\n dot(c, w) + dot(c, vec3(-.299, .413, -.114) * co + vec3(.328, .035, -.363) * s),\n dot(c, w) + dot(c, vec3(-.299, -.587, .886) * co + vec3(-.497, .330, .168) * s)\n ), 0., 1.);\n }\n\n void main() {\n vec3 m = texture2D(uInput, vUv).rgb;\n m *= 1. - step(.5, fract(vUv.y * 200.)) * .06 * step(.97, hash(vec2(floor(vUv.y * 30.), floor(uTime * .5))));\n\n float lum = dot(m, vec3(.299, .587, .114));\n gl_FragColor = vec4(hueShift(mix(vec3(lum), uColor * lum * 2., length(uColor)), uHue) * uAlpha, smoothstep(.08, .18, lum * uAlpha));\n }\n`\n\nconst TEXTURES = [\n '/anatomy/grays-0.jpg',\n '/anatomy/grays-3.jpg',\n '/anatomy/grays-6.jpg',\n '/anatomy/grays-9.jpg'\n]\n\nexport function Greys({ className, style }: GreysProps) {\n const gpuTier = useGpuTier()\n const [blendOverride, setBlendOverride] = useState<string | null>(null)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n\n const c = useSmoothControls(\n 'Effects/Greys',\n {\n alpha: { max: 1, min: 0, step: 0.01, value: 0.19 },\n blend: { options: BLEND_MODES, value: 'color-burn' },\n color: { value: '#ffac02' },\n drift: { max: 2, min: 0, step: 0.1, value: 0.5 },\n enabled: { value: false },\n folds: { max: 12, min: 1, step: 1, value: 1 },\n hue: { max: 1, min: 0, step: 0.01, value: 0.37 },\n intensity: { max: 3, min: 0, step: 0.1, value: 0.1 },\n motion: { max: 2, min: 0, step: 0.1, value: 0.1 },\n rotate: { max: 2, min: -2, step: 0.1, value: 0.3 },\n speed: { max: 1, min: 0.01, step: 0.01, value: 0.21 },\n zoom: { max: 4, min: 0.5, step: 0.1, value: 0.7 }\n },\n { collapsed: true }\n )\n\n const cRef = useRef(c)\n cRef.current = c\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) =>\n e.key.toLowerCase() === 'x' &&\n setBlendOverride(p => (p === 'screen' ? null : 'screen'))\n\n window.addEventListener('keydown', onKey)\n\n return () => window.removeEventListener('keydown', onKey)\n }, [])\n\n const enabled = c.enabled && gpuTier === 2\n\n useEffect(() => {\n if (!canvasRef.current || !enabled) {\n return\n }\n\n let renderer: THREE.WebGLRenderer\n\n try {\n renderer = new THREE.WebGLRenderer({\n alpha: true,\n canvas: canvasRef.current\n })\n } catch {\n // See note in noise.tsx — eager gpu-tier detection should keep us\n // out of here, but if the driver fails the renderer constructor\n // anyway, downgrade so other overlays stop trying too.\n $gpuTier.set(0)\n\n return\n }\n\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1)\n const geo = new THREE.PlaneGeometry(2, 2)\n\n const [rtSource, rtA, rtB] = [0, 1, 2].map(\n () =>\n new THREE.WebGLRenderTarget(innerWidth, innerHeight, {\n magFilter: THREE.NearestFilter,\n minFilter: THREE.NearestFilter\n })\n )\n\n const textures = TEXTURES.map(p => {\n const t = new THREE.TextureLoader().load(p)\n t.wrapS = t.wrapT = THREE.ClampToEdgeWrapping\n t.minFilter = t.magFilter = THREE.LinearFilter\n\n return t\n })\n\n const texU = Object.fromEntries(\n textures.map((t, i) => [`uTex${i}`, { value: t }])\n )\n\n const srcU = {\n ...texU,\n uDrift: { value: 0 },\n uFolds: { value: 0 },\n uRotate: { value: 0 },\n uSpeed: { value: 0 },\n uTime: { value: 0 },\n uZoom: { value: 0 }\n }\n\n const moshU = {\n ...texU,\n uCurrent: { value: rtSource.texture },\n uIntensity: { value: 0 },\n uMotion: { value: 0 },\n uPrev: { value: rtA.texture },\n uRes: { value: new THREE.Vector2(innerWidth, innerHeight) },\n uSpeed: { value: 0 },\n uTime: { value: 0 },\n uZoom: { value: 0 }\n }\n\n const outU = {\n uAlpha: { value: 0 },\n uColor: { value: new THREE.Color() },\n uHue: { value: 0 },\n uInput: { value: rtB.texture },\n uTime: { value: 0 }\n }\n\n const mkScene = (frag: string, uniforms: object, transparent = false) => {\n const s = new THREE.Scene()\n s.add(\n new THREE.Mesh(\n geo.clone(),\n new THREE.ShaderMaterial({\n fragmentShader: frag,\n transparent,\n uniforms: uniforms as Record<string, THREE.IUniform<any>>,\n vertexShader: vert\n })\n )\n )\n\n return s\n }\n\n const srcScene = mkScene(sourceFrag, srcU)\n const moshScene = mkScene(moshFrag, moshU)\n const outScene = mkScene(outputFrag, outU, true)\n\n const resize = () => {\n renderer.setSize(innerWidth, innerHeight)\n // Cap at 1.5x — Greys does triple-buffered ping-pong rendering at\n // every frame, so retina x2 is brutal on fillrate.\n renderer.setPixelRatio(Math.min(devicePixelRatio, 1.5))\n ;[rtSource, rtA, rtB].forEach(rt => rt.setSize(innerWidth, innerHeight))\n moshU.uRes.value.set(innerWidth, innerHeight)\n }\n\n resize()\n window.addEventListener('resize', resize)\n\n let ping = true,\n time = 0\n\n // 30fps cap — feedback effect, no perceptual loss vs 60fps but\n // halves the cost of the heaviest overlay we ship.\n const dispose = runRenderLoop({\n el: canvasRef.current,\n minIntervalMs: 33,\n onFrame: deltaSeconds => {\n time += deltaSeconds\n\n const v = cRef.current\n\n srcU.uTime.value = time\n srcU.uSpeed.value = v.speed\n srcU.uZoom.value = v.zoom\n srcU.uRotate.value = v.rotate\n srcU.uFolds.value = v.folds\n srcU.uDrift.value = v.drift\n\n moshU.uTime.value = time\n moshU.uIntensity.value = v.intensity\n moshU.uMotion.value = v.motion\n moshU.uSpeed.value = v.speed\n moshU.uZoom.value = v.zoom\n\n outU.uTime.value = time\n outU.uAlpha.value = v.alpha\n outU.uHue.value = v.hue\n outU.uColor.value.set(typeof v.color === 'string' ? v.color : '#fff')\n\n renderer.setRenderTarget(rtSource)\n renderer.render(srcScene, camera)\n\n const [read, write] = ping ? [rtA, rtB] : [rtB, rtA]\n moshU.uPrev.value = read.texture\n renderer.setRenderTarget(write)\n renderer.render(moshScene, camera)\n\n outU.uInput.value = write.texture\n renderer.setRenderTarget(null)\n renderer.render(outScene, camera)\n\n ping = !ping\n }\n })\n\n return () => {\n window.removeEventListener('resize', resize)\n dispose()\n textures.forEach(t => t.dispose())\n ;[geo, rtSource, rtA, rtB, renderer].forEach(x => x.dispose())\n }\n }, [enabled])\n\n if (!enabled) {\n return null\n }\n\n return (\n <canvas\n className={cn('h-full w-full', className)}\n ref={canvasRef}\n style={{\n mixBlendMode: (blendOverride ??\n c.blend) as React.CSSProperties['mixBlendMode'],\n ...style\n }}\n />\n )\n}\n\ninterface GreysProps {\n className?: string\n style?: React.CSSProperties\n}"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/overlays/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EACL,UAAU,EACV,SAAS,EACT,KAAK,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,UAAU,EACX,MAAM,QAAQ,CAAA;AACf,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAIxC,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,aAAa,2CAWxD;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/components/overlays/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EACL,UAAU,EACV,SAAS,EACT,KAAK,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,UAAU,EACX,MAAM,QAAQ,CAAA;AAGf,MAAM,KAAK,GAAG,mCAAmC,CAAA;AAEjD,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAiB;IACvD,OAAO,CACL,8BACE,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAI,EAEtC,KAAC,KAAK,IAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAI,EACnD,KAAC,QAAQ,IAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAI,EACrD,KAAC,KAAK,IAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAI,EACnD,KAAC,MAAM,IAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAI,IACnD,CACJ,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { Glitch } from './glitch'\nimport { Greys } from './greys'\nimport { Lens } from './lens-layers'\nimport { Noise } from './noise'\nimport { Vignette } from './vignette'\n\nimport type { LensPreset } from './lens'\n\nexport { BLEND_MODES } from './blend-modes'\nexport { Glitch } from './glitch'\nexport { Greys } from './greys'\nexport { Lens } from './lens-layers'\nexport { Noise } from './noise'\nexport { Vignette } from './vignette'\nexport {\n $lightMode,\n applyLens,\n lens0,\n lens5i,\n LENS_0,\n LENS_5I,\n LENSES,\n toggleLens\n} from './lens'\nexport type { LensPreset } from './lens'\n\nconst LAYER = 'pointer-events-none fixed inset-0'\n\nexport function Overlays({ dark, initial }: OverlaysProps) {\n return (\n <>\n <Lens dark={dark} initial={initial} />\n\n <Noise className={LAYER} style={{ zIndex: 101 }} />\n <Vignette className={LAYER} style={{ zIndex: 99 }} />\n <Greys className={LAYER} style={{ zIndex: 200 }} />\n <Glitch className={LAYER} style={{ zIndex: 201 }} />\n </>\n )\n}\n\ninterface OverlaysProps {\n dark?: boolean\n initial?: LensPreset\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lens-layers.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/overlays/lens-layers.tsx"],"names":[],"mappings":"AAUA,OAAO,EAA+B,KAAK,UAAU,EAAc,MAAM,QAAQ,CAAA;AAIjF,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,2CA4FhD;AAED,UAAU,SAAS;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lens-layers.js","sourceRoot":"","sources":["../../../../src/ui/components/overlays/lens-layers.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { useEffect } from 'react'\n\nimport { useSmoothControls } from '../../../hooks/use-smooth-controls'\nimport { colorMix } from '../../../utils/color'\n\nimport fillerBg from '../../../assets/filler-bg0.jpg'\n\nimport { BLEND_MODES } from './blend-modes'\nimport { $lightMode, LENS_0, LENS_5I, type LensPreset, toggleLens } from './lens'\n\nconst LAYER = 'pointer-events-none fixed inset-0'\n\nexport function Lens({ dark, initial }: LensProps) {\n // `initial` lets the host (e.g. Storybook) seed the Leva/atom state with\n // the *exact* lens preset the user selected, avoiding a one-cycle lag\n // where useSmoothControls emits old colors for the first paint (and, on\n // Storybook's fast iframe reload, sometimes never catches up because\n // useControls' ready-gate swallows the instant color writes).\n const base = initial?.Lens ?? (dark ? LENS_0.Lens : LENS_5I.Lens)\n\n const lens = useSmoothControls(\n 'Lens',\n {\n bgBlend: { options: BLEND_MODES, value: base.bgBlend as 'multiply' },\n bgColor: { value: base.bgColor },\n bgOpacity: { max: 1, min: 0, step: 0.01, value: base.bgOpacity },\n fgBlend: { options: BLEND_MODES, value: 'difference' as const },\n fgColor: { value: base.fgColor },\n fgOpacity: { max: 1, min: 0, step: 0.01, value: base.fgOpacity },\n fillerBlend: { options: BLEND_MODES, value: 'difference' as const },\n fillerOpacity: { max: 1, min: 0, step: 0.01, value: base.fillerOpacity },\n mgColor: { value: base.mgColor },\n mgOpacity: { max: 1, min: 0, step: 0.01, value: base.mgOpacity }\n },\n { collapsed: false }\n )\n\n useEffect(() => {\n $lightMode.set(!dark)\n }, [dark])\n\n useEffect(() => {\n const s = document.documentElement.style\n\n for (const [name, color, alpha] of [\n ['foreground', lens.fgColor, lens.fgOpacity],\n ['midground', lens.mgColor, lens.mgOpacity],\n ['background', lens.bgColor, lens.bgOpacity]\n ] as [string, string, number][]) {\n s.setProperty(`--${name}`, colorMix(color, alpha))\n s.setProperty(`--${name}-base`, color)\n s.setProperty(`--${name}-alpha`, `${alpha}`)\n }\n }, [lens])\n\n useEffect(() => {\n const handle = (e: KeyboardEvent) => e.key === 'x' && toggleLens()\n window.addEventListener('keydown', handle)\n return () => window.removeEventListener('keydown', handle)\n }, [])\n\n // NOTE: z-index is inlined because Tailwind's JIT sometimes doesn't emit\n // these non-default utilities (e.g. in Storybook's isolated content\n // scan), which silently collapses the overlay stack to DOM order and\n // breaks the mix-blend-mode inversion — producing a muddy warm wash\n // instead of the intended clean black/white inversion.\n return (\n <>\n <div\n className={LAYER}\n style={{\n backgroundColor: colorMix(lens.fgColor, lens.fgOpacity),\n mixBlendMode: lens.fgBlend,\n zIndex: 100\n }}\n />\n\n <div\n className={LAYER}\n style={{\n mixBlendMode: lens.fillerBlend,\n opacity: lens.fillerOpacity,\n zIndex: 2\n }}\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n alt=\"\"\n className=\"h-[150dvh] w-auto min-w-dvw object-cover object-top-left invert\"\n fetchPriority=\"low\"\n src={fillerBg.src}\n />\n </div>\n\n <div\n className={LAYER}\n style={{\n backgroundColor: colorMix(lens.bgColor, lens.bgOpacity),\n mixBlendMode: lens.bgBlend,\n zIndex: 1\n }}\n />\n </>\n )\n}\n\ninterface LensProps {\n dark?: boolean\n /**\n * Exact preset to seed the internal Leva controls with. When omitted the\n * component falls back to `LENS_0` / `LENS_5I` based on `dark`. Pass the\n * actual preset from a host (e.g. Storybook toolbar) to guarantee the\n * first-paint colors match the selected lens without needing a followup\n * `applyLens` that can be lost in useSmoothControls' startup window.\n */\n initial?: LensPreset\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lens.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/overlays/lens.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;CAYlB,CAAA;AAED,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;CAYnB,CAAA;AAED,eAAO,MAAM,KAAK,GAChB,IAAI,OAAO,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,EAC/B,IAAI,OAAO,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,KAC/B,UAGD,CAAA;AAQF,eAAO,MAAM,MAAM,GACjB,IAAI,OAAO,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,EAChC,IAAI,OAAO,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,KAChC,UAGD,CAAA;AAKF,eAAO,MAAM,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EASxC,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,QAAQ,UAAU,EAAE,iBAAe,SAK1D,CAAA;AAEH,eAAO,MAAM,UAAU,mEAAa,CAAA;AAEpC,eAAO,MAAM,UAAU,YAMtB,CAAA;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,CAAA;IAC1B,IAAI,EAAE,OAAO,MAAM,CAAC,IAAI,CAAA;CACzB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lens.js","sourceRoot":"","sources":["../../../../src/ui/components/overlays/lens.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAEpE,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE;IAC1E,IAAI,EAAE;QACJ,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE,KAAK;QACpB,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,CAAC;KACb;CACF,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE;IAC1E,IAAI,EAAE;QACJ,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE,IAAI;QACnB,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,CAAC;KACb;CACF,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,CAA+B,EAC/B,CAAgC,EACpB,EAAE,CAAC,CAAC;IAChB,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;IAChC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;CAC/B,CAAC,CAAA;AAEF,sEAAsE;AACtE,yEAAyE;AACzE,sEAAsE;AACtE,sEAAsE;AACtE,uEAAuE;AACvE,mEAAmE;AACnE,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAgC,EAChC,CAAiC,EACrB,EAAE,CAAC,CAAC;IAChB,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;IACjC,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;CAChC,CAAC,CAAA;AAEF,wEAAwE;AACxE,sEAAsE;AACtE,yEAAyE;AACzE,MAAM,CAAC,MAAM,MAAM,GAA2B;IAC5C,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACpC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC,IAAI,EAAE,OAAO,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;CAC1D,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE,CAC/D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CACxC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CACrC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CACxC,CACF,CAAA;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAA;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;IAEvC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;IACxB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,CAAC,CAAA","sourcesContent":["'use client'\n\nimport { atom } from 'nanostores'\n\nimport { setControlValue } from '../../../hooks/use-smooth-controls'\n\nexport const LENS_0 = {\n Globe: { innerColor: '#170d02', innerOpacity: 0.1, outerColor: '#FFAC02' },\n Lens: {\n bgBlend: 'difference',\n bgColor: '#041C1C',\n bgOpacity: 1,\n fgColor: '#FFFFFF',\n fgOpacity: 0,\n fillerOpacity: 0.033,\n mgColor: '#ffe6cb',\n mgOpacity: 1\n }\n}\n\nexport const LENS_5I = {\n Globe: { innerColor: '#170d02', innerOpacity: 0.3, outerColor: '#FFAC02' },\n Lens: {\n bgBlend: 'multiply',\n bgColor: '#170d02',\n bgOpacity: 1,\n fgColor: '#FFFFFF',\n fgOpacity: 1,\n fillerOpacity: 0.06,\n mgColor: '#FFAC02',\n mgOpacity: 1\n }\n}\n\nexport const lens0 = (\n l?: Partial<typeof LENS_0.Lens>,\n g?: Partial<typeof LENS_0.Globe>\n): LensPreset => ({\n Globe: { ...LENS_0.Globe, ...g },\n Lens: { ...LENS_0.Lens, ...l }\n})\n\n// The Hermes light-mode look is produced by a fullscreen opaque-white\n// `mix-blend-mode: difference` foreground layer that inverts everything.\n// Colored lenses that want a \"white + accent\" look MUST be built from\n// LENS_5I, not LENS_0 — otherwise `bgBlend: 'difference'` + an opaque\n// colored bg + active fg inversion land halfway between dark and light\n// mode and produce a muddy warm wash instead of a clean inversion.\nexport const lens5i = (\n l?: Partial<typeof LENS_5I.Lens>,\n g?: Partial<typeof LENS_5I.Globe>\n): LensPreset => ({\n Globe: { ...LENS_5I.Globe, ...g },\n Lens: { ...LENS_5I.Lens, ...l }\n})\n\n// Accent colors are the *pre-inversion* source; after the difference FG\n// layer they read as their visual complement. e.g. `#FFAC02` (orange)\n// renders as blue #0053FD on screen — that's the default LENS_5I accent.\nexport const LENSES: [string, LensPreset][] = [\n ['0', LENS_0],\n ['1', lens0({ bgColor: '#0A1F1F' })],\n ['2', lens0({ bgColor: '#0E0313', mgColor: '#e6cbff' })],\n ['3', lens5i({ mgColor: '#FFAC02' })],\n ['4', lens5i({ bgColor: '#0E0313', mgColor: '#FF5500' })],\n ['5', lens0({ bgColor: '#1540B1', bgOpacity: 0.7 })],\n ['5i', LENS_5I],\n ['6', lens5i({ bgColor: '#170D02', mgColor: '#00E5FF' })]\n]\n\nexport const applyLens = (preset: LensPreset, animate = false) =>\n Object.entries(preset).forEach(([g, v]) =>\n Object.entries(v).forEach(([k, val]) =>\n setControlValue(g, k, val, { animate })\n )\n )\n\nexport const $lightMode = atom(true)\n\nexport const toggleLens = () => {\n const isLight = $lightMode.get()\n const next = isLight ? LENS_0 : LENS_5I\n\n $lightMode.set(!isLight)\n applyLens(next, true)\n}\n\nexport interface LensPreset {\n Globe: typeof LENS_0.Globe\n Lens: typeof LENS_0.Lens\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/overlays/noise.tsx"],"names":[],"mappings":"AAqCA,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,UAAU,kDAmIrD;AAED,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"noise.js","sourceRoot":"","sources":["../../../../src/ui/components/overlays/noise.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { useEffect, useRef } from 'react'\nimport * as THREE from 'three'\n\nimport { $gpuTier, useGpuTier } from '../../../hooks/use-gpu-tier'\nimport { useSmoothControls } from '../../../hooks/use-smooth-controls'\nimport { cn, hexToVec3 } from '../../../utils'\n\nimport { BLEND_MODES } from './blend-modes'\n\nconst vert = /*glsl*/ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n`\n\nconst frag = /*glsl*/ `\n uniform vec2 uRes;\n uniform float uDpr, uSize, uDensity, uOpacity;\n uniform vec3 uColor;\n varying vec2 vUv;\n\n float hash(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n void main() {\n float n = hash(floor(vUv * uRes / (uSize * uDpr)));\n gl_FragColor = vec4(uColor, step(1.0 - uDensity, n)) * uOpacity;\n }\n`\n\nexport function Noise({ className, style }: NoiseProps) {\n const gpuTier = useGpuTier()\n\n const c = useSmoothControls(\n 'Effects/Noise',\n {\n blend: { options: BLEND_MODES, value: 'color-dodge' as const },\n color: { value: '#eaeaea' },\n density: { max: 1, min: 0, step: 0.01, value: 0.11 },\n enabled: { value: true },\n opacity: { max: 1, min: 0, step: 0.01, value: 0.55 },\n size: { max: 10, min: 0.1, step: 0.1, value: 1 }\n },\n { collapsed: true }\n )\n\n const canvasRef = useRef<HTMLCanvasElement>(null)\n\n const enabled = c.enabled && gpuTier > 0\n\n // The noise shader is fully deterministic: given the same uniforms it\n // produces an identical output every frame. The previous version ran\n // it at 60fps forever, which on a retina display with mix-blend-mode\n // is enough to peg the GPU/compositor for the entire lifetime of the\n // page (this is the dominant contributor to the \"fans go crazy after\n // a few hours of idle\" symptom).\n //\n // Instead we render exactly once on mount, and re-render only when\n // the user-controllable uniforms change or the viewport resizes.\n useEffect(() => {\n if (!canvasRef.current || !enabled) {\n return\n }\n\n let renderer: THREE.WebGLRenderer\n\n try {\n renderer = new THREE.WebGLRenderer({\n alpha: true,\n canvas: canvasRef.current,\n premultipliedAlpha: false\n })\n } catch {\n $gpuTier.set(0)\n\n return\n }\n\n renderer.setClearColor(0x000000, 0)\n\n const scene = new THREE.Scene()\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1)\n const geo = new THREE.PlaneGeometry(2, 2)\n\n const mat = new THREE.ShaderMaterial({\n fragmentShader: frag,\n transparent: true,\n uniforms: {\n uColor: { value: hexToVec3(c.color) },\n uDensity: { value: c.density },\n uDpr: { value: 1 },\n uOpacity: { value: c.opacity },\n uRes: { value: new THREE.Vector2() },\n uSize: { value: c.size }\n },\n vertexShader: vert\n })\n\n scene.add(new THREE.Mesh(geo, mat))\n\n // Cap pixel ratio at 1.5 — noise is intentionally pixelated, so the\n // extra retina samples are wasted fillrate.\n const dpr = Math.min(devicePixelRatio, 1.5)\n\n const render = () => {\n mat.uniforms.uColor.value = hexToVec3(c.color)\n mat.uniforms.uDensity.value = c.density\n mat.uniforms.uOpacity.value = c.opacity\n mat.uniforms.uSize.value = c.size\n mat.uniforms.uDpr.value = dpr\n renderer.render(scene, camera)\n }\n\n const resize = () => {\n renderer.setSize(innerWidth, innerHeight)\n renderer.setPixelRatio(dpr)\n mat.uniforms.uRes.value.set(innerWidth * dpr, innerHeight * dpr)\n render()\n }\n\n resize()\n window.addEventListener('resize', resize)\n\n // Re-render when the tab becomes visible again, in case the GL\n // context was discarded by the browser while the page was\n // backgrounded — otherwise we can come back to a transparent canvas.\n const onVisibility = () => {\n if (!document.hidden) render()\n }\n\n document.addEventListener('visibilitychange', onVisibility)\n\n return () => {\n window.removeEventListener('resize', resize)\n document.removeEventListener('visibilitychange', onVisibility)\n\n mat.dispose()\n geo.dispose()\n renderer.dispose()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n enabled,\n gpuTier,\n c.color,\n c.density,\n c.opacity,\n c.size\n ])\n\n if (!enabled) {\n return null\n }\n\n return (\n <canvas\n className={cn('h-full w-full', className)}\n ref={canvasRef}\n style={{ mixBlendMode: c.blend, ...style }}\n />\n )\n}\n\ninterface NoiseProps {\n className?: string\n style?: React.CSSProperties\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vignette.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/overlays/vignette.tsx"],"names":[],"mappings":"AAQA,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,aAAa,kDA8C3D;AAED,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vignette.js","sourceRoot":"","sources":["../../../../src/ui/components/overlays/vignette.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAiB;IAC1D,MAAM,CAAC,GAAG,iBAAiB,CACzB,kBAAkB,EAClB;QACE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAkB,EAAE;QAC1D,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;QACpD,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;QACrD,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;QAC3B,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;QACxB,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QACpD,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;QAC9C,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QACpD,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;KACnD,EACD,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAA;IAED,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAE3B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,CAAA;IAErB,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE,CAC/C,CAAC,GAAG,CAAC;QACL,8BAA8B,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAA;IAEzF,MAAM,EAAE,GAAG;QACT,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;QACrB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;QACxB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC;KAC9B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAEjB,IAAI,CAAC,EAAE,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAE3B,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,EACzC,KAAK,EAAE;YACL,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,YAAY,EAAE,CAAC,CAAC,KAAK;YACrB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,GAAG,KAAK;SACT,GACD,CACH,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { useSmoothControls } from '../../../hooks/use-smooth-controls'\nimport { cn } from '../../../utils'\nimport { hexToRgb } from '../../../utils/color'\n\nimport { BLEND_MODES } from './blend-modes'\n\nexport function Vignette({ className, style }: VignetteProps) {\n const c = useSmoothControls(\n 'Effects/Vignette',\n {\n blend: { options: BLEND_MODES, value: 'lighten' as const },\n bottomLeft: { max: 1, min: 0, step: 0.01, value: 0 },\n bottomRight: { max: 1, min: 0, step: 0.01, value: 0 },\n color: { value: '#ffbd38' },\n enabled: { value: true },\n opacity: { max: 1, min: 0, step: 0.01, value: 0.22 },\n size: { max: 1, min: 0, step: 0.01, value: 1 },\n topLeft: { max: 1, min: 0, step: 0.01, value: 0.35 },\n topRight: { max: 1, min: 0, step: 0.01, value: 0 }\n },\n { collapsed: true }\n )\n\n if (!c.enabled) return null\n\n const rgb = hexToRgb(c.color)\n const s = c.size * 60\n\n const grad = (x: number, y: number, i: number) =>\n i > 0 &&\n `radial-gradient(ellipse at ${x}% ${y}%, rgba(${rgb},0) ${s}%, rgba(${rgb},${i}) 100%)`\n\n const bg = [\n grad(0, 0, c.topLeft),\n grad(100, 0, c.topRight),\n grad(0, 100, c.bottomLeft),\n grad(100, 100, c.bottomRight)\n ].filter(Boolean)\n\n if (!bg.length) return null\n\n return (\n <div\n className={cn('h-full w-full', className)}\n style={{\n background: bg.join(', '),\n mixBlendMode: c.blend,\n opacity: c.opacity,\n ...style\n }}\n />\n )\n}\n\ninterface VignetteProps {\n className?: string\n style?: React.CSSProperties\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"poster.d.ts","sourceRoot":"","sources":["../../../src/ui/components/poster.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAoEzD;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,EACrB,MAAiB,EACjB,QAAkB,EAClB,IAAI,EACJ,MAAa,EACb,OAAO,EACP,QAAQ,EACR,SAAS,EACT,WAAkB,EAClB,OAAO,EACP,QAAkD,EAClD,MAAM,EACN,KAAS,EACT,IAAmB,EACnB,SAAS,EACT,GAAiB,EACjB,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,OAAgB,EAChB,GAAG,IAAI,EACR,EAAE,WAAW,2CAyKb;AA6ED,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,UAAU,GACV,QAAQ,GACR,OAAO,GACP,MAAM,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,CAAA;AAE/C,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,uFAAuF;IACvF,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,mGAAmG;IACnG,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAC5B,uFAAuF;IACvF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0EAA0E;IAC1E,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,qGAAqG;IACrG,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IACnD,oHAAoH;IACpH,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"poster.js","sourceRoot":"","sources":["../../../src/ui/components/poster.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { useEffect, useState } from 'react'\n\nimport fillerBg from '../../assets/filler-bg0.jpg'\nimport { cn } from '../../utils'\n\nimport { Blink } from './blink'\nimport { ImageDistortion } from './image-distortion'\nimport { Typography } from './typography'\nimport { Small } from './typography/small'\n\nimport type { AutoPlayPattern } from './image-distortion'\n\nconst ASPECT_CONFIG: Record<\n PosterAspect,\n { defaultLayout: 'split' | 'stacked'; height: number; width: number }\n> = {\n landscape: { defaultLayout: 'split', height: 1080, width: 1920 },\n portrait: { defaultLayout: 'split', height: 1350, width: 1080 },\n square: { defaultLayout: 'split', height: 1080, width: 1080 },\n story: { defaultLayout: 'stacked', height: 1920, width: 1080 },\n wide: { defaultLayout: 'split', height: 900, width: 1600 }\n}\n\nconst DEFAULT_SRC =\n (fillerBg as { src?: string }).src ?? (fillerBg as unknown as string)\n\nfunction useUtcClock() {\n const [now, setNow] = useState<Date | null>(null)\n\n useEffect(() => {\n setNow(new Date())\n const id = setInterval(() => setNow(new Date()), 1000)\n\n return () => clearInterval(id)\n }, [])\n\n return now ? now.toISOString().slice(11, 19) : '--:--:--'\n}\n\nfunction CornerMark({ className }: { className?: string }) {\n return (\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none absolute block size-4 opacity-50',\n className\n )}\n >\n <span className=\"absolute top-1/2 left-0 h-px w-full -translate-y-1/2 bg-current\" />\n\n <span className=\"absolute top-0 left-1/2 h-full w-px -translate-x-1/2 bg-current\" />\n </span>\n )\n}\n\nfunction ChannelDot() {\n return (\n <span className=\"flex items-center gap-1.5\">\n <span className=\"bg-midground size-1.5 animate-pulse rounded-full\" />\n\n <Small className=\"opacity-70\">REC</Small>\n </span>\n )\n}\n\nfunction ScanlineOverlay() {\n return (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0 opacity-20 mix-blend-overlay\"\n style={{\n backgroundImage:\n 'repeating-linear-gradient(0deg, transparent 0, transparent 2px, rgba(255,255,255,0.08) 2px, rgba(255,255,255,0.08) 3px)'\n }}\n />\n )\n}\n\n/**\n * Social-ready glitchy card built around the haptic-distortion image\n * component. The poster runs the sword-guy distortion on an auto-animated\n * slash pattern so it can be screen-recorded as a GIF without a human\n * moving a cursor.\n *\n * Two variants, matching actual use cases:\n * - `'vibe'` (default): full-bleed distorted image with just registration\n * marks and a tiny \"Hermes Agent\" mark in the corner — mirrors the\n * overlay on the Hermes agent website.\n * - `'dispatch'`: broadcast-card layout with sidebar copy, numbered tags,\n * and chrome — for when the poster needs to carry information.\n */\nexport function Poster({\n aspect = 'square',\n autoPlay = 'slash',\n body,\n border = true,\n channel,\n children,\n className,\n cornerMarks = true,\n eyebrow,\n headline = ['An Agent', 'That Grows', 'With You.'],\n layout,\n scale = 1,\n seal = 'MIT · 2026',\n signature,\n src = DEFAULT_SRC,\n tags,\n tint,\n tintStrength,\n variant = 'vibe',\n ...rest\n}: PosterProps) {\n const config = ASPECT_CONFIG[aspect]\n const resolvedLayout = layout ?? config.defaultLayout\n\n // Use aspect-ratio + max-width/height so the poster fluidly fits any parent\n // (storybook iframe, a tweet preview, an embed) without getting clipped,\n // but caps at the intended export width for screen-recording. `maxHeight`\n // uses an absolute `dvh`-based value rather than `%` because `%` inside a\n // flex container can cause the browser to clamp height without re-running\n // aspect-ratio on width, producing a subtly wrong shape. An absolute cap\n // leaves aspect-ratio fully in charge: once the height binds, width is\n // re-derived correctly. `calc(100dvh - 8rem)` = viewport minus a typical\n // host's vertical padding (e.g. Storybook's `p-8` = 4rem on each side),\n // so the poster + padding fit within the viewport without ever producing\n // scrollbars. Container queries tie all internal typography to the\n // actual rendered width so headline/metadata scales along with the canvas.\n const outerProps = {\n // `text-midground` (not `text-foreground`) is the readable on-canvas\n // color across every lens. `--foreground` is really the lens's inversion\n // layer color: on dark lenses it has `fgOpacity: 0` and resolves to\n // fully-transparent via `color-mix`, which would make text invisible.\n // `--midground` always has opacity 1 and picks up each lens's accent.\n className: cn(\n 'text-midground relative overflow-hidden font-sans',\n border && 'border border-current/25',\n className\n ),\n style: {\n aspectRatio: `${config.width} / ${config.height}`,\n background: 'var(--background)',\n containerType: 'inline-size' as const,\n fontSize: `${(16 / config.width) * 100}cqi`,\n maxHeight: 'calc(100dvh - 8rem)',\n maxWidth: '100%',\n width: `${config.width * scale}px`\n },\n ...rest\n }\n\n if (variant === 'vibe') {\n return (\n <div {...outerProps}>\n <VibeContent\n autoPlay={autoPlay}\n channel={channel}\n cornerMarks={cornerMarks}\n signature={signature}\n src={src}\n tint={tint}\n tintStrength={tintStrength}\n />\n </div>\n )\n }\n\n const headlineLines = Array.isArray(headline) ? headline : [headline]\n\n return (\n <div {...outerProps} className={cn('flex flex-col', outerProps.className)}>\n <DispatchHeader channel={channel} />\n\n <div\n className={cn(\n 'relative min-h-0 min-w-0 flex-1',\n resolvedLayout === 'split'\n ? 'grid grid-cols-[3fr_2fr]'\n : 'grid grid-rows-[3fr_2fr]'\n )}\n >\n <div\n className={cn(\n 'relative overflow-hidden border-current/20',\n resolvedLayout === 'split' ? 'border-r' : 'border-b'\n )}\n style={{ backgroundColor: 'var(--background)' }}\n >\n <ImageDistortion\n autoPlay={autoPlay}\n src={src}\n tint={tint}\n tintStrength={tintStrength}\n />\n\n {cornerMarks && (\n <>\n <CornerMark className=\"top-3 left-3\" />\n <CornerMark className=\"top-3 right-3\" />\n <CornerMark className=\"bottom-3 left-3\" />\n <CornerMark className=\"right-3 bottom-3\" />\n </>\n )}\n\n <ScanlineOverlay />\n\n <Small className=\"absolute bottom-4 left-4 z-1 opacity-80\">\n Hermes Agent\n </Small>\n </div>\n\n <aside className=\"relative flex min-w-0 flex-col justify-between gap-8 p-8\">\n <div className=\"flex flex-col gap-5\">\n {eyebrow && (\n <div className=\"flex items-center gap-2\">\n <span className=\"bg-midground/80 h-px flex-1\" />\n\n <Small className=\"opacity-80\">{eyebrow}</Small>\n </div>\n )}\n\n {children ?? (\n <>\n <Typography\n as=\"h1\"\n className=\"text-[2.75em] leading-[0.95] font-bold tracking-[-0.01em]\"\n expanded\n >\n {headlineLines.map((line, i) => (\n <span className=\"block\" key={`${line}-${i}`}>\n {line}\n </span>\n ))}\n </Typography>\n\n {body && (\n <p className=\"text-[1.0625em] leading-[1.5] tracking-normal normal-case opacity-60\">\n {body}\n </p>\n )}\n </>\n )}\n </div>\n\n {tags && tags.length > 0 && (\n <ul className=\"flex flex-col gap-2 border-t border-current/15 pt-4\">\n {tags.map((tag, i) => (\n <li\n className=\"flex items-baseline justify-between gap-3\"\n key={`${tag}-${i}`}\n >\n <Small className=\"font-courier opacity-40\">\n {String(i + 1).padStart(3, '0')}\n </Small>\n\n <Small className=\"opacity-80\">{tag}</Small>\n\n <span className=\"mx-1 h-px flex-1 translate-y-[-3px] border-b border-dotted border-current/25\" />\n\n <Small className=\"font-courier opacity-40\">\n {String(i + 1).padStart(2, '0')}/\n {String(tags.length).padStart(2, '0')}\n </Small>\n </li>\n ))}\n </ul>\n )}\n </aside>\n </div>\n\n <footer className=\"flex items-center justify-between gap-4 border-t border-current/20 px-6 py-3\">\n <Small className=\"opacity-70\">\n {signature}\n\n <Blink />\n </Small>\n\n <Small className=\"font-courier opacity-40\">{seal}</Small>\n </footer>\n </div>\n )\n}\n\nfunction DispatchHeader({ channel }: { channel: React.ReactNode }) {\n const clock = useUtcClock()\n\n return (\n <header className=\"flex items-center justify-between gap-4 border-b border-current/20 px-6 py-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"bg-midground size-2 rounded-sm opacity-70\" />\n\n <Small className=\"opacity-70\">{channel}</Small>\n </div>\n\n <div className=\"flex items-center gap-4\">\n <ChannelDot />\n\n <Small className=\"font-courier opacity-50\">{clock} UTC</Small>\n </div>\n </header>\n )\n}\n\ninterface VibeContentProps {\n autoPlay: AutoPlayPattern\n channel: React.ReactNode\n cornerMarks: boolean\n signature: React.ReactNode\n src: string\n tint?: string\n tintStrength?: { active: number; inactive: number }\n}\n\nfunction VibeContent({\n autoPlay,\n channel,\n cornerMarks,\n signature,\n src,\n tint,\n tintStrength\n}: VibeContentProps) {\n // Absolute-inset-0 guarantees this fills the poster even when the outer\n // container uses aspect-ratio-derived height in a browser that doesn't\n // propagate that as a definite height for percentage-based children.\n return (\n <div className=\"absolute inset-0\">\n <ImageDistortion\n autoPlay={autoPlay}\n src={src}\n tint={tint}\n tintStrength={tintStrength}\n />\n\n {cornerMarks && (\n <>\n <CornerMark className=\"top-5 left-5\" />\n <CornerMark className=\"top-5 right-5\" />\n <CornerMark className=\"bottom-5 left-5\" />\n <CornerMark className=\"right-5 bottom-5\" />\n </>\n )}\n\n <ScanlineOverlay />\n\n {channel && (\n <Small className=\"absolute top-5 left-10 z-1 text-[0.75em] opacity-70\">\n {channel}\n </Small>\n )}\n\n <Small className=\"absolute right-10 bottom-5 z-1 text-[0.75em] opacity-80\">\n {signature}\n </Small>\n </div>\n )\n}\n\nexport type PosterAspect =\n | 'landscape'\n | 'portrait'\n | 'square'\n | 'story'\n | 'wide'\n\nexport type PosterVariant = 'dispatch' | 'vibe'\n\nexport interface PosterProps {\n /** Output aspect ratio. Picks sensible defaults for common social formats. */\n aspect?: PosterAspect\n /** Distortion choreography pattern. Default: `'slash'`. */\n autoPlay?: AutoPlayPattern\n /** (`dispatch` only) Descriptive copy under the headline. */\n body?: React.ReactNode\n /** Show the thin outer frame around the poster. Default `true`. */\n border?: boolean\n /** Tiny broadcast-station label. Optional in `vibe`; shown in header in `dispatch`. */\n channel?: React.ReactNode\n /** (`dispatch` only) Override the sidebar content (takes precedence over headline/body). */\n children?: React.ReactNode\n className?: string\n /** Show the small `+` die-line registration marks in the image corners. Default `true`. */\n cornerMarks?: boolean\n /** (`dispatch` only) Small tagline above the headline. */\n eyebrow?: React.ReactNode\n /** (`dispatch` only) Big expanded-typography headline. Pass an array of strings to stack lines. */\n headline?: string[] | string\n /** (`dispatch` only) Force stacked vs split layout. Default inferred from `aspect`. */\n layout?: 'split' | 'stacked'\n /** Render scale. 1 = full canvas (1080px+ base width). */\n scale?: number\n /** (`dispatch` only) Small legal / signature line at the bottom-right. */\n seal?: React.ReactNode\n /**\n * Signature mark. In `vibe` this is the small \"Hermes Agent\" overlay in the\n * bottom-right. In `dispatch` this is the URL / CTA in the footer.\n */\n signature?: React.ReactNode\n /** Override the poster image. Defaults to the Hermes \"filler-bg0\" asset. */\n src?: string\n /** (`dispatch` only) Ranked list of features / pricing tiers rendered as a numbered sidebar list. */\n tags?: string[]\n /** Shader tint overlay. Great for tier-colored variants. */\n tint?: string\n /** Active / inactive tint strength — defaults match `ImageDistortion`. */\n tintStrength?: { active: number; inactive: number }\n /** Layout variant. `'vibe'` (default) is full-bleed image; `'dispatch'` is the broadcast-card with sidebar copy. */\n variant?: PosterVariant\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../src/ui/components/progress.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAE/D,eAAO,MAAM,QAAQ,GAAI,oEAQtB,aAAa,4CAoCf,CAAA;AAED,UAAU,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/ui/components/progress.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,UAAU,EAAwB,MAAM,cAAc,CAAA;AAE/D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EACvB,OAAO,GAAG,IAAI,EACd,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,KAAK,GAAG,GAAG,EACX,KAAK,EACL,GAAG,KAAK,EACM,EAAE,EAAE,CAAC,CACnB,eACE,SAAS,EAAE,EAAE,CACX,2EAA2E,EAC3E,SAAS,CACV,KACG,KAAK,aAET,KAAC,UAAU,OACL,QAAQ,EACZ,SAAS,EAAE,EAAE,CACX,wCAAwC,EACxC,iBAAiB,EACjB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAC1B,QAAQ,EAAE,SAAS,CACpB,EACD,IAAI,QACJ,KAAK,EAAE;gBACL,GAAG,CAAC,OAAO,IAAI,EAAE,UAAU,EAAE,SAAS,KAAK,kBAAkB,EAAE,CAAC;gBAChE,KAAK,EAAE,GAAG,KAAK,GAAG;gBAClB,GAAG,QAAQ,EAAE,KAAK;aACnB,YAEA,QAAQ,GACE,EAEb,cACE,SAAS,EAAC,QAAQ,EAClB,KAAK,EACH;gBACE,KAAK,EAAE,OAAO;gBACd,eAAe,EAAE,wJAAwJ;aACnJ,GAE1B,IACE,CACP,CAAA","sourcesContent":["import { cn } from '../../utils'\n\nimport { Typography, type TypographyProps } from './typography'\n\nexport const Progress = ({\n animate = true,\n barProps,\n children,\n className,\n speed = 0.4,\n value,\n ...props\n}: ProgressProps) => (\n <div\n className={cn(\n 'relative flex min-h-[2.3rem] min-w-0 flex-1 items-stretch overflow-hidden',\n className\n )}\n {...props}\n >\n <Typography\n {...barProps}\n className={cn(\n 'shrink-0 translate-y-0.5 truncate py-2',\n 'bg-midground/20',\n children ? 'px-2' : 'px-0',\n barProps?.className\n )}\n mono\n style={{\n ...(animate && { transition: `width ${speed}s steps(10, end)` }),\n width: `${value}%`,\n ...barProps?.style\n }}\n >\n {children}\n </Typography>\n\n <div\n className=\"flex-1\"\n style={\n {\n '--x': '.5rem',\n backgroundImage: `repeating-linear-gradient(to right, transparent 0 var(--x), color-mix(in srgb, var(--color-midground) 17%, transparent) var(--x) calc(var(--x) + 1px))`\n } as React.CSSProperties\n }\n />\n </div>\n)\n\ninterface ProgressProps extends React.ComponentProps<'div'> {\n animate?: boolean\n barProps?: TypographyProps<'span'>\n speed?: number\n value: number\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scene-canvas.d.ts","sourceRoot":"","sources":["../../../src/ui/components/scene-canvas.tsx"],"names":[],"mappings":"AAqHA,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAoB,EACpB,QAAQ,EACR,KAAK,EACN,EAAE,gBAAgB,2CA0GlB;AAED,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACnC,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,QAAQ,EAAE,MAAM,KAAK,CAAC,SAAS,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scene-canvas.js","sourceRoot":"","sources":["../../../src/ui/components/scene-canvas.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { Canvas, useFrame, useThree } from '@react-three/fiber'\nimport {\n Suspense,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState\n} from 'react'\nimport * as THREE from 'three'\n\nconst GL = {\n alpha: true,\n antialias: true,\n depth: true,\n outputColorSpace: 'srgb',\n powerPreference: 'high-performance',\n stencil: false\n} as const\n\nconst tmp = {\n camDir: new THREE.Vector3(),\n hit: new THREE.Vector3(),\n ndc: new THREE.Vector2(),\n origin: new THREE.Vector3(0, 0, 0),\n plane: new THREE.Plane(),\n ray: new THREE.Raycaster()\n}\n\ntype Bounds = { height: number; pageX: number; pageY: number; width: number }\n\nfunction useBounds(target: HTMLElement | null) {\n const bounds = useRef<Bounds | null>(null)\n\n useLayoutEffect(() => {\n if (!target) {\n return\n }\n\n const measure = () => {\n const b = target.getBoundingClientRect()\n bounds.current = {\n height: b.height,\n pageX: b.left + window.scrollX,\n pageY: b.top + window.scrollY,\n width: b.width\n }\n }\n\n measure()\n\n const ro = new ResizeObserver(measure)\n ro.observe(target)\n ro.observe(document.body)\n window.addEventListener('resize', measure, { passive: true })\n\n return () => {\n ro.disconnect()\n window.removeEventListener('resize', measure)\n }\n }, [target])\n\n return bounds\n}\n\nfunction PositionedGroup({\n baseZoom,\n bounds,\n children\n}: React.PropsWithChildren<{\n baseZoom: number\n bounds: React.RefObject<Bounds | null>\n}>) {\n const ref = useRef<THREE.Group>(null)\n const { camera, size, viewport } = useThree()\n\n useFrame(() => {\n const g = ref.current\n const b = bounds.current\n\n if (!g || !b) {\n return\n }\n\n const left = b.pageX - window.scrollX\n const top = b.pageY - window.scrollY\n\n tmp.ndc.set(\n ((left + b.width / 2) / size.width) * 2 - 1,\n 1 - ((top + b.height / 2) / size.height) * 2\n )\n\n camera.getWorldDirection(tmp.camDir)\n tmp.plane.setFromNormalAndCoplanarPoint(tmp.camDir, tmp.origin)\n tmp.ray.setFromCamera(tmp.ndc, camera)\n\n const hit = tmp.ray.ray.intersectPlane(tmp.plane, tmp.hit)\n\n if (hit) {\n g.position.copy(hit)\n }\n\n const zoom = (camera as THREE.Camera & { zoom?: number }).zoom ?? 1\n\n g.scale.setScalar(\n Math.min(\n (b.width / size.width) * viewport.width,\n (b.height / size.height) * viewport.height\n ) * (baseZoom > 0 ? zoom / baseZoom : 1)\n )\n })\n\n return <group ref={ref}>{children}</group>\n}\n\nexport function SceneCanvas({\n camera,\n children,\n className,\n contained,\n frameloop = 'always',\n noEvents,\n style\n}: SceneCanvasProps) {\n const [container, setContainer] = useState<HTMLDivElement | null>(null)\n const baseZoom = camera?.zoom ?? 150\n\n const bounds = useBounds(\n contained ? (container?.parentElement ?? null) : null\n )\n\n useEffect(() => {\n const el = contained && !noEvents ? container : null\n\n if (!el) {\n return\n }\n\n const lock = () => (document.body.style.userSelect = 'none')\n const unlock = () => (document.body.style.userSelect = '')\n\n el.addEventListener('pointerdown', lock)\n window.addEventListener('pointerup', unlock)\n\n return () => {\n el.removeEventListener('pointerdown', lock)\n window.removeEventListener('pointerup', unlock)\n }\n }, [container, contained, noEvents])\n\n // Pause the R3F render loop when the tab is hidden. Even on\n // `frameloop=\"always\"` scenes we don't want the GPU running while the\n // user can't see anything — this is the dominant fix for the \"fans\n // crank up after hours of idle\" symptom.\n const [pageHidden, setPageHidden] = useState(\n typeof document !== 'undefined' && document.hidden\n )\n\n useEffect(() => {\n const onVisibility = () => setPageHidden(document.hidden)\n document.addEventListener('visibilitychange', onVisibility)\n\n return () => document.removeEventListener('visibilitychange', onVisibility)\n }, [])\n\n const effectiveFrameloop = pageHidden ? 'never' : frameloop\n\n const cam = useMemo(\n () => ({\n far: camera?.far ?? 100,\n near: camera?.near ?? -100,\n position: camera?.position ?? ([0, 0, 10] as [number, number, number]),\n zoom: baseZoom * (contained ? 1 : 2)\n }),\n [baseZoom, camera, contained]\n )\n\n const canvas = (\n <Canvas\n camera={cam}\n className={className}\n dpr={[1, 2]}\n eventPrefix={contained ? 'client' : 'offset'}\n eventSource={contained ? (container ?? undefined) : undefined}\n frameloop={effectiveFrameloop}\n gl={GL}\n orthographic\n style={\n contained\n ? {\n height: '100dvh',\n inset: 0,\n pointerEvents: 'none',\n position: 'fixed',\n width: '100dvw',\n zIndex: 0,\n ...style\n }\n : { height: '100%', width: '100%', ...style }\n }\n >\n {contained ? (\n <PositionedGroup baseZoom={baseZoom} bounds={bounds}>\n {children()}\n </PositionedGroup>\n ) : (\n children()\n )}\n </Canvas>\n )\n\n return contained ? (\n <Suspense>\n <div\n ref={setContainer}\n style={{\n height: '100%',\n inset: 0,\n pointerEvents: noEvents ? 'none' : 'auto',\n position: 'absolute',\n width: '100%',\n zIndex: 1\n }}\n />\n {canvas}\n </Suspense>\n ) : (\n canvas\n )\n}\n\ninterface SceneCanvasProps {\n camera?: {\n far?: number\n near?: number\n position?: [number, number, number]\n zoom?: number\n }\n children: () => React.ReactNode\n className?: string\n contained?: boolean\n /**\n * R3F frame-loop mode. Defaults to `'always'` for backwards\n * compatibility, but `'demand'` is strongly preferred for static\n * scenes (use `invalidate()` from `useThree` to request frames). The\n * canvas additionally pauses (forces `'never'`) while the document\n * is hidden, regardless of this setting.\n */\n frameloop?: 'always' | 'demand' | 'never'\n noEvents?: boolean\n style?: React.CSSProperties\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scramble.d.ts","sourceRoot":"","sources":["../../../src/ui/components/scramble.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,GAAS,EACT,MAAU,EACV,MAAM,EACP,EAAE,aAAa,2CA2Ef;AAED,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;CACvC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scramble.js","sourceRoot":"","sources":["../../../src/ui/components/scramble.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGnD,MAAM,KAAK,GAAG,yDAAyD,CAAA;AAEvE,MAAM,UAAU,QAAQ,CAAC,EACvB,QAAQ,EACR,GAAG,GAAG,GAAG,EACT,MAAM,GAAG,CAAC,EACV,MAAM,EACQ;IACd,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAA;IACvB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAkC,EAAE,CAAC,CAAA;IAEzD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,CAAA;QAE1B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACpB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;YAE3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC,CAAA;gBAChB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;gBAEpB,OAAM;YACR,CAAC;YAED,UAAU,CACR,IAAI;iBACD,KAAK,CAAC,EAAE,CAAC;iBACT,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACZ,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;oBACd,OAAO,CAAC,CAAA;gBACV,CAAC;gBAED,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAC9B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;oBAEtB,MAAM,GAAG,GACP,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;wBACrB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;wBACzC,MAAM,CAAA;oBAER,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;oBAChC,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAA;oBAEtB,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;wBACvC,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;oBAC5D,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC,CAAA;YACV,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,CAAC,CACZ,CAAA;YAED,KAAK,CAAC,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;QAChD,CAAC,CAAA;QAED,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACvD,KAAK,CAAC,OAAO,KAAb,KAAK,CAAC,OAAO,GAAK,qBAAqB,CAAC,OAAO,CAAC,EAAA;QAClD,CAAC,CAAA;QAED,EAAE,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAE1C,OAAO,GAAG,EAAE;YACV,EAAE,CAAC,mBAAmB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;YAC7C,KAAK,CAAC,OAAO,IAAI,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACtD,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,OAAO,4BAAG,OAAO,GAAI,CAAA;AACvB,CAAC","sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\n\nconst CHARS = '.,·-─~+:;=*π\"\"┐┌┘┴┬╗╔╝╚╬╠╣╩╦║░▒▓█▄▀▌▐■!?&#$@0123456789*'\n\nexport function Scramble({\n children,\n dur = 666,\n spread = 1,\n target\n}: ScrambleProps) {\n const text = String(children)\n const len = text.length\n const [display, setDisplay] = useState(text)\n const frame = useRef<null | number>(null)\n const waves = useRef<{ pos: number; time: number }[]>([])\n\n useEffect(() => {\n const el = target?.current\n\n if (!el) {\n return\n }\n\n const animate = () => {\n const t = Date.now()\n waves.current = waves.current.filter(w => t - w.time < dur)\n\n if (!waves.current.length) {\n setDisplay(text)\n frame.current = null\n\n return\n }\n\n setDisplay(\n text\n .split('')\n .map((c, i) => {\n if (c === ' ') {\n return c\n }\n\n for (const w of waves.current) {\n const age = t - w.time\n\n const rad =\n (Math.min(age / dur, 1) *\n (Math.max(w.pos, len - w.pos - 1) + 5)) /\n spread\n\n const dist = Math.abs(i - w.pos)\n const int = rad - dist\n\n if (dist <= rad && int > 0 && int <= 3) {\n return CHARS[(dist * 3 + ((age / 40) | 0)) % CHARS.length]\n }\n }\n\n return c\n })\n .join('')\n )\n\n frame.current = requestAnimationFrame(animate)\n }\n\n const onEnter = () => {\n waves.current.push({ pos: len >> 1, time: Date.now() })\n frame.current ??= requestAnimationFrame(animate)\n }\n\n el.addEventListener('mouseenter', onEnter)\n\n return () => {\n el.removeEventListener('mouseenter', onEnter)\n frame.current && cancelAnimationFrame(frame.current)\n }\n }, [target, text, len, dur, spread])\n\n useEffect(() => {\n setDisplay(text)\n }, [text])\n\n return <>{display}</>\n}\n\ninterface ScrambleProps {\n children: string\n dur?: number\n spread?: number\n target?: RefObject<HTMLElement | null>\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"segmented.d.ts","sourceRoot":"","sources":["../../../src/ui/components/segmented.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAC1C,SAAS,EACT,QAAQ,EACR,OAAO,EACP,IAAW,EACX,KAAK,EACN,EAAE,cAAc,CAAC,CAAC,CAAC,2CAqCnB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CAU3E;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,eAAe,CAAC,CAAC,SAAS,MAAM;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,CAAC,CAAA;CACT;AAED,UAAU,cAAc,CAAC,CAAC,SAAS,MAAM;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;IAC5B,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,KAAK,EAAE,CAAC,CAAA;CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"segmented.js","sourceRoot":"","sources":["../../../src/ui/components/segmented.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAIZ,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,UAAU,SAAS,CAAmB,EAC1C,SAAS,EACT,QAAQ,EACR,OAAO,EACP,IAAI,GAAG,IAAI,EACX,KAAK,EACa;IAClB,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,yDAAyD,EACzD,SAAS,CACV,EACD,IAAI,EAAC,YAAY,YAEhB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACjB,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,KAAK,CAAA;YAElC,OAAO,CACL,iCACgB,MAAM,EACpB,SAAS,EAAE,EAAE,CACX,0CAA0C,EAC1C,oDAAoD,EACpD,8CAA8C,EAC9C,iFAAiF,EACjF,IAAI,KAAK,IAAI,IAAI,2BAA2B,EAC5C,IAAI,KAAK,IAAI,IAAI,kBAAkB,EACnC,MAAM;oBACJ,CAAC,CAAC,8BAA8B;oBAChC,CAAC,CAAC,8DAA8D,CACnE,EAED,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAClC,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,QAAQ,YAEZ,GAAG,CAAC,KAAK,IALL,GAAG,CAAC,KAAK,CAMP,CACV,CAAA;QACH,CAAC,CAAC,GACE,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAoB;IAC1E,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,aACtD,eAAM,SAAS,EAAC,4EAA4E,YACzF,KAAK,GACD,EAEN,QAAQ,IACL,CACP,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { type ReactNode } from 'react'\n\nimport { cn } from '../../utils'\n\nexport function Segmented<T extends string>({\n className,\n onChange,\n options,\n size = 'sm',\n value\n}: SegmentedProps<T>) {\n return (\n <div\n className={cn(\n 'inline-flex border border-midground/15 bg-background/30',\n className\n )}\n role=\"radiogroup\"\n >\n {options.map(opt => {\n const active = opt.value === value\n\n return (\n <button\n aria-checked={active}\n className={cn(\n 'font-mondwest tracking-[0.1em] uppercase',\n 'transition-colors cursor-pointer whitespace-nowrap',\n 'border-r border-midground/15 last:border-r-0',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30',\n size === 'sm' && 'h-7 px-2.5 text-[0.65rem]',\n size === 'md' && 'h-8 px-3 text-xs',\n active\n ? 'bg-midground text-background'\n : 'text-midground/60 hover:bg-midground/10 hover:text-midground'\n )}\n key={opt.value}\n onClick={() => onChange(opt.value)}\n role=\"radio\"\n type=\"button\"\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport function FilterGroup({ children, className, label }: FilterGroupProps) {\n return (\n <div className={cn('flex items-center gap-2', className)}>\n <span className=\"font-mondwest text-[0.65rem] tracking-[0.12em] uppercase text-midground/50\">\n {label}\n </span>\n\n {children}\n </div>\n )\n}\n\ninterface FilterGroupProps {\n children: ReactNode\n className?: string\n label: string\n}\n\ninterface SegmentedOption<T extends string> {\n label: string\n value: T\n}\n\ninterface SegmentedProps<T extends string> {\n className?: string\n onChange: (value: T) => void\n options: SegmentedOption<T>[]\n size?: 'md' | 'sm'\n value: T\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/ui/components/select.tsx"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,aAAa,EAGlB,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAiBd,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,EAAE,EACF,aAAa,EACb,WAAW,EACX,KAAK,EACL,KAAK,EACN,EAAE,WAAW,2CAoJb;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,QAErD;AA0DD,UAAU,iBAAiB;IACzB,QAAQ,EAAE,SAAS,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/ui/components/select.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport {\n Children,\n isValidElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode\n} from 'react'\n\nimport { cn } from '../../utils'\n\nconst TRIGGER_CN =\n 'flex h-9 w-full items-center justify-between gap-2 ' +\n 'border border-midground/15 bg-background/40 px-3 py-1 ' +\n 'font-courier text-sm text-left text-midground transition-colors ' +\n 'hover:border-midground/25 ' +\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30 focus-visible:border-midground/30 ' +\n 'disabled:cursor-not-allowed disabled:opacity-50 ' +\n 'cursor-pointer'\n\nconst LISTBOX_CN =\n 'absolute z-50 mt-1 w-full max-h-60 overflow-auto ' +\n 'border border-midground/15 bg-background-base text-midground shadow-lg'\n\nexport function Select({\n children,\n className,\n disabled,\n id,\n onValueChange,\n placeholder,\n style,\n value\n}: SelectProps) {\n const [open, setOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const containerRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n const options = useMemo(() => collectOptions(children), [children])\n const selected = options.find(o => o.value === value)\n const displayLabel = selected?.label ?? placeholder ?? value ?? ''\n\n const close = useCallback(() => {\n setOpen(false)\n setHighlightedIndex(-1)\n }, [])\n\n useEffect(() => {\n if (!open) return\n const ac = new AbortController()\n document.addEventListener(\n 'mousedown',\n e => {\n if (!containerRef.current?.contains(e.target as Node)) close()\n },\n { signal: ac.signal }\n )\n return () => ac.abort()\n }, [open, close])\n\n useEffect(() => {\n if (!open || highlightedIndex < 0) return\n const el = listRef.current?.children[highlightedIndex] as\n | HTMLElement\n | undefined\n el?.scrollIntoView({ block: 'nearest' })\n }, [open, highlightedIndex])\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (disabled) return\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault()\n if (!open) {\n setOpen(true)\n setHighlightedIndex(options.findIndex(o => o.value === value))\n } else if (highlightedIndex >= 0 && options[highlightedIndex]) {\n onValueChange?.(options[highlightedIndex].value)\n close()\n }\n break\n case 'ArrowDown':\n e.preventDefault()\n if (!open) {\n setOpen(true)\n setHighlightedIndex(options.findIndex(o => o.value === value))\n } else {\n setHighlightedIndex(i => Math.min(i + 1, options.length - 1))\n }\n break\n case 'ArrowUp':\n e.preventDefault()\n if (open) setHighlightedIndex(i => Math.max(i - 1, 0))\n break\n case 'Home':\n if (open) {\n e.preventDefault()\n setHighlightedIndex(0)\n }\n break\n case 'End':\n if (open) {\n e.preventDefault()\n setHighlightedIndex(options.length - 1)\n }\n break\n case 'Escape':\n e.preventDefault()\n close()\n break\n }\n }\n\n return (\n <div\n className={cn('relative', className)}\n id={id}\n ref={containerRef}\n style={style}\n >\n <button\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n className={TRIGGER_CN}\n disabled={disabled}\n onClick={() => !disabled && setOpen(o => !o)}\n onKeyDown={handleKeyDown}\n role=\"combobox\"\n type=\"button\"\n >\n <span className={cn('truncate', !selected && 'text-midground/50')}>\n {displayLabel}\n </span>\n\n <ChevronDownGlyph\n className={cn(\n 'size-3 shrink-0 text-midground/60 transition-transform',\n open && 'rotate-180'\n )}\n />\n </button>\n\n {open && (\n <div className={LISTBOX_CN} ref={listRef} role=\"listbox\">\n {options.map((opt, i) => {\n const isSelected = opt.value === value\n const isHighlighted = i === highlightedIndex\n\n return (\n <div\n aria-selected={isSelected}\n className={cn(\n 'flex cursor-pointer items-center gap-2 px-3 py-2',\n 'font-courier text-sm transition-colors',\n isHighlighted && 'bg-midground/10',\n isSelected ? 'text-midground' : 'text-midground/70'\n )}\n key={opt.value}\n onClick={() => {\n onValueChange?.(opt.value)\n close()\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n role=\"option\"\n >\n <CheckGlyph\n className={cn(\n 'size-3 shrink-0',\n isSelected ? 'opacity-100' : 'opacity-0'\n )}\n />\n <span className=\"truncate\">{opt.label}</span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// Marker component — `Select` reads `value`/`children` from its tree.\n// Renders nothing on its own.\nexport function SelectOption(_props: SelectOptionProps) {\n return null\n}\n\nconst ChevronDownGlyph = ({ className }: { className?: string }) => (\n <svg\n aria-hidden\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"square\"\n strokeWidth={1.5}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M2.5 4.5 6 8l3.5-3.5\" />\n </svg>\n)\n\nconst CheckGlyph = ({ className }: { className?: string }) => (\n <svg\n aria-hidden\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"square\"\n strokeWidth={1.5}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"m2.5 6.5 2.5 2.5L9.5 3.5\" />\n </svg>\n)\n\nfunction collectOptions(children: ReactNode): SelectOptionData[] {\n const out: SelectOptionData[] = []\n Children.forEach(children, child => {\n if (!isValidElement(child)) return\n const el = child as ReactElement<{\n children?: ReactNode\n value?: unknown\n }>\n if (el.props.value !== undefined) {\n out.push({\n label:\n typeof el.props.children === 'string'\n ? el.props.children\n : String(el.props.value),\n value: String(el.props.value)\n })\n } else if (el.props.children) {\n out.push(...collectOptions(el.props.children))\n }\n })\n return out\n}\n\ninterface SelectOptionData {\n label: string\n value: string\n}\n\ninterface SelectOptionProps {\n children: ReactNode\n value: string\n}\n\ninterface SelectProps {\n children?: ReactNode\n className?: string\n disabled?: boolean\n id?: string\n onValueChange?: (value: string) => void\n placeholder?: string\n style?: CSSProperties\n value?: string\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selection-switcher.d.ts","sourceRoot":"","sources":["../../../src/ui/components/selection-switcher.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,iBAAiB,SAyBhC"}
|