@nous-research/ui 0.13.2 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/README.md +16 -0
  2. package/dist/assets/filler-bg0.webp +0 -0
  3. package/dist/assets.d.ts +38 -0
  4. package/dist/fonts.d.ts +0 -1
  5. package/dist/fonts.js +5 -7
  6. package/dist/hooks/use-capped-frame.d.ts +0 -1
  7. package/dist/hooks/use-capped-frame.js +12 -13
  8. package/dist/hooks/use-css-var-dims.d.ts +0 -1
  9. package/dist/hooks/use-css-var-dims.js +26 -21
  10. package/dist/hooks/use-gpu-tier.d.ts +0 -1
  11. package/dist/hooks/use-gpu-tier.js +90 -110
  12. package/dist/hooks/use-render-loop.d.ts +0 -1
  13. package/dist/hooks/use-render-loop.js +58 -58
  14. package/dist/hooks/use-smooth-controls.d.ts +0 -1
  15. package/dist/hooks/use-smooth-controls.js +204 -206
  16. package/dist/index.d.ts +0 -1
  17. package/dist/index.js +84 -58
  18. package/dist/ui/basic-page.d.ts +1 -2
  19. package/dist/ui/basic-page.js +15 -7
  20. package/dist/ui/build.css +1 -0
  21. package/dist/ui/components/animated-count.d.ts +1 -2
  22. package/dist/ui/components/animated-count.js +109 -85
  23. package/dist/ui/components/ascii.d.ts +2 -3
  24. package/dist/ui/components/ascii.js +75 -59
  25. package/dist/ui/components/badge.d.ts +1 -2
  26. package/dist/ui/components/badge.js +35 -18
  27. package/dist/ui/components/badges/nous-girl.d.ts +1 -2
  28. package/dist/ui/components/badges/nous-girl.js +80 -3
  29. package/dist/ui/components/blend-mode.d.ts +1 -2
  30. package/dist/ui/components/blend-mode.js +55 -63
  31. package/dist/ui/components/blink.d.ts +1 -2
  32. package/dist/ui/components/blink.js +15 -6
  33. package/dist/ui/components/button.d.ts +2 -3
  34. package/dist/ui/components/button.js +139 -90
  35. package/dist/ui/components/command-block.d.ts +2 -3
  36. package/dist/ui/components/command-block.js +52 -24
  37. package/dist/ui/components/cursor.d.ts +1 -2
  38. package/dist/ui/components/cursor.js +93 -54
  39. package/dist/ui/components/dropdown-menu.d.ts +1 -2
  40. package/dist/ui/components/dropdown-menu.js +99 -51
  41. package/dist/ui/components/fit-text/index.d.ts +0 -1
  42. package/dist/ui/components/fit-text/index.js +21 -13
  43. package/dist/ui/components/graphs/bar-chart.d.ts +1 -2
  44. package/dist/ui/components/graphs/bar-chart.js +116 -63
  45. package/dist/ui/components/graphs/index.d.ts +0 -1
  46. package/dist/ui/components/graphs/index.js +3 -4
  47. package/dist/ui/components/graphs/line-chart.d.ts +1 -2
  48. package/dist/ui/components/graphs/line-chart.js +159 -102
  49. package/dist/ui/components/graphs/utils.d.ts +2 -3
  50. package/dist/ui/components/graphs/utils.js +147 -114
  51. package/dist/ui/components/grid/index.d.ts +0 -1
  52. package/dist/ui/components/grid/index.js +12 -9
  53. package/dist/ui/components/hover-bg.d.ts +0 -1
  54. package/dist/ui/components/hover-bg.js +11 -6
  55. package/dist/ui/components/icons/arrow.d.ts +1 -2
  56. package/dist/ui/components/icons/arrow.js +42 -5
  57. package/dist/ui/components/icons/chevron.d.ts +1 -2
  58. package/dist/ui/components/icons/chevron.js +49 -5
  59. package/dist/ui/components/icons/discord.d.ts +1 -2
  60. package/dist/ui/components/icons/discord.js +12 -4
  61. package/dist/ui/components/icons/eye.d.ts +1 -2
  62. package/dist/ui/components/icons/eye.js +5 -3
  63. package/dist/ui/components/icons/gear.d.ts +1 -2
  64. package/dist/ui/components/icons/gear.js +28 -14
  65. package/dist/ui/components/icons/github.d.ts +1 -2
  66. package/dist/ui/components/icons/github.js +12 -4
  67. package/dist/ui/components/icons/hamburger.d.ts +1 -2
  68. package/dist/ui/components/icons/hamburger.js +54 -5
  69. package/dist/ui/components/icons/heart.d.ts +1 -2
  70. package/dist/ui/components/icons/heart.js +8 -3
  71. package/dist/ui/components/icons/index.d.ts +0 -1
  72. package/dist/ui/components/icons/index.js +11 -12
  73. package/dist/ui/components/icons/link.d.ts +1 -2
  74. package/dist/ui/components/icons/link.js +10 -3
  75. package/dist/ui/components/icons/minus.d.ts +1 -2
  76. package/dist/ui/components/icons/minus.js +10 -3
  77. package/dist/ui/components/icons/search.d.ts +1 -2
  78. package/dist/ui/components/icons/search.js +30 -3
  79. package/dist/ui/components/image-distortion.d.ts +1 -2
  80. package/dist/ui/components/image-distortion.js +300 -265
  81. package/dist/ui/components/leva-client.d.ts +1 -2
  82. package/dist/ui/components/leva-client.js +9 -10
  83. package/dist/ui/components/list-item.d.ts +0 -1
  84. package/dist/ui/components/list-item.js +26 -10
  85. package/dist/ui/components/modal/index.d.ts +1 -2
  86. package/dist/ui/components/modal/index.js +33 -14
  87. package/dist/ui/components/overlays/blend-modes.d.ts +0 -1
  88. package/dist/ui/components/overlays/blend-modes.js +11 -12
  89. package/dist/ui/components/overlays/glitch.d.ts +1 -2
  90. package/dist/ui/components/overlays/glitch.js +115 -110
  91. package/dist/ui/components/overlays/greys.d.ts +1 -2
  92. package/dist/ui/components/overlays/greys.js +200 -179
  93. package/dist/ui/components/overlays/index.d.ts +1 -2
  94. package/dist/ui/components/overlays/index.js +31 -17
  95. package/dist/ui/components/overlays/lens-layers.d.ts +1 -2
  96. package/dist/ui/components/overlays/lens-layers.js +89 -65
  97. package/dist/ui/components/overlays/lens.d.ts +0 -1
  98. package/dist/ui/components/overlays/lens.js +46 -52
  99. package/dist/ui/components/overlays/noise.d.ts +1 -2
  100. package/dist/ui/components/overlays/noise.js +112 -113
  101. package/dist/ui/components/overlays/vignette.d.ts +1 -2
  102. package/dist/ui/components/overlays/vignette.js +44 -38
  103. package/dist/ui/components/poster.d.ts +1 -2
  104. package/dist/ui/components/poster.js +240 -87
  105. package/dist/ui/components/progress.d.ts +1 -2
  106. package/dist/ui/components/progress.js +52 -12
  107. package/dist/ui/components/scene-canvas.d.ts +1 -2
  108. package/dist/ui/components/scene-canvas.js +169 -119
  109. package/dist/ui/components/scramble.d.ts +1 -2
  110. package/dist/ui/components/scramble.js +60 -59
  111. package/dist/ui/components/segmented.d.ts +2 -3
  112. package/dist/ui/components/segmented.js +47 -12
  113. package/dist/ui/components/select.d.ts +1 -2
  114. package/dist/ui/components/select.js +207 -120
  115. package/dist/ui/components/selection-switcher.d.ts +0 -1
  116. package/dist/ui/components/selection-switcher.js +29 -25
  117. package/dist/ui/components/shader.d.ts +1 -2
  118. package/dist/ui/components/shader.js +56 -38
  119. package/dist/ui/components/socials.d.ts +1 -2
  120. package/dist/ui/components/socials.js +18 -7
  121. package/dist/ui/components/spinner.d.ts +1 -2
  122. package/dist/ui/components/spinner.js +36 -25
  123. package/dist/ui/components/stats.d.ts +1 -2
  124. package/dist/ui/components/stats.js +33 -9
  125. package/dist/ui/components/switch.d.ts +0 -1
  126. package/dist/ui/components/switch.js +35 -11
  127. package/dist/ui/components/tabs.d.ts +3 -4
  128. package/dist/ui/components/tabs.js +38 -12
  129. package/dist/ui/components/terminal-demo.d.ts +1 -2
  130. package/dist/ui/components/terminal-demo.js +119 -74
  131. package/dist/ui/components/theme-toggle.d.ts +1 -2
  132. package/dist/ui/components/theme-toggle.js +63 -8
  133. package/dist/ui/components/tier-card.d.ts +1 -2
  134. package/dist/ui/components/tier-card.js +144 -24
  135. package/dist/ui/components/tv.d.ts +1 -2
  136. package/dist/ui/components/tv.js +138 -90
  137. package/dist/ui/components/typography/h1.d.ts +0 -1
  138. package/dist/ui/components/typography/h1.js +17 -8
  139. package/dist/ui/components/typography/h2.d.ts +0 -1
  140. package/dist/ui/components/typography/h2.js +17 -8
  141. package/dist/ui/components/typography/index.d.ts +0 -1
  142. package/dist/ui/components/typography/index.js +35 -24
  143. package/dist/ui/components/typography/legend.d.ts +1 -2
  144. package/dist/ui/components/typography/legend.js +18 -6
  145. package/dist/ui/components/typography/small.d.ts +0 -1
  146. package/dist/ui/components/typography/small.js +8 -7
  147. package/dist/ui/components/watchlist.d.ts +1 -2
  148. package/dist/ui/components/watchlist.js +77 -25
  149. package/dist/ui/fonts.css +7 -7
  150. package/dist/ui/footer.d.ts +1 -2
  151. package/dist/ui/footer.js +61 -25
  152. package/dist/ui/globals.css +5 -1
  153. package/dist/ui/header.d.ts +1 -2
  154. package/dist/ui/header.js +255 -60
  155. package/dist/ui/layout-wrapper.d.ts +1 -2
  156. package/dist/ui/layout-wrapper.js +5 -4
  157. package/dist/utils/color.d.ts +0 -1
  158. package/dist/utils/color.js +8 -9
  159. package/dist/utils/index.d.ts +0 -1
  160. package/dist/utils/index.js +37 -38
  161. package/dist/utils/poly.d.ts +0 -1
  162. package/dist/utils/poly.js +1 -2
  163. package/package.json +42 -24
  164. package/dist/assets/filler-bg0.jpg +0 -0
  165. package/dist/fonts.d.ts.map +0 -1
  166. package/dist/fonts.js.map +0 -1
  167. package/dist/hooks/use-capped-frame.d.ts.map +0 -1
  168. package/dist/hooks/use-capped-frame.js.map +0 -1
  169. package/dist/hooks/use-css-var-dims.d.ts.map +0 -1
  170. package/dist/hooks/use-css-var-dims.js.map +0 -1
  171. package/dist/hooks/use-gpu-tier.d.ts.map +0 -1
  172. package/dist/hooks/use-gpu-tier.js.map +0 -1
  173. package/dist/hooks/use-render-loop.d.ts.map +0 -1
  174. package/dist/hooks/use-render-loop.js.map +0 -1
  175. package/dist/hooks/use-smooth-controls.d.ts.map +0 -1
  176. package/dist/hooks/use-smooth-controls.js.map +0 -1
  177. package/dist/index.d.ts.map +0 -1
  178. package/dist/index.js.map +0 -1
  179. package/dist/ui/basic-page.d.ts.map +0 -1
  180. package/dist/ui/basic-page.js.map +0 -1
  181. package/dist/ui/components/animated-count.d.ts.map +0 -1
  182. package/dist/ui/components/animated-count.js.map +0 -1
  183. package/dist/ui/components/ascii.d.ts.map +0 -1
  184. package/dist/ui/components/ascii.js.map +0 -1
  185. package/dist/ui/components/badge.d.ts.map +0 -1
  186. package/dist/ui/components/badge.js.map +0 -1
  187. package/dist/ui/components/badges/nous-girl.d.ts.map +0 -1
  188. package/dist/ui/components/badges/nous-girl.js.map +0 -1
  189. package/dist/ui/components/blend-mode.d.ts.map +0 -1
  190. package/dist/ui/components/blend-mode.js.map +0 -1
  191. package/dist/ui/components/blink.d.ts.map +0 -1
  192. package/dist/ui/components/blink.js.map +0 -1
  193. package/dist/ui/components/button.d.ts.map +0 -1
  194. package/dist/ui/components/button.js.map +0 -1
  195. package/dist/ui/components/command-block.d.ts.map +0 -1
  196. package/dist/ui/components/command-block.js.map +0 -1
  197. package/dist/ui/components/cursor.d.ts.map +0 -1
  198. package/dist/ui/components/cursor.js.map +0 -1
  199. package/dist/ui/components/dropdown-menu.d.ts.map +0 -1
  200. package/dist/ui/components/dropdown-menu.js.map +0 -1
  201. package/dist/ui/components/fit-text/index.d.ts.map +0 -1
  202. package/dist/ui/components/fit-text/index.js.map +0 -1
  203. package/dist/ui/components/graphs/bar-chart.d.ts.map +0 -1
  204. package/dist/ui/components/graphs/bar-chart.js.map +0 -1
  205. package/dist/ui/components/graphs/index.d.ts.map +0 -1
  206. package/dist/ui/components/graphs/index.js.map +0 -1
  207. package/dist/ui/components/graphs/line-chart.d.ts.map +0 -1
  208. package/dist/ui/components/graphs/line-chart.js.map +0 -1
  209. package/dist/ui/components/graphs/utils.d.ts.map +0 -1
  210. package/dist/ui/components/graphs/utils.js.map +0 -1
  211. package/dist/ui/components/grid/index.d.ts.map +0 -1
  212. package/dist/ui/components/grid/index.js.map +0 -1
  213. package/dist/ui/components/hover-bg.d.ts.map +0 -1
  214. package/dist/ui/components/hover-bg.js.map +0 -1
  215. package/dist/ui/components/icons/arrow.d.ts.map +0 -1
  216. package/dist/ui/components/icons/arrow.js.map +0 -1
  217. package/dist/ui/components/icons/chevron.d.ts.map +0 -1
  218. package/dist/ui/components/icons/chevron.js.map +0 -1
  219. package/dist/ui/components/icons/discord.d.ts.map +0 -1
  220. package/dist/ui/components/icons/discord.js.map +0 -1
  221. package/dist/ui/components/icons/eye.d.ts.map +0 -1
  222. package/dist/ui/components/icons/eye.js.map +0 -1
  223. package/dist/ui/components/icons/gear.d.ts.map +0 -1
  224. package/dist/ui/components/icons/gear.js.map +0 -1
  225. package/dist/ui/components/icons/github.d.ts.map +0 -1
  226. package/dist/ui/components/icons/github.js.map +0 -1
  227. package/dist/ui/components/icons/hamburger.d.ts.map +0 -1
  228. package/dist/ui/components/icons/hamburger.js.map +0 -1
  229. package/dist/ui/components/icons/heart.d.ts.map +0 -1
  230. package/dist/ui/components/icons/heart.js.map +0 -1
  231. package/dist/ui/components/icons/index.d.ts.map +0 -1
  232. package/dist/ui/components/icons/index.js.map +0 -1
  233. package/dist/ui/components/icons/link.d.ts.map +0 -1
  234. package/dist/ui/components/icons/link.js.map +0 -1
  235. package/dist/ui/components/icons/minus.d.ts.map +0 -1
  236. package/dist/ui/components/icons/minus.js.map +0 -1
  237. package/dist/ui/components/icons/search.d.ts.map +0 -1
  238. package/dist/ui/components/icons/search.js.map +0 -1
  239. package/dist/ui/components/image-distortion.d.ts.map +0 -1
  240. package/dist/ui/components/image-distortion.js.map +0 -1
  241. package/dist/ui/components/leva-client.d.ts.map +0 -1
  242. package/dist/ui/components/leva-client.js.map +0 -1
  243. package/dist/ui/components/list-item.d.ts.map +0 -1
  244. package/dist/ui/components/list-item.js.map +0 -1
  245. package/dist/ui/components/modal/index.d.ts.map +0 -1
  246. package/dist/ui/components/modal/index.js.map +0 -1
  247. package/dist/ui/components/overlays/blend-modes.d.ts.map +0 -1
  248. package/dist/ui/components/overlays/blend-modes.js.map +0 -1
  249. package/dist/ui/components/overlays/glitch.d.ts.map +0 -1
  250. package/dist/ui/components/overlays/glitch.js.map +0 -1
  251. package/dist/ui/components/overlays/greys.d.ts.map +0 -1
  252. package/dist/ui/components/overlays/greys.js.map +0 -1
  253. package/dist/ui/components/overlays/index.d.ts.map +0 -1
  254. package/dist/ui/components/overlays/index.js.map +0 -1
  255. package/dist/ui/components/overlays/lens-layers.d.ts.map +0 -1
  256. package/dist/ui/components/overlays/lens-layers.js.map +0 -1
  257. package/dist/ui/components/overlays/lens.d.ts.map +0 -1
  258. package/dist/ui/components/overlays/lens.js.map +0 -1
  259. package/dist/ui/components/overlays/noise.d.ts.map +0 -1
  260. package/dist/ui/components/overlays/noise.js.map +0 -1
  261. package/dist/ui/components/overlays/vignette.d.ts.map +0 -1
  262. package/dist/ui/components/overlays/vignette.js.map +0 -1
  263. package/dist/ui/components/poster.d.ts.map +0 -1
  264. package/dist/ui/components/poster.js.map +0 -1
  265. package/dist/ui/components/progress.d.ts.map +0 -1
  266. package/dist/ui/components/progress.js.map +0 -1
  267. package/dist/ui/components/scene-canvas.d.ts.map +0 -1
  268. package/dist/ui/components/scene-canvas.js.map +0 -1
  269. package/dist/ui/components/scramble.d.ts.map +0 -1
  270. package/dist/ui/components/scramble.js.map +0 -1
  271. package/dist/ui/components/segmented.d.ts.map +0 -1
  272. package/dist/ui/components/segmented.js.map +0 -1
  273. package/dist/ui/components/select.d.ts.map +0 -1
  274. package/dist/ui/components/select.js.map +0 -1
  275. package/dist/ui/components/selection-switcher.d.ts.map +0 -1
  276. package/dist/ui/components/selection-switcher.js.map +0 -1
  277. package/dist/ui/components/shader.d.ts.map +0 -1
  278. package/dist/ui/components/shader.js.map +0 -1
  279. package/dist/ui/components/socials.d.ts.map +0 -1
  280. package/dist/ui/components/socials.js.map +0 -1
  281. package/dist/ui/components/spinner.d.ts.map +0 -1
  282. package/dist/ui/components/spinner.js.map +0 -1
  283. package/dist/ui/components/stats.d.ts.map +0 -1
  284. package/dist/ui/components/stats.js.map +0 -1
  285. package/dist/ui/components/switch.d.ts.map +0 -1
  286. package/dist/ui/components/switch.js.map +0 -1
  287. package/dist/ui/components/tabs.d.ts.map +0 -1
  288. package/dist/ui/components/tabs.js.map +0 -1
  289. package/dist/ui/components/terminal-demo.d.ts.map +0 -1
  290. package/dist/ui/components/terminal-demo.js.map +0 -1
  291. package/dist/ui/components/theme-toggle.d.ts.map +0 -1
  292. package/dist/ui/components/theme-toggle.js.map +0 -1
  293. package/dist/ui/components/tier-card.d.ts.map +0 -1
  294. package/dist/ui/components/tier-card.js.map +0 -1
  295. package/dist/ui/components/tv.d.ts.map +0 -1
  296. package/dist/ui/components/tv.js.map +0 -1
  297. package/dist/ui/components/typography/h1.d.ts.map +0 -1
  298. package/dist/ui/components/typography/h1.js.map +0 -1
  299. package/dist/ui/components/typography/h2.d.ts.map +0 -1
  300. package/dist/ui/components/typography/h2.js.map +0 -1
  301. package/dist/ui/components/typography/index.d.ts.map +0 -1
  302. package/dist/ui/components/typography/index.js.map +0 -1
  303. package/dist/ui/components/typography/legend.d.ts.map +0 -1
  304. package/dist/ui/components/typography/legend.js.map +0 -1
  305. package/dist/ui/components/typography/small.d.ts.map +0 -1
  306. package/dist/ui/components/typography/small.js.map +0 -1
  307. package/dist/ui/components/watchlist.d.ts.map +0 -1
  308. package/dist/ui/components/watchlist.js.map +0 -1
  309. package/dist/ui/footer.d.ts.map +0 -1
  310. package/dist/ui/footer.js.map +0 -1
  311. package/dist/ui/header.d.ts.map +0 -1
  312. package/dist/ui/header.js.map +0 -1
  313. package/dist/ui/layout-wrapper.d.ts.map +0 -1
  314. package/dist/ui/layout-wrapper.js.map +0 -1
  315. package/dist/utils/color.d.ts.map +0 -1
  316. package/dist/utils/color.js.map +0 -1
  317. package/dist/utils/index.d.ts.map +0 -1
  318. package/dist/utils/index.js.map +0 -1
  319. package/dist/utils/poly.d.ts.map +0 -1
  320. package/dist/utils/poly.js.map +0 -1
