@nastechai-research/ui 0.18.2

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 (352) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +21 -0
  3. package/dist/assets/filler-bg0.webp +0 -0
  4. package/dist/assets.d.ts +38 -0
  5. package/dist/fonts/Collapse-Bold.woff2 +0 -0
  6. package/dist/fonts/Collapse-BoldItalic.woff2 +0 -0
  7. package/dist/fonts/Collapse-Italic.woff2 +0 -0
  8. package/dist/fonts/Collapse-Light.woff2 +0 -0
  9. package/dist/fonts/Collapse-LightItalic.woff2 +0 -0
  10. package/dist/fonts/Collapse-Regular.woff2 +0 -0
  11. package/dist/fonts/Collapse-Thin.woff2 +0 -0
  12. package/dist/fonts/Collapse-ThinItalic.woff2 +0 -0
  13. package/dist/fonts/Mondwest-Regular.woff2 +0 -0
  14. package/dist/fonts/Neuebit-Bold.woff2 +0 -0
  15. package/dist/fonts/RulesCompressed-Medium.woff2 +0 -0
  16. package/dist/fonts/RulesCompressed-Regular.woff2 +0 -0
  17. package/dist/fonts/RulesExpanded-Bold.woff2 +0 -0
  18. package/dist/fonts/RulesExpanded-Regular.woff2 +0 -0
  19. package/dist/fonts.d.ts +6 -0
  20. package/dist/fonts.js +6 -0
  21. package/dist/hooks/use-below-breakpoint.d.ts +2 -0
  22. package/dist/hooks/use-below-breakpoint.js +17 -0
  23. package/dist/hooks/use-capped-frame.d.ts +2 -0
  24. package/dist/hooks/use-capped-frame.js +15 -0
  25. package/dist/hooks/use-confirm-delete.d.ts +10 -0
  26. package/dist/hooks/use-confirm-delete.js +35 -0
  27. package/dist/hooks/use-css-var-dims.d.ts +1 -0
  28. package/dist/hooks/use-css-var-dims.js +29 -0
  29. package/dist/hooks/use-gpu-tier.d.ts +34 -0
  30. package/dist/hooks/use-gpu-tier.js +111 -0
  31. package/dist/hooks/use-render-loop.d.ts +41 -0
  32. package/dist/hooks/use-render-loop.js +63 -0
  33. package/dist/hooks/use-smooth-controls.d.ts +16 -0
  34. package/dist/hooks/use-smooth-controls.js +217 -0
  35. package/dist/hooks/use-toast.d.ts +7 -0
  36. package/dist/hooks/use-toast.js +21 -0
  37. package/dist/index.d.ts +79 -0
  38. package/dist/index.js +107 -0
  39. package/dist/ui/basic-page.d.ts +7 -0
  40. package/dist/ui/basic-page.js +18 -0
  41. package/dist/ui/build.css +4 -0
  42. package/dist/ui/components/animated-count.d.ts +10 -0
  43. package/dist/ui/components/animated-count.js +113 -0
  44. package/dist/ui/components/ascii.d.ts +10 -0
  45. package/dist/ui/components/ascii.js +79 -0
  46. package/dist/ui/components/badge.d.ts +6 -0
  47. package/dist/ui/components/badge.js +40 -0
  48. package/dist/ui/components/badges/nous-girl.d.ts +2 -0
  49. package/dist/ui/components/badges/nous-girl.js +83 -0
  50. package/dist/ui/components/blend-mode.d.ts +28 -0
  51. package/dist/ui/components/blend-mode.js +69 -0
  52. package/dist/ui/components/blink.d.ts +6 -0
  53. package/dist/ui/components/blink.js +17 -0
  54. package/dist/ui/components/bottom-sheet.d.ts +15 -0
  55. package/dist/ui/components/bottom-sheet.js +192 -0
  56. package/dist/ui/components/button.d.ts +14 -0
  57. package/dist/ui/components/button.js +147 -0
  58. package/dist/ui/components/card.d.ts +5 -0
  59. package/dist/ui/components/card.js +74 -0
  60. package/dist/ui/components/checkbox.d.ts +2 -0
  61. package/dist/ui/components/checkbox.js +27 -0
  62. package/dist/ui/components/command-block.d.ts +24 -0
  63. package/dist/ui/components/command-block.js +56 -0
  64. package/dist/ui/components/confirm-dialog.d.ts +13 -0
  65. package/dist/ui/components/confirm-dialog.js +113 -0
  66. package/dist/ui/components/cursor.d.ts +3 -0
  67. package/dist/ui/components/cursor.js +97 -0
  68. package/dist/ui/components/dialog.d.ts +15 -0
  69. package/dist/ui/components/dialog.js +171 -0
  70. package/dist/ui/components/dropdown-menu.d.ts +12 -0
  71. package/dist/ui/components/dropdown-menu.js +102 -0
  72. package/dist/ui/components/fit-text/fit-text.css +42 -0
  73. package/dist/ui/components/fit-text/index.d.ts +9 -0
  74. package/dist/ui/components/fit-text/index.js +25 -0
  75. package/dist/ui/components/graphs/bar-chart.d.ts +12 -0
  76. package/dist/ui/components/graphs/bar-chart.js +129 -0
  77. package/dist/ui/components/graphs/index.d.ts +3 -0
  78. package/dist/ui/components/graphs/index.js +4 -0
  79. package/dist/ui/components/graphs/line-chart.d.ts +14 -0
  80. package/dist/ui/components/graphs/line-chart.js +175 -0
  81. package/dist/ui/components/graphs/utils.d.ts +52 -0
  82. package/dist/ui/components/graphs/utils.js +162 -0
  83. package/dist/ui/components/grid/grid.css +79 -0
  84. package/dist/ui/components/grid/index.d.ts +2 -0
  85. package/dist/ui/components/grid/index.js +17 -0
  86. package/dist/ui/components/hover-bg.d.ts +1 -0
  87. package/dist/ui/components/hover-bg.js +14 -0
  88. package/dist/ui/components/icons/arrow.d.ts +6 -0
  89. package/dist/ui/components/icons/arrow.js +44 -0
  90. package/dist/ui/components/icons/check.d.ts +2 -0
  91. package/dist/ui/components/icons/check.js +13 -0
  92. package/dist/ui/components/icons/chevron.d.ts +6 -0
  93. package/dist/ui/components/icons/chevron.js +51 -0
  94. package/dist/ui/components/icons/discord.d.ts +2 -0
  95. package/dist/ui/components/icons/discord.js +15 -0
  96. package/dist/ui/components/icons/eye.d.ts +2 -0
  97. package/dist/ui/components/icons/eye.js +8 -0
  98. package/dist/ui/components/icons/gear.d.ts +6 -0
  99. package/dist/ui/components/icons/gear.js +30 -0
  100. package/dist/ui/components/icons/github.d.ts +2 -0
  101. package/dist/ui/components/icons/github.js +15 -0
  102. package/dist/ui/components/icons/hamburger.d.ts +6 -0
  103. package/dist/ui/components/icons/hamburger.js +56 -0
  104. package/dist/ui/components/icons/heart.d.ts +2 -0
  105. package/dist/ui/components/icons/heart.js +11 -0
  106. package/dist/ui/components/icons/index.d.ts +12 -0
  107. package/dist/ui/components/icons/index.js +13 -0
  108. package/dist/ui/components/icons/link.d.ts +2 -0
  109. package/dist/ui/components/icons/link.js +13 -0
  110. package/dist/ui/components/icons/minus.d.ts +2 -0
  111. package/dist/ui/components/icons/minus.js +13 -0
  112. package/dist/ui/components/icons/search.d.ts +2 -0
  113. package/dist/ui/components/icons/search.js +33 -0
  114. package/dist/ui/components/image-distortion.d.ts +21 -0
  115. package/dist/ui/components/image-distortion.js +398 -0
  116. package/dist/ui/components/input.d.ts +1 -0
  117. package/dist/ui/components/input.js +21 -0
  118. package/dist/ui/components/label.d.ts +1 -0
  119. package/dist/ui/components/label.js +18 -0
  120. package/dist/ui/components/leva-client.d.ts +1 -0
  121. package/dist/ui/components/leva-client.js +12 -0
  122. package/dist/ui/components/list-item.d.ts +6 -0
  123. package/dist/ui/components/list-item.js +27 -0
  124. package/dist/ui/components/overlays/blend-modes.d.ts +1 -0
  125. package/dist/ui/components/overlays/blend-modes.js +14 -0
  126. package/dist/ui/components/overlays/glitch.d.ts +6 -0
  127. package/dist/ui/components/overlays/glitch.js +209 -0
  128. package/dist/ui/components/overlays/greys.d.ts +6 -0
  129. package/dist/ui/components/overlays/greys.js +339 -0
  130. package/dist/ui/components/overlays/index.d.ts +14 -0
  131. package/dist/ui/components/overlays/index.js +34 -0
  132. package/dist/ui/components/overlays/lens-layers.d.ts +14 -0
  133. package/dist/ui/components/overlays/lens-layers.js +95 -0
  134. package/dist/ui/components/overlays/lens.d.ts +44 -0
  135. package/dist/ui/components/overlays/lens.js +60 -0
  136. package/dist/ui/components/overlays/noise.d.ts +6 -0
  137. package/dist/ui/components/overlays/noise.js +136 -0
  138. package/dist/ui/components/overlays/vignette.d.ts +6 -0
  139. package/dist/ui/components/overlays/vignette.js +47 -0
  140. package/dist/ui/components/poster.d.ts +62 -0
  141. package/dist/ui/components/poster.js +256 -0
  142. package/dist/ui/components/progress.d.ts +9 -0
  143. package/dist/ui/components/progress.js +53 -0
  144. package/dist/ui/components/scene-canvas.d.ts +23 -0
  145. package/dist/ui/components/scene-canvas.js +179 -0
  146. package/dist/ui/components/scramble.d.ts +9 -0
  147. package/dist/ui/components/scramble.js +63 -0
  148. package/dist/ui/components/segmented.d.ts +20 -0
  149. package/dist/ui/components/segmented.js +51 -0
  150. package/dist/ui/components/select.d.ts +18 -0
  151. package/dist/ui/components/select.js +215 -0
  152. package/dist/ui/components/selection-switcher.d.ts +1 -0
  153. package/dist/ui/components/selection-switcher.js +34 -0
  154. package/dist/ui/components/separator.d.ts +5 -0
  155. package/dist/ui/components/separator.js +22 -0
  156. package/dist/ui/components/shader.d.ts +7 -0
  157. package/dist/ui/components/shader.js +60 -0
  158. package/dist/ui/components/socials.d.ts +20 -0
  159. package/dist/ui/components/socials.js +21 -0
  160. package/dist/ui/components/spinner.d.ts +20 -0
  161. package/dist/ui/components/spinner.js +38 -0
  162. package/dist/ui/components/stats.d.ts +16 -0
  163. package/dist/ui/components/stats.js +36 -0
  164. package/dist/ui/components/switch.d.ts +7 -0
  165. package/dist/ui/components/switch.js +37 -0
  166. package/dist/ui/components/tabs.d.ts +14 -0
  167. package/dist/ui/components/tabs.js +44 -0
  168. package/dist/ui/components/terminal-demo.d.ts +32 -0
  169. package/dist/ui/components/terminal-demo.js +125 -0
  170. package/dist/ui/components/theme-toggle.d.ts +6 -0
  171. package/dist/ui/components/theme-toggle.js +66 -0
  172. package/dist/ui/components/tier-card.d.ts +53 -0
  173. package/dist/ui/components/tier-card.js +146 -0
  174. package/dist/ui/components/toast.d.ts +8 -0
  175. package/dist/ui/components/toast.js +39 -0
  176. package/dist/ui/components/tv.d.ts +3 -0
  177. package/dist/ui/components/tv.js +239 -0
  178. package/dist/ui/components/typography/h1.d.ts +11 -0
  179. package/dist/ui/components/typography/h1.js +18 -0
  180. package/dist/ui/components/typography/h2.d.ts +11 -0
  181. package/dist/ui/components/typography/h2.js +18 -0
  182. package/dist/ui/components/typography/index.d.ts +15 -0
  183. package/dist/ui/components/typography/index.js +41 -0
  184. package/dist/ui/components/typography/legend.d.ts +6 -0
  185. package/dist/ui/components/typography/legend.js +20 -0
  186. package/dist/ui/components/typography/small.d.ts +2 -0
  187. package/dist/ui/components/typography/small.js +9 -0
  188. package/dist/ui/components/watchlist.d.ts +11 -0
  189. package/dist/ui/components/watchlist.js +80 -0
  190. package/dist/ui/fonts.css +63 -0
  191. package/dist/ui/footer.d.ts +20 -0
  192. package/dist/ui/footer.js +65 -0
  193. package/dist/ui/globals.css +395 -0
  194. package/dist/ui/header.d.ts +41 -0
  195. package/dist/ui/header.js +270 -0
  196. package/dist/ui/layout-wrapper.d.ts +1 -0
  197. package/dist/ui/layout-wrapper.js +7 -0
  198. package/dist/utils/color.d.ts +4 -0
  199. package/dist/utils/color.js +14 -0
  200. package/dist/utils/index.d.ts +15 -0
  201. package/dist/utils/index.js +48 -0
  202. package/dist/utils/poly.d.ts +8 -0
  203. package/dist/utils/poly.js +3 -0
  204. package/package.json +120 -0
  205. package/src/assets/filler-bg0.webp +0 -0
  206. package/src/assets.d.ts +38 -0
  207. package/src/fonts/Collapse-Bold.woff2 +0 -0
  208. package/src/fonts/Collapse-BoldItalic.woff2 +0 -0
  209. package/src/fonts/Collapse-Italic.woff2 +0 -0
  210. package/src/fonts/Collapse-Light.woff2 +0 -0
  211. package/src/fonts/Collapse-LightItalic.woff2 +0 -0
  212. package/src/fonts/Collapse-Regular.woff2 +0 -0
  213. package/src/fonts/Collapse-Thin.woff2 +0 -0
  214. package/src/fonts/Collapse-ThinItalic.woff2 +0 -0
  215. package/src/fonts/Mondwest-Regular.woff2 +0 -0
  216. package/src/fonts/Neuebit-Bold.woff2 +0 -0
  217. package/src/fonts/RulesCompressed-Medium.woff2 +0 -0
  218. package/src/fonts/RulesCompressed-Regular.woff2 +0 -0
  219. package/src/fonts/RulesExpanded-Bold.woff2 +0 -0
  220. package/src/fonts/RulesExpanded-Regular.woff2 +0 -0
  221. package/src/fonts.ts +6 -0
  222. package/src/hooks/use-below-breakpoint.ts +21 -0
  223. package/src/hooks/use-capped-frame.ts +18 -0
  224. package/src/hooks/use-confirm-delete.ts +43 -0
  225. package/src/hooks/use-css-var-dims.ts +39 -0
  226. package/src/hooks/use-gpu-tier.ts +190 -0
  227. package/src/hooks/use-render-loop.ts +121 -0
  228. package/src/hooks/use-smooth-controls.ts +318 -0
  229. package/src/hooks/use-toast.ts +29 -0
  230. package/src/index.ts +130 -0
  231. package/src/ui/basic-page.tsx +34 -0
  232. package/src/ui/build.css +4 -0
  233. package/src/ui/components/animated-count.stories.tsx +67 -0
  234. package/src/ui/components/animated-count.tsx +168 -0
  235. package/src/ui/components/ascii.stories.tsx +30 -0
  236. package/src/ui/components/ascii.tsx +110 -0
  237. package/src/ui/components/badge.stories.tsx +31 -0
  238. package/src/ui/components/badge.tsx +60 -0
  239. package/src/ui/components/badges/nous-girl.tsx +52 -0
  240. package/src/ui/components/blend-mode.stories.tsx +33 -0
  241. package/src/ui/components/blend-mode.tsx +129 -0
  242. package/src/ui/components/blink.stories.tsx +32 -0
  243. package/src/ui/components/blink.tsx +21 -0
  244. package/src/ui/components/bottom-sheet.stories.tsx +43 -0
  245. package/src/ui/components/bottom-sheet.tsx +227 -0
  246. package/src/ui/components/button.stories.tsx +68 -0
  247. package/src/ui/components/button.tsx +170 -0
  248. package/src/ui/components/card.stories.tsx +63 -0
  249. package/src/ui/components/card.tsx +85 -0
  250. package/src/ui/components/checkbox.stories.tsx +113 -0
  251. package/src/ui/components/checkbox.tsx +36 -0
  252. package/src/ui/components/command-block.stories.tsx +52 -0
  253. package/src/ui/components/command-block.tsx +86 -0
  254. package/src/ui/components/confirm-dialog.stories.tsx +91 -0
  255. package/src/ui/components/confirm-dialog.tsx +130 -0
  256. package/src/ui/components/cursor.tsx +115 -0
  257. package/src/ui/components/dialog.stories.tsx +169 -0
  258. package/src/ui/components/dialog.tsx +177 -0
  259. package/src/ui/components/dropdown-menu.stories.tsx +52 -0
  260. package/src/ui/components/dropdown-menu.tsx +117 -0
  261. package/src/ui/components/fit-text/fit-text.css +42 -0
  262. package/src/ui/components/fit-text/index.stories.tsx +33 -0
  263. package/src/ui/components/fit-text/index.tsx +45 -0
  264. package/src/ui/components/forms.stories.tsx +173 -0
  265. package/src/ui/components/graphs/bar-chart.tsx +153 -0
  266. package/src/ui/components/graphs/index.stories.tsx +64 -0
  267. package/src/ui/components/graphs/index.tsx +4 -0
  268. package/src/ui/components/graphs/line-chart.tsx +213 -0
  269. package/src/ui/components/graphs/utils.tsx +265 -0
  270. package/src/ui/components/grid/grid.css +79 -0
  271. package/src/ui/components/grid/index.tsx +19 -0
  272. package/src/ui/components/hover-bg.stories.tsx +29 -0
  273. package/src/ui/components/hover-bg.tsx +15 -0
  274. package/src/ui/components/icons/arrow.tsx +42 -0
  275. package/src/ui/components/icons/check.tsx +14 -0
  276. package/src/ui/components/icons/chevron.tsx +45 -0
  277. package/src/ui/components/icons/discord.tsx +16 -0
  278. package/src/ui/components/icons/eye.tsx +12 -0
  279. package/src/ui/components/icons/gear.tsx +51 -0
  280. package/src/ui/components/icons/github.tsx +16 -0
  281. package/src/ui/components/icons/hamburger.tsx +52 -0
  282. package/src/ui/components/icons/heart.tsx +12 -0
  283. package/src/ui/components/icons/index.ts +12 -0
  284. package/src/ui/components/icons/link.tsx +14 -0
  285. package/src/ui/components/icons/minus.tsx +14 -0
  286. package/src/ui/components/icons/search.tsx +28 -0
  287. package/src/ui/components/image-distortion.stories.tsx +120 -0
  288. package/src/ui/components/image-distortion.tsx +499 -0
  289. package/src/ui/components/input.stories.tsx +39 -0
  290. package/src/ui/components/input.tsx +20 -0
  291. package/src/ui/components/label.stories.tsx +26 -0
  292. package/src/ui/components/label.tsx +16 -0
  293. package/src/ui/components/leva-client.tsx +14 -0
  294. package/src/ui/components/list-item.stories.tsx +83 -0
  295. package/src/ui/components/list-item.tsx +37 -0
  296. package/src/ui/components/overlays/blend-modes.ts +13 -0
  297. package/src/ui/components/overlays/glitch.tsx +243 -0
  298. package/src/ui/components/overlays/greys.tsx +386 -0
  299. package/src/ui/components/overlays/index.tsx +47 -0
  300. package/src/ui/components/overlays/lens-layers.tsx +121 -0
  301. package/src/ui/components/overlays/lens.ts +91 -0
  302. package/src/ui/components/overlays/noise.tsx +174 -0
  303. package/src/ui/components/overlays/vignette.tsx +60 -0
  304. package/src/ui/components/poster.stories.tsx +513 -0
  305. package/src/ui/components/poster.tsx +411 -0
  306. package/src/ui/components/progress.stories.tsx +48 -0
  307. package/src/ui/components/progress.tsx +56 -0
  308. package/src/ui/components/scene-canvas.tsx +254 -0
  309. package/src/ui/components/scramble.stories.tsx +49 -0
  310. package/src/ui/components/scramble.tsx +95 -0
  311. package/src/ui/components/segmented.stories.tsx +101 -0
  312. package/src/ui/components/segmented.tsx +81 -0
  313. package/src/ui/components/select.stories.tsx +88 -0
  314. package/src/ui/components/select.tsx +267 -0
  315. package/src/ui/components/selection-switcher.tsx +44 -0
  316. package/src/ui/components/separator.stories.tsx +33 -0
  317. package/src/ui/components/separator.tsx +24 -0
  318. package/src/ui/components/shader.tsx +83 -0
  319. package/src/ui/components/socials.tsx +42 -0
  320. package/src/ui/components/spinner.stories.tsx +101 -0
  321. package/src/ui/components/spinner.tsx +60 -0
  322. package/src/ui/components/stats.stories.tsx +24 -0
  323. package/src/ui/components/stats.tsx +53 -0
  324. package/src/ui/components/switch.stories.tsx +77 -0
  325. package/src/ui/components/switch.tsx +48 -0
  326. package/src/ui/components/tabs.stories.tsx +101 -0
  327. package/src/ui/components/tabs.tsx +66 -0
  328. package/src/ui/components/terminal-demo.stories.tsx +67 -0
  329. package/src/ui/components/terminal-demo.tsx +189 -0
  330. package/src/ui/components/theme-toggle.stories.tsx +47 -0
  331. package/src/ui/components/theme-toggle.tsx +66 -0
  332. package/src/ui/components/tier-card.stories.tsx +217 -0
  333. package/src/ui/components/tier-card.tsx +190 -0
  334. package/src/ui/components/toast.stories.tsx +55 -0
  335. package/src/ui/components/toast.tsx +49 -0
  336. package/src/ui/components/tv.stories.tsx +37 -0
  337. package/src/ui/components/tv.tsx +257 -0
  338. package/src/ui/components/typography/h1.tsx +18 -0
  339. package/src/ui/components/typography/h2.tsx +18 -0
  340. package/src/ui/components/typography/index.tsx +54 -0
  341. package/src/ui/components/typography/legend.tsx +24 -0
  342. package/src/ui/components/typography/small.tsx +11 -0
  343. package/src/ui/components/watchlist.stories.tsx +33 -0
  344. package/src/ui/components/watchlist.tsx +105 -0
  345. package/src/ui/fonts.css +63 -0
  346. package/src/ui/footer.tsx +111 -0
  347. package/src/ui/globals.css +395 -0
  348. package/src/ui/header.tsx +398 -0
  349. package/src/ui/layout-wrapper.tsx +11 -0
  350. package/src/utils/color.ts +21 -0
  351. package/src/utils/index.ts +62 -0
  352. package/src/utils/poly.ts +26 -0
