@nastechai-research/ui 0.13.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,38 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import {
4
+ useEffect,
5
+ useState
6
+ } from "react";
7
+ import spinners from "unicode-animations";
8
+ import { cn } from "../../utils/index.js";
9
+ export function Spinner({
10
+ className,
11
+ name = "braille",
12
+ style,
13
+ ...props
14
+ }) {
15
+ const [frame, setFrame] = useState(0);
16
+ const animation = spinners[name];
17
+ useEffect(() => {
18
+ const id = setInterval(
19
+ () => setFrame((f) => (f + 1) % animation.frames.length),
20
+ animation.interval
21
+ );
22
+ return () => clearInterval(id);
23
+ }, [animation.frames.length, animation.interval]);
24
+ return /* @__PURE__ */ jsx(
25
+ "span",
26
+ {
27
+ "aria-hidden": props["aria-label"] ? void 0 : true,
28
+ className: cn(
29
+ "font-mono inline-block leading-none tabular-nums",
30
+ className
31
+ ),
32
+ style,
33
+ ...props,
34
+ children: animation.frames[frame]
35
+ }
36
+ );
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7XG4gIHR5cGUgQ1NTUHJvcGVydGllcyxcbiAgdHlwZSBIVE1MQXR0cmlidXRlcyxcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZVxufSBmcm9tICdyZWFjdCdcbmltcG9ydCBzcGlubmVycywgeyB0eXBlIEJyYWlsbGVTcGlubmVyTmFtZSB9IGZyb20gJ3VuaWNvZGUtYW5pbWF0aW9ucydcblxuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuLyoqXG4gKiBCcmFpbGxlIHVuaWNvZGUgc3Bpbm5lci4gUmVuZGVycyB0aGUgYWN0aXZlIGZyYW1lIG9mIGEgYHVuaWNvZGUtYW5pbWF0aW9uc2BcbiAqIHNlcXVlbmNlIGluc2lkZSBhbiBpbmxpbmUgYDxzcGFuPmAsIGFkdmFuY2luZyBvbiB0aGUgc3Bpbm5lcidzIG93biBpbnRlcnZhbC5cbiAqXG4gKiBJbmhlcml0cyBmb250IGNvbG9yIGFuZCBmb250IHNpemUgZnJvbSBpdHMgcGFyZW50IFx1MjAxNCBhcHBseSBUYWlsd2luZCB1dGlsaXRpZXNcbiAqIChlLmcuIGB0ZXh0LXdhcm5pbmdgLCBgdGV4dC1iYXNlYCkgdmlhIGBjbGFzc05hbWVgIHRvIHN0eWxlLlxuICpcbiAqIERlY29yYXRpdmUgYnkgZGVmYXVsdC4gUGFzcyBgYXJpYS1sYWJlbGAgKGFuZCBvcHRpb25hbGx5IGByb2xlPVwic3RhdHVzXCJgKSB3aGVuXG4gKiB0aGUgc3Bpbm5lciBoYXMgbm8gc3Vycm91bmRpbmcgbG9hZGluZyB0ZXh0IGFuZCBzY3JlZW4gcmVhZGVycyBuZWVkIHRvIGtub3dcbiAqIHNvbWV0aGluZyBpcyBsb2FkaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3Bpbm5lcih7XG4gIGNsYXNzTmFtZSxcbiAgbmFtZSA9ICdicmFpbGxlJyxcbiAgc3R5bGUsXG4gIC4uLnByb3BzXG59OiBTcGlubmVyUHJvcHMpIHtcbiAgY29uc3QgW2ZyYW1lLCBzZXRGcmFtZV0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBhbmltYXRpb24gPSBzcGlubmVyc1tuYW1lXVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaWQgPSBzZXRJbnRlcnZhbChcbiAgICAgICgpID0+IHNldEZyYW1lKGYgPT4gKGYgKyAxKSAlIGFuaW1hdGlvbi5mcmFtZXMubGVuZ3RoKSxcbiAgICAgIGFuaW1hdGlvbi5pbnRlcnZhbFxuICAgIClcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJJbnRlcnZhbChpZClcbiAgfSwgW2FuaW1hdGlvbi5mcmFtZXMubGVuZ3RoLCBhbmltYXRpb24uaW50ZXJ2YWxdKVxuXG4gIHJldHVybiAoXG4gICAgPHNwYW5cbiAgICAgIGFyaWEtaGlkZGVuPXtwcm9wc1snYXJpYS1sYWJlbCddID8gdW5kZWZpbmVkIDogdHJ1ZX1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmb250LW1vbm8gaW5saW5lLWJsb2NrIGxlYWRpbmctbm9uZSB0YWJ1bGFyLW51bXMnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBzdHlsZT17c3R5bGV9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAge2FuaW1hdGlvbi5mcmFtZXNbZnJhbWVdfVxuICAgIDwvc3Bhbj5cbiAgKVxufVxuXG5pbnRlcmZhY2UgU3Bpbm5lclByb3BzIGV4dGVuZHMgSFRNTEF0dHJpYnV0ZXM8SFRNTFNwYW5FbGVtZW50PiB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBuYW1lPzogQnJhaWxsZVNwaW5uZXJOYW1lXG4gIHN0eWxlPzogQ1NTUHJvcGVydGllc1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQXlDSTtBQXZDSjtBQUFBLEVBR0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sY0FBMkM7QUFFbEQsU0FBUyxVQUFVO0FBYVosZ0JBQVMsUUFBUTtBQUFBLEVBQ3RCO0FBQUEsRUFDQSxPQUFPO0FBQUEsRUFDUDtBQUFBLEVBQ0EsR0FBRztBQUNMLEdBQWlCO0FBQ2YsUUFBTSxDQUFDLE9BQU8sUUFBUSxJQUFJLFNBQVMsQ0FBQztBQUNwQyxRQUFNLFlBQVksU0FBUyxJQUFJO0FBRS9CLFlBQVUsTUFBTTtBQUNkLFVBQU0sS0FBSztBQUFBLE1BQ1QsTUFBTSxTQUFTLFFBQU0sSUFBSSxLQUFLLFVBQVUsT0FBTyxNQUFNO0FBQUEsTUFDckQsVUFBVTtBQUFBLElBQ1o7QUFDQSxXQUFPLE1BQU0sY0FBYyxFQUFFO0FBQUEsRUFDL0IsR0FBRyxDQUFDLFVBQVUsT0FBTyxRQUFRLFVBQVUsUUFBUSxDQUFDO0FBRWhELFNBQ0U7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDLGVBQWEsTUFBTSxZQUFZLElBQUksU0FBWTtBQUFBLE1BQy9DLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBO0FBQUEsTUFDQyxHQUFHO0FBQUEsTUFFSCxvQkFBVSxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBQ3pCO0FBRUo7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,16 @@
1
+ import React, { ReactNode } from 'react';
2
+ export declare function Stats({ className, items, flip, ...props }: StatsProps): React.JSX.Element;
3
+ interface StatsProps extends React.ComponentProps<'div'> {
4
+ items: {
5
+ label: string | {
6
+ key: string;
7
+ node: ReactNode;
8
+ };
9
+ value: string | {
10
+ key: string;
11
+ node: ReactNode;
12
+ };
13
+ }[];
14
+ flip?: boolean;
15
+ }
16
+ export {};
@@ -0,0 +1,36 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../utils/index.js";
3
+ import { Typography } from "./typography/index.js";
4
+ export function Stats({ className, items, flip, ...props }) {
5
+ return /* @__PURE__ */ jsx("div", { className: cn("flex w-full flex-col gap-5", className), ...props, children: items.map(({ label, value }) => {
6
+ const valueText = /* @__PURE__ */ jsx(
7
+ Typography,
8
+ {
9
+ className: "text-xs leading-[1.4] tracking-widest",
10
+ expanded: true,
11
+ children: typeof value === "string" ? value : value.node
12
+ }
13
+ );
14
+ const labelText = /* @__PURE__ */ jsx(Typography, { className: "leading-none tracking-[0.2em] opacity-60", mono: true, children: typeof label === "string" ? label : label.node });
15
+ return /* @__PURE__ */ jsxs(
16
+ "div",
17
+ {
18
+ className: "text-midground text-display grid grid-cols-[auto_1fr_auto] items-center gap-2.5",
19
+ children: [
20
+ flip ? labelText : valueText,
21
+ /* @__PURE__ */ jsx(
22
+ Typography,
23
+ {
24
+ className: "min-w-0 overflow-hidden text-[13px] leading-[1.4] tracking-[0.4em] opacity-20",
25
+ expanded: true,
26
+ children: "\xB7".repeat(100)
27
+ }
28
+ ),
29
+ flip ? valueText : labelText
30
+ ]
31
+ },
32
+ (typeof label === "string" ? label : label.key) + "@@@" + (typeof value === "string" ? value : value.key)
33
+ );
34
+ }) });
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IFJlYWN0LCB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuXG5pbXBvcnQgeyBUeXBvZ3JhcGh5IH0gZnJvbSAnLi90eXBvZ3JhcGh5J1xuXG5leHBvcnQgZnVuY3Rpb24gU3RhdHMoeyBjbGFzc05hbWUsIGl0ZW1zLCBmbGlwLCAuLi5wcm9wcyB9OiBTdGF0c1Byb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2NuKCdmbGV4IHctZnVsbCBmbGV4LWNvbCBnYXAtNScsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30+XG4gICAgICB7aXRlbXMubWFwKCh7IGxhYmVsLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlVGV4dCA9IChcbiAgICAgICAgICA8VHlwb2dyYXBoeVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyBsZWFkaW5nLVsxLjRdIHRyYWNraW5nLXdpZGVzdFwiXG4gICAgICAgICAgICBleHBhbmRlZFxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiB2YWx1ZS5ub2RlfVxuICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgKVxuICAgICAgICBjb25zdCBsYWJlbFRleHQgPSAoXG4gICAgICAgICAgPFR5cG9ncmFwaHkgY2xhc3NOYW1lPVwibGVhZGluZy1ub25lIHRyYWNraW5nLVswLjJlbV0gb3BhY2l0eS02MFwiIG1vbm8+XG4gICAgICAgICAgICB7dHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJyA/IGxhYmVsIDogbGFiZWwubm9kZX1cbiAgICAgICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtbWlkZ3JvdW5kIHRleHQtZGlzcGxheSBncmlkIGdyaWQtY29scy1bYXV0b18xZnJfYXV0b10gaXRlbXMtY2VudGVyIGdhcC0yLjVcIlxuICAgICAgICAgICAga2V5PXsodHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJyA/IGxhYmVsIDogbGFiZWwua2V5ICkgKyAnQEBAJysodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdmFsdWUua2V5KX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZmxpcCA/IGxhYmVsVGV4dCA6IHZhbHVlVGV4dH1cblxuICAgICAgICAgICAgPFR5cG9ncmFwaHlcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWluLXctMCBvdmVyZmxvdy1oaWRkZW4gdGV4dC1bMTNweF0gbGVhZGluZy1bMS40XSB0cmFja2luZy1bMC40ZW1dIG9wYWNpdHktMjBcIlxuICAgICAgICAgICAgICBleHBhbmRlZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7J1x1MDBCNycucmVwZWF0KDEwMCl9XG4gICAgICAgICAgICA8L1R5cG9ncmFwaHk+XG5cbiAgICAgICAgICAgIHtmbGlwID8gdmFsdWVUZXh0IDogbGFiZWxUZXh0fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApXG4gICAgICB9KX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5pbnRlcmZhY2UgU3RhdHNQcm9wcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPiB7XG4gIGl0ZW1zOiB7XG4gICAgbGFiZWw6IHN0cmluZyB8IHtrZXk6IHN0cmluZywgbm9kZTogUmVhY3ROb2RlfVxuICAgIHZhbHVlOiBzdHJpbmcgfCB7a2V5OiBzdHJpbmcsIG5vZGU6IFJlYWN0Tm9kZX1cbiAgfVtdXG4gIGZsaXA/OiBib29sZWFuXG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFXVSxjQWNBLFlBZEE7QUFUVixTQUFTLFVBQVU7QUFFbkIsU0FBUyxrQkFBa0I7QUFFcEIsZ0JBQVMsTUFBTSxFQUFFLFdBQVcsT0FBTyxNQUFNLEdBQUcsTUFBTSxHQUFlO0FBQ3RFLFNBQ0Usb0JBQUMsU0FBSSxXQUFXLEdBQUcsOEJBQThCLFNBQVMsR0FBSSxHQUFHLE9BQzlELGdCQUFNLElBQUksQ0FBQyxFQUFFLE9BQU8sTUFBTSxNQUFNO0FBQy9CLFVBQU0sWUFDSjtBQUFBLE1BQUM7QUFBQTtBQUFBLFFBQ0MsV0FBVTtBQUFBLFFBQ1YsVUFBUTtBQUFBLFFBRVAsaUJBQU8sVUFBVSxXQUFXLFFBQVEsTUFBTTtBQUFBO0FBQUEsSUFDN0M7QUFFRixVQUFNLFlBQ0osb0JBQUMsY0FBVyxXQUFVLDRDQUEyQyxNQUFJLE1BQ2xFLGlCQUFPLFVBQVUsV0FBVyxRQUFRLE1BQU0sTUFDN0M7QUFHRixXQUNFO0FBQUEsTUFBQztBQUFBO0FBQUEsUUFDQyxXQUFVO0FBQUEsUUFHVDtBQUFBLGlCQUFPLFlBQVk7QUFBQSxVQUVwQjtBQUFBLFlBQUM7QUFBQTtBQUFBLGNBQ0MsV0FBVTtBQUFBLGNBQ1YsVUFBUTtBQUFBLGNBRVAsaUJBQUksT0FBTyxHQUFHO0FBQUE7QUFBQSxVQUNqQjtBQUFBLFVBRUMsT0FBTyxZQUFZO0FBQUE7QUFBQTtBQUFBLE9BWGQsT0FBTyxVQUFVLFdBQVcsUUFBUSxNQUFNLE9BQVEsU0FBTyxPQUFPLFVBQVUsV0FBVyxRQUFRLE1BQU07QUFBQSxJQVkzRztBQUFBLEVBRUosQ0FBQyxHQUNIO0FBRUo7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,7 @@
1
+ import { type ButtonHTMLAttributes } from 'react';
2
+ export declare const Switch: import("react").ForwardRefExoticComponent<SwitchProps & import("react").RefAttributes<HTMLButtonElement>>;
3
+ interface SwitchProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {
4
+ checked: boolean;
5
+ onCheckedChange: (checked: boolean) => void;
6
+ }
7
+ export {};
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import { cn } from "../../utils/index.js";
5
+ export const Switch = forwardRef(function Switch2({ checked, className, disabled, id, onCheckedChange, ...props }, ref) {
6
+ return /* @__PURE__ */ jsx(
7
+ "button",
8
+ {
9
+ "aria-checked": checked,
10
+ className: cn(
11
+ "peer inline-flex h-5 w-9 shrink-0 items-center border transition-colors cursor-pointer",
12
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30",
13
+ "disabled:cursor-not-allowed disabled:opacity-50",
14
+ checked ? "bg-midground/15 border-midground/30" : "bg-background border-midground/20",
15
+ className
16
+ ),
17
+ disabled,
18
+ id,
19
+ onClick: () => onCheckedChange(!checked),
20
+ ref,
21
+ role: "switch",
22
+ type: "button",
23
+ ...props,
24
+ children: /* @__PURE__ */ jsx(
25
+ "span",
26
+ {
27
+ "aria-hidden": true,
28
+ className: cn(
29
+ "pointer-events-none block h-3.5 w-3.5 transition-transform",
30
+ checked ? "translate-x-4 bg-midground" : "translate-x-0.5 bg-midground/40"
31
+ )
32
+ }
33
+ )
34
+ }
35
+ );
36
+ });
37
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHR5cGUgQnV0dG9uSFRNTEF0dHJpYnV0ZXMsIGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuZXhwb3J0IGNvbnN0IFN3aXRjaCA9IGZvcndhcmRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQsIFN3aXRjaFByb3BzPihmdW5jdGlvbiBTd2l0Y2goXG4gIHsgY2hlY2tlZCwgY2xhc3NOYW1lLCBkaXNhYmxlZCwgaWQsIG9uQ2hlY2tlZENoYW5nZSwgLi4ucHJvcHMgfSxcbiAgcmVmXG4pIHtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICBhcmlhLWNoZWNrZWQ9e2NoZWNrZWR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncGVlciBpbmxpbmUtZmxleCBoLTUgdy05IHNocmluay0wIGl0ZW1zLWNlbnRlciBib3JkZXIgdHJhbnNpdGlvbi1jb2xvcnMgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAnZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTEgZm9jdXMtdmlzaWJsZTpyaW5nLW1pZGdyb3VuZC8zMCcsXG4gICAgICAgICdkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gICAgICAgIGNoZWNrZWRcbiAgICAgICAgICA/ICdiZy1taWRncm91bmQvMTUgYm9yZGVyLW1pZGdyb3VuZC8zMCdcbiAgICAgICAgICA6ICdiZy1iYWNrZ3JvdW5kIGJvcmRlci1taWRncm91bmQvMjAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBpZD17aWR9XG4gICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoZWNrZWRDaGFuZ2UoIWNoZWNrZWQpfVxuICAgICAgcmVmPXtyZWZ9XG4gICAgICByb2xlPVwic3dpdGNoXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgYmxvY2sgaC0zLjUgdy0zLjUgdHJhbnNpdGlvbi10cmFuc2Zvcm0nLFxuICAgICAgICAgIGNoZWNrZWRcbiAgICAgICAgICAgID8gJ3RyYW5zbGF0ZS14LTQgYmctbWlkZ3JvdW5kJ1xuICAgICAgICAgICAgOiAndHJhbnNsYXRlLXgtMC41IGJnLW1pZGdyb3VuZC80MCdcbiAgICAgICAgKX1cbiAgICAgIC8+XG4gICAgPC9idXR0b24+XG4gIClcbn0pXG5cbmludGVyZmFjZSBTd2l0Y2hQcm9wc1xuICBleHRlbmRzIE9taXQ8QnV0dG9uSFRNTEF0dHJpYnV0ZXM8SFRNTEJ1dHRvbkVsZW1lbnQ+LCAnb25DaGFuZ2UnPiB7XG4gIGNoZWNrZWQ6IGJvb2xlYW5cbiAgb25DaGVja2VkQ2hhbmdlOiAoY2hlY2tlZDogYm9vbGVhbikgPT4gdm9pZFxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQThCTTtBQTVCTixTQUFvQyxrQkFBa0I7QUFFdEQsU0FBUyxVQUFVO0FBRVosYUFBTSxTQUFTLFdBQTJDLFNBQVNBLFFBQ3hFLEVBQUUsU0FBUyxXQUFXLFVBQVUsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLEdBQzlELEtBQ0E7QUFDQSxTQUNFO0FBQUEsSUFBQztBQUFBO0FBQUEsTUFDQyxnQkFBYztBQUFBLE1BQ2QsV0FBVztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsVUFDSSx3Q0FDQTtBQUFBLFFBQ0o7QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLFNBQVMsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPO0FBQUEsTUFDdkM7QUFBQSxNQUNBLE1BQUs7QUFBQSxNQUNMLE1BQUs7QUFBQSxNQUNKLEdBQUc7QUFBQSxNQUVKO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDQyxlQUFXO0FBQUEsVUFDWCxXQUFXO0FBQUEsWUFDVDtBQUFBLFlBQ0EsVUFDSSwrQkFDQTtBQUFBLFVBQ047QUFBQTtBQUFBLE1BQ0Y7QUFBQTtBQUFBLEVBQ0Y7QUFFSixDQUFDOyIsCiAgIm5hbWVzIjogWyJTd2l0Y2giXQp9Cg==
@@ -0,0 +1,14 @@
1
+ import { type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react';
2
+ export declare function Tabs({ children, className, defaultValue }: TabsProps): import("react").JSX.Element;
3
+ export declare function TabsList({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
4
+ export declare function TabsTrigger({ active, className, value: _value, ...props }: TabsTriggerProps): import("react").JSX.Element;
5
+ interface TabsProps {
6
+ children: (active: string, setActive: (value: string) => void) => ReactNode;
7
+ className?: string;
8
+ defaultValue: string;
9
+ }
10
+ interface TabsTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {
11
+ active: boolean;
12
+ value: string;
13
+ }
14
+ export {};
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import {
4
+ useState
5
+ } from "react";
6
+ import { cn } from "../../utils/index.js";
7
+ export function Tabs({ children, className, defaultValue }) {
8
+ const [active, setActive] = useState(defaultValue);
9
+ return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-4", className), children: children(active, setActive) });
10
+ }
11
+ export function TabsList({ className, ...props }) {
12
+ return /* @__PURE__ */ jsx(
13
+ "div",
14
+ {
15
+ className: cn(
16
+ "inline-flex h-9 items-center justify-start border-b border-midground/15 text-text-secondary",
17
+ className
18
+ ),
19
+ ...props
20
+ }
21
+ );
22
+ }
23
+ export function TabsTrigger({
24
+ active,
25
+ className,
26
+ value: _value,
27
+ ...props
28
+ }) {
29
+ return /* @__PURE__ */ jsx(
30
+ "button",
31
+ {
32
+ className: cn(
33
+ "relative inline-flex items-center justify-center whitespace-nowrap px-3 py-1.5",
34
+ "font-mondwest text-display text-xs tracking-[0.1em] transition-all cursor-pointer",
35
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30",
36
+ active ? "text-midground after:absolute after:bottom-0 after:left-0 after:right-0 after:h-px after:bg-midground" : "text-text-secondary hover:text-midground",
37
+ className
38
+ ),
39
+ type: "button",
40
+ ...props
41
+ }
42
+ );
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7XG4gIHR5cGUgQnV0dG9uSFRNTEF0dHJpYnV0ZXMsXG4gIHR5cGUgSFRNTEF0dHJpYnV0ZXMsXG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VTdGF0ZVxufSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIFRhYnMoeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBkZWZhdWx0VmFsdWUgfTogVGFic1Byb3BzKSB7XG4gIGNvbnN0IFthY3RpdmUsIHNldEFjdGl2ZV0gPSB1c2VTdGF0ZShkZWZhdWx0VmFsdWUpXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y24oJ2ZsZXggZmxleC1jb2wgZ2FwLTQnLCBjbGFzc05hbWUpfT5cbiAgICAgIHtjaGlsZHJlbihhY3RpdmUsIHNldEFjdGl2ZSl9XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRhYnNMaXN0KHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBIVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnaW5saW5lLWZsZXggaC05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGJvcmRlci1iIGJvcmRlci1taWRncm91bmQvMTUgdGV4dC10ZXh0LXNlY29uZGFyeScsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUYWJzVHJpZ2dlcih7XG4gIGFjdGl2ZSxcbiAgY2xhc3NOYW1lLFxuICB2YWx1ZTogX3ZhbHVlLFxuICAuLi5wcm9wc1xufTogVGFic1RyaWdnZXJQcm9wcykge1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdyZWxhdGl2ZSBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgd2hpdGVzcGFjZS1ub3dyYXAgcHgtMyBweS0xLjUnLFxuICAgICAgICAnZm9udC1tb25kd2VzdCB0ZXh0LWRpc3BsYXkgdGV4dC14cyB0cmFja2luZy1bMC4xZW1dIHRyYW5zaXRpb24tYWxsIGN1cnNvci1wb2ludGVyJyxcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0xIGZvY3VzLXZpc2libGU6cmluZy1taWRncm91bmQvMzAnLFxuICAgICAgICBhY3RpdmVcbiAgICAgICAgICA/ICd0ZXh0LW1pZGdyb3VuZCBhZnRlcjphYnNvbHV0ZSBhZnRlcjpib3R0b20tMCBhZnRlcjpsZWZ0LTAgYWZ0ZXI6cmlnaHQtMCBhZnRlcjpoLXB4IGFmdGVyOmJnLW1pZGdyb3VuZCdcbiAgICAgICAgICA6ICd0ZXh0LXRleHQtc2Vjb25kYXJ5IGhvdmVyOnRleHQtbWlkZ3JvdW5kJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5pbnRlcmZhY2UgVGFic1Byb3BzIHtcbiAgY2hpbGRyZW46IChhY3RpdmU6IHN0cmluZywgc2V0QWN0aXZlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCkgPT4gUmVhY3ROb2RlXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBkZWZhdWx0VmFsdWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgVGFic1RyaWdnZXJQcm9wcyBleHRlbmRzIEJ1dHRvbkhUTUxBdHRyaWJ1dGVzPEhUTUxCdXR0b25FbGVtZW50PiB7XG4gIGFjdGl2ZTogYm9vbGVhblxuICB2YWx1ZTogc3RyaW5nXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBZUk7QUFiSjtBQUFBLEVBSUU7QUFBQSxPQUNLO0FBRVAsU0FBUyxVQUFVO0FBRVosZ0JBQVMsS0FBSyxFQUFFLFVBQVUsV0FBVyxhQUFhLEdBQWM7QUFDckUsUUFBTSxDQUFDLFFBQVEsU0FBUyxJQUFJLFNBQVMsWUFBWTtBQUVqRCxTQUNFLG9CQUFDLFNBQUksV0FBVyxHQUFHLHVCQUF1QixTQUFTLEdBQ2hELG1CQUFTLFFBQVEsU0FBUyxHQUM3QjtBQUVKO0FBRU8sZ0JBQVMsU0FBUyxFQUFFLFdBQVcsR0FBRyxNQUFNLEdBQW1DO0FBQ2hGLFNBQ0U7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNDLEdBQUc7QUFBQTtBQUFBLEVBQ047QUFFSjtBQUVPLGdCQUFTLFlBQVk7QUFBQSxFQUMxQjtBQUFBLEVBQ0E7QUFBQSxFQUNBLE9BQU87QUFBQSxFQUNQLEdBQUc7QUFDTCxHQUFxQjtBQUNuQixTQUNFO0FBQUEsSUFBQztBQUFBO0FBQUEsTUFDQyxXQUFXO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQSxTQUNJLDBHQUNBO0FBQUEsUUFDSjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE1BQUs7QUFBQSxNQUNKLEdBQUc7QUFBQTtBQUFBLEVBQ047QUFFSjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,32 @@
1
+ export declare function TerminalDemo({ ariaLabel, className, height, label, loopDelayMs, outputLineDelayMs, sequence }: TerminalDemoProps): import("react").JSX.Element;
2
+ interface ClearStep {
3
+ type: 'clear';
4
+ }
5
+ interface OutputStep {
6
+ lines: string[];
7
+ type: 'output';
8
+ }
9
+ interface PauseStep {
10
+ ms: number;
11
+ type: 'pause';
12
+ }
13
+ interface PromptStep {
14
+ text: string;
15
+ type: 'prompt';
16
+ }
17
+ interface TerminalDemoProps {
18
+ ariaLabel?: string;
19
+ className?: string;
20
+ height?: number | string;
21
+ label?: string;
22
+ loopDelayMs?: number;
23
+ outputLineDelayMs?: number;
24
+ sequence: TerminalDemoStep[];
25
+ }
26
+ export type TerminalDemoStep = ClearStep | OutputStep | PauseStep | PromptStep | TypeStep;
27
+ interface TypeStep {
28
+ delay?: number;
29
+ text: string;
30
+ type: 'type';
31
+ }
32
+ export {};
@@ -0,0 +1,125 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useRef, useState } from "react";
4
+ import { cn } from "../../utils/index.js";
5
+ function sleep(ms) {
6
+ return new Promise((resolve) => setTimeout(resolve, ms));
7
+ }
8
+ export function TerminalDemo({
9
+ ariaLabel = "Terminal Demo",
10
+ className,
11
+ height = 320,
12
+ label = "Terminal",
13
+ loopDelayMs = 1e3,
14
+ outputLineDelayMs = 50,
15
+ sequence
16
+ }) {
17
+ const bodyRef = useRef(null);
18
+ const startedRef = useRef(false);
19
+ const [html, setHtml] = useState("");
20
+ const runDemo = useCallback(async () => {
21
+ if (startedRef.current) {
22
+ return;
23
+ }
24
+ startedRef.current = true;
25
+ let content = "";
26
+ const render = (h) => {
27
+ content = h;
28
+ setHtml(h);
29
+ };
30
+ for (; ; ) {
31
+ for (const step of sequence) {
32
+ switch (step.type) {
33
+ case "clear":
34
+ content = "";
35
+ render("");
36
+ break;
37
+ case "output":
38
+ for (const line of step.lines) {
39
+ render(content + "\n" + line);
40
+ await sleep(outputLineDelayMs);
41
+ }
42
+ break;
43
+ case "pause":
44
+ await sleep(step.ms);
45
+ break;
46
+ case "prompt":
47
+ render(content + `<span class="text-midground">${step.text}</span>`);
48
+ break;
49
+ case "type":
50
+ for (const char of step.text) {
51
+ render(content + char);
52
+ await sleep(step.delay ?? 30);
53
+ }
54
+ break;
55
+ }
56
+ }
57
+ content = "";
58
+ render("");
59
+ await sleep(loopDelayMs);
60
+ }
61
+ }, [loopDelayMs, outputLineDelayMs, sequence]);
62
+ useEffect(() => {
63
+ const el = bodyRef.current?.closest("[data-demo-root]");
64
+ if (!el) {
65
+ return;
66
+ }
67
+ const observer = new IntersectionObserver(
68
+ (entries) => {
69
+ entries.forEach((entry) => {
70
+ if (entry.isIntersecting) {
71
+ runDemo();
72
+ }
73
+ });
74
+ },
75
+ { threshold: 0.3 }
76
+ );
77
+ observer.observe(el);
78
+ return () => observer.disconnect();
79
+ }, [runDemo]);
80
+ useEffect(() => {
81
+ if (bodyRef.current) {
82
+ bodyRef.current.scrollTop = bodyRef.current.scrollHeight;
83
+ }
84
+ }, [html]);
85
+ return /* @__PURE__ */ jsxs(
86
+ "div",
87
+ {
88
+ "aria-label": ariaLabel,
89
+ className: cn("border-4 border-double border-inherit", className),
90
+ "data-demo-root": true,
91
+ role: "img",
92
+ children: [
93
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b border-current/10 px-3 py-2", children: [
94
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-1.5", children: [
95
+ /* @__PURE__ */ jsx(
96
+ "span",
97
+ {
98
+ className: "bg-midground size-2 rounded-full",
99
+ style: { mixBlendMode: "plus-lighter" }
100
+ }
101
+ ),
102
+ /* @__PURE__ */ jsx("span", { className: "bg-midground/60 size-2 rounded-full" }),
103
+ /* @__PURE__ */ jsx("span", { className: "bg-midground/30 size-2 rounded-full" })
104
+ ] }),
105
+ /* @__PURE__ */ jsx("span", { className: "font-courier text-display text-xs tracking-widest text-text-tertiary", children: label })
106
+ ] }),
107
+ /* @__PURE__ */ jsx(
108
+ "div",
109
+ {
110
+ className: cn(
111
+ "overflow-x-hidden overflow-y-auto whitespace-pre-wrap",
112
+ "font-courier p-4 text-[0.75rem] leading-[1.7] normal-case"
113
+ ),
114
+ dangerouslySetInnerHTML: {
115
+ __html: html + '<span class="blink inline-block dither ml-0.5 h-[1em] w-[1ch]"></span>'
116
+ },
117
+ ref: bodyRef,
118
+ style: { height }
119
+ }
120
+ )
121
+ ]
122
+ }
123
+ );
124
+ }
125
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRlcm1pbmFsRGVtbyh7XG4gIGFyaWFMYWJlbCA9ICdUZXJtaW5hbCBEZW1vJyxcbiAgY2xhc3NOYW1lLFxuICBoZWlnaHQgPSAzMjAsXG4gIGxhYmVsID0gJ1Rlcm1pbmFsJyxcbiAgbG9vcERlbGF5TXMgPSAxMDAwLFxuICBvdXRwdXRMaW5lRGVsYXlNcyA9IDUwLFxuICBzZXF1ZW5jZVxufTogVGVybWluYWxEZW1vUHJvcHMpIHtcbiAgY29uc3QgYm9keVJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3Qgc3RhcnRlZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgW2h0bWwsIHNldEh0bWxdID0gdXNlU3RhdGUoJycpXG5cbiAgY29uc3QgcnVuRGVtbyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoc3RhcnRlZFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzdGFydGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgbGV0IGNvbnRlbnQgPSAnJ1xuXG4gICAgY29uc3QgcmVuZGVyID0gKGg6IHN0cmluZykgPT4ge1xuICAgICAgY29udGVudCA9IGhcbiAgICAgIHNldEh0bWwoaClcbiAgICB9XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc2VxdWVuY2UpIHtcbiAgICAgICAgc3dpdGNoIChzdGVwLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdjbGVhcic6XG4gICAgICAgICAgICBjb250ZW50ID0gJydcbiAgICAgICAgICAgIHJlbmRlcignJylcblxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgJ291dHB1dCc6XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RlcC5saW5lcykge1xuICAgICAgICAgICAgICByZW5kZXIoY29udGVudCArICdcXG4nICsgbGluZSlcbiAgICAgICAgICAgICAgYXdhaXQgc2xlZXAob3V0cHV0TGluZURlbGF5TXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlICdwYXVzZSc6XG4gICAgICAgICAgICBhd2FpdCBzbGVlcChzdGVwLm1zKVxuXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSAncHJvbXB0JzpcbiAgICAgICAgICAgIHJlbmRlcihjb250ZW50ICsgYDxzcGFuIGNsYXNzPVwidGV4dC1taWRncm91bmRcIj4ke3N0ZXAudGV4dH08L3NwYW4+YClcblxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyIG9mIHN0ZXAudGV4dCkge1xuICAgICAgICAgICAgICByZW5kZXIoY29udGVudCArIGNoYXIpXG4gICAgICAgICAgICAgIGF3YWl0IHNsZWVwKHN0ZXAuZGVsYXkgPz8gMzApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29udGVudCA9ICcnXG4gICAgICByZW5kZXIoJycpXG4gICAgICBhd2FpdCBzbGVlcChsb29wRGVsYXlNcylcbiAgICB9XG4gIH0sIFtsb29wRGVsYXlNcywgb3V0cHV0TGluZURlbGF5TXMsIHNlcXVlbmNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gYm9keVJlZi5jdXJyZW50Py5jbG9zZXN0KCdbZGF0YS1kZW1vLXJvb3RdJylcblxuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgICAgZW50cmllcyA9PiB7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICBydW5EZW1vKClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgeyB0aHJlc2hvbGQ6IDAuMyB9XG4gICAgKVxuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbClcblxuICAgIHJldHVybiAoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgfSwgW3J1bkRlbW9dKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGJvZHlSZWYuY3VycmVudCkge1xuICAgICAgYm9keVJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IGJvZHlSZWYuY3VycmVudC5zY3JvbGxIZWlnaHRcbiAgICB9XG4gIH0sIFtodG1sXSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGFyaWEtbGFiZWw9e2FyaWFMYWJlbH1cbiAgICAgIGNsYXNzTmFtZT17Y24oJ2JvcmRlci00IGJvcmRlci1kb3VibGUgYm9yZGVyLWluaGVyaXQnLCBjbGFzc05hbWUpfVxuICAgICAgZGF0YS1kZW1vLXJvb3RcbiAgICAgIHJvbGU9XCJpbWdcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgYm9yZGVyLWIgYm9yZGVyLWN1cnJlbnQvMTAgcHgtMyBweS0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMS41XCI+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLW1pZGdyb3VuZCBzaXplLTIgcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IG1peEJsZW5kTW9kZTogJ3BsdXMtbGlnaHRlcicgfX1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmctbWlkZ3JvdW5kLzYwIHNpemUtMiByb3VuZGVkLWZ1bGxcIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJnLW1pZGdyb3VuZC8zMCBzaXplLTIgcm91bmRlZC1mdWxsXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1jb3VyaWVyIHRleHQtZGlzcGxheSB0ZXh0LXhzIHRyYWNraW5nLXdpZGVzdCB0ZXh0LXRleHQtdGVydGlhcnlcIj5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ292ZXJmbG93LXgtaGlkZGVuIG92ZXJmbG93LXktYXV0byB3aGl0ZXNwYWNlLXByZS13cmFwJyxcbiAgICAgICAgICAnZm9udC1jb3VyaWVyIHAtNCB0ZXh0LVswLjc1cmVtXSBsZWFkaW5nLVsxLjddIG5vcm1hbC1jYXNlJ1xuICAgICAgICApfVxuICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgIF9faHRtbDpcbiAgICAgICAgICAgIGh0bWwgK1xuICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiYmxpbmsgaW5saW5lLWJsb2NrIGRpdGhlciBtbC0wLjUgaC1bMWVtXSB3LVsxY2hdXCI+PC9zcGFuPidcbiAgICAgICAgfX1cbiAgICAgICAgcmVmPXtib2R5UmVmfVxuICAgICAgICBzdHlsZT17eyBoZWlnaHQgfX1cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuaW50ZXJmYWNlIENsZWFyU3RlcCB7XG4gIHR5cGU6ICdjbGVhcidcbn1cblxuaW50ZXJmYWNlIE91dHB1dFN0ZXAge1xuICBsaW5lczogc3RyaW5nW11cbiAgdHlwZTogJ291dHB1dCdcbn1cblxuaW50ZXJmYWNlIFBhdXNlU3RlcCB7XG4gIG1zOiBudW1iZXJcbiAgdHlwZTogJ3BhdXNlJ1xufVxuXG5pbnRlcmZhY2UgUHJvbXB0U3RlcCB7XG4gIHRleHQ6IHN0cmluZ1xuICB0eXBlOiAncHJvbXB0J1xufVxuXG5pbnRlcmZhY2UgVGVybWluYWxEZW1vUHJvcHMge1xuICBhcmlhTGFiZWw/OiBzdHJpbmdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIGhlaWdodD86IG51bWJlciB8IHN0cmluZ1xuICBsYWJlbD86IHN0cmluZ1xuICBsb29wRGVsYXlNcz86IG51bWJlclxuICBvdXRwdXRMaW5lRGVsYXlNcz86IG51bWJlclxuICBzZXF1ZW5jZTogVGVybWluYWxEZW1vU3RlcFtdXG59XG5cbmV4cG9ydCB0eXBlIFRlcm1pbmFsRGVtb1N0ZXAgPVxuICB8IENsZWFyU3RlcFxuICB8IE91dHB1dFN0ZXBcbiAgfCBQYXVzZVN0ZXBcbiAgfCBQcm9tcHRTdGVwXG4gIHwgVHlwZVN0ZXBcblxuaW50ZXJmYWNlIFR5cGVTdGVwIHtcbiAgZGVsYXk/OiBudW1iZXJcbiAgdGV4dDogc3RyaW5nXG4gIHR5cGU6ICd0eXBlJ1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQW9IUSxTQUNFLEtBREY7QUFsSFIsU0FBUyxhQUFhLFdBQVcsUUFBUSxnQkFBZ0I7QUFFekQsU0FBUyxVQUFVO0FBRW5CLFNBQVMsTUFBTSxJQUFZO0FBQ3pCLFNBQU8sSUFBSSxRQUFjLGFBQVcsV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUM3RDtBQUVPLGdCQUFTLGFBQWE7QUFBQSxFQUMzQixZQUFZO0FBQUEsRUFDWjtBQUFBLEVBQ0EsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1IsY0FBYztBQUFBLEVBQ2Qsb0JBQW9CO0FBQUEsRUFDcEI7QUFDRixHQUFzQjtBQUNwQixR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
@@ -0,0 +1,6 @@
1
+ export declare function ThemeToggle({ className, style }: ThemeToggleProps): import("react").JSX.Element;
2
+ interface ThemeToggleProps {
3
+ className?: string;
4
+ style?: React.CSSProperties;
5
+ }
6
+ export {};
@@ -0,0 +1,66 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useStore } from "@nanostores/react";
4
+ import { cn } from "../../utils/index.js";
5
+ import { $lightMode, toggleLens } from "./overlays/index.js";
6
+ export function ThemeToggle({ className, style }) {
7
+ const light = useStore($lightMode);
8
+ return /* @__PURE__ */ jsxs(
9
+ "button",
10
+ {
11
+ "aria-label": light ? "Switch to dark mode" : "Switch to light mode",
12
+ className: cn(
13
+ "relative flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full",
14
+ "border border-current/25 bg-current/8 transition-colors",
15
+ "hover:bg-current/15",
16
+ className
17
+ ),
18
+ onClick: toggleLens,
19
+ style,
20
+ type: "button",
21
+ children: [
22
+ /* @__PURE__ */ jsxs(
23
+ "svg",
24
+ {
25
+ className: "absolute left-1 size-3.5 opacity-40",
26
+ fill: "none",
27
+ stroke: "currentColor",
28
+ strokeLinecap: "round",
29
+ strokeLinejoin: "round",
30
+ strokeWidth: 2,
31
+ viewBox: "0 0 24 24",
32
+ children: [
33
+ /* @__PURE__ */ jsx("circle", { cx: 12, cy: 12, r: 5 }),
34
+ /* @__PURE__ */ jsx("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" })
35
+ ]
36
+ }
37
+ ),
38
+ /* @__PURE__ */ jsx(
39
+ "svg",
40
+ {
41
+ className: "absolute right-1 size-3.5 opacity-40",
42
+ fill: "none",
43
+ stroke: "currentColor",
44
+ strokeLinecap: "round",
45
+ strokeLinejoin: "round",
46
+ strokeWidth: 2,
47
+ viewBox: "0 0 24 24",
48
+ children: /* @__PURE__ */ jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
49
+ }
50
+ ),
51
+ /* @__PURE__ */ jsx(
52
+ "span",
53
+ {
54
+ "aria-hidden": true,
55
+ className: cn(
56
+ "bg-midground absolute size-4 rounded-full",
57
+ "transition-transform duration-200 ease-out"
58
+ ),
59
+ style: { transform: `translateX(${light ? 2 : 22}px)` }
60
+ }
61
+ )
62
+ ]
63
+ }
64
+ );
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZVN0b3JlIH0gZnJvbSAnQG5hbm9zdG9yZXMvcmVhY3QnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vdXRpbHMnXG5cbmltcG9ydCB7ICRsaWdodE1vZGUsIHRvZ2dsZUxlbnMgfSBmcm9tICcuL292ZXJsYXlzJ1xuXG5leHBvcnQgZnVuY3Rpb24gVGhlbWVUb2dnbGUoeyBjbGFzc05hbWUsIHN0eWxlIH06IFRoZW1lVG9nZ2xlUHJvcHMpIHtcbiAgY29uc3QgbGlnaHQgPSB1c2VTdG9yZSgkbGlnaHRNb2RlKVxuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgYXJpYS1sYWJlbD17bGlnaHQgPyAnU3dpdGNoIHRvIGRhcmsgbW9kZScgOiAnU3dpdGNoIHRvIGxpZ2h0IG1vZGUnfVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ3JlbGF0aXZlIGZsZXggaC02IHctMTEgc2hyaW5rLTAgY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICdib3JkZXIgYm9yZGVyLWN1cnJlbnQvMjUgYmctY3VycmVudC84IHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgJ2hvdmVyOmJnLWN1cnJlbnQvMTUnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBvbkNsaWNrPXt0b2dnbGVMZW5zfVxuICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgPHN2Z1xuICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTEgc2l6ZS0zLjUgb3BhY2l0eS00MFwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgc3Ryb2tlTGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIHN0cm9rZVdpZHRoPXsyfVxuICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgID5cbiAgICAgICAgPGNpcmNsZSBjeD17MTJ9IGN5PXsxMn0gcj17NX0gLz5cblxuICAgICAgICA8cGF0aCBkPVwiTTEyIDF2Mk0xMiAyMXYyTTQuMjIgNC4yMmwxLjQyIDEuNDJNMTguMzYgMTguMzZsMS40MiAxLjQyTTEgMTJoMk0yMSAxMmgyTTQuMjIgMTkuNzhsMS40Mi0xLjQyTTE4LjM2IDUuNjRsMS40Mi0xLjQyXCIgLz5cbiAgICAgIDwvc3ZnPlxuXG4gICAgICA8c3ZnXG4gICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHJpZ2h0LTEgc2l6ZS0zLjUgb3BhY2l0eS00MFwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgc3Ryb2tlTGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIHN0cm9rZVdpZHRoPXsyfVxuICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgID5cbiAgICAgICAgPHBhdGggZD1cIk0yMSAxMi43OUE5IDkgMCAxIDEgMTEuMjEgMyA3IDcgMCAwIDAgMjEgMTIuNzl6XCIgLz5cbiAgICAgIDwvc3ZnPlxuXG4gICAgICA8c3BhblxuICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1taWRncm91bmQgYWJzb2x1dGUgc2l6ZS00IHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgJ3RyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMCBlYXNlLW91dCdcbiAgICAgICAgKX1cbiAgICAgICAgc3R5bGU9e3sgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgke2xpZ2h0ID8gMiA6IDIyfXB4KWAgfX1cbiAgICAgIC8+XG4gICAgPC9idXR0b24+XG4gIClcbn1cblxuaW50ZXJmYWNlIFRoZW1lVG9nZ2xlUHJvcHMge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBd0JNLFNBU0UsS0FURjtBQXRCTixTQUFTLGdCQUFnQjtBQUV6QixTQUFTLFVBQVU7QUFFbkIsU0FBUyxZQUFZLGtCQUFrQjtBQUVoQyxnQkFBUyxZQUFZLEVBQUUsV0FBVyxNQUFNLEdBQXFCO0FBQ2xFLFFBQU0sUUFBUSxTQUFTLFVBQVU7QUFFakMsU0FDRTtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsY0FBWSxRQUFRLHdCQUF3QjtBQUFBLE1BQzVDLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLE1BQ0EsU0FBUztBQUFBLE1BQ1Q7QUFBQSxNQUNBLE1BQUs7QUFBQSxNQUVMO0FBQUE7QUFBQSxVQUFDO0FBQUE7QUFBQSxZQUNDLFdBQVU7QUFBQSxZQUNWLE1BQUs7QUFBQSxZQUNMLFFBQU87QUFBQSxZQUNQLGVBQWM7QUFBQSxZQUNkLGdCQUFlO0FBQUEsWUFDZixhQUFhO0FBQUEsWUFDYixTQUFRO0FBQUEsWUFFUjtBQUFBLGtDQUFDLFlBQU8sSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUc7QUFBQSxjQUU5QixvQkFBQyxVQUFLLEdBQUUsc0hBQXFIO0FBQUE7QUFBQTtBQUFBLFFBQy9IO0FBQUEsUUFFQTtBQUFBLFVBQUM7QUFBQTtBQUFBLFlBQ0MsV0FBVTtBQUFBLFlBQ1YsTUFBSztBQUFBLFlBQ0wsUUFBTztBQUFBLFlBQ1AsZUFBYztBQUFBLFlBQ2QsZ0JBQWU7QUFBQSxZQUNmLGFBQWE7QUFBQSxZQUNiLFNBQVE7QUFBQSxZQUVSLDhCQUFDLFVBQUssR0FBRSxtREFBa0Q7QUFBQTtBQUFBLFFBQzVEO0FBQUEsUUFFQTtBQUFBLFVBQUM7QUFBQTtBQUFBLFlBQ0MsZUFBVztBQUFBLFlBQ1gsV0FBVztBQUFBLGNBQ1Q7QUFBQSxjQUNBO0FBQUEsWUFDRjtBQUFBLFlBQ0EsT0FBTyxFQUFFLFdBQVcsY0FBYyxRQUFRLElBQUksRUFBRSxNQUFNO0FBQUE7QUFBQSxRQUN4RDtBQUFBO0FBQUE7QUFBQSxFQUNGO0FBRUo7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Selectable tier / pricing card. Full-bleed distorted image background,
3
+ * readable overlay text, and an animated `.arc-border` shimmer on the
4
+ * selected state. Fully presentational — the consumer owns the data
5
+ * (tier schema, price formatting, tier imagery / tints).
6
+ *
7
+ * Visual states:
8
+ * - `selected`: brightens the distortion, activates `.arc-border`, and
9
+ * composites the headline / price with `mix-blend-mode: plus-lighter`
10
+ * so the text lifts off the image regardless of tint.
11
+ * - `isCurrent`: subtle midground-tinted border hint (suppressed when
12
+ * `selected` wins).
13
+ * - `overlay`: optional top-layer color blended with `mix-blend-mode:
14
+ * color` — used for the "highest tier" red treatment on top of any
15
+ * base tint.
16
+ */
17
+ export declare function TierCard({ badge, bullets, className, image, isCurrent, onSelect, overlay, price, selected, tint, tintStrength, title }: TierCardProps): import("react").JSX.Element;
18
+ export interface TierCardPrice {
19
+ /** Headline price, e.g. `"$20"` or `"Free"`. */
20
+ primary: string;
21
+ /** Small suffix rendered after `primary`, e.g. `"/mo"` or `"first payment"`. */
22
+ primarySuffix?: string;
23
+ /** Optional struck-through comparison price rendered above `primary`, e.g. `"$30"`. */
24
+ secondary?: string;
25
+ /** Small suffix rendered after `secondary`. */
26
+ secondarySuffix?: string;
27
+ }
28
+ export interface TierCardProps {
29
+ /** Small annotation after the title, e.g. `"(current)"`. */
30
+ badge?: React.ReactNode;
31
+ /** Feature list rendered under the price. */
32
+ bullets: React.ReactNode[];
33
+ className?: string;
34
+ /** Background image URL. */
35
+ image: string;
36
+ /** Applies the "current plan" border hint when not `selected`. */
37
+ isCurrent?: boolean;
38
+ onSelect?: () => void;
39
+ /** Color blended with `mix-blend-mode: color` over the image (used for the highest-tier red treatment). */
40
+ overlay?: string;
41
+ price: TierCardPrice;
42
+ /** Applies selected chrome (arc-border shimmer, active distortion, plus-lighter text blend). */
43
+ selected?: boolean;
44
+ /** Shader tint passed through to `ImageDistortion`. */
45
+ tint?: string;
46
+ /** Active / inactive tint strength passed through to `ImageDistortion`. */
47
+ tintStrength?: {
48
+ active: number;
49
+ inactive: number;
50
+ };
51
+ /** Tier name / headline. */
52
+ title: React.ReactNode;
53
+ }