@@ -1,127 +1,214 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Children, isValidElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
- import { cn } from '../../utils';
5
- const TRIGGER_CN = 'flex h-9 w-full items-center justify-between gap-2 ' +
6
- 'border border-midground/15 bg-background/40 px-3 py-1 ' +
7
- 'font-courier text-sm text-left text-midground transition-colors ' +
8
- 'hover:border-midground/25 ' +
9
- 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30 focus-visible:border-midground/30 ' +
10
- 'disabled:cursor-not-allowed disabled:opacity-50 ' +
11
- 'cursor-pointer';
12
- const LISTBOX_CN = 'absolute z-50 mt-1 w-full max-h-60 overflow-auto ' +
13
- 'border border-midground/15 bg-background-base text-midground shadow-lg';
14
- export function Select({ children, className, disabled, id, onValueChange, placeholder, style, value }) {
15
- const [open, setOpen] = useState(false);
16
- const [highlightedIndex, setHighlightedIndex] = useState(-1);
17
- const containerRef = useRef(null);
18
- const listRef = useRef(null);
19
- const options = useMemo(() => collectOptions(children), [children]);
20
- const selected = options.find(o => o.value === value);
21
- const displayLabel = selected?.label ?? placeholder ?? value ?? '';
22
- const close = useCallback(() => {
23
- setOpen(false);
24
- setHighlightedIndex(-1);
25
- }, []);
26
- useEffect(() => {
27
- if (!open)
28
- return;
29
- const ac = new AbortController();
30
- document.addEventListener('mousedown', e => {
31
- if (!containerRef.current?.contains(e.target))
32
- close();
33
- }, { signal: ac.signal });
34
- return () => ac.abort();
35
- }, [open, close]);
36
- useEffect(() => {
37
- if (!open || highlightedIndex < 0)
38
- return;
39
- const el = listRef.current?.children[highlightedIndex];
40
- el?.scrollIntoView({ block: 'nearest' });
41
- }, [open, highlightedIndex]);
42
- const handleKeyDown = (e) => {
43
- if (disabled)
44
- return;
45
- switch (e.key) {
46
- case 'Enter':
47
- case ' ':
48
- e.preventDefault();
49
- if (!open) {
50
- setOpen(true);
51
- setHighlightedIndex(options.findIndex(o => o.value === value));
52
- }
53
- else if (highlightedIndex >= 0 && options[highlightedIndex]) {
54
- onValueChange?.(options[highlightedIndex].value);
55
- close();
56
- }
57
- break;
58
- case 'ArrowDown':
59
- e.preventDefault();
60
- if (!open) {
61
- setOpen(true);
62
- setHighlightedIndex(options.findIndex(o => o.value === value));
63
- }
64
- else {
65
- setHighlightedIndex(i => Math.min(i + 1, options.length - 1));
66
- }
67
- break;
68
- case 'ArrowUp':
69
- e.preventDefault();
70
- if (open)
71
- setHighlightedIndex(i => Math.max(i - 1, 0));
72
- break;
73
- case 'Home':
74
- if (open) {
75
- e.preventDefault();
76
- setHighlightedIndex(0);
77
- }
78
- break;
79
- case 'End':
80
- if (open) {
81
- e.preventDefault();
82
- setHighlightedIndex(options.length - 1);
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ Children,
5
+ isValidElement,
6
+ useCallback,
7
+ useEffect,
8
+ useMemo,
9
+ useRef,
10
+ useState
11
+ } from "react";
12
+ import { cn } from "../../utils/index.js";
13
+ const TRIGGER_CN = "flex h-9 w-full items-center justify-between gap-2 border border-midground/15 bg-background/40 px-3 py-1 font-courier text-sm text-left text-midground transition-colors hover:border-midground/25 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30 focus-visible:border-midground/30 disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer";
14
+ const LISTBOX_CN = "absolute z-50 mt-1 w-full max-h-60 overflow-auto border border-midground/15 bg-background-base text-midground shadow-lg";
15
+ export function Select({
16
+ children,
17
+ className,
18
+ disabled,
19
+ id,
20
+ onValueChange,
21
+ placeholder,
22
+ style,
23
+ value
24
+ }) {
25
+ const [open, setOpen] = useState(false);
26
+ const [highlightedIndex, setHighlightedIndex] = useState(-1);
27
+ const containerRef = useRef(null);
28
+ const listRef = useRef(null);
29
+ const options = useMemo(() => collectOptions(children), [children]);
30
+ const selected = options.find((o) => o.value === value);
31
+ const displayLabel = selected?.label ?? placeholder ?? value ?? "";
32
+ const close = useCallback(() => {
33
+ setOpen(false);
34
+ setHighlightedIndex(-1);
35
+ }, []);
36
+ useEffect(() => {
37
+ if (!open) return;
38
+ const ac = new AbortController();
39
+ document.addEventListener(
40
+ "mousedown",
41
+ (e) => {
42
+ if (!containerRef.current?.contains(e.target)) close();
43
+ },
44
+ { signal: ac.signal }
45
+ );
46
+ return () => ac.abort();
47
+ }, [open, close]);
48
+ useEffect(() => {
49
+ if (!open || highlightedIndex < 0) return;
50
+ const el = listRef.current?.children[highlightedIndex];
51
+ el?.scrollIntoView({ block: "nearest" });
52
+ }, [open, highlightedIndex]);
53
+ const handleKeyDown = (e) => {
54
+ if (disabled) return;
55
+ switch (e.key) {
56
+ case "Enter":
57
+ case " ":
58
+ e.preventDefault();
59
+ if (!open) {
60
+ setOpen(true);
61
+ setHighlightedIndex(options.findIndex((o) => o.value === value));
62
+ } else if (highlightedIndex >= 0 && options[highlightedIndex]) {
63
+ onValueChange?.(options[highlightedIndex].value);
64
+ close();
65
+ }
66
+ break;
67
+ case "ArrowDown":
68
+ e.preventDefault();
69
+ if (!open) {
70
+ setOpen(true);
71
+ setHighlightedIndex(options.findIndex((o) => o.value === value));
72
+ } else {
73
+ setHighlightedIndex((i) => Math.min(i + 1, options.length - 1));
74
+ }
75
+ break;
76
+ case "ArrowUp":
77
+ e.preventDefault();
78
+ if (open) setHighlightedIndex((i) => Math.max(i - 1, 0));
79
+ break;
80
+ case "Home":
81
+ if (open) {
82
+ e.preventDefault();
83
+ setHighlightedIndex(0);
84
+ }
85
+ break;
86
+ case "End":
87
+ if (open) {
88
+ e.preventDefault();
89
+ setHighlightedIndex(options.length - 1);
90
+ }
91
+ break;
92
+ case "Escape":
93
+ e.preventDefault();
94
+ close();
95
+ break;
96
+ }
97
+ };
98
+ return /* @__PURE__ */ jsxs(
99
+ "div",
100
+ {
101
+ className: cn("relative", className),
102
+ id,
103
+ ref: containerRef,
104
+ style,
105
+ children: [
106
+ /* @__PURE__ */ jsxs(
107
+ "button",
108
+ {
109
+ "aria-expanded": open,
110
+ "aria-haspopup": "listbox",
111
+ className: TRIGGER_CN,
112
+ disabled,
113
+ onClick: () => !disabled && setOpen((o) => !o),
114
+ onKeyDown: handleKeyDown,
115
+ role: "combobox",
116
+ type: "button",
117
+ children: [
118
+ /* @__PURE__ */ jsx("span", { className: cn("truncate", !selected && "text-midground/50"), children: displayLabel }),
119
+ /* @__PURE__ */ jsx(
120
+ ChevronDownGlyph,
121
+ {
122
+ className: cn(
123
+ "size-3 shrink-0 text-midground/60 transition-transform",
124
+ open && "rotate-180"
125
+ )
83
126
  }
84
- break;
85
- case 'Escape':
86
- e.preventDefault();
127
+ )
128
+ ]
129
+ }
130
+ ),
131
+ open && /* @__PURE__ */ jsx("div", { className: LISTBOX_CN, ref: listRef, role: "listbox", children: options.map((opt, i) => {
132
+ const isSelected = opt.value === value;
133
+ const isHighlighted = i === highlightedIndex;
134
+ return /* @__PURE__ */ jsxs(
135
+ "div",
136
+ {
137
+ "aria-selected": isSelected,
138
+ className: cn(
139
+ "flex cursor-pointer items-center gap-2 px-3 py-2",
140
+ "font-courier text-sm transition-colors",
141
+ isHighlighted && "bg-midground/10",
142
+ isSelected ? "text-midground" : "text-midground/70"
143
+ ),
144
+ onClick: () => {
145
+ onValueChange?.(opt.value);
87
146
  close();
88
- break;
89
- }
90
- };
91
- return (_jsxs("div", { className: cn('relative', className), id: id, ref: containerRef, style: style, children: [_jsxs("button", { "aria-expanded": open, "aria-haspopup": "listbox", className: TRIGGER_CN, disabled: disabled, onClick: () => !disabled && setOpen(o => !o), onKeyDown: handleKeyDown, role: "combobox", type: "button", children: [_jsx("span", { className: cn('truncate', !selected && 'text-midground/50'), children: displayLabel }), _jsx(ChevronDownGlyph, { className: cn('size-3 shrink-0 text-midground/60 transition-transform', open && 'rotate-180') })] }), open && (_jsx("div", { className: LISTBOX_CN, ref: listRef, role: "listbox", children: options.map((opt, i) => {
92
- const isSelected = opt.value === value;
93
- const isHighlighted = i === highlightedIndex;
94
- return (_jsxs("div", { "aria-selected": isSelected, className: cn('flex cursor-pointer items-center gap-2 px-3 py-2', 'font-courier text-sm transition-colors', isHighlighted && 'bg-midground/10', isSelected ? 'text-midground' : 'text-midground/70'), onClick: () => {
95
- onValueChange?.(opt.value);
96
- close();
97
- }, onMouseEnter: () => setHighlightedIndex(i), role: "option", children: [_jsx(CheckGlyph, { className: cn('size-3 shrink-0', isSelected ? 'opacity-100' : 'opacity-0') }), _jsx("span", { className: "truncate", children: opt.label })] }, opt.value));
98
- }) }))] }));
147
+ },
148
+ onMouseEnter: () => setHighlightedIndex(i),
149
+ role: "option",
150
+ children: [
151
+ /* @__PURE__ */ jsx(
152
+ CheckGlyph,
153
+ {
154
+ className: cn(
155
+ "size-3 shrink-0",
156
+ isSelected ? "opacity-100" : "opacity-0"
157
+ )
158
+ }
159
+ ),
160
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: opt.label })
161
+ ]
162
+ },
163
+ opt.value
164
+ );
165
+ }) })
166
+ ]
167
+ }
168
+ );
99
169
  }