@@ -0,0 +1,41 @@
1
+ import { type SocialLink } from './components/socials';
2
+ export declare function Header({ brand, brandHref, className, desktopGridStyle, links, LinkComponent, scramble: scrambleProp, socials, socialsLabel, style, themeLabel, themeToggle }: HeaderProps): import("react").JSX.Element;
3
+ export interface HeaderLink {
4
+ external?: boolean;
5
+ href: string;
6
+ label: string;
7
+ onClick?: React.MouseEventHandler;
8
+ }
9
+ export interface HeaderProps {
10
+ brand?: React.ReactNode;
11
+ brandHref?: string;
12
+ className?: string;
13
+ /**
14
+ * Inline `style` for the desktop `Grid` only — useful for overriding
15
+ * `grid-template-columns` (e.g. to align with a sidebar track) without
16
+ * affecting the mobile bar or drawer.
17
+ */
18
+ desktopGridStyle?: React.CSSProperties;
19
+ links?: HeaderLink[];
20
+ LinkComponent?: React.ElementType;
21
+ /**
22
+ * Apply the hover-Scramble effect to nav link labels. Defaults to `true`,
23
+ * automatically suppressed on tier-0 GPUs and when the user has
24
+ * `prefers-reduced-motion: reduce`.
25
+ */
26
+ scramble?: boolean;
27
+ /**
28
+ * Optional socials shown in a trailing chrome cell on desktop and in the
29
+ * mobile drawer's chrome row. For nav-heavy products (≥ 5 links) prefer
30
+ * passing socials to `<Footer>` instead — the desktop `Grid` only ships
31
+ * column rules through `grid-cols-6`, so brand + many links + chrome can
32
+ * overflow.
33
+ */
34
+ socials?: SocialLink[];
35
+ socialsLabel?: string;
36
+ style?: React.CSSProperties;
37
+ themeLabel?: string;
38
+ themeToggle?: boolean;
39
+ }
40
+ /** @deprecated Use `SocialLink` from `@nous-research/ui`. Same shape. */
41
+ export type HeaderSocial = SocialLink;
@@ -0,0 +1,270 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { AnimatePresence, motion } from "motion/react";
4
+ import { createElement, useCallback, useRef, useState } from "react";
5
+ import { useCssVarDims } from "../hooks/use-css-var-dims.js";
6
+ import { useGpuTier } from "../hooks/use-gpu-tier.js";
7
+ import { cn } from "../utils/index.js";
8
+ import { Blink } from "./components/blink.js";
9
+ import { Cell, Grid } from "./components/grid/index.js";
10
+ import { HoverBg } from "./components/hover-bg.js";
11
+ import { HamburgerIcon } from "./components/icons/hamburger.js";
12
+ import { Scramble } from "./components/scramble.js";
13
+ import { Socials } from "./components/socials.js";
14
+ import { ThemeToggle } from "./components/theme-toggle.js";
15
+ import { H2 } from "./components/typography/h2.js";
16
+ import { Small } from "./components/typography/small.js";
17
+ const DEFAULT_BRAND = /* @__PURE__ */ jsxs("hgroup", { className: "flex flex-col gap-2", children: [
18
+ /* @__PURE__ */ jsx(Small, { children: "Nous" }),
19
+ /* @__PURE__ */ jsx(H2, { children: "Research" })
20
+ ] });
21
+ const DEFAULT_LINKS = [
22
+ { href: "/projects", label: "Projects" },
23
+ { href: "/participants", label: "Participants" },
24
+ { href: "/provenance", label: "Provenance" },
25
+ { href: "/contribute", label: "Contribute" }
26
+ ];
27
+ export function Header({
28
+ brand = DEFAULT_BRAND,
29
+ brandHref = "/",
30
+ className,
31
+ desktopGridStyle,
32
+ links = DEFAULT_LINKS,
33
+ LinkComponent = "a",
34
+ scramble: scrambleProp = true,
35
+ socials,
36
+ socialsLabel = "Socials",
37
+ style,
38
+ themeLabel = "Theme",
39
+ themeToggle = false
40
+ }) {
41
+ const ref = useRef(null);
42
+ useCssVarDims("header", ref);
43
+ const gpuTier = useGpuTier();
44
+ const scramble = scrambleProp && gpuTier > 0;
45
+ const [open, setOpen] = useState(false);
46
+ const close = useCallback(() => setOpen(false), []);
47
+ const hasSocials = (socials?.length ?? 0) > 0;
48
+ const hasMobileChrome = themeToggle || hasSocials;
49
+ return /* @__PURE__ */ jsxs("header", { className, ref, style, children: [
50
+ /* @__PURE__ */ jsxs(
51
+ Grid,
52
+ {
53
+ className: "hidden border-t border-b lg:grid",
54
+ style: desktopGridStyle,
55
+ children: [
56
+ /* @__PURE__ */ jsx(
57
+ BrandCell,
58
+ {
59
+ brand,
60
+ href: brandHref,
61
+ LinkComponent
62
+ }
63
+ ),
64
+ links.map((link) => /* @__PURE__ */ jsx(
65
+ NavCell,
66
+ {
67
+ link,
68
+ LinkComponent,
69
+ scramble
70
+ },
71
+ link.href
72
+ )),
73
+ hasSocials && /* @__PURE__ */ jsxs(Cell, { className: "flex items-start justify-between", children: [
74
+ /* @__PURE__ */ jsx(Small, { className: "opacity-50", children: socialsLabel }),
75
+ /* @__PURE__ */ jsx(Socials, { items: socials })
76
+ ] }),
77
+ themeToggle && /* @__PURE__ */ jsxs(Cell, { className: "flex items-start justify-between", children: [
78
+ /* @__PURE__ */ jsx(Small, { className: "opacity-50", children: themeLabel }),
79
+ /* @__PURE__ */ jsx(ThemeToggle, {})
80
+ ] })
81
+ ]
82
+ }
83
+ ),
84
+ /* @__PURE__ */ jsxs(
85
+ "div",
86
+ {
87
+ className: cn(
88
+ "flex items-center justify-between border border-current/20 p-4",
89
+ "lg:hidden"
90
+ ),
91
+ children: [
92
+ /* @__PURE__ */ jsx(
93
+ BrandLink,
94
+ {
95
+ brand,
96
+ href: brandHref,
97
+ LinkComponent
98
+ }
99
+ ),
100
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
101
+ themeToggle && /* @__PURE__ */ jsx(ThemeToggle, {}),
102
+ /* @__PURE__ */ jsx(
103
+ "button",
104
+ {
105
+ "aria-label": open ? "Close menu" : "Open menu",
106
+ className: "relative z-50 cursor-pointer bg-transparent p-2",
107
+ onClick: () => setOpen((v) => !v),
108
+ type: "button",
109
+ children: /* @__PURE__ */ jsx(HamburgerIcon, { open })
110
+ }
111
+ )
112
+ ] })
113
+ ]
114
+ }
115
+ ),
116
+ /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsx(
117
+ motion.div,
118
+ {
119
+ animate: { opacity: 1 },
120
+ className: cn(
121
+ "bg-background/95 fixed inset-0 z-50 flex flex-col backdrop-blur-sm",
122
+ "p-8 lg:hidden"
123
+ ),
124
+ exit: { opacity: 0 },
125
+ initial: { opacity: 0 },
126
+ transition: { duration: 0.2 },
127
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col border border-current/20", children: [
128
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-current/20 p-4", children: [
129
+ /* @__PURE__ */ jsx(
130
+ BrandLink,
131
+ {
132
+ brand,
133
+ href: brandHref,
134
+ LinkComponent,
135
+ onClick: close
136
+ }
137
+ ),
138
+ /* @__PURE__ */ jsx(
139
+ "button",
140
+ {
141
+ "aria-label": "Close menu",
142
+ className: "cursor-pointer bg-transparent p-2",
143
+ onClick: close,
144
+ type: "button",
145
+ children: /* @__PURE__ */ jsx(HamburgerIcon, { open: true })
146
+ }
147
+ )
148
+ ] }),
149
+ links.map((link) => /* @__PURE__ */ jsx(
150
+ MobileNavLink,
151
+ {
152
+ link,
153
+ LinkComponent,
154
+ onNavigate: close,
155
+ scramble
156
+ },
157
+ link.href
158
+ )),
159
+ hasMobileChrome && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b border-current/20 p-4", children: [
160
+ hasSocials && /* @__PURE__ */ jsxs(Fragment, { children: [
161
+ /* @__PURE__ */ jsx(Small, { className: "opacity-50", children: socialsLabel }),
162
+ /* @__PURE__ */ jsx(Socials, { items: socials, onNavigate: close })
163
+ ] }),
164
+ themeToggle && hasSocials && /* @__PURE__ */ jsx("span", { className: "flex-1" }),
165
+ themeToggle && /* @__PURE__ */ jsxs(Fragment, { children: [
166
+ /* @__PURE__ */ jsx(Small, { className: "opacity-50", children: themeLabel }),
167
+ /* @__PURE__ */ jsx(ThemeToggle, {})
168
+ ] })
169
+ ] })
170
+ ] })
171
+ }
172
+ ) })
173
+ ] });
174
+ }
175
+ function BrandCell({ brand, href, LinkComponent }) {
176
+ return isExternal(href) ? /* @__PURE__ */ jsx(Cell, { href, ...EXTERNAL_REL, as: "a", children: brand }) : /* @__PURE__ */ jsx(Cell, { as: LinkComponent, href, children: brand });
177
+ }
178
+ function BrandLink({ brand, href, LinkComponent, onClick }) {
179
+ if (isExternal(href)) {
180
+ return /* @__PURE__ */ jsx("a", { href, onClick, ...EXTERNAL_REL, children: brand });
181
+ }
182
+ return createElement(
183
+ LinkComponent,
184
+ { href, onClick },
185
+ brand
186
+ );
187
+ }
188
+ function NavCell({ link, LinkComponent, scramble }) {
189
+ const ref = useRef(null);
190
+ const isExt = link.external ?? isExternal(link.href);
191
+ const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
192
+ /* @__PURE__ */ jsxs(Small, { children: [
193
+ scramble ? /* @__PURE__ */ jsx(Scramble, { target: ref, children: link.label }) : link.label,
194
+ /* @__PURE__ */ jsx(Blink, {})
195
+ ] }),
196
+ /* @__PURE__ */ jsx(HoverBg, {})
197
+ ] });
198
+ if (isExt) {
199
+ return /* @__PURE__ */ jsx(
200
+ Cell,
201
+ {
202
+ as: "a",
203
+ className: "group relative cursor-pointer",
204
+ href: link.href,
205
+ onClick: link.onClick,
206
+ ref,
207
+ ...EXTERNAL_REL,
208
+ children: inner
209
+ }
210
+ );
211
+ }
212
+ return /* @__PURE__ */ jsx(
213
+ Cell,
214
+ {
215
+ as: LinkComponent,
216
+ className: "group relative cursor-pointer",
217
+ href: link.href,
218
+ onClick: link.onClick,
219
+ ref,
220
+ children: inner
221
+ }
222
+ );
223
+ }
224
+ function MobileNavLink({
225
+ link,
226
+ LinkComponent,
227
+ onNavigate,
228
+ scramble
229
+ }) {
230
+ const ref = useRef(null);
231
+ const isExt = link.external ?? isExternal(link.href);
232
+ const className = cn(
233
+ "group relative flex cursor-pointer items-center border-b border-current/20 p-4"
234
+ );
235
+ const onClick = (e) => {
236
+ link.onClick?.(e);
237
+ onNavigate();
238
+ };
239
+ const children = /* @__PURE__ */ jsxs(Fragment, { children: [
240
+ /* @__PURE__ */ jsxs(Small, { children: [
241
+ scramble ? /* @__PURE__ */ jsx(Scramble, { target: ref, children: link.label }) : link.label,
242
+ /* @__PURE__ */ jsx(Blink, {})
243
+ ] }),
244
+ /* @__PURE__ */ jsx(HoverBg, {})
245
+ ] });
246
+ if (isExt) {
247
+ return /* @__PURE__ */ jsx(
248
+ "a",
249
+ {
250
+ className,
251
+ href: link.href,
252
+ onClick,
253
+ ref,
254
+ ...EXTERNAL_REL,
255
+ children
256
+ }
257
+ );
258
+ }
259
+ return createElement(
260
+ LinkComponent,
261
+ { className, href: link.href, onClick, ref },
262
+ children
263
+ );
264
+ }
265
+ const EXTERNAL_REL = {
266
+ rel: "noopener noreferrer",
267
+ target: "_blank"
268
+ };
269
+ const isExternal = (href) => /^(https?:|mailto:|tel:)/i.test(href);
270
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IEFuaW1hdGVQcmVzZW5jZSwgbW90aW9uIH0gZnJvbSAnbW90aW9uL3JlYWN0J1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgdXNlQ3NzVmFyRGltcyB9IGZyb20gJy4uL2hvb2tzL3VzZS1jc3MtdmFyLWRpbXMnXG5pbXBvcnQgeyB1c2VHcHVUaWVyIH0gZnJvbSAnLi4vaG9va3MvdXNlLWdwdS10aWVyJ1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi91dGlscydcblxuaW1wb3J0IHsgQmxpbmsgfSBmcm9tICcuL2NvbXBvbmVudHMvYmxpbmsnXG5pbXBvcnQgeyBDZWxsLCBHcmlkIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQnXG5pbXBvcnQgeyBIb3ZlckJnIH0gZnJvbSAnLi9jb21wb25lbnRzL2hvdmVyLWJnJ1xuaW1wb3J0IHsgSGFtYnVyZ2VySWNvbiB9IGZyb20gJy4vY29tcG9uZW50cy9pY29ucy9oYW1idXJnZXInXG5pbXBvcnQgeyBTY3JhbWJsZSB9IGZyb20gJy4vY29tcG9uZW50cy9zY3JhbWJsZSdcbmltcG9ydCB7IFNvY2lhbHMsIHR5cGUgU29jaWFsTGluayB9IGZyb20gJy4vY29tcG9uZW50cy9zb2NpYWxzJ1xuaW1wb3J0IHsgVGhlbWVUb2dnbGUgfSBmcm9tICcuL2NvbXBvbmVudHMvdGhlbWUtdG9nZ2xlJ1xuaW1wb3J0IHsgSDIgfSBmcm9tICcuL2NvbXBvbmVudHMvdHlwb2dyYXBoeS9oMidcbmltcG9ydCB7IFNtYWxsIH0gZnJvbSAnLi9jb21wb25lbnRzL3R5cG9ncmFwaHkvc21hbGwnXG5cbmNvbnN0IERFRkFVTFRfQlJBTkQgPSAoXG4gIDxoZ3JvdXAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgIDxTbWFsbD5Ob3VzPC9TbWFsbD5cblxuICAgIDxIMj5SZXNlYXJjaDwvSDI+XG4gIDwvaGdyb3VwPlxuKVxuXG5jb25zdCBERUZBVUxUX0xJTktTOiBIZWFkZXJMaW5rW10gPSBbXG4gIHsgaHJlZjogJy9wcm9qZWN0cycsIGxhYmVsOiAnUHJvamVjdHMnIH0sXG4gIHsgaHJlZjogJy9wYXJ0aWNpcGFudHMnLCBsYWJlbDogJ1BhcnRpY2lwYW50cycgfSxcbiAgeyBocmVmOiAnL3Byb3ZlbmFuY2UnLCBsYWJlbDogJ1Byb3ZlbmFuY2UnIH0sXG4gIHsgaHJlZjogJy9jb250cmlidXRlJywgbGFiZWw6ICdDb250cmlidXRlJyB9XG5dXG5cbmV4cG9ydCBmdW5jdGlvbiBIZWFkZXIoe1xuICBicmFuZCA9IERFRkFVTFRfQlJBTkQsXG4gIGJyYW5kSHJlZiA9ICcvJyxcbiAgY2xhc3NOYW1lLFxuICBkZXNrdG9wR3JpZFN0eWxlLFxuICBsaW5rcyA9IERFRkFVTFRfTElOS1MsXG4gIExpbmtDb21wb25lbnQgPSAnYScsXG4gIHNjcmFtYmxlOiBzY3JhbWJsZVByb3AgPSB0cnVlLFxuICBzb2NpYWxzLFxuICBzb2NpYWxzTGFiZWwgPSAnU29jaWFscycsXG4gIHN0eWxlLFxuICB0aGVtZUxhYmVsID0gJ1RoZW1lJyxcbiAgdGhlbWVUb2dnbGUgPSBmYWxzZVxufTogSGVhZGVyUHJvcHMpIHtcbiAgY29uc3QgcmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PihudWxsKVxuICB1c2VDc3NWYXJEaW1zKCdoZWFkZXInLCByZWYpXG5cbiAgLy8gU2tpcCB0aGUgaG92ZXItU2NyYW1ibGUgckFGIGxvb3Agb24gdGllci0wIGRldmljZXMgKG5vIEdQVSAvIHNvZnR3YXJlXG4gIC8vIHJlbmRlcmVyIC8gYHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZWApIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb3AuXG4gIGNvbnN0IGdwdVRpZXIgPSB1c2VHcHVUaWVyKClcbiAgY29uc3Qgc2NyYW1ibGUgPSBzY3JhbWJsZVByb3AgJiYgZ3B1VGllciA+IDBcblxuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgY2xvc2UgPSB1c2VDYWxsYmFjaygoKSA9PiBzZXRPcGVuKGZhbHNlKSwgW10pXG5cbiAgY29uc3QgaGFzU29jaWFscyA9IChzb2NpYWxzPy5sZW5ndGggPz8gMCkgPiAwXG4gIGNvbnN0IGhhc01vYmlsZUNocm9tZSA9IHRoZW1lVG9nZ2xlIHx8IGhhc1NvY2lhbHNcblxuICByZXR1cm4gKFxuICAgIDxoZWFkZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9IHJlZj17cmVmfSBzdHlsZT17c3R5bGV9PlxuICAgICAgPEdyaWRcbiAgICAgICAgY2xhc3NOYW1lPVwiaGlkZGVuIGJvcmRlci10IGJvcmRlci1iIGxnOmdyaWRcIlxuICAgICAgICBzdHlsZT17ZGVza3RvcEdyaWRTdHlsZX1cbiAgICAgID5cbiAgICAgICAgPEJyYW5kQ2VsbFxuICAgICAgICAgIGJyYW5kPXticmFuZH1cbiAgICAgICAgICBocmVmPXticmFuZEhyZWZ9XG4gICAgICAgICAgTGlua0NvbXBvbmVudD17TGlua0NvbXBvbmVudH1cbiAgICAgICAgLz5cblxuICAgICAgICB7bGlua3MubWFwKGxpbmsgPT4gKFxuICAgICAgICAgIDxOYXZDZWxsXG4gICAgICAgICAgICBrZXk9e2xpbmsuaHJlZn1cbiAgICAgICAgICAgIGxpbms9e2xpbmt9XG4gICAgICAgICAgICBMaW5rQ29tcG9uZW50PXtMaW5rQ29tcG9uZW50fVxuICAgICAgICAgICAgc2NyYW1ibGU9e3NjcmFtYmxlfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuXG4gICAgICAgIHtoYXNTb2NpYWxzICYmIChcbiAgICAgICAgICA8Q2VsbCBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPFNtYWxsIGNsYXNzTmFtZT1cIm9wYWNpdHktNTBcIj57c29jaWFsc0xhYmVsfTwvU21hbGw+XG5cbiAgICAgICAgICAgIDxTb2NpYWxzIGl0ZW1zPXtzb2NpYWxzIX0gLz5cbiAgICAgICAgICA8L0NlbGw+XG4gICAgICAgICl9XG5cbiAgICAgICAge3RoZW1lVG9nZ2xlICYmIChcbiAgICAgICAgICA8Q2VsbCBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPFNtYWxsIGNsYXNzTmFtZT1cIm9wYWNpdHktNTBcIj57dGhlbWVMYWJlbH08L1NtYWxsPlxuXG4gICAgICAgICAgICA8VGhlbWVUb2dnbGUgLz5cbiAgICAgICAgICA8L0NlbGw+XG4gICAgICAgICl9XG4gICAgICA8L0dyaWQ+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlciBib3JkZXItY3VycmVudC8yMCBwLTQnLFxuICAgICAgICAgICdsZzpoaWRkZW4nXG4gICAgICAgICl9XG4gICAgICA+XG4gICAgICAgIDxCcmFuZExpbmtcbiAgICAgICAgICBicmFuZD17YnJhbmR9XG4gICAgICAgICAgaHJlZj17YnJhbmRIcmVmfVxuICAgICAgICAgIExpbmtDb21wb25lbnQ9e0xpbmtDb21wb25lbnR9XG4gICAgICAgIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgIHt0aGVtZVRvZ2dsZSAmJiA8VGhlbWVUb2dnbGUgLz59XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBhcmlhLWxhYmVsPXtvcGVuID8gJ0Nsb3NlIG1lbnUnIDogJ09wZW4gbWVudSd9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSB6LTUwIGN1cnNvci1wb2ludGVyIGJnLXRyYW5zcGFyZW50IHAtMlwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKHYgPT4gIXYpfVxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEhhbWJ1cmdlckljb24gb3Blbj17b3Blbn0gLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPEFuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAge29wZW4gJiYgKFxuICAgICAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdiZy1iYWNrZ3JvdW5kLzk1IGZpeGVkIGluc2V0LTAgei01MCBmbGV4IGZsZXgtY29sIGJhY2tkcm9wLWJsdXItc20nLFxuICAgICAgICAgICAgICAncC04IGxnOmhpZGRlbidcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAgfX1cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCB9fVxuICAgICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4yIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGJvcmRlciBib3JkZXItY3VycmVudC8yMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItY3VycmVudC8yMCBwLTRcIj5cbiAgICAgICAgICAgICAgICA8QnJhbmRMaW5rXG4gICAgICAgICAgICAgICAgICBicmFuZD17YnJhbmR9XG4gICAgICAgICAgICAgICAgICBocmVmPXticmFuZEhyZWZ9XG4gICAgICAgICAgICAgICAgICBMaW5rQ29tcG9uZW50PXtMaW5rQ29tcG9uZW50fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17Y2xvc2V9XG4gICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBtZW51XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImN1cnNvci1wb2ludGVyIGJnLXRyYW5zcGFyZW50IHAtMlwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtjbG9zZX1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxIYW1idXJnZXJJY29uIG9wZW4gLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAge2xpbmtzLm1hcChsaW5rID0+IChcbiAgICAgICAgICAgICAgICA8TW9iaWxlTmF2TGlua1xuICAgICAgICAgICAgICAgICAga2V5PXtsaW5rLmhyZWZ9XG4gICAgICAgICAgICAgICAgICBsaW5rPXtsaW5rfVxuICAgICAgICAgICAgICAgICAgTGlua0NvbXBvbmVudD17TGlua0NvbXBvbmVudH1cbiAgICAgICAgICAgICAgICAgIG9uTmF2aWdhdGU9e2Nsb3NlfVxuICAgICAgICAgICAgICAgICAgc2NyYW1ibGU9e3NjcmFtYmxlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICkpfVxuXG4gICAgICAgICAgICAgIHtoYXNNb2JpbGVDaHJvbWUgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgYm9yZGVyLWIgYm9yZGVyLWN1cnJlbnQvMjAgcC00XCI+XG4gICAgICAgICAgICAgICAgICB7aGFzU29jaWFscyAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgPFNtYWxsIGNsYXNzTmFtZT1cIm9wYWNpdHktNTBcIj57c29jaWFsc0xhYmVsfTwvU21hbGw+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U29jaWFscyBpdGVtcz17c29jaWFscyF9IG9uTmF2aWdhdGU9e2Nsb3NlfSAvPlxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICAgIHt0aGVtZVRvZ2dsZSAmJiBoYXNTb2NpYWxzICYmIDxzcGFuIGNsYXNzTmFtZT1cImZsZXgtMVwiIC8+fVxuXG4gICAgICAgICAgICAgICAgICB7dGhlbWVUb2dnbGUgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgIDxTbWFsbCBjbGFzc05hbWU9XCJvcGFjaXR5LTUwXCI+e3RoZW1lTGFiZWx9PC9TbWFsbD5cblxuICAgICAgICAgICAgICAgICAgICAgIDxUaGVtZVRvZ2dsZSAvPlxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICl9XG4gICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICA8L2hlYWRlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBCcmFuZENlbGwoeyBicmFuZCwgaHJlZiwgTGlua0NvbXBvbmVudCB9OiBCcmFuZFNsb3RQcm9wcykge1xuICByZXR1cm4gaXNFeHRlcm5hbChocmVmKSA/IChcbiAgICA8Q2VsbCBocmVmPXtocmVmfSB7Li4uRVhURVJOQUxfUkVMfSBhcz1cImFcIj5cbiAgICAgIHticmFuZH1cbiAgICA8L0NlbGw+XG4gICkgOiAoXG4gICAgPENlbGwgYXM9e0xpbmtDb21wb25lbnR9IGhyZWY9e2hyZWZ9PlxuICAgICAge2JyYW5kfVxuICAgIDwvQ2VsbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBCcmFuZExpbmsoeyBicmFuZCwgaHJlZiwgTGlua0NvbXBvbmVudCwgb25DbGljayB9OiBCcmFuZExpbmtQcm9wcykge1xuICBpZiAoaXNFeHRlcm5hbChocmVmKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8YSBocmVmPXtocmVmfSBvbkNsaWNrPXtvbkNsaWNrfSB7Li4uRVhURVJOQUxfUkVMfT5cbiAgICAgICAge2JyYW5kfVxuICAgICAgPC9hPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgIExpbmtDb21wb25lbnQsXG4gICAgeyBocmVmLCBvbkNsaWNrIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgYnJhbmRcbiAgKVxufVxuXG5mdW5jdGlvbiBOYXZDZWxsKHsgbGluaywgTGlua0NvbXBvbmVudCwgc2NyYW1ibGUgfTogTmF2Q2VsbFByb3BzKSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MQW5jaG9yRWxlbWVudD4obnVsbClcbiAgY29uc3QgaXNFeHQgPSBsaW5rLmV4dGVybmFsID8/IGlzRXh0ZXJuYWwobGluay5ocmVmKVxuXG4gIGNvbnN0IGlubmVyID0gKFxuICAgIDw+XG4gICAgICA8U21hbGw+XG4gICAgICAgIHtzY3JhbWJsZSA/IChcbiAgICAgICAgICA8U2NyYW1ibGUgdGFyZ2V0PXtyZWZ9PntsaW5rLmxhYmVsfTwvU2NyYW1ibGU+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgbGluay5sYWJlbFxuICAgICAgICApfVxuXG4gICAgICAgIDxCbGluayAvPlxuICAgICAgPC9TbWFsbD5cblxuICAgICAgPEhvdmVyQmcgLz5cbiAgICA8Lz5cbiAgKVxuXG4gIGlmIChpc0V4dCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Q2VsbFxuICAgICAgICBhcz1cImFcIlxuICAgICAgICBjbGFzc05hbWU9XCJncm91cCByZWxhdGl2ZSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIGhyZWY9e2xpbmsuaHJlZn1cbiAgICAgICAgb25DbGljaz17bGluay5vbkNsaWNrfVxuICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgey4uLkVYVEVSTkFMX1JFTH1cbiAgICAgID5cbiAgICAgICAge2lubmVyfVxuICAgICAgPC9DZWxsPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENlbGxcbiAgICAgIGFzPXtMaW5rQ29tcG9uZW50fVxuICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAgcmVsYXRpdmUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgaHJlZj17bGluay5ocmVmfVxuICAgICAgb25DbGljaz17bGluay5vbkNsaWNrfVxuICAgICAgcmVmPXtyZWZ9XG4gICAgPlxuICAgICAge2lubmVyfVxuICAgIDwvQ2VsbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBNb2JpbGVOYXZMaW5rKHtcbiAgbGluayxcbiAgTGlua0NvbXBvbmVudCxcbiAgb25OYXZpZ2F0ZSxcbiAgc2NyYW1ibGVcbn06IE1vYmlsZU5hdkxpbmtQcm9wcykge1xuICBjb25zdCByZWYgPSB1c2VSZWY8SFRNTEFuY2hvckVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGlzRXh0ID0gbGluay5leHRlcm5hbCA/PyBpc0V4dGVybmFsKGxpbmsuaHJlZilcblxuICBjb25zdCBjbGFzc05hbWUgPSBjbihcbiAgICAnZ3JvdXAgcmVsYXRpdmUgZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgYm9yZGVyLWIgYm9yZGVyLWN1cnJlbnQvMjAgcC00J1xuICApXG5cbiAgY29uc3Qgb25DbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxBbmNob3JFbGVtZW50PikgPT4ge1xuICAgIGxpbmsub25DbGljaz8uKGUpXG4gICAgb25OYXZpZ2F0ZSgpXG4gIH1cblxuICBjb25zdCBjaGlsZHJlbiA9IChcbiAgICA8PlxuICAgICAgPFNtYWxsPlxuICAgICAgICB7c2NyYW1ibGUgPyAoXG4gICAgICAgICAgPFNjcmFtYmxlIHRhcmdldD17cmVmfT57bGluay5sYWJlbH08L1NjcmFtYmxlPlxuICAgICAgICApIDogKFxuICAgICAgICAgIGxpbmsubGFiZWxcbiAgICAgICAgKX1cblxuICAgICAgICA8QmxpbmsgLz5cbiAgICAgIDwvU21hbGw+XG5cbiAgICAgIDxIb3ZlckJnIC8+XG4gICAgPC8+XG4gIClcblxuICBpZiAoaXNFeHQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGFcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgIGhyZWY9e2xpbmsuaHJlZn1cbiAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIHsuLi5FWFRFUk5BTF9SRUx9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvYT5cbiAgICApXG4gIH1cblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChcbiAgICBMaW5rQ29tcG9uZW50LFxuICAgIHsgY2xhc3NOYW1lLCBocmVmOiBsaW5rLmhyZWYsIG9uQ2xpY2ssIHJlZiB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGNoaWxkcmVuXG4gIClcbn1cblxuY29uc3QgRVhURVJOQUxfUkVMID0ge1xuICByZWw6ICdub29wZW5lciBub3JlZmVycmVyJyxcbiAgdGFyZ2V0OiAnX2JsYW5rJ1xufSBhcyBjb25zdFxuXG5jb25zdCBpc0V4dGVybmFsID0gKGhyZWY6IHN0cmluZykgPT4gL14oaHR0cHM/OnxtYWlsdG86fHRlbDopL2kudGVzdChocmVmKVxuXG5pbnRlcmZhY2UgQnJhbmRMaW5rUHJvcHMgZXh0ZW5kcyBCcmFuZFNsb3RQcm9wcyB7XG4gIG9uQ2xpY2s/OiBSZWFjdC5Nb3VzZUV2ZW50SGFuZGxlclxufVxuXG5pbnRlcmZhY2UgQnJhbmRTbG90UHJvcHMge1xuICBicmFuZDogUmVhY3QuUmVhY3ROb2RlXG4gIGhyZWY6IHN0cmluZ1xuICBMaW5rQ29tcG9uZW50OiBSZWFjdC5FbGVtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlckxpbmsge1xuICBleHRlcm5hbD86IGJvb2xlYW5cbiAgaHJlZjogc3RyaW5nXG4gIGxhYmVsOiBzdHJpbmdcbiAgb25DbGljaz86IFJlYWN0Lk1vdXNlRXZlbnRIYW5kbGVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyUHJvcHMge1xuICBicmFuZD86IFJlYWN0LlJlYWN0Tm9kZVxuICBicmFuZEhyZWY/OiBzdHJpbmdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBJbmxpbmUgYHN0eWxlYCBmb3IgdGhlIGRlc2t0b3AgYEdyaWRgIG9ubHkgXHUyMDE0IHVzZWZ1bCBmb3Igb3ZlcnJpZGluZ1xuICAgKiBgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zYCAoZS5nLiB0byBhbGlnbiB3aXRoIGEgc2lkZWJhciB0cmFjaykgd2l0aG91dFxuICAgKiBhZmZlY3RpbmcgdGhlIG1vYmlsZSBiYXIgb3IgZHJhd2VyLlxuICAgKi9cbiAgZGVza3RvcEdyaWRTdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgbGlua3M/OiBIZWFkZXJMaW5rW11cbiAgTGlua0NvbXBvbmVudD86IFJlYWN0LkVsZW1lbnRUeXBlXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgaG92ZXItU2NyYW1ibGUgZWZmZWN0IHRvIG5hdiBsaW5rIGxhYmVscy4gRGVmYXVsdHMgdG8gYHRydWVgLFxuICAgKiBhdXRvbWF0aWNhbGx5IHN1cHByZXNzZWQgb24gdGllci0wIEdQVXMgYW5kIHdoZW4gdGhlIHVzZXIgaGFzXG4gICAqIGBwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2VgLlxuICAgKi9cbiAgc2NyYW1ibGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzb2NpYWxzIHNob3duIGluIGEgdHJhaWxpbmcgY2hyb21lIGNlbGwgb24gZGVza3RvcCBhbmQgaW4gdGhlXG4gICAqIG1vYmlsZSBkcmF3ZXIncyBjaHJvbWUgcm93LiBGb3IgbmF2LWhlYXZ5IHByb2R1Y3RzIChcdTIyNjUgNSBsaW5rcykgcHJlZmVyXG4gICAqIHBhc3Npbmcgc29jaWFscyB0byBgPEZvb3Rlcj5gIGluc3RlYWQgXHUyMDE0IHRoZSBkZXNrdG9wIGBHcmlkYCBvbmx5IHNoaXBzXG4gICAqIGNvbHVtbiBydWxlcyB0aHJvdWdoIGBncmlkLWNvbHMtNmAsIHNvIGJyYW5kICsgbWFueSBsaW5rcyArIGNocm9tZSBjYW5cbiAgICogb3ZlcmZsb3cuXG4gICAqL1xuICBzb2NpYWxzPzogU29jaWFsTGlua1tdXG4gIHNvY2lhbHNMYWJlbD86IHN0cmluZ1xuICBzdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgdGhlbWVMYWJlbD86IHN0cmluZ1xuICB0aGVtZVRvZ2dsZT86IGJvb2xlYW5cbn1cblxuLyoqIEBkZXByZWNhdGVkIFVzZSBgU29jaWFsTGlua2AgZnJvbSBgQG5vdXMtcmVzZWFyY2gvdWlgLiBTYW1lIHNoYXBlLiAqL1xuZXhwb3J0IHR5cGUgSGVhZGVyU29jaWFsID0gU29jaWFsTGlua1xuXG5pbnRlcmZhY2UgTW9iaWxlTmF2TGlua1Byb3BzIHtcbiAgbGluazogSGVhZGVyTGlua1xuICBMaW5rQ29tcG9uZW50OiBSZWFjdC5FbGVtZW50VHlwZVxuICBvbk5hdmlnYXRlOiAoKSA9PiB2b2lkXG4gIHNjcmFtYmxlOiBib29sZWFuXG59XG5cbmludGVyZmFjZSBOYXZDZWxsUHJvcHMge1xuICBsaW5rOiBIZWFkZXJMaW5rXG4gIExpbmtDb21wb25lbnQ6IFJlYWN0LkVsZW1lbnRUeXBlXG4gIHNjcmFtYmxlOiBib29sZWFuXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBb0JFLFNBc0prQixVQXJKaEIsS0FERjtBQWxCRixTQUFTLGlCQUFpQixjQUFjO0FBQ3hDLFNBQVMsZUFBZSxhQUFhLFFBQVEsZ0JBQWdCO0FBRTdELFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsVUFBVTtBQUVuQixTQUFTLGFBQWE7QUFDdEIsU0FBUyxNQUFNLFlBQVk7QUFDM0IsU0FBUyxlQUFlO0FBQ3hCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMs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
@@ -0,0 +1 @@
1
+ export declare function LayoutWrapper({ children }: Readonly<React.PropsWithChildren>): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ export function LayoutWrapper({
3
+ children
4
+ }) {
5
+ return /* @__PURE__ */ jsx("html", { lang: "en", children: /* @__PURE__ */ jsx("body", { className: "text-text-primary bg-black antialiased", children }) });
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGZ1bmN0aW9uIExheW91dFdyYXBwZXIoe1xuICBjaGlsZHJlblxufTogUmVhZG9ubHk8UmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW4+KSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWwgbGFuZz1cImVuXCI+XG4gICAgICA8Ym9keSBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtcHJpbWFyeSBiZy1ibGFjayBhbnRpYWxpYXNlZFwiPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApXG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFLTTtBQUxDLGdCQUFTLGNBQWM7QUFBQSxFQUM1QjtBQUNGLEdBQXNDO0FBQ3BDLFNBQ0Usb0JBQUMsVUFBSyxNQUFLLE1BQ1QsOEJBQUMsVUFBSyxXQUFVLDBDQUNiLFVBQ0gsR0FDRjtBQUVKOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,4 @@
1
+ export declare const hexToRgb: (hex: string) => number[];
2
+ export declare const rgbToHex: (r: number, g: number, b: number) => string;
3
+ export declare const colorDodge: (base: string, blend: string) => string;
4
+ export declare const colorMix: (color: string, alpha: number) => string;
@@ -0,0 +1,14 @@
1
+ export const hexToRgb = (hex) => [
2
+ parseInt(hex.slice(1, 3), 16),
3
+ parseInt(hex.slice(3, 5), 16),
4
+ parseInt(hex.slice(5, 7), 16)
5
+ ];
6
+ export const rgbToHex = (r, g, b) => `#${[r, g, b].map((v) => v.toString(16).padStart(2, "0")).join("")}`;
7
+ export const colorDodge = (base, blend) => {
8
+ const [br, bg, bb] = hexToRgb(base);
9
+ const [lr, lg, lb] = hexToRgb(blend);
10
+ const d = (b, l) => l === 255 ? 255 : Math.min(255, Math.floor(b * 255 / (255 - l)));
11
+ return rgbToHex(d(br, lr), d(bg, lg), d(bb, lb));
12
+ };
13
+ export const colorMix = (color, alpha) => `color-mix(in srgb, ${color} ${Math.round(alpha * 100)}%, transparent)`;
14
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGNvbnN0IGhleFRvUmdiID0gKGhleDogc3RyaW5nKSA9PiBbXG4gIHBhcnNlSW50KGhleC5zbGljZSgxLCAzKSwgMTYpLFxuICBwYXJzZUludChoZXguc2xpY2UoMywgNSksIDE2KSxcbiAgcGFyc2VJbnQoaGV4LnNsaWNlKDUsIDcpLCAxNilcbl1cblxuZXhwb3J0IGNvbnN0IHJnYlRvSGV4ID0gKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpID0+XG4gIGAjJHtbciwgZywgYl0ubWFwKHYgPT4gdi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyl9YFxuXG5leHBvcnQgY29uc3QgY29sb3JEb2RnZSA9IChiYXNlOiBzdHJpbmcsIGJsZW5kOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgW2JyLCBiZywgYmJdID0gaGV4VG9SZ2IoYmFzZSlcbiAgY29uc3QgW2xyLCBsZywgbGJdID0gaGV4VG9SZ2IoYmxlbmQpXG5cbiAgY29uc3QgZCA9IChiOiBudW1iZXIsIGw6IG51bWJlcikgPT5cbiAgICBsID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IoKGIgKiAyNTUpIC8gKDI1NSAtIGwpKSlcblxuICByZXR1cm4gcmdiVG9IZXgoZChiciwgbHIpLCBkKGJnLCBsZyksIGQoYmIsIGxiKSlcbn1cblxuZXhwb3J0IGNvbnN0IGNvbG9yTWl4ID0gKGNvbG9yOiBzdHJpbmcsIGFscGhhOiBudW1iZXIpID0+XG4gIGBjb2xvci1taXgoaW4gc3JnYiwgJHtjb2xvcn0gJHtNYXRoLnJvdW5kKGFscGhhICogMTAwKX0lLCB0cmFuc3BhcmVudClgXG4iXSwKICAibWFwcGluZ3MiOiAiQUFBTyxhQUFNLFdBQVcsQ0FBQyxRQUFnQjtBQUFBLEVBQ3ZDLFNBQVMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUU7QUFBQSxFQUM1QixTQUFTLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFO0FBQUEsRUFDNUIsU0FBUyxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRTtBQUM5QjtBQUVPLGFBQU0sV0FBVyxDQUFDLEdBQVcsR0FBVyxNQUM3QyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLE9BQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFFM0QsYUFBTSxhQUFhLENBQUMsTUFBYyxVQUFrQjtBQUN6RCxRQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxTQUFTLElBQUk7QUFDbEMsUUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksU0FBUyxLQUFLO0FBRW5DLFFBQU0sSUFBSSxDQUFDLEdBQVcsTUFDcEIsTUFBTSxNQUFNLE1BQU0sS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFPLElBQUksT0FBUSxNQUFNLEVBQUUsQ0FBQztBQUVuRSxTQUFPLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDakQ7QUFFTyxhQUFNLFdBQVcsQ0FBQyxPQUFlLFVBQ3RDLHNCQUFzQixLQUFLLElBQUksS0FBSyxNQUFNLFFBQVEsR0FBRyxDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,15 @@
1
+ import { type ClassValue } from 'clsx';
2
+ import * as THREE from 'three';
3
+ import { hexToRgb, rgbToHex } from './color';
4
+ import { polyRef } from './poly';
5
+ import type { PolyComponent, PolyProps, PolyRef } from './poly';
6
+ export { hexToRgb, polyRef, rgbToHex };
7
+ export type { PolyComponent, PolyProps, PolyRef };
8
+ export declare const cn: (...inputs: ClassValue[]) => string;
9
+ export declare const clamp: (v: number, min?: number, max?: number) => number;
10
+ export declare const smoothstep: (edge0: number, edge1: number, x: number) => number;
11
+ export declare const hexToVec3: (hex: string) => THREE.Vector3;
12
+ export declare const truncate: (text: string, options: {
13
+ length: number;
14
+ }) => string;
15
+ export declare const stripWpStyles: (html: string) => string;
@@ -0,0 +1,48 @@
1
+ import { clsx } from "clsx";
2
+ import sanitize from "sanitize-html";
3
+ import { twMerge } from "tailwind-merge";
4
+ import * as THREE from "three";
5
+ import { hexToRgb, rgbToHex } from "./color.js";
6
+ import { polyRef } from "./poly.js";
7
+ export { hexToRgb, polyRef, rgbToHex };
8
+ export const cn = (...inputs) => twMerge(clsx(inputs));
9
+ export const clamp = (v, min = 0, max = 1) => Math.min(max, Math.max(min, Number.isFinite(v) ? v : min));
10
+ export const smoothstep = (edge0, edge1, x) => {
11
+ const t = clamp((x - edge0) / (edge1 - edge0));
12
+ return t * t * (3 - 2 * t);
13
+ };
14
+ export const hexToVec3 = (hex) => {
15
+ const [r, g, b] = hexToRgb(hex);
16
+ return new THREE.Vector3(r / 255, g / 255, b / 255);
17
+ };
18
+ export const truncate = (text, options) => text.length > options.length ? `${text.slice(0, options.length)}...` : text;
19
+ export const stripWpStyles = (html) => sanitize(html, {
20
+ allowedAttributes: {
21
+ a: ["href", "target", "rel", "name"],
22
+ audio: ["src", "controls"],
23
+ iframe: ["src", "width", "height", "frameborder", "allowfullscreen"],
24
+ img: ["src", "alt", "width", "height", "loading"],
25
+ source: ["src", "type", "srcset"],
26
+ td: ["colspan", "rowspan"],
27
+ th: ["colspan", "rowspan"],
28
+ video: ["src", "controls", "width", "height", "poster"]
29
+ },
30
+ allowedIframeHostnames: [
31
+ "www.youtube.com",
32
+ "youtube.com",
33
+ "player.vimeo.com"
34
+ ],
35
+ allowedSchemes: ["http", "https", "mailto"],
36
+ allowedTags: [
37
+ ...sanitize.defaults.allowedTags,
38
+ "img",
39
+ "figure",
40
+ "figcaption",
41
+ "iframe",
42
+ "video",
43
+ "audio",
44
+ "source",
45
+ "picture"
46
+ ]
47
+ });
48
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCBzYW5pdGl6ZSBmcm9tICdzYW5pdGl6ZS1odG1sJ1xuaW1wb3J0IHsgdHdNZXJnZSB9IGZyb20gJ3RhaWx3aW5kLW1lcmdlJ1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnXG5cbmltcG9ydCB7IGhleFRvUmdiLCByZ2JUb0hleCB9IGZyb20gJy4vY29sb3InXG5pbXBvcnQgeyBwb2x5UmVmIH0gZnJvbSAnLi9wb2x5J1xuaW1wb3J0IHR5cGUgeyBQb2x5Q29tcG9uZW50LCBQb2x5UHJvcHMsIFBvbHlSZWYgfSBmcm9tICcuL3BvbHknXG5cbmV4cG9ydCB7IGhleFRvUmdiLCBwb2x5UmVmLCByZ2JUb0hleCB9XG5leHBvcnQgdHlwZSB7IFBvbHlDb21wb25lbnQsIFBvbHlQcm9wcywgUG9seVJlZiB9XG5cbmV4cG9ydCBjb25zdCBjbiA9ICguLi5pbnB1dHM6IENsYXNzVmFsdWVbXSkgPT4gdHdNZXJnZShjbHN4KGlucHV0cykpXG5cbmV4cG9ydCBjb25zdCBjbGFtcCA9ICh2OiBudW1iZXIsIG1pbiA9IDAsIG1heCA9IDEpID0+XG4gIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCBOdW1iZXIuaXNGaW5pdGUodikgPyB2IDogbWluKSlcblxuZXhwb3J0IGNvbnN0IHNtb290aHN0ZXAgPSAoZWRnZTA6IG51bWJlciwgZWRnZTE6IG51bWJlciwgeDogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHQgPSBjbGFtcCgoeCAtIGVkZ2UwKSAvIChlZGdlMSAtIGVkZ2UwKSlcblxuICByZXR1cm4gdCAqIHQgKiAoMyAtIDIgKiB0KVxufVxuXG5leHBvcnQgY29uc3QgaGV4VG9WZWMzID0gKGhleDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IFtyLCBnLCBiXSA9IGhleFRvUmdiKGhleClcblxuICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjMociAvIDI1NSwgZyAvIDI1NSwgYiAvIDI1NSlcbn1cblxuZXhwb3J0IGNvbnN0IHRydW5jYXRlID0gKHRleHQ6IHN0cmluZywgb3B0aW9uczogeyBsZW5ndGg6IG51bWJlciB9KSA9PlxuICB0ZXh0Lmxlbmd0aCA+IG9wdGlvbnMubGVuZ3RoID8gYCR7dGV4dC5zbGljZSgwLCBvcHRpb25zLmxlbmd0aCl9Li4uYCA6IHRleHRcblxuZXhwb3J0IGNvbnN0IHN0cmlwV3BTdHlsZXMgPSAoaHRtbDogc3RyaW5nKSA9PlxuICBzYW5pdGl6ZShodG1sLCB7XG4gICAgYWxsb3dlZEF0dHJpYnV0ZXM6IHtcbiAgICAgIGE6IFsnaHJlZicsICd0YXJnZXQnLCAncmVsJywgJ25hbWUnXSxcbiAgICAgIGF1ZGlvOiBbJ3NyYycsICdjb250cm9scyddLFxuICAgICAgaWZyYW1lOiBbJ3NyYycsICd3aWR0aCcsICdoZWlnaHQnLCAnZnJhbWVib3JkZXInLCAnYWxsb3dmdWxsc2NyZWVuJ10sXG4gICAgICBpbWc6IFsnc3JjJywgJ2FsdCcsICd3aWR0aCcsICdoZWlnaHQnLCAnbG9hZGluZyddLFxuICAgICAgc291cmNlOiBbJ3NyYycsICd0eXBlJywgJ3NyY3NldCddLFxuICAgICAgdGQ6IFsnY29sc3BhbicsICdyb3dzcGFuJ10sXG4gICAgICB0aDogWydjb2xzcGFuJywgJ3Jvd3NwYW4nXSxcbiAgICAgIHZpZGVvOiBbJ3NyYycsICdjb250cm9scycsICd3aWR0aCcsICdoZWlnaHQnLCAncG9zdGVyJ11cbiAgICB9LFxuICAgIGFsbG93ZWRJZnJhbWVIb3N0bmFtZXM6IFtcbiAgICAgICd3d3cueW91dHViZS5jb20nLFxuICAgICAgJ3lvdXR1YmUuY29tJyxcbiAgICAgICdwbGF5ZXIudmltZW8uY29tJ1xuICAgIF0sXG4gICAgYWxsb3dlZFNjaGVtZXM6IFsnaHR0cCcsICdodHRwcycsICdtYWlsdG8nXSxcbiAgICBhbGxvd2VkVGFnczogW1xuICAgICAgLi4uc2FuaXRpemUuZGVmYXVsdHMuYWxsb3dlZFRhZ3MsXG4gICAgICAnaW1nJyxcbiAgICAgICdmaWd1cmUnLFxuICAgICAgJ2ZpZ2NhcHRpb24nLFxuICAgICAgJ2lmcmFtZScsXG4gICAgICAndmlkZW8nLFxuICAgICAgJ2F1ZGlvJyxcbiAgICAgICdzb3VyY2UnLFxuICAgICAgJ3BpY3R1cmUnXG4gICAgXVxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBMEIsWUFBWTtBQUN0QyxPQUFPLGNBQWM7QUFDckIsU0FBUyxlQUFlO0FBQ3hCLFlBQVksV0FBVztBQUV2QixTQUFTLFVBQVUsZ0JBQWdCO0FBQ25DLFNBQVMsZUFBZTtBQUd4QixTQUFTLFVBQVUsU0FBUztBQUdyQixhQUFNLEtBQUssSUFBSSxXQUF5QixRQUFRLEtBQUssTUFBTSxDQUFDO0FBRTVELGFBQU0sUUFBUSxDQUFDLEdBQVcsTUFBTSxHQUFHLE1BQU0sTUFDOUMsS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUssT0FBTyxTQUFTLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztBQUVwRCxhQUFNLGFBQWEsQ0FBQyxPQUFlLE9BQWUsTUFBYztBQUNyRSxRQUFNLElBQUksT0FBTyxJQUFJLFVBQVUsUUFBUSxNQUFNO0FBRTdDLFNBQU8sSUFBSSxLQUFLLElBQUksSUFBSTtBQUMxQjtBQUVPLGFBQU0sWUFBWSxDQUFDLFFBQWdCO0FBQ3hDLFFBQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRztBQUU5QixTQUFPLElBQUksTUFBTSxRQUFRLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxHQUFHO0FBQ3BEO0FBRU8sYUFBTSxXQUFXLENBQUMsTUFBYyxZQUNyQyxLQUFLLFNBQVMsUUFBUSxTQUFTLEdBQUcsS0FBSyxNQUFNLEdBQUcsUUFBUSxNQUFNLENBQUMsUUFBUTtBQUVsRSxhQUFNLGdCQUFnQixDQUFDLFNBQzVCLFNBQVMsTUFBTTtBQUFBLEVBQ2IsbUJBQW1CO0FBQUEsSUFDakIsR0FBRyxDQUFDLFFBQVEsVUFBVSxPQUFPLE1BQU07QUFBQSxJQUNuQyxPQUFPLENBQUMsT0FBTyxVQUFVO0FBQUEsSUFDekIsUUFBUSxDQUFDLE9BQU8sU0FBUyxVQUFVLGVBQWUsaUJBQWlCO0FBQUEsSUFDbkUsS0FBSyxDQUFDLE9BQU8sT0FBTyxTQUFTLFVBQVUsU0FBUztBQUFBLElBQ2hELFFBQVEsQ0FBQyxPQUFPLFFBQVEsUUFBUTtBQUFBLElBQ2hDLElBQUksQ0FBQyxXQUFXLFNBQVM7QUFBQSxJQUN6QixJQUFJLENBQUMsV0FBVyxTQUFTO0FBQUEsSUFDekIsT0FBTyxDQUFDLE9BQU8sWUFBWSxTQUFTLFVBQVUsUUFBUTtBQUFBLEVBQ3hEO0FBQUEsRUFDQSx3QkFBd0I7QUFBQSxJQUN0QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBQ0EsZ0JBQWdCLENBQUMsUUFBUSxTQUFTLFFBQVE7QUFBQSxFQUMxQyxhQUFhO0FBQUEsSUFDWCxHQUFHLFNBQVMsU0FBUztBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,8 @@
1
+ export type PolyProps<T extends React.ElementType, Own extends object = object> = {
2
+ as?: T;
3
+ } & Own & Omit<React.ComponentPropsWithoutRef<T>, 'as' | keyof Own>;
4
+ export type PolyRef<T extends React.ElementType> = React.ComponentPropsWithRef<T>['ref'];
5
+ export type PolyComponent<D extends React.ElementType, Own extends object = object> = <T extends React.ElementType = D>(props: PolyProps<T, Own> & {
6
+ ref?: PolyRef<T>;
7
+ }) => null | React.ReactElement;
8
+ export declare const polyRef: <D extends React.ElementType, Own extends object = object>(render: <T extends React.ElementType = D>(props: PolyProps<T, Own>, ref: PolyRef<T>) => null | React.ReactElement) => PolyComponent<D, Own>;
@@ -0,0 +1,3 @@
1
+ import { forwardRef } from "react";
2
+ export const polyRef = forwardRef;
3
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZm9yd2FyZFJlZiB9IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgdHlwZSBQb2x5UHJvcHM8XG4gIFQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSxcbiAgT3duIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0XG4+ID0geyBhcz86IFQgfSAmIE93biAmIE9taXQ8UmVhY3QuQ29tcG9uZW50UHJvcHNXaXRob3V0UmVmPFQ+LCAnYXMnIHwga2V5b2YgT3duPlxuXG5leHBvcnQgdHlwZSBQb2x5UmVmPFQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZT4gPVxuICBSZWFjdC5Db21wb25lbnRQcm9wc1dpdGhSZWY8VD5bJ3JlZiddXG5cbmV4cG9ydCB0eXBlIFBvbHlDb21wb25lbnQ8XG4gIEQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSxcbiAgT3duIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0XG4+ID0gPFQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IEQ+KFxuICBwcm9wczogUG9seVByb3BzPFQsIE93bj4gJiB7IHJlZj86IFBvbHlSZWY8VD4gfVxuKSA9PiBudWxsIHwgUmVhY3QuUmVhY3RFbGVtZW50XG5cbmV4cG9ydCBjb25zdCBwb2x5UmVmID0gZm9yd2FyZFJlZiBhcyA8XG4gIEQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSxcbiAgT3duIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0XG4+KFxuICByZW5kZXI6IDxUIGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBEPihcbiAgICBwcm9wczogUG9seVByb3BzPFQsIE93bj4sXG4gICAgcmVmOiBQb2x5UmVmPFQ+XG4gICkgPT4gbnVsbCB8IFJlYWN0LlJlYWN0RWxlbWVudFxuKSA9PiBQb2x5Q29tcG9uZW50PEQsIE93bj5cbiJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsa0JBQWtCO0FBaUJwQixhQUFNLFVBQVU7IiwKICAibmFtZXMiOiBbXQp9Cg==
package/package.json ADDED
@@ -0,0 +1,120 @@
1
+ {
2
+ "name": "@nastechai-research/ui",
3
+ "version": "0.18.2",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "sideEffects": [
7
+ "**/*.css"
8
+ ],
9
+ "files": [
10
+ "dist",
11
+ "src",
12
+ "README.md",
13
+ "CHANGELOG.md"
14
+ ],
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ },
22
+ "./ui/*": {
23
+ "types": "./dist/ui/*.d.ts",
24
+ "import": "./dist/ui/*.js"
25
+ },
26
+ "./utils": {
27
+ "types": "./dist/utils/index.d.ts",
28
+ "import": "./dist/utils/index.js"
29
+ },
30
+ "./utils/*": {
31
+ "types": "./dist/utils/*.d.ts",
32
+ "import": "./dist/utils/*.js"
33
+ },
34
+ "./hooks/*": {
35
+ "types": "./dist/hooks/*.d.ts",
36
+ "import": "./dist/hooks/*.js"
37
+ },
38
+ "./fonts/*": "./dist/fonts/*",
39
+ "./assets/*": "./dist/assets/*",
40
+ "./styles/fonts.css": "./dist/ui/fonts.css",
41
+ "./styles/globals.css": "./dist/ui/globals.css"
42
+ },
43
+ "dependencies": {
44
+ "@nanostores/react": "^1.1.0",
45
+ "radix-ui": "^1.4.0",
46
+ "class-variance-authority": "^0.7.1",
47
+ "clsx": "^2.1.1",
48
+ "nanostores": "^1.3.0",
49
+ "sanitize-html": "^2.17.4",
50
+ "tailwind-merge": "^3.6.0",
51
+ "tw-animate-css": "^1.4.0",
52
+ "unicode-animations": "^1.0.3"
53
+ },
54
+ "devDependencies": {
55
+ "@observablehq/plot": "^0.6.17",
56
+ "@react-three/fiber": "^9.6.1",
57
+ "@storybook/addon-a11y": "^10.4.0",
58
+ "@storybook/addon-docs": "^10.4.0",
59
+ "@storybook/addon-vitest": "^10.4.0",
60
+ "@storybook/react-vite": "^10.4.0",
61
+ "@tailwindcss/cli": "^4.3.0",
62
+ "@tailwindcss/vite": "^4.3.0",
63
+ "@types/node": "25.8.0",
64
+ "@types/react": "^19.2.14",
65
+ "@types/react-dom": "^19.2.3",
66
+ "@types/sanitize-html": "^2.16.1",
67
+ "@types/three": "^0.184.1",
68
+ "@vitejs/plugin-react": "^6.0.2",
69
+ "@vitest/browser-playwright": "^4.1.6",
70
+ "glob": "^13.0.6",
71
+ "gsap": "^3.15.0",
72
+ "leva": "^0.10.1",
73
+ "mockdate": "^3.0.5",
74
+ "motion": "^12.38.0",
75
+ "msw": "^2.14.6",
76
+ "msw-storybook-addon": "^2.0.7",
77
+ "playwright": "^1.60.0",
78
+ "storybook": "^10.4.0",
79
+ "tailwindcss": "^4.3.0",
80
+ "three": "^0.184.0",
81
+ "typescript": "^6.0.3",
82
+ "unbuild": "^3.6.1",
83
+ "vite": "^8.0.13",
84
+ "vite-plugin-static-copy": "^4.1.0",
85
+ "vitest": "^4.1.6"
86
+ },
87
+ "peerDependencies": {
88
+ "@observablehq/plot": "^0.6.17",
89
+ "@react-three/fiber": "^9.4.0",
90
+ "gsap": "^3.13.0",
91
+ "leva": "^0.10.1",
92
+ "motion": "^12.38.0",
93
+ "react": "^19.0.0",
94
+ "react-dom": "^19.0.0",
95
+ "three": "^0.180.0"
96
+ },
97
+ "peerDependenciesMeta": {
98
+ "three": {
99
+ "optional": true
100
+ },
101
+ "@react-three/fiber": {
102
+ "optional": true
103
+ },
104
+ "@observablehq/plot": {
105
+ "optional": true
106
+ },
107
+ "leva": {
108
+ "optional": true
109
+ },
110
+ "gsap": {
111
+ "optional": true
112
+ }
113
+ },
114
+ "msw": {
115
+ "workerDirectory": [
116
+ "public"
117
+ ]
118
+ },
119
+ "description": "The shared design system for React UI @ Nastechai. Components, hooks, utils, fonts, overlays, etc."
120
+ }
Binary file
@@ -0,0 +1,38 @@
1
+ interface StaticImageData {
2
+ src: string
3
+ height: number
4
+ width: number
5
+ blurDataURL?: string
6
+ blurWidth?: number
7
+ blurHeight?: number
8
+ }
9
+
10
+ declare module '*.jpg' {
11
+ const content: StaticImageData
12
+ export default content
13
+ }
14
+
15
+ declare module '*.jpeg' {
16
+ const content: StaticImageData
17
+ export default content
18
+ }
19
+
20
+ declare module '*.png' {
21
+ const content: StaticImageData
22
+ export default content
23
+ }
24
+
25
+ declare module '*.svg' {
26
+ const content: StaticImageData
27
+ export default content
28
+ }
29
+
30
+ declare module '*.gif' {
31
+ const content: StaticImageData
32
+ export default content
33
+ }
34
+
35
+ declare module '*.webp' {
36
+ const content: StaticImageData
37
+ export default content
38
+ }
Binary file
Binary file
Binary file
Binary file
Binary file