@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.
Files changed (320) hide show
  1. package/README.md +16 -0
  2. package/dist/assets/filler-bg0.webp +0 -0
  3. package/dist/assets.d.ts +38 -0
  4. package/dist/fonts.d.ts +0 -1
  5. package/dist/fonts.js +5 -7
  6. package/dist/hooks/use-capped-frame.d.ts +0 -1
  7. package/dist/hooks/use-capped-frame.js +12 -13
  8. package/dist/hooks/use-css-var-dims.d.ts +0 -1
  9. package/dist/hooks/use-css-var-dims.js +26 -21
  10. package/dist/hooks/use-gpu-tier.d.ts +0 -1
  11. package/dist/hooks/use-gpu-tier.js +90 -110
  12. package/dist/hooks/use-render-loop.d.ts +0 -1
  13. package/dist/hooks/use-render-loop.js +58 -58
  14. package/dist/hooks/use-smooth-controls.d.ts +0 -1
  15. package/dist/hooks/use-smooth-controls.js +204 -206
  16. package/dist/index.d.ts +0 -1
  17. package/dist/index.js +84 -58
  18. package/dist/ui/basic-page.d.ts +1 -2
  19. package/dist/ui/basic-page.js +15 -7
  20. package/dist/ui/build.css +1 -0
  21. package/dist/ui/components/animated-count.d.ts +1 -2
  22. package/dist/ui/components/animated-count.js +109 -85
  23. package/dist/ui/components/ascii.d.ts +2 -3
  24. package/dist/ui/components/ascii.js +75 -59
  25. package/dist/ui/components/badge.d.ts +1 -2
  26. package/dist/ui/components/badge.js +35 -18
  27. package/dist/ui/components/badges/nous-girl.d.ts +1 -2
  28. package/dist/ui/components/badges/nous-girl.js +80 -3
  29. package/dist/ui/components/blend-mode.d.ts +1 -2
  30. package/dist/ui/components/blend-mode.js +55 -63
  31. package/dist/ui/components/blink.d.ts +1 -2
  32. package/dist/ui/components/blink.js +15 -6
  33. package/dist/ui/components/button.d.ts +2 -3
  34. package/dist/ui/components/button.js +139 -90
  35. package/dist/ui/components/command-block.d.ts +2 -3
  36. package/dist/ui/components/command-block.js +52 -24
  37. package/dist/ui/components/cursor.d.ts +1 -2
  38. package/dist/ui/components/cursor.js +93 -54
  39. package/dist/ui/components/dropdown-menu.d.ts +1 -2
  40. package/dist/ui/components/dropdown-menu.js +99 -51
  41. package/dist/ui/components/fit-text/index.d.ts +0 -1
  42. package/dist/ui/components/fit-text/index.js +21 -13
  43. package/dist/ui/components/graphs/bar-chart.d.ts +1 -2
  44. package/dist/ui/components/graphs/bar-chart.js +116 -63
  45. package/dist/ui/components/graphs/index.d.ts +0 -1
  46. package/dist/ui/components/graphs/index.js +3 -4
  47. package/dist/ui/components/graphs/line-chart.d.ts +1 -2
  48. package/dist/ui/components/graphs/line-chart.js +159 -102
  49. package/dist/ui/components/graphs/utils.d.ts +2 -3
  50. package/dist/ui/components/graphs/utils.js +147 -114
  51. package/dist/ui/components/grid/index.d.ts +0 -1
  52. package/dist/ui/components/grid/index.js +12 -9
  53. package/dist/ui/components/hover-bg.d.ts +0 -1
  54. package/dist/ui/components/hover-bg.js +11 -6
  55. package/dist/ui/components/icons/arrow.d.ts +1 -2
  56. package/dist/ui/components/icons/arrow.js +42 -5
  57. package/dist/ui/components/icons/chevron.d.ts +1 -2
  58. package/dist/ui/components/icons/chevron.js +49 -5
  59. package/dist/ui/components/icons/discord.d.ts +1 -2
  60. package/dist/ui/components/icons/discord.js +12 -4
  61. package/dist/ui/components/icons/eye.d.ts +1 -2
  62. package/dist/ui/components/icons/eye.js +5 -3
  63. package/dist/ui/components/icons/gear.d.ts +1 -2
  64. package/dist/ui/components/icons/gear.js +28 -14
  65. package/dist/ui/components/icons/github.d.ts +1 -2
  66. package/dist/ui/components/icons/github.js +12 -4
  67. package/dist/ui/components/icons/hamburger.d.ts +1 -2
  68. package/dist/ui/components/icons/hamburger.js +54 -5
  69. package/dist/ui/components/icons/heart.d.ts +1 -2
  70. package/dist/ui/components/icons/heart.js +8 -3
  71. package/dist/ui/components/icons/index.d.ts +0 -1
  72. package/dist/ui/components/icons/index.js +11 -12
  73. package/dist/ui/components/icons/link.d.ts +1 -2
  74. package/dist/ui/components/icons/link.js +10 -3
  75. package/dist/ui/components/icons/minus.d.ts +1 -2
  76. package/dist/ui/components/icons/minus.js +10 -3
  77. package/dist/ui/components/icons/search.d.ts +1 -2
  78. package/dist/ui/components/icons/search.js +30 -3
  79. package/dist/ui/components/image-distortion.d.ts +1 -2
  80. package/dist/ui/components/image-distortion.js +300 -265
  81. package/dist/ui/components/leva-client.d.ts +1 -2
  82. package/dist/ui/components/leva-client.js +9 -10
  83. package/dist/ui/components/list-item.d.ts +0 -1
  84. package/dist/ui/components/list-item.js +26 -10
  85. package/dist/ui/components/modal/index.d.ts +1 -2
  86. package/dist/ui/components/modal/index.js +33 -14
  87. package/dist/ui/components/overlays/blend-modes.d.ts +0 -1
  88. package/dist/ui/components/overlays/blend-modes.js +11 -12
  89. package/dist/ui/components/overlays/glitch.d.ts +1 -2
  90. package/dist/ui/components/overlays/glitch.js +115 -110
  91. package/dist/ui/components/overlays/greys.d.ts +1 -2
  92. package/dist/ui/components/overlays/greys.js +200 -179
  93. package/dist/ui/components/overlays/index.d.ts +1 -2
  94. package/dist/ui/components/overlays/index.js +31 -17
  95. package/dist/ui/components/overlays/lens-layers.d.ts +1 -2
  96. package/dist/ui/components/overlays/lens-layers.js +89 -65
  97. package/dist/ui/components/overlays/lens.d.ts +0 -1
  98. package/dist/ui/components/overlays/lens.js +46 -52
  99. package/dist/ui/components/overlays/noise.d.ts +1 -2
  100. package/dist/ui/components/overlays/noise.js +112 -113
  101. package/dist/ui/components/overlays/vignette.d.ts +1 -2
  102. package/dist/ui/components/overlays/vignette.js +44 -38
  103. package/dist/ui/components/poster.d.ts +1 -2
  104. package/dist/ui/components/poster.js +240 -87
  105. package/dist/ui/components/progress.d.ts +1 -2
  106. package/dist/ui/components/progress.js +52 -12
  107. package/dist/ui/components/scene-canvas.d.ts +1 -2
  108. package/dist/ui/components/scene-canvas.js +169 -119
  109. package/dist/ui/components/scramble.d.ts +1 -2
  110. package/dist/ui/components/scramble.js +60 -59
  111. package/dist/ui/components/segmented.d.ts +2 -3
  112. package/dist/ui/components/segmented.js +47 -12
  113. package/dist/ui/components/select.d.ts +1 -2
  114. package/dist/ui/components/select.js +207 -120
  115. package/dist/ui/components/selection-switcher.d.ts +0 -1
  116. package/dist/ui/components/selection-switcher.js +29 -25
  117. package/dist/ui/components/shader.d.ts +1 -2
  118. package/dist/ui/components/shader.js +56 -38
  119. package/dist/ui/components/socials.d.ts +1 -2
  120. package/dist/ui/components/socials.js +18 -7
  121. package/dist/ui/components/spinner.d.ts +1 -2
  122. package/dist/ui/components/spinner.js +36 -25
  123. package/dist/ui/components/stats.d.ts +1 -2
  124. package/dist/ui/components/stats.js +33 -9
  125. package/dist/ui/components/switch.d.ts +0 -1
  126. package/dist/ui/components/switch.js +35 -11
  127. package/dist/ui/components/tabs.d.ts +3 -4
  128. package/dist/ui/components/tabs.js +38 -12
  129. package/dist/ui/components/terminal-demo.d.ts +1 -2
  130. package/dist/ui/components/terminal-demo.js +119 -74
  131. package/dist/ui/components/theme-toggle.d.ts +1 -2
  132. package/dist/ui/components/theme-toggle.js +63 -8
  133. package/dist/ui/components/tier-card.d.ts +1 -2
  134. package/dist/ui/components/tier-card.js +144 -24
  135. package/dist/ui/components/tv.d.ts +1 -2
  136. package/dist/ui/components/tv.js +138 -90
  137. package/dist/ui/components/typography/h1.d.ts +0 -1
  138. package/dist/ui/components/typography/h1.js +17 -8
  139. package/dist/ui/components/typography/h2.d.ts +0 -1
  140. package/dist/ui/components/typography/h2.js +17 -8
  141. package/dist/ui/components/typography/index.d.ts +0 -1
  142. package/dist/ui/components/typography/index.js +35 -24
  143. package/dist/ui/components/typography/legend.d.ts +1 -2
  144. package/dist/ui/components/typography/legend.js +18 -6
  145. package/dist/ui/components/typography/small.d.ts +0 -1
  146. package/dist/ui/components/typography/small.js +8 -7
  147. package/dist/ui/components/watchlist.d.ts +1 -2
  148. package/dist/ui/components/watchlist.js +77 -25
  149. package/dist/ui/fonts.css +7 -7
  150. package/dist/ui/footer.d.ts +1 -2
  151. package/dist/ui/footer.js +61 -25
  152. package/dist/ui/globals.css +5 -1
  153. package/dist/ui/header.d.ts +1 -2
  154. package/dist/ui/header.js +255 -60
  155. package/dist/ui/layout-wrapper.d.ts +1 -2
  156. package/dist/ui/layout-wrapper.js +5 -4
  157. package/dist/utils/color.d.ts +0 -1
  158. package/dist/utils/color.js +8 -9
  159. package/dist/utils/index.d.ts +0 -1
  160. package/dist/utils/index.js +37 -38
  161. package/dist/utils/poly.d.ts +0 -1
  162. package/dist/utils/poly.js +1 -2
  163. package/package.json +42 -24
  164. package/dist/assets/filler-bg0.jpg +0 -0
  165. package/dist/fonts.d.ts.map +0 -1
  166. package/dist/fonts.js.map +0 -1
  167. package/dist/hooks/use-capped-frame.d.ts.map +0 -1
  168. package/dist/hooks/use-capped-frame.js.map +0 -1
  169. package/dist/hooks/use-css-var-dims.d.ts.map +0 -1
  170. package/dist/hooks/use-css-var-dims.js.map +0 -1
  171. package/dist/hooks/use-gpu-tier.d.ts.map +0 -1
  172. package/dist/hooks/use-gpu-tier.js.map +0 -1
  173. package/dist/hooks/use-render-loop.d.ts.map +0 -1
  174. package/dist/hooks/use-render-loop.js.map +0 -1
  175. package/dist/hooks/use-smooth-controls.d.ts.map +0 -1
  176. package/dist/hooks/use-smooth-controls.js.map +0 -1
  177. package/dist/index.d.ts.map +0 -1
  178. package/dist/index.js.map +0 -1
  179. package/dist/ui/basic-page.d.ts.map +0 -1
  180. package/dist/ui/basic-page.js.map +0 -1
  181. package/dist/ui/components/animated-count.d.ts.map +0 -1
  182. package/dist/ui/components/animated-count.js.map +0 -1
  183. package/dist/ui/components/ascii.d.ts.map +0 -1
  184. package/dist/ui/components/ascii.js.map +0 -1
  185. package/dist/ui/components/badge.d.ts.map +0 -1
  186. package/dist/ui/components/badge.js.map +0 -1
  187. package/dist/ui/components/badges/nous-girl.d.ts.map +0 -1
  188. package/dist/ui/components/badges/nous-girl.js.map +0 -1
  189. package/dist/ui/components/blend-mode.d.ts.map +0 -1
  190. package/dist/ui/components/blend-mode.js.map +0 -1
  191. package/dist/ui/components/blink.d.ts.map +0 -1
  192. package/dist/ui/components/blink.js.map +0 -1
  193. package/dist/ui/components/button.d.ts.map +0 -1
  194. package/dist/ui/components/button.js.map +0 -1
  195. package/dist/ui/components/command-block.d.ts.map +0 -1
  196. package/dist/ui/components/command-block.js.map +0 -1
  197. package/dist/ui/components/cursor.d.ts.map +0 -1
  198. package/dist/ui/components/cursor.js.map +0 -1
  199. package/dist/ui/components/dropdown-menu.d.ts.map +0 -1
  200. package/dist/ui/components/dropdown-menu.js.map +0 -1
  201. package/dist/ui/components/fit-text/index.d.ts.map +0 -1
  202. package/dist/ui/components/fit-text/index.js.map +0 -1
  203. package/dist/ui/components/graphs/bar-chart.d.ts.map +0 -1
  204. package/dist/ui/components/graphs/bar-chart.js.map +0 -1
  205. package/dist/ui/components/graphs/index.d.ts.map +0 -1
  206. package/dist/ui/components/graphs/index.js.map +0 -1
  207. package/dist/ui/components/graphs/line-chart.d.ts.map +0 -1
  208. package/dist/ui/components/graphs/line-chart.js.map +0 -1
  209. package/dist/ui/components/graphs/utils.d.ts.map +0 -1
  210. package/dist/ui/components/graphs/utils.js.map +0 -1
  211. package/dist/ui/components/grid/index.d.ts.map +0 -1
  212. package/dist/ui/components/grid/index.js.map +0 -1
  213. package/dist/ui/components/hover-bg.d.ts.map +0 -1
  214. package/dist/ui/components/hover-bg.js.map +0 -1
  215. package/dist/ui/components/icons/arrow.d.ts.map +0 -1
  216. package/dist/ui/components/icons/arrow.js.map +0 -1
  217. package/dist/ui/components/icons/chevron.d.ts.map +0 -1
  218. package/dist/ui/components/icons/chevron.js.map +0 -1
  219. package/dist/ui/components/icons/discord.d.ts.map +0 -1
  220. package/dist/ui/components/icons/discord.js.map +0 -1
  221. package/dist/ui/components/icons/eye.d.ts.map +0 -1
  222. package/dist/ui/components/icons/eye.js.map +0 -1
  223. package/dist/ui/components/icons/gear.d.ts.map +0 -1
  224. package/dist/ui/components/icons/gear.js.map +0 -1
  225. package/dist/ui/components/icons/github.d.ts.map +0 -1
  226. package/dist/ui/components/icons/github.js.map +0 -1
  227. package/dist/ui/components/icons/hamburger.d.ts.map +0 -1
  228. package/dist/ui/components/icons/hamburger.js.map +0 -1
  229. package/dist/ui/components/icons/heart.d.ts.map +0 -1
  230. package/dist/ui/components/icons/heart.js.map +0 -1
  231. package/dist/ui/components/icons/index.d.ts.map +0 -1
  232. package/dist/ui/components/icons/index.js.map +0 -1
  233. package/dist/ui/components/icons/link.d.ts.map +0 -1
  234. package/dist/ui/components/icons/link.js.map +0 -1
  235. package/dist/ui/components/icons/minus.d.ts.map +0 -1
  236. package/dist/ui/components/icons/minus.js.map +0 -1
  237. package/dist/ui/components/icons/search.d.ts.map +0 -1
  238. package/dist/ui/components/icons/search.js.map +0 -1
  239. package/dist/ui/components/image-distortion.d.ts.map +0 -1
  240. package/dist/ui/components/image-distortion.js.map +0 -1
  241. package/dist/ui/components/leva-client.d.ts.map +0 -1
  242. package/dist/ui/components/leva-client.js.map +0 -1
  243. package/dist/ui/components/list-item.d.ts.map +0 -1
  244. package/dist/ui/components/list-item.js.map +0 -1
  245. package/dist/ui/components/modal/index.d.ts.map +0 -1
  246. package/dist/ui/components/modal/index.js.map +0 -1
  247. package/dist/ui/components/overlays/blend-modes.d.ts.map +0 -1
  248. package/dist/ui/components/overlays/blend-modes.js.map +0 -1
  249. package/dist/ui/components/overlays/glitch.d.ts.map +0 -1
  250. package/dist/ui/components/overlays/glitch.js.map +0 -1
  251. package/dist/ui/components/overlays/greys.d.ts.map +0 -1
  252. package/dist/ui/components/overlays/greys.js.map +0 -1
  253. package/dist/ui/components/overlays/index.d.ts.map +0 -1
  254. package/dist/ui/components/overlays/index.js.map +0 -1
  255. package/dist/ui/components/overlays/lens-layers.d.ts.map +0 -1
  256. package/dist/ui/components/overlays/lens-layers.js.map +0 -1
  257. package/dist/ui/components/overlays/lens.d.ts.map +0 -1
  258. package/dist/ui/components/overlays/lens.js.map +0 -1
  259. package/dist/ui/components/overlays/noise.d.ts.map +0 -1
  260. package/dist/ui/components/overlays/noise.js.map +0 -1
  261. package/dist/ui/components/overlays/vignette.d.ts.map +0 -1
  262. package/dist/ui/components/overlays/vignette.js.map +0 -1
  263. package/dist/ui/components/poster.d.ts.map +0 -1
  264. package/dist/ui/components/poster.js.map +0 -1
  265. package/dist/ui/components/progress.d.ts.map +0 -1
  266. package/dist/ui/components/progress.js.map +0 -1
  267. package/dist/ui/components/scene-canvas.d.ts.map +0 -1
  268. package/dist/ui/components/scene-canvas.js.map +0 -1
  269. package/dist/ui/components/scramble.d.ts.map +0 -1
  270. package/dist/ui/components/scramble.js.map +0 -1
  271. package/dist/ui/components/segmented.d.ts.map +0 -1
  272. package/dist/ui/components/segmented.js.map +0 -1
  273. package/dist/ui/components/select.d.ts.map +0 -1
  274. package/dist/ui/components/select.js.map +0 -1
  275. package/dist/ui/components/selection-switcher.d.ts.map +0 -1
  276. package/dist/ui/components/selection-switcher.js.map +0 -1
  277. package/dist/ui/components/shader.d.ts.map +0 -1
  278. package/dist/ui/components/shader.js.map +0 -1
  279. package/dist/ui/components/socials.d.ts.map +0 -1
  280. package/dist/ui/components/socials.js.map +0 -1
  281. package/dist/ui/components/spinner.d.ts.map +0 -1
  282. package/dist/ui/components/spinner.js.map +0 -1
  283. package/dist/ui/components/stats.d.ts.map +0 -1
  284. package/dist/ui/components/stats.js.map +0 -1
  285. package/dist/ui/components/switch.d.ts.map +0 -1
  286. package/dist/ui/components/switch.js.map +0 -1
  287. package/dist/ui/components/tabs.d.ts.map +0 -1
  288. package/dist/ui/components/tabs.js.map +0 -1
  289. package/dist/ui/components/terminal-demo.d.ts.map +0 -1
  290. package/dist/ui/components/terminal-demo.js.map +0 -1
  291. package/dist/ui/components/theme-toggle.d.ts.map +0 -1
  292. package/dist/ui/components/theme-toggle.js.map +0 -1
  293. package/dist/ui/components/tier-card.d.ts.map +0 -1
  294. package/dist/ui/components/tier-card.js.map +0 -1
  295. package/dist/ui/components/tv.d.ts.map +0 -1
  296. package/dist/ui/components/tv.js.map +0 -1
  297. package/dist/ui/components/typography/h1.d.ts.map +0 -1
  298. package/dist/ui/components/typography/h1.js.map +0 -1
  299. package/dist/ui/components/typography/h2.d.ts.map +0 -1
  300. package/dist/ui/components/typography/h2.js.map +0 -1
  301. package/dist/ui/components/typography/index.d.ts.map +0 -1
  302. package/dist/ui/components/typography/index.js.map +0 -1
  303. package/dist/ui/components/typography/legend.d.ts.map +0 -1
  304. package/dist/ui/components/typography/legend.js.map +0 -1
  305. package/dist/ui/components/typography/small.d.ts.map +0 -1
  306. package/dist/ui/components/typography/small.js.map +0 -1
  307. package/dist/ui/components/watchlist.d.ts.map +0 -1
  308. package/dist/ui/components/watchlist.js.map +0 -1
  309. package/dist/ui/footer.d.ts.map +0 -1
  310. package/dist/ui/footer.js.map +0 -1
  311. package/dist/ui/header.d.ts.map +0 -1
  312. package/dist/ui/header.js.map +0 -1
  313. package/dist/ui/layout-wrapper.d.ts.map +0 -1
  314. package/dist/ui/layout-wrapper.js.map +0 -1
  315. package/dist/utils/color.d.ts.map +0 -1
  316. package/dist/utils/color.js.map +0 -1
  317. package/dist/utils/index.d.ts.map +0 -1
  318. package/dist/utils/index.js.map +0 -1
  319. package/dist/utils/poly.d.ts.map +0 -1
  320. package/dist/utils/poly.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"selection-switcher.js","sourceRoot":"","sources":["../../../src/ui/components/selection-switcher.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,MAAM,MAAM,GAAG;IACb,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;CACZ,CAAA;AAEV,MAAM,UAAU,iBAAiB;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAA;QAChC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;QAErB,IAAI,GAAG,GAAG,CAAC,CAAA;QAEX,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,qBAAqB,CAAC,GAAG,EAAE,CACzB,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CACxC,gBAAgB,EAChB,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAC1C,CACF,CAAA;QAEH,MAAM,KAAK,GAAG,CAAC,CAAgB,EAAE,EAAE,CACjC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAA;QAEpE,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3D,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAEvD,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;IACzB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["'use client'\n\nimport { useEffect } from 'react'\n\nconst colors = [\n 'oklch(85% 0.12 330)',\n 'oklch(85% 0.12 300)',\n 'oklch(85% 0.12 270)',\n 'oklch(85% 0.12 230)',\n 'oklch(85% 0.12 180)',\n 'oklch(85% 0.12 150)',\n 'oklch(85% 0.12 120)',\n 'oklch(85% 0.12 90)',\n 'oklch(85% 0.12 60)',\n 'oklch(85% 0.12 30)',\n 'oklch(88% 0.10 80)'\n] as const\n\nexport function SelectionSwitcher() {\n useEffect(() => {\n const ac = new AbortController()\n const { signal } = ac\n\n let idx = 0\n\n const cycle = () =>\n requestAnimationFrame(() =>\n document.documentElement.style.setProperty(\n '--selection-bg',\n colors[(idx = (idx + 1) % colors.length)]\n )\n )\n\n const onKey = (e: KeyboardEvent) =>\n e.key.toLowerCase() === 'a' && (e.metaKey || e.ctrlKey) && cycle()\n\n document.addEventListener('selectstart', cycle, { signal })\n document.addEventListener('keydown', onKey, { signal })\n\n return () => ac.abort()\n }, [])\n\n return null\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shader.d.ts","sourceRoot":"","sources":["../../../src/ui/components/shader.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAY,MAAM,oBAAoB,CAAA;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAUtC,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,GAAG,KAAK,EACT,EAAE,WAAW,2UAmDb;AAED,UAAU,WACR,SAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAC7C,IAAI,CACF,aAAa,CAAC,gBAAgB,CAAC,EAC/B,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,UAAU,GAAG,cAAc,CACzE;IACH,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,KAAK,SAAS,CAAC,GAAG,SAAS,CAAA;CAC5D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shader.js","sourceRoot":"","sources":["../../../src/ui/components/shader.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAsB,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAE7D,MAAM,eAAe,GAAG;IACtB,WAAW,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;IACnD,KAAK,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;CAC5B,CAAA;AAED,MAAM,UAAU,MAAM,CAAC,EACrB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,GAAG,KAAK,EACI;IACZ,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;IAChD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAA;IAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IAElC,MAAM,WAAW,GAAG,MAAM,CAAC;QACzB,GAAG,eAAe;QAClB,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;KACpB,CAAC,CAAA;IAEF,cAAc,CACZ,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAA;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAA;QAEpC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc,EAAE,CAAA;QACxD,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CACxC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAC7C,CAAA;IACH,CAAC,EACD,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAClB,CAAA;IAED,SAAS,CACP,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EACrE,CAAC,QAAQ,CAAC,CACX,CAAA;IAED,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE1E,MAAM,aAAa,GAAG;QACpB,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,SAAS;QACT,cAAc;QACd,IAAI,EAAE,KAAK,CAAC,UAAU;QACtB,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,WAAW,CAAC,OAAO;QAC7B,YAAY;KAC6B,CAAA;IAE3C,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,4BAAoB,aAAa,GAAI,CAAC,CAAA;IACxD,CAAC;IAED,OAAO,CACL,mBAAU,KAAK,aACZ,QAAQ,IAAI,yBAAiB,EAC9B,4BAAoB,aAAa,GAAI,IAChC,CACR,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { type ThreeElements, useThree } from '@react-three/fiber'\nimport { useEffect, useRef } from 'react'\nimport type { ReactNode } from 'react'\nimport * as THREE from 'three'\n\nimport { useCappedFrame } from '../../hooks/use-capped-frame'\n\nconst defaultUniforms = {\n uResolution: new THREE.Uniform(new THREE.Vector4()),\n uTime: new THREE.Uniform(0)\n}\n\nexport function Shader({\n children,\n defines,\n depthTest,\n fragmentShader,\n uniforms,\n vertexShader,\n ...props\n}: ShaderProps) {\n const invalidate = useThree(st => st.invalidate)\n const { size, viewport } = useThree()\n\n const isMobile = size.width < 1024\n\n const uniformsRef = useRef({\n ...defaultUniforms,\n ...(uniforms ?? {})\n })\n\n useCappedFrame(\n ({ clock }) => {\n const w = size.width * viewport.dpr\n const h = size.height * viewport.dpr\n\n uniformsRef.current.uTime.value = clock.getElapsedTime()\n uniformsRef.current.uResolution.value.copy(\n new THREE.Vector4(w, h, w / h, viewport.dpr)\n )\n },\n isMobile ? 0 : 80\n )\n\n useEffect(\n () => void (uniforms && Object.assign(uniformsRef.current, uniforms)),\n [uniforms]\n )\n\n useEffect(() => void (isMobile && invalidate(80)), [invalidate, isMobile])\n\n const materialProps = {\n defines: defines ?? {},\n depthTest,\n fragmentShader,\n side: THREE.DoubleSide,\n transparent: true,\n uniforms: uniformsRef.current,\n vertexShader\n } satisfies ThreeElements['shaderMaterial']\n\n if (typeof children === 'function') {\n return children(<shaderMaterial {...materialProps} />)\n }\n\n return (\n <mesh {...props}>\n {children ?? <planeGeometry />}\n <shaderMaterial {...materialProps} />\n </mesh>\n )\n}\n\ninterface ShaderProps\n extends Omit<ThreeElements['mesh'], 'children'>,\n Pick<\n ThreeElements['shaderMaterial'],\n 'defines' | 'depthTest' | 'fragmentShader' | 'uniforms' | 'vertexShader'\n > {\n children?: ((material: ReactNode) => ReactNode) | ReactNode\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"socials.d.ts","sourceRoot":"","sources":["../../../src/ui/components/socials.tsx"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,2CAqB9E;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAA;CAClC;AAED,UAAU,YAAa,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACjE,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"socials.js","sourceRoot":"","sources":["../../../src/ui/components/socials.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,UAAU,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,EAAgB;IAC7E,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,KAAM,IAAI,YAC/D,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CACpE,YACE,SAAS,EAAC,iDAAiD,EAC3D,IAAI,EAAE,IAAI,EAEV,OAAO,EAAE,CAAC,CAAC,EAAE;gBACX,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;gBACZ,UAAU,EAAE,EAAE,CAAA;YAChB,CAAC,EACD,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,EACjD,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACvC,KAAK,EAAE,KAAK,YAEZ,KAAC,IAAI,KAAG,IATH,KAAK,CAUR,CACL,CAAC,GACE,CACP,CAAA;AACH,CAAC","sourcesContent":["import { cn } from '../../utils'\n\nexport function Socials({ className, items, onNavigate, ...rest }: SocialsProps) {\n return (\n <div className={cn('flex items-center gap-3', className)} {...rest}>\n {items.map(({ external = true, href, icon: Icon, label, onClick }) => (\n <a\n className=\"opacity-60 transition-opacity hover:opacity-100\"\n href={href}\n key={label}\n onClick={e => {\n onClick?.(e)\n onNavigate?.()\n }}\n rel={external ? 'noopener noreferrer' : undefined}\n target={external ? '_blank' : undefined}\n title={label}\n >\n <Icon />\n </a>\n ))}\n </div>\n )\n}\n\nexport interface SocialLink {\n external?: boolean\n href: string\n icon: React.ComponentType<{ className?: string }>\n label: string\n onClick?: React.MouseEventHandler\n}\n\ninterface SocialsProps extends React.HTMLAttributes<HTMLDivElement> {\n items: SocialLink[]\n /**\n * Called *in addition* to each link's `onClick` after a click — useful in\n * mobile drawer / dialog contexts where clicking a link should also close\n * the surrounding overlay.\n */\n onNavigate?: () => void\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/ui/components/spinner.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EAGpB,MAAM,OAAO,CAAA;AACd,OAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAItE;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,IAAgB,EAChB,KAAK,EACL,GAAG,KAAK,EACT,EAAE,YAAY,2CAyBd;AAED,UAAU,YAAa,SAAQ,cAAc,CAAC,eAAe,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../../src/ui/components/spinner.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAGL,SAAS,EACT,QAAQ,EACT,MAAM,OAAO,CAAA;AACd,OAAO,QAAqC,MAAM,oBAAoB,CAAA;AAEtE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,OAAO,CAAC,EACtB,SAAS,EACT,IAAI,GAAG,SAAS,EAChB,KAAK,EACL,GAAG,KAAK,EACK;IACb,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CACpB,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EACtD,SAAS,CAAC,QAAQ,CACnB,CAAA;QACD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEjD,OAAO,CACL,8BACe,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EACnD,SAAS,EAAE,EAAE,CACX,kDAAkD,EAClD,SAAS,CACV,EACD,KAAK,EAAE,KAAK,KACR,KAAK,YAER,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GACnB,CACR,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport {\n type CSSProperties,\n type HTMLAttributes,\n useEffect,\n useState\n} from 'react'\nimport spinners, { type BrailleSpinnerName } from 'unicode-animations'\n\nimport { cn } from '../../utils'\n\n/**\n * Braille unicode spinner. Renders the active frame of a `unicode-animations`\n * sequence inside an inline `<span>`, advancing on the spinner's own interval.\n *\n * Inherits font color and font size from its parent — apply Tailwind utilities\n * (e.g. `text-warning`, `text-base`) via `className` to style.\n *\n * Decorative by default. Pass `aria-label` (and optionally `role=\"status\"`) when\n * the spinner has no surrounding loading text and screen readers need to know\n * something is loading.\n */\nexport function Spinner({\n className,\n name = 'braille',\n style,\n ...props\n}: SpinnerProps) {\n const [frame, setFrame] = useState(0)\n const animation = spinners[name]\n\n useEffect(() => {\n const id = setInterval(\n () => setFrame(f => (f + 1) % animation.frames.length),\n animation.interval\n )\n return () => clearInterval(id)\n }, [animation.frames.length, animation.interval])\n\n return (\n <span\n aria-hidden={props['aria-label'] ? undefined : true}\n className={cn(\n 'font-mono inline-block leading-none tabular-nums',\n className\n )}\n style={style}\n {...props}\n >\n {animation.frames[frame]}\n </span>\n )\n}\n\ninterface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n className?: string\n name?: BrailleSpinnerName\n style?: CSSProperties\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/ui/components/stats.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMxC,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,2CAsCrE;AAED,UAAU,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;IACtD,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,GAAG;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,SAAS,CAAA;SAAC,CAAA;QAC9C,KAAK,EAAE,MAAM,GAAG;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,SAAS,CAAA;SAAC,CAAA;KAC/C,EAAE,CAAA;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;CACf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/ui/components/stats.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,EAAc;IACpE,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,KAAM,KAAK,YACnE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;YAC9B,MAAM,SAAS,GAAG,CAChB,KAAC,UAAU,IACT,SAAS,EAAC,uCAAuC,EACjD,QAAQ,kBAEP,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GACpC,CACd,CAAA;YACD,MAAM,SAAS,GAAG,CAChB,KAAC,UAAU,IAAC,SAAS,EAAC,0CAA0C,EAAC,IAAI,kBAClE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GACpC,CACd,CAAA;YAED,OAAO,CACL,eACE,SAAS,EAAC,8EAA8E,aAGvF,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAE7B,KAAC,UAAU,IACT,SAAS,EAAC,+EAA+E,EACzF,QAAQ,kBAEP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GACL,EAEZ,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,KAXxB,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAE,GAAG,KAAK,GAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAYzG,CACP,CAAA;QACH,CAAC,CAAC,GACE,CACP,CAAA;AACH,CAAC","sourcesContent":["import React, { ReactNode } from 'react'\n\nimport { cn } from '../../utils'\n\nimport { Typography } from './typography'\n\nexport function Stats({ className, items, flip, ...props }: StatsProps) {\n return (\n <div className={cn('flex w-full flex-col gap-5', className)} {...props}>\n {items.map(({ label, value }) => {\n const valueText = (\n <Typography\n className=\"text-xs leading-[1.4] tracking-widest\"\n expanded\n >\n {typeof value === 'string' ? value : value.node}\n </Typography>\n )\n const labelText = (\n <Typography className=\"leading-none tracking-[0.2em] opacity-60\" mono>\n {typeof label === 'string' ? label : label.node}\n </Typography>\n )\n\n return (\n <div\n className=\"text-midground grid grid-cols-[auto_1fr_auto] items-center gap-2.5 uppercase\"\n key={(typeof label === 'string' ? label : label.key ) + '@@@'+(typeof value === 'string' ? value : value.key)}\n >\n {flip ? labelText : valueText}\n\n <Typography\n className=\"min-w-0 overflow-hidden text-[13px] leading-[1.4] tracking-[0.4em] opacity-20\"\n expanded\n >\n {'·'.repeat(100)}\n </Typography>\n\n {flip ? valueText : labelText}\n </div>\n )\n })}\n </div>\n )\n}\n\ninterface StatsProps extends React.ComponentProps<'div'> {\n items: {\n label: string | {key: string, node: ReactNode}\n value: string | {key: string, node: ReactNode}\n }[]\n flip?: boolean\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/ui/components/switch.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAc,MAAM,OAAO,CAAA;AAI7D,eAAO,MAAM,MAAM,2GAmCjB,CAAA;AAEF,UAAU,WACR,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACjE,OAAO,EAAE,OAAO,CAAA;IAChB,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC5C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../src/ui/components/switch.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAA6B,UAAU,EAAE,MAAM,OAAO,CAAA;AAE7D,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CAC9E,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,EAAE,EAC/D,GAAG;IAEH,OAAO,CACL,iCACgB,OAAO,EACrB,SAAS,EAAE,EAAE,CACX,wFAAwF,EACxF,iFAAiF,EACjF,iDAAiD,EACjD,OAAO;YACL,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,mCAAmC,EACvC,SAAS,CACV,EACD,QAAQ,EAAE,QAAQ,EAClB,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACxC,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,KACT,KAAK,YAET,oCAEE,SAAS,EAAE,EAAE,CACX,4DAA4D,EAC5D,OAAO;gBACL,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,iCAAiC,CACtC,GACD,GACK,CACV,CAAA;AACH,CAAC,CAAC,CAAA","sourcesContent":["'use client'\n\nimport { type ButtonHTMLAttributes, forwardRef } from 'react'\n\nimport { cn } from '../../utils'\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { checked, className, disabled, id, onCheckedChange, ...props },\n ref\n) {\n return (\n <button\n aria-checked={checked}\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 items-center border 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 checked\n ? 'bg-midground/15 border-midground/30'\n : 'bg-background border-midground/20',\n className\n )}\n disabled={disabled}\n id={id}\n onClick={() => onCheckedChange(!checked)}\n ref={ref}\n role=\"switch\"\n type=\"button\"\n {...props}\n >\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none block h-3.5 w-3.5 transition-transform',\n checked\n ? 'translate-x-4 bg-midground'\n : 'translate-x-0.5 bg-midground/40'\n )}\n />\n </button>\n )\n})\n\ninterface SwitchProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/ui/components/tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAA;AAId,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,SAAS,2CAQpE;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,2CAU/E;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,SAAS,EACT,KAAK,EAAE,MAAM,EACb,GAAG,KAAK,EACT,EAAE,gBAAgB,2CAgBlB;AAED,UAAU,SAAS;IACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,SAAS,CAAA;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,UAAU,gBAAiB,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IACxE,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/ui/components/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAIL,QAAQ,EACT,MAAM,OAAO,CAAA;AAEd,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAa;IACnE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IAElD,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,YACjD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,GACxB,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAkC;IAC9E,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,2FAA2F,EAC3F,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,MAAM,EACN,SAAS,EACT,KAAK,EAAE,MAAM,EACb,GAAG,KAAK,EACS;IACjB,OAAO,CACL,iBACE,SAAS,EAAE,EAAE,CACX,gFAAgF,EAChF,gFAAgF,EAChF,iFAAiF,EACjF,MAAM;YACJ,CAAC,CAAC,uGAAuG;YACzG,CAAC,CAAC,sBAAsB,EAC1B,SAAS,CACV,EACD,IAAI,EAAC,QAAQ,KACT,KAAK,GACT,CACH,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport {\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n useState\n} from 'react'\n\nimport { cn } from '../../utils'\n\nexport function Tabs({ children, className, defaultValue }: TabsProps) {\n const [active, setActive] = useState(defaultValue)\n\n return (\n <div className={cn('flex flex-col gap-4', className)}>\n {children(active, setActive)}\n </div>\n )\n}\n\nexport function TabsList({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n 'inline-flex h-9 items-center justify-start border-b border-midground/15 text-midground/60',\n className\n )}\n {...props}\n />\n )\n}\n\nexport function TabsTrigger({\n active,\n className,\n value: _value,\n ...props\n}: TabsTriggerProps) {\n return (\n <button\n className={cn(\n 'relative inline-flex items-center justify-center whitespace-nowrap px-3 py-1.5',\n 'font-mondwest text-xs tracking-[0.1em] uppercase transition-all cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30',\n active\n ? 'text-midground after:absolute after:bottom-0 after:left-0 after:right-0 after:h-px after:bg-midground'\n : 'hover:text-midground',\n className\n )}\n type=\"button\"\n {...props}\n />\n )\n}\n\ninterface TabsProps {\n children: (active: string, setActive: (value: string) => void) => ReactNode\n className?: string\n defaultValue: string\n}\n\ninterface TabsTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n active: boolean\n value: string\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal-demo.d.ts","sourceRoot":"","sources":["../../../src/ui/components/terminal-demo.tsx"],"names":[],"mappings":"AAUA,wBAAgB,YAAY,CAAC,EAC3B,SAA2B,EAC3B,SAAS,EACT,MAAY,EACZ,KAAkB,EAClB,WAAkB,EAClB,iBAAsB,EACtB,QAAQ,EACT,EAAE,iBAAiB,2CAgInB;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,OAAO,CAAA;CACd;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,EAAE,QAAQ,CAAA;CACf;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,OAAO,CAAA;CACd;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;CACf;AAED,UAAU,iBAAiB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,UAAU,GACV,SAAS,GACT,UAAU,GACV,QAAQ,CAAA;AAEZ,UAAU,QAAQ;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal-demo.js","sourceRoot":"","sources":["../../../src/ui/components/terminal-demo.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAC3B,SAAS,GAAG,eAAe,EAC3B,SAAS,EACT,MAAM,GAAG,GAAG,EACZ,KAAK,GAAG,UAAU,EAClB,WAAW,GAAG,IAAI,EAClB,iBAAiB,GAAG,EAAE,EACtB,QAAQ,EACU;IAClB,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAEpC,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,OAAM;QACR,CAAC;QAED,UAAU,CAAC,OAAO,GAAG,IAAI,CAAA;QACzB,IAAI,OAAO,GAAG,EAAE,CAAA;QAEhB,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE;YAC3B,OAAO,GAAG,CAAC,CAAA;YACX,OAAO,CAAC,CAAC,CAAC,CAAA;QACZ,CAAC,CAAA;QAED,SAAS,CAAC;YACR,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClB,KAAK,OAAO;wBACV,OAAO,GAAG,EAAE,CAAA;wBACZ,MAAM,CAAC,EAAE,CAAC,CAAA;wBAEV,MAAK;oBAEP,KAAK,QAAQ;wBACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BAC9B,MAAM,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,CAAA;4BAC7B,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAA;wBAChC,CAAC;wBAED,MAAK;oBAEP,KAAK,OAAO;wBACV,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;wBAEpB,MAAK;oBAEP,KAAK,QAAQ;wBACX,MAAM,CAAC,OAAO,GAAG,gCAAgC,IAAI,CAAC,IAAI,SAAS,CAAC,CAAA;wBAEpE,MAAK;oBAEP,KAAK,MAAM;wBACT,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BAC7B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;4BACtB,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;wBAC/B,CAAC;wBAED,MAAK;gBACT,CAAC;YACH,CAAC;YAED,OAAO,GAAG,EAAE,CAAA;YACZ,MAAM,CAAC,EAAE,CAAC,CAAA;YACV,MAAM,KAAK,CAAC,WAAW,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAA;QAEvD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACvC,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACtB,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;oBACzB,OAAO,EAAE,CAAA;gBACX,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,EACD,EAAE,SAAS,EAAE,GAAG,EAAE,CACnB,CAAA;QAED,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAEpB,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAA;IACpC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAA;QAC1D,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,OAAO,CACL,6BACc,SAAS,EACrB,SAAS,EAAE,EAAE,CAAC,uCAAuC,EAAE,SAAS,CAAC,0BAEjE,IAAI,EAAC,KAAK,aAEV,eAAK,SAAS,EAAC,8DAA8D,aAC3E,eAAK,SAAS,EAAC,cAAc,aAC3B,eACE,SAAS,EAAC,kCAAkC,EAC5C,KAAK,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,GACvC,EAEF,eAAM,SAAS,EAAC,qCAAqC,GAAG,EACxD,eAAM,SAAS,EAAC,qCAAqC,GAAG,IACpD,EAEN,eAAM,SAAS,EAAC,mEAAmE,YAChF,KAAK,GACD,IACH,EAEN,cACE,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,2DAA2D,CAC5D,EACD,uBAAuB,EAAE;oBACvB,MAAM,EACJ,IAAI;wBACJ,wEAAwE;iBAC3E,EACD,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,EAAE,MAAM,EAAE,GACjB,IACE,CACP,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { cn } from '../../utils'\n\nfunction sleep(ms: number) {\n return new Promise<void>(resolve => setTimeout(resolve, ms))\n}\n\nexport function TerminalDemo({\n ariaLabel = 'Terminal Demo',\n className,\n height = 320,\n label = 'Terminal',\n loopDelayMs = 1000,\n outputLineDelayMs = 50,\n sequence\n}: TerminalDemoProps) {\n const bodyRef = useRef<HTMLDivElement>(null)\n const startedRef = useRef(false)\n const [html, setHtml] = useState('')\n\n const runDemo = useCallback(async () => {\n if (startedRef.current) {\n return\n }\n\n startedRef.current = true\n let content = ''\n\n const render = (h: string) => {\n content = h\n setHtml(h)\n }\n\n for (;;) {\n for (const step of sequence) {\n switch (step.type) {\n case 'clear':\n content = ''\n render('')\n\n break\n\n case 'output':\n for (const line of step.lines) {\n render(content + '\\n' + line)\n await sleep(outputLineDelayMs)\n }\n\n break\n\n case 'pause':\n await sleep(step.ms)\n\n break\n\n case 'prompt':\n render(content + `<span class=\"text-midground\">${step.text}</span>`)\n\n break\n\n case 'type':\n for (const char of step.text) {\n render(content + char)\n await sleep(step.delay ?? 30)\n }\n\n break\n }\n }\n\n content = ''\n render('')\n await sleep(loopDelayMs)\n }\n }, [loopDelayMs, outputLineDelayMs, sequence])\n\n useEffect(() => {\n const el = bodyRef.current?.closest('[data-demo-root]')\n\n if (!el) {\n return\n }\n\n const observer = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n runDemo()\n }\n })\n },\n { threshold: 0.3 }\n )\n\n observer.observe(el)\n\n return () => observer.disconnect()\n }, [runDemo])\n\n useEffect(() => {\n if (bodyRef.current) {\n bodyRef.current.scrollTop = bodyRef.current.scrollHeight\n }\n }, [html])\n\n return (\n <div\n aria-label={ariaLabel}\n className={cn('border-4 border-double border-inherit', className)}\n data-demo-root\n role=\"img\"\n >\n <div className=\"flex items-center gap-3 border-b border-current/10 px-3 py-2\">\n <div className=\"flex gap-1.5\">\n <span\n className=\"bg-midground size-2 rounded-full\"\n style={{ mixBlendMode: 'plus-lighter' }}\n />\n\n <span className=\"bg-midground/60 size-2 rounded-full\" />\n <span className=\"bg-midground/30 size-2 rounded-full\" />\n </div>\n\n <span className=\"font-courier text-[0.625rem] tracking-widest uppercase opacity-50\">\n {label}\n </span>\n </div>\n\n <div\n className={cn(\n 'overflow-x-hidden overflow-y-auto whitespace-pre-wrap',\n 'font-courier p-4 text-[0.75rem] leading-[1.7] normal-case'\n )}\n dangerouslySetInnerHTML={{\n __html:\n html +\n '<span class=\"blink inline-block dither ml-0.5 h-[1em] w-[1ch]\"></span>'\n }}\n ref={bodyRef}\n style={{ height }}\n />\n </div>\n )\n}\n\ninterface ClearStep {\n type: 'clear'\n}\n\ninterface OutputStep {\n lines: string[]\n type: 'output'\n}\n\ninterface PauseStep {\n ms: number\n type: 'pause'\n}\n\ninterface PromptStep {\n text: string\n type: 'prompt'\n}\n\ninterface TerminalDemoProps {\n ariaLabel?: string\n className?: string\n height?: number | string\n label?: string\n loopDelayMs?: number\n outputLineDelayMs?: number\n sequence: TerminalDemoStep[]\n}\n\nexport type TerminalDemoStep =\n | ClearStep\n | OutputStep\n | PauseStep\n | PromptStep\n | TypeStep\n\ninterface TypeStep {\n delay?: number\n text: string\n type: 'type'\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../../src/ui/components/theme-toggle.tsx"],"names":[],"mappings":"AAQA,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CAoDjE;AAED,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-toggle.js","sourceRoot":"","sources":["../../../src/ui/components/theme-toggle.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEnD,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,EAAE,KAAK,EAAoB;IAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAA;IAElC,OAAO,CACL,gCACc,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB,EAClE,SAAS,EAAE,EAAE,CACX,0EAA0E,EAC1E,yDAAyD,EACzD,qBAAqB,EACrB,SAAS,CACV,EACD,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAC,QAAQ,aAEb,eACE,SAAS,EAAC,qCAAqC,EAC/C,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAE,CAAC,EACd,OAAO,EAAC,WAAW,aAEnB,iBAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAI,EAEhC,eAAM,CAAC,EAAC,oHAAoH,GAAG,IAC3H,EAEN,cACE,SAAS,EAAC,sCAAsC,EAChD,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAE,CAAC,EACd,OAAO,EAAC,WAAW,YAEnB,eAAM,CAAC,EAAC,iDAAiD,GAAG,GACxD,EAEN,oCAEE,SAAS,EAAE,EAAE,CACX,2CAA2C,EAC3C,4CAA4C,CAC7C,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GACvD,IACK,CACV,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { useStore } from '@nanostores/react'\n\nimport { cn } from '../../utils'\n\nimport { $lightMode, toggleLens } from './overlays'\n\nexport function ThemeToggle({ className, style }: ThemeToggleProps) {\n const light = useStore($lightMode)\n\n return (\n <button\n aria-label={light ? 'Switch to dark mode' : 'Switch to light mode'}\n className={cn(\n 'relative flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full',\n 'border border-current/25 bg-current/8 transition-colors',\n 'hover:bg-current/15',\n className\n )}\n onClick={toggleLens}\n style={style}\n type=\"button\"\n >\n <svg\n className=\"absolute left-1 size-3.5 opacity-40\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <circle cx={12} cy={12} r={5} />\n\n <path d=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\" />\n </svg>\n\n <svg\n className=\"absolute right-1 size-3.5 opacity-40\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </svg>\n\n <span\n aria-hidden\n className={cn(\n 'bg-midground absolute size-4 rounded-full',\n 'transition-transform duration-200 ease-out'\n )}\n style={{ transform: `translateX(${light ? 2 : 22}px)` }}\n />\n </button>\n )\n}\n\ninterface ThemeToggleProps {\n className?: string\n style?: React.CSSProperties\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tier-card.d.ts","sourceRoot":"","sources":["../../../src/ui/components/tier-card.tsx"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,OAAO,EACP,SAAS,EACT,KAAK,EACL,SAAiB,EACjB,QAAQ,EACR,OAAO,EACP,KAAK,EACL,QAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,KAAK,EACN,EAAE,aAAa,2CAqHf;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAA;IACf,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,6CAA6C;IAC7C,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,2GAA2G;IAC3G,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,aAAa,CAAA;IACpB,gGAAgG;IAChG,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2EAA2E;IAC3E,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IACnD,4BAA4B;IAC5B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;CACvB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tier-card.js","sourceRoot":"","sources":["../../../src/ui/components/tier-card.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,KAAK,EACL,OAAO,EACP,SAAS,EACT,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,QAAQ,EACR,OAAO,EACP,KAAK,EACL,QAAQ,GAAG,KAAK,EAChB,IAAI,EACJ,YAAY,EACZ,KAAK,EACS;IACd,OAAO,CACL,kBACE,SAAS,EAAE,EAAE,CACX,6EAA6E,EAC7E,0CAA0C,EAC1C,QAAQ,IAAI,qBAAqB,EACjC,SAAS,IAAI,CAAC,QAAQ,IAAI,qBAAqB,EAC/C,SAAS,CACV,EACD,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAC,QAAQ,aAEb,oCAEE,SAAS,EAAE,EAAE,CACX,4CAA4C,EAC5C,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,mCAAmC,CAC/D,GACD,EAEF,eACE,SAAS,EAAC,6DAA6D,EACvE,KAAK,EAAE,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAE/C,KAAC,eAAe,IACd,MAAM,EAAE,QAAQ,EAChB,GAAG,EAAE,KAAK,EACV,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,YAAY,GAC1B,EAED,OAAO,IAAI,CACV,cACE,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAC1D,CACH,EAED,eAAK,SAAS,EAAC,8EAA8E,aAC3F,eAAK,SAAS,EAAC,uBAAuB,aACpC,MAAC,UAAU,IAAC,OAAO,EAAC,IAAI,EACtB,SAAS,EAAE,EAAE,CACX,6DAA6D,EAC7D,mBAAmB,EACnB,QAAQ,IAAI,gBAAgB,CAC7B,EACD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,aAE7D,KAAK,EACL,KAAK,IAAI,eAAM,SAAS,EAAC,iBAAiB,YAAE,KAAK,GAAQ,IAC/C,EAEZ,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CACjB,8BACE,MAAC,UAAU,IACT,SAAS,EAAC,+EAA+E,EACzF,QAAQ,QACR,KAAK,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,aAEtC,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,eAAe,IAAI,CACxB,eAAM,SAAS,EAAC,aAAa,YAC1B,KAAK,CAAC,eAAe,GACjB,CACR,IACU,EAEb,MAAC,UAAU,IACT,SAAS,EAAC,iEAAiE,EAC3E,QAAQ,QACR,KAAK,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,aAEtC,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,aAAa,IAAI,CACtB,gBAAM,SAAS,EAAC,wBAAwB,aACrC,GAAG,EACH,KAAK,CAAC,aAAa,IACf,CACR,IACU,IACZ,CACJ,CAAC,CAAC,CAAC,CACF,MAAC,UAAU,IACT,SAAS,EAAC,iEAAiE,EAC3E,QAAQ,QACR,KAAK,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,aAEtC,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,aAAa,IAAI,CACtB,eAAM,SAAS,EAAC,wBAAwB,YACrC,KAAK,CAAC,aAAa,GACf,CACR,IACU,CACd,IACG,EAEL,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,aAAI,SAAS,EAAC,qBAAqB,YAChC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,cACE,SAAS,EAAE,EAAE,CACX,iEAAiE,EACjE,yCAAyC,CAC1C,wBAGE,MAAM,KAFJ,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAGzC,CACN,CAAC,GACC,CACN,IACG,IACF,IACC,CACV,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { cn } from '../../utils'\n\nimport { ImageDistortion } from './image-distortion'\nimport { Typography } from './typography'\nimport { Small } from './typography/small'\n\n/**\n * Selectable tier / pricing card. Full-bleed distorted image background,\n * readable overlay text, and an animated `.arc-border` shimmer on the\n * selected state. Fully presentational — the consumer owns the data\n * (tier schema, price formatting, tier imagery / tints).\n *\n * Visual states:\n * - `selected`: brightens the distortion, activates `.arc-border`, and\n * composites the headline / price with `mix-blend-mode: plus-lighter`\n * so the text lifts off the image regardless of tint.\n * - `isCurrent`: subtle midground-tinted border hint (suppressed when\n * `selected` wins).\n * - `overlay`: optional top-layer color blended with `mix-blend-mode:\n * color` — used for the \"highest tier\" red treatment on top of any\n * base tint.\n */\nexport function TierCard({\n badge,\n bullets,\n className,\n image,\n isCurrent = false,\n onSelect,\n overlay,\n price,\n selected = false,\n tint,\n tintStrength,\n title\n}: TierCardProps) {\n return (\n <button\n className={cn(\n 'group relative flex w-full cursor-pointer flex-col border border-current/20',\n 'text-left transition-colors duration-300',\n selected && 'border-midground/60',\n isCurrent && !selected && 'border-midground/30',\n className\n )}\n onClick={onSelect}\n type=\"button\"\n >\n <span\n aria-hidden\n className={cn(\n 'arc-border transition-opacity duration-200',\n selected ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'\n )}\n />\n\n <div\n className=\"relative aspect-[3/4] min-h-0 w-full flex-1 overflow-hidden\"\n style={{ backgroundColor: 'var(--background)' }}\n >\n <ImageDistortion\n active={selected}\n src={image}\n tint={tint}\n tintStrength={tintStrength}\n />\n\n {overlay && (\n <div\n className=\"pointer-events-none absolute inset-0\"\n style={{ backgroundColor: overlay, mixBlendMode: 'color' }}\n />\n )}\n\n <div className=\"pointer-events-none absolute inset-0 z-[1] flex flex-col justify-between p-3\">\n <div className=\"flex flex-col gap-0.5\">\n <Typography variant=\"sm\" \n className={cn(\n 'block drop-shadow-[0_1px_2px_rgba(0,0,0,0.5)] text-[1.2rem]',\n 'transition-colors',\n selected && 'text-midground'\n )}\n style={selected ? { mixBlendMode: 'plus-lighter' } : undefined}\n >\n {title}\n {badge && <span className=\"ml-1 opacity-50\">{badge}</span>}\n </Typography>\n\n {price.secondary ? (\n <>\n <Typography\n className=\"block text-md line-through opacity-50 drop-shadow-[0_1px_3px_rgba(0,0,0,0.6)]\"\n expanded\n style={{ mixBlendMode: 'plus-lighter' }}\n >\n {price.secondary}\n {price.secondarySuffix && (\n <span className=\"text-[1rem]\">\n {price.secondarySuffix}\n </span>\n )}\n </Typography>\n\n <Typography\n className=\"block text-xl font-bold drop-shadow-[0_1px_3px_rgba(0,0,0,0.6)]\"\n expanded\n style={{ mixBlendMode: 'plus-lighter' }}\n >\n {price.primary}\n {price.primarySuffix && (\n <span className=\"text-[1rem] opacity-60\">\n {' '}\n {price.primarySuffix}\n </span>\n )}\n </Typography>\n </>\n ) : (\n <Typography\n className=\"block text-xl font-bold drop-shadow-[0_1px_3px_rgba(0,0,0,0.6)]\"\n expanded\n style={{ mixBlendMode: 'plus-lighter' }}\n >\n {price.primary}\n {price.primarySuffix && (\n <span className=\"text-[1rem] opacity-60\">\n {price.primarySuffix}\n </span>\n )}\n </Typography>\n )}\n </div>\n\n {bullets.length > 0 && (\n <ul className=\"flex flex-col gap-1\">\n {bullets.map((bullet, i) => (\n <li\n className={cn(\n 'font-courier text-[1rem] leading-tight tracking-tight uppercase',\n 'drop-shadow-[0_1px_2px_rgba(0,0,0,0.5)]',\n )}\n key={typeof bullet === 'string' ? bullet : i}\n >\n · {bullet}\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n </button>\n )\n}\n\nexport interface TierCardPrice {\n /** Headline price, e.g. `\"$20\"` or `\"Free\"`. */\n primary: string\n /** Small suffix rendered after `primary`, e.g. `\"/mo\"` or `\"first payment\"`. */\n primarySuffix?: string\n /** Optional struck-through comparison price rendered above `primary`, e.g. `\"$30\"`. */\n secondary?: string\n /** Small suffix rendered after `secondary`. */\n secondarySuffix?: string\n}\n\nexport interface TierCardProps {\n /** Small annotation after the title, e.g. `\"(current)\"`. */\n badge?: React.ReactNode\n /** Feature list rendered under the price. */\n bullets: React.ReactNode[]\n className?: string\n /** Background image URL. */\n image: string\n /** Applies the \"current plan\" border hint when not `selected`. */\n isCurrent?: boolean\n onSelect?: () => void\n /** Color blended with `mix-blend-mode: color` over the image (used for the highest-tier red treatment). */\n overlay?: string\n price: TierCardPrice\n /** Applies selected chrome (arc-border shimmer, active distortion, plus-lighter text blend). */\n selected?: boolean\n /** Shader tint passed through to `ImageDistortion`. */\n tint?: string\n /** Active / inactive tint strength passed through to `ImageDistortion`. */\n tintStrength?: { active: number; inactive: number }\n /** Tier name / headline. */\n title: React.ReactNode\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tv.d.ts","sourceRoot":"","sources":["../../../src/ui/components/tv.tsx"],"names":[],"mappings":"AA2NA,wBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAqCvD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tv.js","sourceRoot":"","sources":["../../../src/ui/components/tv.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { useEffect, useRef } from 'react'\n\nconst VERT = /* glsl */ `attribute vec2 a;void main(){gl_Position=vec4(a,0,1);}`\n\nconst FRAG = /* glsl */ `precision highp float;\nuniform float t;\nuniform vec2 r;\n\nconst float FBM_STR = .08;\n\nfloat h(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }\n\nfloat n2(vec2 p) {\n vec2 i = floor(p), f = fract(p);\n f = f * f * (3. - 2. * f);\n\n return mix(\n mix(h(i), h(i + vec2(1, 0)), f.x),\n mix(h(i + vec2(0, 1)), h(i + vec2(1, 1)), f.x),\n f.y\n );\n}\n\nfloat fbm(vec2 p) {\n float v = 0., a = .5;\n\n for (int i = 0; i < 4; i++) {\n v += a * n2(p);\n p *= 2.1;\n a *= .45;\n }\n\n return v;\n}\n\nfloat drift(float speed, float s) {\n return fract(t * speed + s + .02 * sin(t * .4 + s * 3.));\n}\n\nfloat brushAt(vec2 uv, float y, float th, float s) {\n float hw = .34 + .08 * h(vec2(s, 77.));\n float cx = .5;\n float xn = (uv.x - (cx - hw)) / (2. * hw);\n float env = smoothstep(0., .03, xn) * smoothstep(1., .97, xn);\n float localTh = th * env;\n\n if (localTh < .002) return 0.;\n\n float morph = floor(t * 8.) * .7 + s;\n float top = y - localTh * .5 + fbm(vec2(uv.x * 6., morph)) * FBM_STR;\n float bot = y + localTh * .5 - fbm(vec2(uv.x * 6., morph + 30.)) * FBM_STR;\n float x0 = cx - hw + fbm(vec2(uv.y * 8., morph + 60.)) * FBM_STR;\n float x1 = cx + hw - fbm(vec2(uv.y * 8., morph + 90.)) * FBM_STR;\n\n float dMin = min(min(uv.y - top, bot - uv.y), min(uv.x - x0, x1 - uv.x));\n\n float bristle = n2(vec2(uv.x * 60., uv.y * 8. + s)) * .4\n + n2(vec2(uv.x * 25., (uv.y - y) * 120. + s)) * .35\n + n2(vec2(uv.x * 90., uv.y * 3. + s * 2.)) * .25;\n\n float eaten = smoothstep(.03, 0., dMin) * (1. - smoothstep(.2, .5, bristle));\n\n return clamp(smoothstep(0., .003, dMin) * (1. - eaten), 0., 1.);\n}\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / r;\n uv = vec2(uv.x * cos(.095) - uv.y * sin(.095), uv.x * sin(.095) + uv.y * cos(.095));\n uv += vec2(fbm(uv * 4. + t * .06), fbm(uv * 4. + 8. + t * .05)) * .012;\n\n vec3 c = vec3(.992, .992, .051);\n\n float smScroll = -drift(.04, 5.) * 2.;\n float sm = 0.;\n\n for (int i = 0; i < 20; i++) {\n sm = max(sm, brushAt(uv, mod(float(i) * .1 + smScroll, 2.) - .5, .04, float(i) + 10.));\n }\n\n float d1 = drift(.15, 1.), d2 = drift(.15, 1.37), d3 = drift(.15, 1.58), d4 = drift(.15, 1.82);\n float big = max(\n max(brushAt(uv, 1.1 - d1 * 1.4, .28, 1.), brushAt(uv, 1.1 - d2 * 1.4, .18, 2.)),\n max(brushAt(uv, 1.1 - d3 * 1.4, .3, 3.), brushAt(uv, 1.1 - d4 * 1.4, .15, 4.))\n );\n\n c = mix(c, vec3(0.), clamp(max(sm, big), 0., 1.));\n c *= .94 + .06 * sin(uv.y * r.y * 6.283);\n\n vec2 raw = gl_FragCoord.xy / r;\n float dx = min(raw.x - .22, .90 - raw.x);\n float dy = min(raw.y - .29, .86 - raw.y);\n float cycle = floor(t * .4);\n float edge = mix(smoothstep(.22, 0., max(min(dx, dy), 0.)), 1., step(.75, h(vec2(cycle, 13.))))\n * smoothstep(.85, 1., sin(t * 2.5) * .5 + .5)\n * (.7 + .3 * h(vec2(cycle, 7.)));\n\n float scanY = floor(gl_FragCoord.y);\n float rowNoise = h(vec2(scanY, floor(t * 30.)));\n c *= 1. - edge * max(step(.45, rowNoise), step(.3, h(vec2(gl_FragCoord.x + scanY * 7., floor(t * 45.)))) * step(.2, rowNoise));\n\n gl_FragColor = vec4(clamp(c, 0., 1.), 1.);\n}`\n\nfunction useGL(ref: React.RefObject<HTMLCanvasElement | null>) {\n const raf = useRef(0)\n\n useEffect(() => {\n const c = ref.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 sh = (type: number, src: string) => {\n const s = gl.createShader(type)!\n gl.shaderSource(s, src)\n gl.compileShader(s)\n\n return s\n }\n\n const p = gl.createProgram()!\n gl.attachShader(p, sh(gl.VERTEX_SHADER, VERT))\n gl.attachShader(p, sh(gl.FRAGMENT_SHADER, FRAG))\n gl.linkProgram(p)\n gl.useProgram(p)\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(p, 'a')\n gl.enableVertexAttribArray(a)\n gl.vertexAttribPointer(a, 2, gl.FLOAT, false, 0, 0)\n\n const uT = gl.getUniformLocation(p, 't')\n const uR = gl.getUniformLocation(p, 'r')\n\n const resize = () => {\n const rect = c.getBoundingClientRect()\n const dpr = Math.min(devicePixelRatio, 2)\n\n c.width = rect.width * dpr\n c.height = rect.height * dpr\n\n gl.viewport(0, 0, c.width, c.height)\n }\n\n resize()\n\n const ro = new ResizeObserver(resize)\n ro.observe(c)\n\n const t0 = performance.now()\n\n let visible = !document.hidden\n let inView = true\n let raf2 = 0\n\n const tick = () => {\n gl.uniform1f(uT, (performance.now() - t0) / 1e3)\n gl.uniform2f(uR, c.width, c.height)\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n raf2 = requestAnimationFrame(tick)\n }\n\n const start = () => {\n if (visible && inView && !raf2) {\n raf2 = requestAnimationFrame(tick)\n }\n }\n\n const stop = () => {\n if (raf2) {\n cancelAnimationFrame(raf2)\n raf2 = 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 raf.current = raf2\n\n return () => {\n stop()\n io.disconnect()\n document.removeEventListener('visibilitychange', onVisibility)\n ro.disconnect()\n }\n }, [ref])\n}\n\nexport function TV({ className }: { className?: string }) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n useGL(canvasRef)\n\n return (\n <div className={['relative', className].filter(Boolean).join(' ')}>\n <svg className=\"relative h-full w-full\" fill=\"none\" viewBox=\"0 0 210 173\">\n <path\n d=\"M30.8342 2.44471 6.08268 36.683c-.24437.338-.38254.7412-.39689 1.158L1.57754 157.126c-.03891 1.129.82339 2.087 1.95096 2.167l162.4835 11.463c.433.031.866-.074 1.238-.3l35.718-21.69c.607-.369.986-1.02 1.008-1.73l4.102-130.9871c.035-1.1269-.826-2.0806-1.951-2.1604L32.6847 1.58029c-.7248-.05144-1.4247.27551-1.8505.86442Z\"\n fill=\"#FDFD0D\"\n stroke=\"#FDFD0D\"\n strokeWidth=\"3.15\"\n />\n\n <path\n d=\"M203.09 17.1483 35.6844 5.83395l-4.2 121.94805 168.4906 13.076z\"\n fill=\"#000\"\n stroke=\"#FDFD0D\"\n strokeWidth=\"4.2\"\n />\n\n <path\n d=\"M190.491 29.7483 48.2859 18.434l-4.2 98.848 143.2901 10.976z\"\n fill=\"#FDFD0D\"\n />\n </svg>\n\n <canvas\n className=\"absolute inset-0 h-full w-full\"\n ref={canvasRef}\n style={{\n clipPath:\n 'polygon(23% 10.65%, 90.71% 17.2%, 89.23% 74.13%, 20.99% 67.79%)'\n }}\n />\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"h1.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/typography/h1.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,EAAE;;;;;;;;;;8QAWd,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"h1.js","sourceRoot":"","sources":["../../../../src/ui/components/typography/h1.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAElC,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAEnC,OAAO,EAAE,UAAU,EAAwB,MAAM,GAAG,CAAA;AAEpD,MAAM,CAAC,MAAM,EAAE,GAAG,UAAU,CAC1B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAC/B,OAAO,CACL,KAAC,UAAU,IACT,EAAE,EAAC,IAAI,EACP,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EACrC,OAAO,EAAC,IAAI,EACN,GAAG,EAAE,GAAG,KAAK,GACnB,CACH,CAAA;AACH,CAAC,CACF,CAAA","sourcesContent":["import { forwardRef } from 'react'\n\nimport { cn } from '../../../utils'\n\nimport { Typography, type TypographyProps } from '.'\n\nexport const H1 = forwardRef<HTMLHeadingElement, TypographyProps<'h1'>>(\n ({ className, ...props }, ref) => {\n return (\n <Typography\n as=\"h1\"\n className={cn('font-bold', className)}\n variant=\"xl\"\n {...{ ref, ...props }}\n />\n )\n }\n)\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"h2.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/typography/h2.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,EAAE;;;;;;;;;;8QAWd,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"h2.js","sourceRoot":"","sources":["../../../../src/ui/components/typography/h2.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAElC,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAEnC,OAAO,EAAE,UAAU,EAAwB,MAAM,GAAG,CAAA;AAEpD,MAAM,CAAC,MAAM,EAAE,GAAG,UAAU,CAC1B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAC/B,OAAO,CACL,KAAC,UAAU,IACT,EAAE,EAAC,IAAI,EACP,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EACrC,OAAO,EAAC,IAAI,EACN,GAAG,EAAE,GAAG,KAAK,GACnB,CACH,CAAA;AACH,CAAC,CACF,CAAA","sourcesContent":["import { forwardRef } from 'react'\n\nimport { cn } from '../../../utils'\n\nimport { Typography, type TypographyProps } from '.'\n\nexport const H2 = forwardRef<HTMLHeadingElement, TypographyProps<'h2'>>(\n ({ className, ...props }, ref) => {\n return (\n <Typography\n as=\"h2\"\n className={cn('font-bold', className)}\n variant=\"lg\"\n {...{ ref, ...props }}\n />\n )\n }\n)\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/typography/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAM,KAAK,SAAS,EAAW,MAAM,gBAAgB,CAAA;AAE5D,QAAA,MAAM,kBAAkB;;;;;;;;8EAetB,CAAA;AAEF,eAAO,MAAM,UAAU,oDAwBtB,CAAA;AAED,KAAK,QAAQ,GAAG,YAAY,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEvD,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,MAAM,IAAI,SAAS,CAC3E,CAAC,EACD,QAAQ,CACT,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/components/typography/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAErC,OAAO,EAAE,EAAE,EAAkB,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAE5D,MAAM,kBAAkB,GAAG,GAAG,CAAC,WAAW,EAAE;IAC1C,QAAQ,EAAE;QACR,UAAU,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;QACvC,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;QACjC,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;QACnC,QAAQ,EAAE,EAAE,IAAI,EAAE,oCAAoC,EAAE;QACxD,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3B,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3B,OAAO,EAAE;YACP,EAAE,EAAE,kDAAkD;YACtD,EAAE,EAAE,kDAAkD;YACtD,EAAE,EAAE,kDAAkD;YACtD,EAAE,EAAE,+CAA+C;SACpD;KACF;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAC/B,CACE,EACE,EAAE,EACF,SAAS,EACT,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,GAAG,IAAI,EACR,EACD,GAAG,EACH,EAAE;IACF,MAAM,KAAK,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC/D,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;IAE3E,OAAO,aAAa,CAAC,CAAC,EAAE,IAAI,MAAM,CAAsB,EAAE;QACxD,GAAG,IAAI;QACP,SAAS,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC;QACzE,GAAG;KACJ,CAAC,CAAA;AACJ,CAAC,CACF,CAAA","sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority'\nimport { createElement } from 'react'\n\nimport { cn, type PolyProps, polyRef } from '../../../utils'\n\nconst typographyVariants = cva('font-sans', {\n variants: {\n compressed: { true: 'font-compressed' },\n courier: { true: 'font-courier' },\n expanded: { true: 'font-expanded' },\n mondwest: { true: 'font-mondwest tracking-[0.1875rem]' },\n mono: { true: 'font-mono' },\n sans: { true: 'font-sans' },\n variant: {\n lg: 'text-[2.625rem] leading-[1] tracking-[0.0525rem]',\n md: 'text-[2.625rem] leading-[1] tracking-[0.0525rem]',\n sm: 'leading-1.4 text-[.9375rem] tracking-[0.1875rem]',\n xl: 'text-[4.5rem] leading-[1] tracking-[0.135rem]'\n }\n }\n})\n\nexport const Typography = polyRef<'span', OwnProps>(\n (\n {\n as,\n className,\n compressed,\n courier,\n expanded,\n mondwest,\n mono,\n variant,\n ...rest\n },\n ref\n ) => {\n const fonts = { compressed, courier, expanded, mondwest, mono }\n const fontVariant = { ...fonts, sans: !Object.values(fonts).some(Boolean) }\n\n return createElement((as ?? 'span') as React.ElementType, {\n ...rest,\n className: cn(typographyVariants({ ...fontVariant, variant }), className),\n ref\n })\n }\n)\n\ntype OwnProps = VariantProps<typeof typographyVariants>\n\nexport type TypographyProps<T extends React.ElementType = 'span'> = PolyProps<\n T,\n OwnProps\n>\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"legend.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/typography/legend.tsx"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,WAAW,2CAQb;AAED,UAAU,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;IAC1D,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACtB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"legend.js","sourceRoot":"","sources":["../../../../src/ui/components/typography/legend.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,MAAM,UAAU,MAAM,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACI;IACZ,OAAO,CACL,kBAAQ,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,KAAM,KAAK,aAChE,KAAC,KAAK,cAAE,KAAK,GAAS,EACrB,GAAG,IAAI,MAAC,KAAK,IAAC,SAAS,EAAC,YAAY,mBAAI,GAAG,IAAS,EACpD,QAAQ,IACF,CACV,CAAA;AACH,CAAC","sourcesContent":["import { cn } from '../../../utils'\n\nimport { Small } from './small'\n\nexport function Legend({\n children,\n className,\n label,\n sub,\n ...props\n}: LegendProps) {\n return (\n <hgroup className={cn('flex flex-col gap-2', className)} {...props}>\n <Small>{label}</Small>\n {sub && <Small className=\"opacity-50\">- {sub}</Small>}\n {children}\n </hgroup>\n )\n}\n\ninterface LegendProps extends React.ComponentProps<'hgroup'> {\n label: React.ReactNode\n sub?: React.ReactNode\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"small.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/typography/small.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,GAAG,CAAA;AAEpD,eAAO,MAAM,KAAK,+HAMjB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"small.js","sourceRoot":"","sources":["../../../../src/ui/components/typography/small.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAElC,OAAO,EAAE,UAAU,EAAwB,MAAM,GAAG,CAAA;AAEpD,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAC7B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACb,OAAO,CACL,KAAC,UAAU,IAAC,EAAE,EAAC,OAAO,EAAC,QAAQ,QAAC,OAAO,EAAC,IAAI,EAAO,GAAG,EAAE,GAAG,KAAK,GAAM,CACvE,CAAA;AACH,CAAC,CACF,CAAA","sourcesContent":["import { forwardRef } from 'react'\n\nimport { Typography, type TypographyProps } from '.'\n\nexport const Small = forwardRef<HTMLSpanElement, TypographyProps<any>>(\n (props, ref) => {\n return (\n <Typography as=\"small\" mondwest variant=\"sm\" {...{ ref, ...props }} />\n )\n }\n)\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"watchlist.d.ts","sourceRoot":"","sources":["../../../src/ui/components/watchlist.tsx"],"names":[],"mappings":"AAWA,wBAAgB,SAAS,CAAC,EACxB,SAAS,EACT,OAAe,EACf,KAAK,EACL,QAAgB,EAChB,GAAG,KAAK,EACT,EAAE,cAAc,2CAiFhB;AAED,UAAU,cAAe,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"watchlist.js","sourceRoot":"","sources":["../../../src/ui/components/watchlist.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,MAAM,GAAG,qBAAqB,CAAA;AACpC,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAEhF,MAAM,UAAU,SAAS,CAAC,EACxB,SAAS,EACT,OAAO,GAAG,KAAK,EACf,KAAK,EACL,QAAQ,GAAG,KAAK,EAChB,GAAG,KAAK,EACO;IACf,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,KAAM,KAAK,YAC5D,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAA;YACvC,MAAM,GAAG,GAAG,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACvC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAgB,CAAA;YAEtD,OAAO,CACL,aACE,SAAS,EAAE,EAAE,CACX,yCAAyC,EACzC,yBAAyB,EACzB,2DAA2D,EAC3D,8CAA8C,EAC9C,6BAA6B,CAC9B,EACD,IAAI,EAAE,GAAG,EAET,GAAG,EAAC,qBAAqB,EACzB,KAAK,EAAE;oBACL,UAAU,EAAE,8CAA8C,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,iBAAiB;oBACtG,mBAAmB,EAAE;wBACnB,OAAO,IAAI,WAAW;wBACtB,KAAK;wBACL,KAAK,IAAI,MAAM;wBACf,GAAG,IAAI,WAAW;qBACnB;yBACE,MAAM,CAAC,OAAO,CAAC;yBACf,IAAI,CAAC,GAAG,CAAC;iBACb,EACD,MAAM,EAAC,QAAQ,aAEd,OAAO,IAAI,CACV,8BACE,KAAC,UAAU,IACT,SAAS,EAAC,sCAAsC,EAChD,UAAU,kBAET,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GACpB,EAEb,eAAM,SAAS,EAAC,wDAAwD,kBAEjE,IACN,CACJ,EAEA,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,UAAU,IACT,SAAS,EAAC,6DAA6D,KACnE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,YAEhD,QAAQ,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAC,CAAC,IAAI,GAC/C,CACd,CAAC,CAAC,CAAC,CACF,KAAK,CACN,EAEA,KAAK,IAAI,CACR,KAAC,UAAU,IACT,SAAS,EAAC,+CAA+C,EACzD,IAAI,kBAEH,KAAK,GACK,CACd,EAEA,GAAG,IAAI,CACN,8BACE,eAAM,SAAS,EAAC,8CAA8C,kBAEvD,EACP,KAAC,QAAQ,IAAC,SAAS,EAAC,yBAAyB,GAAG,IAC/C,CACJ,KAzDI,CAAC,CA0DJ,CACL,CAAA;QACH,CAAC,CAAC,GACE,CACP,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport { cn } from '../../utils'\n\nimport { Scramble } from './ascii'\nimport { LinkIcon } from './icons'\nimport { Typography } from './typography'\n\nconst ETH_RE = /^0x[a-fA-F0-9]{40}$/\nconst truncate = (a: string) => `${a.slice(0, 6)}${'·'.repeat(8)}${a.slice(-4)}`\n\nexport function Watchlist({\n className,\n counter = false,\n items,\n scramble = false,\n ...props\n}: WatchlistProps) {\n return (\n <div className={cn('flex flex-col gap-3', className)} {...props}>\n {items.map(({ label, right, url }, i) => {\n const isStr = typeof label === 'string'\n const eth = isStr && ETH_RE.test(label)\n const text = eth ? truncate(label) : (label as string)\n\n return (\n <a\n className={cn(\n 'grid items-center gap-2.5 px-2.5 py-1.5',\n 'leading-[1.4] uppercase',\n 'hover:bg-midground/10! hover:ring-2 hover:ring-current/20',\n 'transition-all duration-500 hover:duration-0',\n 'opacity-(--midground-alpha)'\n )}\n href={url}\n key={i}\n rel=\"noopener noreferrer\"\n style={{\n background: `color-mix(in oklch, var(--color-midground) ${10 * Math.max(0, 1 - i / 9)}%, transparent)`,\n gridTemplateColumns: [\n counter && 'auto auto',\n '1fr',\n right && 'auto',\n url && 'auto auto'\n ]\n .filter(Boolean)\n .join(' ')\n }}\n target=\"_blank\"\n >\n {counter && (\n <>\n <Typography\n className=\"text-lg tracking-[0.35em] opacity-40\"\n compressed\n >\n {String(i + 1).padStart(2, '0')}\n </Typography>\n\n <span className=\"text-[0.8125rem] font-bold tracking-[0.4em] opacity-20\">\n :\n </span>\n </>\n )}\n\n {isStr ? (\n <Typography\n className=\"min-w-0 overflow-hidden text-lg font-bold tracking-[0.35em]\"\n {...(eth ? { mono: true } : { compressed: true })}\n >\n {scramble ? <Scramble delay={i * 80} text={text} /> : text}\n </Typography>\n ) : (\n label\n )}\n\n {right && (\n <Typography\n className=\"text-right text-sm tracking-widest opacity-40\"\n mono\n >\n {right}\n </Typography>\n )}\n\n {url && (\n <>\n <span className=\"text-[0.8125rem] tracking-[0.4em] opacity-20\">\n :\n </span>\n <LinkIcon className=\"text-midground size-3.5\" />\n </>\n )}\n </a>\n )\n })}\n </div>\n )\n}\n\ninterface WatchlistProps extends React.ComponentProps<'div'> {\n counter?: boolean\n items: { label?: React.ReactNode; right?: React.ReactNode; url?: string }[]\n scramble?: boolean\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../src/ui/footer.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAW/D,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,MAAuB,EACvB,aAAmB,EACnB,OAAO,EACP,YAAwB,EACxB,KAAK,EACL,UAAoB,EACpB,WAAmB,EACpB,EAAE,WAAW,2CA+Db;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAA;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;IACtB,aAAa,CAAC,EAAE,KAAK,CAAC,WAAW,CAAA;IACjC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../src/ui/footer.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { useRef } from 'react'\n\nimport { useCssVarDims } from '../hooks/use-css-var-dims'\nimport { Cell, Grid } from './components/grid'\nimport { Socials, type SocialLink } from './components/socials'\nimport { ThemeToggle } from './components/theme-toggle'\nimport { Small } from './components/typography/small'\n\nconst DEFAULT_GROUPS: FooterGroup[] = [\n { label: 'Product', links: ['Overview', 'Features', 'Pricing'] },\n { label: 'Resources', links: ['Docs', 'Blog', 'Support'] },\n { label: 'Company', links: ['About', 'Careers', 'Contact'] },\n { label: 'Legal', links: ['Privacy', 'Terms', 'License'] }\n]\n\nexport function Footer({\n className,\n groups = DEFAULT_GROUPS,\n LinkComponent = 'a',\n socials,\n socialsLabel = 'Socials',\n style,\n themeLabel = 'Theme',\n themeToggle = false\n}: FooterProps) {\n const ref = useRef<HTMLElement>(null)\n useCssVarDims('footer', ref)\n\n const hasSocials = (socials?.length ?? 0) > 0\n const hasChrome = hasSocials || themeToggle\n\n return (\n <footer className={className} ref={ref} style={style}>\n <Grid>\n <Cell>\n <Small className=\"opacity-50\">&copy;{new Date().getFullYear()}</Small>\n </Cell>\n\n {groups.map(({ label, links }) => (\n <Cell key={label}>\n <Small className=\"opacity-50\">{label}</Small>\n\n <nav className=\"mt-3 flex flex-col gap-2\">\n {links.map(link => {\n const href = typeof link === 'string'\n ? `/${link.toLowerCase()}`\n : link.href\n\n const label = typeof link === 'string' ? link : link.label\n\n return (\n <Small\n as={LinkComponent}\n className=\"underline\"\n href={href}\n key={label}\n >\n {label}\n </Small>\n )\n })}\n </nav>\n </Cell>\n ))}\n </Grid>\n\n {hasChrome && (\n <Grid>\n {hasSocials && (\n <Cell className=\"flex items-start justify-between\">\n <Small className=\"opacity-50\">{socialsLabel}</Small>\n\n <Socials items={socials!} />\n </Cell>\n )}\n\n {themeToggle && (\n <Cell className=\"flex items-start justify-between\">\n <Small className=\"opacity-50\">{themeLabel}</Small>\n\n <ThemeToggle />\n </Cell>\n )}\n </Grid>\n )}\n </footer>\n )\n}\n\nexport interface FooterGroup {\n label: string\n links: (FooterLink | string)[]\n}\n\nexport interface FooterLink {\n href: string\n label: string\n}\n\nexport interface FooterProps {\n className?: string\n groups?: FooterGroup[]\n LinkComponent?: React.ElementType\n socials?: SocialLink[]\n socialsLabel?: string\n style?: React.CSSProperties\n themeLabel?: string\n themeToggle?: boolean\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../src/ui/header.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAoB/D,wBAAgB,MAAM,CAAC,EACrB,KAAqB,EACrB,SAAe,EACf,SAAS,EACT,gBAAgB,EAChB,KAAqB,EACrB,aAAmB,EACnB,QAAQ,EAAE,YAAmB,EAC7B,OAAO,EACP,YAAwB,EACxB,KAAK,EACL,UAAoB,EACpB,WAAmB,EACpB,EAAE,WAAW,2CAmJb;AAsJD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAA;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IACtC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,KAAK,CAAC,WAAW,CAAA;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,UAAU,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/ui/header.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { AnimatePresence, motion } from 'motion/react'\nimport { createElement, useCallback, useRef, useState } from 'react'\n\nimport { useCssVarDims } from '../hooks/use-css-var-dims'\nimport { useGpuTier } from '../hooks/use-gpu-tier'\nimport { cn } from '../utils'\n\nimport { Blink } from './components/blink'\nimport { Cell, Grid } from './components/grid'\nimport { HoverBg } from './components/hover-bg'\nimport { HamburgerIcon } from './components/icons/hamburger'\nimport { Scramble } from './components/scramble'\nimport { Socials, type SocialLink } from './components/socials'\nimport { ThemeToggle } from './components/theme-toggle'\nimport { H2 } from './components/typography/h2'\nimport { Small } from './components/typography/small'\n\nconst DEFAULT_BRAND = (\n <hgroup className=\"flex flex-col gap-2\">\n <Small>Nous</Small>\n\n <H2>Research</H2>\n </hgroup>\n)\n\nconst DEFAULT_LINKS: HeaderLink[] = [\n { href: '/projects', label: 'Projects' },\n { href: '/participants', label: 'Participants' },\n { href: '/provenance', label: 'Provenance' },\n { href: '/contribute', label: 'Contribute' }\n]\n\nexport function Header({\n brand = DEFAULT_BRAND,\n brandHref = '/',\n className,\n desktopGridStyle,\n links = DEFAULT_LINKS,\n LinkComponent = 'a',\n scramble: scrambleProp = true,\n socials,\n socialsLabel = 'Socials',\n style,\n themeLabel = 'Theme',\n themeToggle = false\n}: HeaderProps) {\n const ref = useRef<HTMLElement>(null)\n useCssVarDims('header', ref)\n\n // Skip the hover-Scramble rAF loop on tier-0 devices (no GPU / software\n // renderer / `prefers-reduced-motion: reduce`) regardless of the prop.\n const gpuTier = useGpuTier()\n const scramble = scrambleProp && gpuTier > 0\n\n const [open, setOpen] = useState(false)\n const close = useCallback(() => setOpen(false), [])\n\n const hasSocials = (socials?.length ?? 0) > 0\n const hasMobileChrome = themeToggle || hasSocials\n\n return (\n <header className={className} ref={ref} style={style}>\n <Grid\n className=\"hidden border-t border-b lg:grid\"\n style={desktopGridStyle}\n >\n <BrandCell\n brand={brand}\n href={brandHref}\n LinkComponent={LinkComponent}\n />\n\n {links.map(link => (\n <NavCell\n key={link.href}\n link={link}\n LinkComponent={LinkComponent}\n scramble={scramble}\n />\n ))}\n\n {hasSocials && (\n <Cell className=\"flex items-start justify-between\">\n <Small className=\"opacity-50\">{socialsLabel}</Small>\n\n <Socials items={socials!} />\n </Cell>\n )}\n\n {themeToggle && (\n <Cell className=\"flex items-start justify-between\">\n <Small className=\"opacity-50\">{themeLabel}</Small>\n\n <ThemeToggle />\n </Cell>\n )}\n </Grid>\n\n <div\n className={cn(\n 'flex items-center justify-between border border-current/20 p-4',\n 'lg:hidden'\n )}\n >\n <BrandLink\n brand={brand}\n href={brandHref}\n LinkComponent={LinkComponent}\n />\n\n <div className=\"flex items-center gap-3\">\n {themeToggle && <ThemeToggle />}\n\n <button\n aria-label={open ? 'Close menu' : 'Open menu'}\n className=\"relative z-50 cursor-pointer bg-transparent p-2\"\n onClick={() => setOpen(v => !v)}\n type=\"button\"\n >\n <HamburgerIcon open={open} />\n </button>\n </div>\n </div>\n\n <AnimatePresence>\n {open && (\n <motion.div\n animate={{ opacity: 1 }}\n className={cn(\n 'bg-background/95 fixed inset-0 z-50 flex flex-col backdrop-blur-sm',\n 'p-8 lg:hidden'\n )}\n exit={{ opacity: 0 }}\n initial={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col border border-current/20\">\n <div className=\"flex items-center justify-between border-b border-current/20 p-4\">\n <BrandLink\n brand={brand}\n href={brandHref}\n LinkComponent={LinkComponent}\n onClick={close}\n />\n\n <button\n aria-label=\"Close menu\"\n className=\"cursor-pointer bg-transparent p-2\"\n onClick={close}\n type=\"button\"\n >\n <HamburgerIcon open />\n </button>\n </div>\n\n {links.map(link => (\n <MobileNavLink\n key={link.href}\n link={link}\n LinkComponent={LinkComponent}\n onNavigate={close}\n scramble={scramble}\n />\n ))}\n\n {hasMobileChrome && (\n <div className=\"flex items-center gap-3 border-b border-current/20 p-4\">\n {hasSocials && (\n <>\n <Small className=\"opacity-50\">{socialsLabel}</Small>\n\n <Socials items={socials!} onNavigate={close} />\n </>\n )}\n\n {themeToggle && hasSocials && <span className=\"flex-1\" />}\n\n {themeToggle && (\n <>\n <Small className=\"opacity-50\">{themeLabel}</Small>\n\n <ThemeToggle />\n </>\n )}\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </header>\n )\n}\n\nfunction BrandCell({ brand, href, LinkComponent }: BrandSlotProps) {\n return isExternal(href) ? (\n <Cell href={href} {...EXTERNAL_REL} as=\"a\">\n {brand}\n </Cell>\n ) : (\n <Cell as={LinkComponent} href={href}>\n {brand}\n </Cell>\n )\n}\n\nfunction BrandLink({ brand, href, LinkComponent, onClick }: BrandLinkProps) {\n if (isExternal(href)) {\n return (\n <a href={href} onClick={onClick} {...EXTERNAL_REL}>\n {brand}\n </a>\n )\n }\n\n return createElement(\n LinkComponent,\n { href, onClick } as Record<string, unknown>,\n brand\n )\n}\n\nfunction NavCell({ link, LinkComponent, scramble }: NavCellProps) {\n const ref = useRef<HTMLAnchorElement>(null)\n const isExt = link.external ?? isExternal(link.href)\n\n const inner = (\n <>\n <Small>\n {scramble ? (\n <Scramble target={ref}>{link.label}</Scramble>\n ) : (\n link.label\n )}\n\n <Blink />\n </Small>\n\n <HoverBg />\n </>\n )\n\n if (isExt) {\n return (\n <Cell\n as=\"a\"\n className=\"group relative cursor-pointer\"\n href={link.href}\n onClick={link.onClick}\n ref={ref}\n {...EXTERNAL_REL}\n >\n {inner}\n </Cell>\n )\n }\n\n return (\n <Cell\n as={LinkComponent}\n className=\"group relative cursor-pointer\"\n href={link.href}\n onClick={link.onClick}\n ref={ref}\n >\n {inner}\n </Cell>\n )\n}\n\nfunction MobileNavLink({\n link,\n LinkComponent,\n onNavigate,\n scramble\n}: MobileNavLinkProps) {\n const ref = useRef<HTMLAnchorElement>(null)\n const isExt = link.external ?? isExternal(link.href)\n\n const className = cn(\n 'group relative flex cursor-pointer items-center border-b border-current/20 p-4'\n )\n\n const onClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n link.onClick?.(e)\n onNavigate()\n }\n\n const children = (\n <>\n <Small>\n {scramble ? (\n <Scramble target={ref}>{link.label}</Scramble>\n ) : (\n link.label\n )}\n\n <Blink />\n </Small>\n\n <HoverBg />\n </>\n )\n\n if (isExt) {\n return (\n <a\n className={className}\n href={link.href}\n onClick={onClick}\n ref={ref}\n {...EXTERNAL_REL}\n >\n {children}\n </a>\n )\n }\n\n return createElement(\n LinkComponent,\n { className, href: link.href, onClick, ref } as Record<string, unknown>,\n children\n )\n}\n\nconst EXTERNAL_REL = {\n rel: 'noopener noreferrer',\n target: '_blank'\n} as const\n\nconst isExternal = (href: string) => /^(https?:|mailto:|tel:)/i.test(href)\n\ninterface BrandLinkProps extends BrandSlotProps {\n onClick?: React.MouseEventHandler\n}\n\ninterface BrandSlotProps {\n brand: React.ReactNode\n href: string\n LinkComponent: React.ElementType\n}\n\nexport interface HeaderLink {\n external?: boolean\n href: string\n label: string\n onClick?: React.MouseEventHandler\n}\n\nexport interface HeaderProps {\n brand?: React.ReactNode\n brandHref?: string\n className?: string\n /**\n * Inline `style` for the desktop `Grid` only — useful for overriding\n * `grid-template-columns` (e.g. to align with a sidebar track) without\n * affecting the mobile bar or drawer.\n */\n desktopGridStyle?: React.CSSProperties\n links?: HeaderLink[]\n LinkComponent?: React.ElementType\n /**\n * Apply the hover-Scramble effect to nav link labels. Defaults to `true`,\n * automatically suppressed on tier-0 GPUs and when the user has\n * `prefers-reduced-motion: reduce`.\n */\n scramble?: boolean\n /**\n * Optional socials shown in a trailing chrome cell on desktop and in the\n * mobile drawer's chrome row. For nav-heavy products (≥ 5 links) prefer\n * passing socials to `<Footer>` instead — the desktop `Grid` only ships\n * column rules through `grid-cols-6`, so brand + many links + chrome can\n * overflow.\n */\n socials?: SocialLink[]\n socialsLabel?: string\n style?: React.CSSProperties\n themeLabel?: string\n themeToggle?: boolean\n}\n\n/** @deprecated Use `SocialLink` from `@nous-research/ui`. Same shape. */\nexport type HeaderSocial = SocialLink\n\ninterface MobileNavLinkProps {\n link: HeaderLink\n LinkComponent: React.ElementType\n onNavigate: () => void\n scramble: boolean\n}\n\ninterface NavCellProps {\n link: HeaderLink\n LinkComponent: React.ElementType\n scramble: boolean\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"layout-wrapper.d.ts","sourceRoot":"","sources":["../../src/ui/layout-wrapper.tsx"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACT,EAAE,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,2CAQnC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"layout-wrapper.js","sourceRoot":"","sources":["../../src/ui/layout-wrapper.tsx"],"names":[],"mappings":";AAAA,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EAC0B;IAClC,OAAO,CACL,eAAM,IAAI,EAAC,IAAI,YACb,eAAM,SAAS,EAAC,6DAA6D,YAC1E,QAAQ,GACJ,GACF,CACR,CAAA;AACH,CAAC","sourcesContent":["export function LayoutWrapper({\n children\n}: Readonly<React.PropsWithChildren>) {\n return (\n <html lang=\"en\">\n <body className=\"text-midground font-mondwest bg-black uppercase antialiased\">\n {children}\n </body>\n </html>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../src/utils/color.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,aAInC,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,WACY,CAAA;AAEpE,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,WAQrD,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,WACoB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/utils/color.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC;IACvC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE,CAC1D,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;AAEpE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE;IACxD,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEpC,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CACjC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpE,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE,CACvD,sBAAsB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,iBAAiB,CAAA","sourcesContent":["export const hexToRgb = (hex: string) => [\n parseInt(hex.slice(1, 3), 16),\n parseInt(hex.slice(3, 5), 16),\n parseInt(hex.slice(5, 7), 16)\n]\n\nexport const rgbToHex = (r: number, g: number, b: number) =>\n `#${[r, g, b].map(v => v.toString(16).padStart(2, '0')).join('')}`\n\nexport const colorDodge = (base: string, blend: string) => {\n const [br, bg, bb] = hexToRgb(base)\n const [lr, lg, lb] = hexToRgb(blend)\n\n const d = (b: number, l: number) =>\n l === 255 ? 255 : Math.min(255, Math.floor((b * 255) / (255 - l)))\n\n return rgbToHex(d(br, lr), d(bg, lg), d(bb, lb))\n}\n\nexport const colorMix = (color: string, alpha: number) =>\n `color-mix(in srgb, ${color} ${Math.round(alpha * 100)}%, transparent)`\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;AAG5C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAE/D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AACtC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AAEjD,eAAO,MAAM,EAAE,GAAI,GAAG,QAAQ,UAAU,EAAE,WAA0B,CAAA;AAEpE,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,EAAE,YAAO,EAAE,YAAO,WACW,CAAA;AAE5D,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,EAAE,GAAG,MAAM,WAIjE,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,kBAIpC,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,SAAS;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,WACW,CAAA;AAE7E,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,WA6BtC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport sanitize from 'sanitize-html'\nimport { twMerge } from 'tailwind-merge'\nimport * as THREE from 'three'\n\nimport { hexToRgb, rgbToHex } from './color'\nimport { polyRef } from './poly'\nimport type { PolyComponent, PolyProps, PolyRef } from './poly'\n\nexport { hexToRgb, polyRef, rgbToHex }\nexport type { PolyComponent, PolyProps, PolyRef }\n\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs))\n\nexport const clamp = (v: number, min = 0, max = 1) =>\n Math.min(max, Math.max(min, Number.isFinite(v) ? v : min))\n\nexport const smoothstep = (edge0: number, edge1: number, x: number) => {\n const t = clamp((x - edge0) / (edge1 - edge0))\n\n return t * t * (3 - 2 * t)\n}\n\nexport const hexToVec3 = (hex: string) => {\n const [r, g, b] = hexToRgb(hex)\n\n return new THREE.Vector3(r / 255, g / 255, b / 255)\n}\n\nexport const truncate = (text: string, options: { length: number }) =>\n text.length > options.length ? `${text.slice(0, options.length)}...` : text\n\nexport const stripWpStyles = (html: string) =>\n sanitize(html, {\n allowedAttributes: {\n a: ['href', 'target', 'rel', 'name'],\n audio: ['src', 'controls'],\n iframe: ['src', 'width', 'height', 'frameborder', 'allowfullscreen'],\n img: ['src', 'alt', 'width', 'height', 'loading'],\n source: ['src', 'type', 'srcset'],\n td: ['colspan', 'rowspan'],\n th: ['colspan', 'rowspan'],\n video: ['src', 'controls', 'width', 'height', 'poster']\n },\n allowedIframeHostnames: [\n 'www.youtube.com',\n 'youtube.com',\n 'player.vimeo.com'\n ],\n allowedSchemes: ['http', 'https', 'mailto'],\n allowedTags: [\n ...sanitize.defaults.allowedTags,\n 'img',\n 'figure',\n 'figcaption',\n 'iframe',\n 'video',\n 'audio',\n 'source',\n 'picture'\n ]\n })\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"poly.d.ts","sourceRoot":"","sources":["../../src/utils/poly.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,CACnB,CAAC,SAAS,KAAK,CAAC,WAAW,EAC3B,GAAG,SAAS,MAAM,GAAG,MAAM,IACzB;IAAE,EAAE,CAAC,EAAE,CAAC,CAAA;CAAE,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,CAAC,CAAA;AAEhF,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,IAC7C,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;AAEvC,MAAM,MAAM,aAAa,CACvB,CAAC,SAAS,KAAK,CAAC,WAAW,EAC3B,GAAG,SAAS,MAAM,GAAG,MAAM,IACzB,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,CAAC,EAClC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,KAC5C,IAAI,GAAG,KAAK,CAAC,YAAY,CAAA;AAE9B,eAAO,MAAM,OAAO,EAAiB,CACnC,CAAC,SAAS,KAAK,CAAC,WAAW,EAC3B,GAAG,SAAS,MAAM,GAAG,MAAM,EAE3B,MAAM,EAAE,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,CAAC,EACtC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EACxB,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,KACZ,IAAI,GAAG,KAAK,CAAC,YAAY,KAC3B,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"poly.js","sourceRoot":"","sources":["../../src/utils/poly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAiBlC,MAAM,CAAC,MAAM,OAAO,GAAG,UAQG,CAAA","sourcesContent":["import { forwardRef } from 'react'\n\nexport type PolyProps<\n T extends React.ElementType,\n Own extends object = object\n> = { as?: T } & Own & Omit<React.ComponentPropsWithoutRef<T>, 'as' | keyof Own>\n\nexport type PolyRef<T extends React.ElementType> =\n React.ComponentPropsWithRef<T>['ref']\n\nexport type PolyComponent<\n D extends React.ElementType,\n Own extends object = object\n> = <T extends React.ElementType = D>(\n props: PolyProps<T, Own> & { ref?: PolyRef<T> }\n) => null | React.ReactElement\n\nexport const polyRef = forwardRef as <\n D extends React.ElementType,\n Own extends object = object\n>(\n render: <T extends React.ElementType = D>(\n props: PolyProps<T, Own>,\n ref: PolyRef<T>\n ) => null | React.ReactElement\n) => PolyComponent<D, Own>\n"]}