100
- // Marker component — `Select` reads `value`/`children` from its tree.
101
- // Renders nothing on its own.
102
170
  export function SelectOption(_props) {
103
- return null;
171
+ return null;
104
172
  }
105
- const ChevronDownGlyph = ({ className }) => (_jsx("svg", { "aria-hidden": true, className: className, fill: "none", stroke: "currentColor", strokeLinecap: "square", strokeWidth: 1.5, viewBox: "0 0 12 12", children: _jsx("path", { d: "M2.5 4.5 6 8l3.5-3.5" }) }));
106
- const CheckGlyph = ({ className }) => (_jsx("svg", { "aria-hidden": true, className: className, fill: "none", stroke: "currentColor", strokeLinecap: "square", strokeWidth: 1.5, viewBox: "0 0 12 12", children: _jsx("path", { d: "m2.5 6.5 2.5 2.5L9.5 3.5" }) }));
173
+ const ChevronDownGlyph = ({ className }) => /* @__PURE__ */ jsx(
174
+ "svg",
175
+ {
176
+ "aria-hidden": true,
177
+ className,
178
+ fill: "none",
179
+ stroke: "currentColor",
180
+ strokeLinecap: "square",
181
+ strokeWidth: 1.5,
182
+ viewBox: "0 0 12 12",
183
+ children: /* @__PURE__ */ jsx("path", { d: "M2.5 4.5 6 8l3.5-3.5" })
184
+ }
185
+ );
186
+ const CheckGlyph = ({ className }) => /* @__PURE__ */ jsx(
187
+ "svg",
188
+ {
189
+ "aria-hidden": true,
190
+ className,
191
+ fill: "none",
192
+ stroke: "currentColor",
193
+ strokeLinecap: "square",
194
+ strokeWidth: 1.5,
195
+ viewBox: "0 0 12 12",
196
+ children: /* @__PURE__ */ jsx("path", { d: "m2.5 6.5 2.5 2.5L9.5 3.5" })
197
+ }
198
+ );
107
199
  function collectOptions(children) {
108
- const out = [];
109
- Children.forEach(children, child => {
110
- if (!isValidElement(child))
111
- return;
112
- const el = child;
113
- if (el.props.value !== undefined) {
114
- out.push({
115
- label: typeof el.props.children === 'string'
116
- ? el.props.children
117
- : String(el.props.value),
118
- value: String(el.props.value)
119
- });
120
- }
121
- else if (el.props.children) {
122
- out.push(...collectOptions(el.props.children));
123
- }
124
- });
125
- return out;
200
+ const out = [];
201
+ Children.forEach(children, (child) => {
202
+ if (!isValidElement(child)) return;
203
+ const el = child;
204
+ if (el.props.value !== void 0) {
205
+ out.push({
206
+ label: typeof el.props.children === "string" ? el.props.children : String(el.props.value),
207
+ value: String(el.props.value)
208
+ });
209
+ } else if (el.props.children) {
210
+ out.push(...collectOptions(el.props.children));
211
+ }
212
+ });
213
+ return out;
126
214
  }
127
- //# sourceMappingURL=select.js.map
@@ -1,2 +1 @@
1
1
  export declare function SelectionSwitcher(): null;
2
- //# sourceMappingURL=selection-switcher.d.ts.map
@@ -1,29 +1,33 @@
1
- 'use client';
2
- import { useEffect } from 'react';
1
+ "use client";
2
+ import { useEffect } from "react";
3
3
  const colors = [
4
- 'oklch(85% 0.12 330)',
5
- 'oklch(85% 0.12 300)',
6
- 'oklch(85% 0.12 270)',
7
- 'oklch(85% 0.12 230)',
8
- 'oklch(85% 0.12 180)',
9
- 'oklch(85% 0.12 150)',
10
- 'oklch(85% 0.12 120)',
11
- 'oklch(85% 0.12 90)',
12
- 'oklch(85% 0.12 60)',
13
- 'oklch(85% 0.12 30)',
14
- 'oklch(88% 0.10 80)'
4
+ "oklch(85% 0.12 330)",
5
+ "oklch(85% 0.12 300)",
6
+ "oklch(85% 0.12 270)",
7
+ "oklch(85% 0.12 230)",
8
+ "oklch(85% 0.12 180)",
9
+ "oklch(85% 0.12 150)",
10
+ "oklch(85% 0.12 120)",
11
+ "oklch(85% 0.12 90)",
12
+ "oklch(85% 0.12 60)",
13
+ "oklch(85% 0.12 30)",
14
+ "oklch(88% 0.10 80)"
15
15
  ];
16
16
  export function SelectionSwitcher() {
17
- useEffect(() => {
18
- const ac = new AbortController();
19
- const { signal } = ac;
20
- let idx = 0;
21
- const cycle = () => requestAnimationFrame(() => document.documentElement.style.setProperty('--selection-bg', colors[(idx = (idx + 1) % colors.length)]));
22
- const onKey = (e) => e.key.toLowerCase() === 'a' && (e.metaKey || e.ctrlKey) && cycle();
23
- document.addEventListener('selectstart', cycle, { signal });
24
- document.addEventListener('keydown', onKey, { signal });
25
- return () => ac.abort();
26
- }, []);
27
- return null;
17
+ useEffect(() => {
18
+ const ac = new AbortController();
19
+ const { signal } = ac;
20
+ let idx = 0;
21
+ const cycle = () => requestAnimationFrame(
22
+ () => document.documentElement.style.setProperty(
23
+ "--selection-bg",
24
+ colors[idx = (idx + 1) % colors.length]
25
+ )
26
+ );
27
+ const onKey = (e) => e.key.toLowerCase() === "a" && (e.metaKey || e.ctrlKey) && cycle();
28
+ document.addEventListener("selectstart", cycle, { signal });
29
+ document.addEventListener("keydown", onKey, { signal });
30
+ return () => ac.abort();
31
+ }, []);
32
+ return null;
28
33
  }
29
- //# sourceMappingURL=selection-switcher.js.map
@@ -1,8 +1,7 @@
1
1
  import { type ThreeElements } from '@react-three/fiber';
2
2
  import type { ReactNode } from 'react';
3
- export declare function Shader({ children, defines, depthTest, fragmentShader, uniforms, vertexShader, ...props }: ShaderProps): string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
3
+ export declare function Shader({ children, defines, depthTest, fragmentShader, uniforms, vertexShader, ...props }: ShaderProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react").JSX.Element | null | undefined;
4
4
  interface ShaderProps extends Omit<ThreeElements['mesh'], 'children'>, Pick<ThreeElements['shaderMaterial'], 'defines' | 'depthTest' | 'fragmentShader' | 'uniforms' | 'vertexShader'> {
5
5
  children?: ((material: ReactNode) => ReactNode) | ReactNode;
6
6
  }
7
7
  export {};
8
- //# sourceMappingURL=shader.d.ts.map
@@ -1,41 +1,59 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useThree } from '@react-three/fiber';
4
- import { useEffect, useRef } from 'react';
5
- import * as THREE from 'three';
6
- import { useCappedFrame } from '../../hooks/use-capped-frame';
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useThree } from "@react-three/fiber";
4
+ import { useEffect, useRef } from "react";
5
+ import * as THREE from "three";
6
+ import { useCappedFrame } from "../../hooks/use-capped-frame.js";
7
7
  const defaultUniforms = {
8
- uResolution: new THREE.Uniform(new THREE.Vector4()),
9
- uTime: new THREE.Uniform(0)
8
+ uResolution: new THREE.Uniform(new THREE.Vector4()),
9
+ uTime: new THREE.Uniform(0)
10
10
  };
11
- export function Shader({ children, defines, depthTest, fragmentShader, uniforms, vertexShader, ...props }) {
12
- const invalidate = useThree(st => st.invalidate);
13
- const { size, viewport } = useThree();
14
- const isMobile = size.width < 1024;
15
- const uniformsRef = useRef({
16
- ...defaultUniforms,
17
- ...(uniforms ?? {})
18
- });
19
- useCappedFrame(({ clock }) => {
20
- const w = size.width * viewport.dpr;
21
- const h = size.height * viewport.dpr;
22
- uniformsRef.current.uTime.value = clock.getElapsedTime();
23
- uniformsRef.current.uResolution.value.copy(new THREE.Vector4(w, h, w / h, viewport.dpr));
24
- }, isMobile ? 0 : 80);
25
- useEffect(() => void (uniforms && Object.assign(uniformsRef.current, uniforms)), [uniforms]);
26
- useEffect(() => void (isMobile && invalidate(80)), [invalidate, isMobile]);
27
- const materialProps = {
28
- defines: defines ?? {},
29
- depthTest,
30
- fragmentShader,
31
- side: THREE.DoubleSide,
32
- transparent: true,
33
- uniforms: uniformsRef.current,
34
- vertexShader
35
- };
36
- if (typeof children === 'function') {
37
- return children(_jsx("shaderMaterial", { ...materialProps }));
38
- }
39
- return (_jsxs("mesh", { ...props, children: [children ?? _jsx("planeGeometry", {}), _jsx("shaderMaterial", { ...materialProps })] }));
11
+ export function Shader({
12
+ children,
13
+ defines,
14
+ depthTest,
15
+ fragmentShader,
16
+ uniforms,
17
+ vertexShader,
18
+ ...props
19
+ }) {
20
+ const invalidate = useThree((st) => st.invalidate);
21
+ const { size, viewport } = useThree();
22
+ const isMobile = size.width < 1024;
23
+ const uniformsRef = useRef({
24
+ ...defaultUniforms,
25
+ ...uniforms ?? {}
26
+ });
27
+ useCappedFrame(
28
+ ({ clock }) => {
29
+ const w = size.width * viewport.dpr;
30
+ const h = size.height * viewport.dpr;
31
+ uniformsRef.current.uTime.value = clock.getElapsedTime();
32
+ uniformsRef.current.uResolution.value.copy(
33
+ new THREE.Vector4(w, h, w / h, viewport.dpr)
34
+ );
35
+ },
36
+ isMobile ? 0 : 80
37
+ );
38
+ useEffect(
39
+ () => void (uniforms && Object.assign(uniformsRef.current, uniforms)),
40
+ [uniforms]
41
+ );
42
+ useEffect(() => void (isMobile && invalidate(80)), [invalidate, isMobile]);
43
+ const materialProps = {
44
+ defines: defines ?? {},
45
+ depthTest,
46
+ fragmentShader,
47
+ side: THREE.DoubleSide,
48
+ transparent: true,
49
+ uniforms: uniformsRef.current,
50
+ vertexShader
51
+ };
52
+ if (typeof children === "function") {
53
+ return children(/* @__PURE__ */ jsx("shaderMaterial", { ...materialProps }));
54
+ }
55
+ return /* @__PURE__ */ jsxs("mesh", { ...props, children: [
56
+ children ?? /* @__PURE__ */ jsx("planeGeometry", {}),
57
+ /* @__PURE__ */ jsx("shaderMaterial", { ...materialProps })
58
+ ] });
40
59
  }
41
- //# sourceMappingURL=shader.js.map
@@ -1,4 +1,4 @@
1
- export declare function Socials({ className, items, onNavigate, ...rest }: SocialsProps): import("react/jsx-runtime").JSX.Element;
1
+ export declare function Socials({ className, items, onNavigate, ...rest }: SocialsProps): import("react").JSX.Element;
2
2
  export interface SocialLink {
3
3
  external?: boolean;
4
4
  href: string;
@@ -18,4 +18,3 @@ interface SocialsProps extends React.HTMLAttributes<HTMLDivElement> {
18
18
  onNavigate?: () => void;
19
19
  }
20
20
  export {};
21
- //# sourceMappingURL=socials.d.ts.map
@@ -1,9 +1,20 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cn } from '../../utils';
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../utils/index.js";
3
3
  export function Socials({ className, items, onNavigate, ...rest }) {
4
- return (_jsx("div", { className: cn('flex items-center gap-3', className), ...rest, children: items.map(({ external = true, href, icon: Icon, label, onClick }) => (_jsx("a", { className: "opacity-60 transition-opacity hover:opacity-100", href: href, onClick: e => {
5
- onClick?.(e);
6
- onNavigate?.();
7
- }, rel: external ? 'noopener noreferrer' : undefined, target: external ? '_blank' : undefined, title: label, children: _jsx(Icon, {}) }, label))) }));
4
+ return /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-3", className), ...rest, children: items.map(({ external = true, href, icon: Icon, label, onClick }) => /* @__PURE__ */ jsx(
5
+ "a",
6
+ {
7
+ className: "opacity-60 transition-opacity hover:opacity-100",
8
+ href,
9
+ onClick: (e) => {
10
+ onClick?.(e);
11
+ onNavigate?.();
12
+ },
13
+ rel: external ? "noopener noreferrer" : void 0,
14
+ target: external ? "_blank" : void 0,
15
+ title: label,
16
+ children: /* @__PURE__ */ jsx(Icon, {})
17
+ },
18
+ label
19
+ )) });
8
20
  }
9
- //# sourceMappingURL=socials.js.map
@@ -11,11 +11,10 @@ import { type BrailleSpinnerName } from 'unicode-animations';
11
11
  * the spinner has no surrounding loading text and screen readers need to know
12
12
  * something is loading.
13
13
  */
14
- export declare function Spinner({ className, name, style, ...props }: SpinnerProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare function Spinner({ className, name, style, ...props }: SpinnerProps): import("react").JSX.Element;
15
15
  interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {
16
16
  className?: string;
17
17
  name?: BrailleSpinnerName;
18
18
  style?: CSSProperties;
19
19
  }
20
20
  export {};
21
- //# sourceMappingURL=spinner.d.ts.map
@@ -1,26 +1,37 @@
1
- 'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useEffect, useState } from 'react';
4
- import spinners from 'unicode-animations';
5
- import { cn } from '../../utils';
6
- /**
7
- * Braille unicode spinner. Renders the active frame of a `unicode-animations`
8
- * sequence inside an inline `<span>`, advancing on the spinner's own interval.
9
- *
10
- * Inherits font color and font size from its parent — apply Tailwind utilities
11
- * (e.g. `text-warning`, `text-base`) via `className` to style.
12
- *
13
- * Decorative by default. Pass `aria-label` (and optionally `role="status"`) when
14
- * the spinner has no surrounding loading text and screen readers need to know
15
- * something is loading.
16
- */
17
- export function Spinner({ className, name = 'braille', style, ...props }) {
18
- const [frame, setFrame] = useState(0);
19
- const animation = spinners[name];
20
- useEffect(() => {
21
- const id = setInterval(() => setFrame(f => (f + 1) % animation.frames.length), animation.interval);
22
- return () => clearInterval(id);
23
- }, [animation.frames.length, animation.interval]);
24
- return (_jsx("span", { "aria-hidden": props['aria-label'] ? undefined : true, className: cn('font-mono inline-block leading-none tabular-nums', className), style: style, ...props, children: animation.frames[frame] }));
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
+ );
25
37
  }
26
- //# sourceMappingURL=spinner.js.map
@@ -1,5 +1,5 @@
1
1
  import React, { ReactNode } from 'react';
2
- export declare function Stats({ className, items, flip, ...props }: StatsProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function Stats({ className, items, flip, ...props }: StatsProps): React.JSX.Element;
3
3
  interface StatsProps extends React.ComponentProps<'div'> {
4
4
  items: {
5
5
  label: string | {
@@ -14,4 +14,3 @@ interface StatsProps extends React.ComponentProps<'div'> {
14
14
  flip?: boolean;
15
15
  }
16
16
  export {};
17
- //# sourceMappingURL=stats.d.ts.map