@vllnt/ui 0.3.0-canary.f3cafe8 → 0.3.0

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 (336) hide show
  1. package/CHANGELOG.md +16 -5
  2. package/README.md +1 -1
  3. package/dist/components/accordion/accordion.js +2 -8
  4. package/dist/components/activity-heatmap/activity-heatmap.js +22 -29
  5. package/dist/components/activity-log/activity-log.js +52 -53
  6. package/dist/components/agent-activity/agent-activity.js +139 -125
  7. package/dist/components/ai-artifact/ai-artifact.js +115 -76
  8. package/dist/components/ai-chat-input/ai-chat-input.js +59 -61
  9. package/dist/components/ai-message-bubble/ai-message-bubble.js +63 -65
  10. package/dist/components/ai-sidebar/ai-sidebar.js +77 -55
  11. package/dist/components/ai-source-citation/ai-source-citation.js +38 -32
  12. package/dist/components/ai-streaming-text/ai-streaming-text.js +33 -35
  13. package/dist/components/ai-tool-call-display/ai-tool-call-display.js +58 -60
  14. package/dist/components/alert/alert.js +20 -7
  15. package/dist/components/alert-dialog/alert-dialog.js +36 -13
  16. package/dist/components/alert-pulse/alert-pulse.js +69 -69
  17. package/dist/components/anchor-port/anchor-port.js +26 -28
  18. package/dist/components/animated-beam/animated-beam.js +157 -0
  19. package/dist/components/animated-beam/index.js +4 -0
  20. package/dist/components/animated-grid-pattern/animated-grid-pattern.js +81 -0
  21. package/dist/components/animated-grid-pattern/index.js +6 -0
  22. package/dist/components/animated-list/animated-list.js +28 -0
  23. package/dist/components/animated-list/index.js +4 -0
  24. package/dist/components/animated-tabs/animated-tabs.js +98 -0
  25. package/dist/components/animated-tabs/index.js +6 -0
  26. package/dist/components/animated-testimonials/animated-testimonials.js +97 -0
  27. package/dist/components/animated-testimonials/index.js +6 -0
  28. package/dist/components/animated-text/animated-text.js +66 -67
  29. package/dist/components/animated-tooltip/animated-tooltip.js +58 -0
  30. package/dist/components/animated-tooltip/index.js +6 -0
  31. package/dist/components/auto-reload/auto-reload.js +109 -105
  32. package/dist/components/avatar/avatar.js +18 -7
  33. package/dist/components/avatar-group/avatar-group.js +35 -30
  34. package/dist/components/banner/banner.js +80 -77
  35. package/dist/components/bento-grid/bento-grid.js +46 -0
  36. package/dist/components/bento-grid/index.js +8 -0
  37. package/dist/components/blur-reveal/blur-reveal.js +83 -0
  38. package/dist/components/blur-reveal/index.js +4 -0
  39. package/dist/components/border-beam/border-beam.js +43 -45
  40. package/dist/components/bottom-activity-strip/bottom-activity-strip.js +5 -5
  41. package/dist/components/bottom-bar/bottom-bar.js +22 -18
  42. package/dist/components/button/button.js +18 -14
  43. package/dist/components/button-group/button-group.js +37 -0
  44. package/dist/components/button-group/index.js +8 -0
  45. package/dist/components/candlestick-chart/candlestick-chart.js +52 -54
  46. package/dist/components/canvas-shell/canvas-shell.js +11 -6
  47. package/dist/components/canvas-view/canvas-view.js +72 -74
  48. package/dist/components/card/card.js +35 -12
  49. package/dist/components/card-flip/card-flip.js +67 -0
  50. package/dist/components/card-flip/index.js +4 -0
  51. package/dist/components/carousel/carousel.js +78 -60
  52. package/dist/components/chain-of-thought/chain-of-thought.js +78 -0
  53. package/dist/components/chain-of-thought/index.js +6 -0
  54. package/dist/components/chart/area-chart.js +66 -67
  55. package/dist/components/chart/bar-chart.js +68 -70
  56. package/dist/components/chart/line-chart.js +69 -70
  57. package/dist/components/chat-dock-section/chat-dock-section.js +43 -45
  58. package/dist/components/checkbox/checkbox.js +6 -3
  59. package/dist/components/checkbox-group/checkbox-group.js +98 -0
  60. package/dist/components/checkbox-group/index.js +8 -0
  61. package/dist/components/choropleth-map/choropleth-map.js +90 -82
  62. package/dist/components/chronological-timeline/chronological-timeline.js +75 -72
  63. package/dist/components/civilization-card/civilization-card.js +59 -56
  64. package/dist/components/code-block/code-block.js +14 -17
  65. package/dist/components/code-playground/code-playground.js +8 -9
  66. package/dist/components/color-picker/color-picker.js +133 -0
  67. package/dist/components/color-picker/index.js +4 -0
  68. package/dist/components/combobox/combobox.js +57 -58
  69. package/dist/components/command/command.js +42 -15
  70. package/dist/components/comment-pin/comment-pin.js +58 -60
  71. package/dist/components/connector-edge/connector-edge.js +59 -54
  72. package/dist/components/content-intro/content-intro.js +4 -1
  73. package/dist/components/context-lens/context-lens.js +74 -73
  74. package/dist/components/context-menu/context-menu.js +55 -17
  75. package/dist/components/contribution-graph/contribution-graph.js +118 -0
  76. package/dist/components/contribution-graph/index.js +6 -0
  77. package/dist/components/conversation-thread/conversation-thread.js +89 -65
  78. package/dist/components/cookie-consent/cookie-consent.js +114 -115
  79. package/dist/components/copy-button/copy-button.js +100 -103
  80. package/dist/components/countdown-timer/countdown-timer.js +47 -75
  81. package/dist/components/credit-badge/credit-badge.js +26 -22
  82. package/dist/components/curriculum/curriculum.js +2 -2
  83. package/dist/components/cursor/cursor.js +52 -0
  84. package/dist/components/cursor/index.js +4 -0
  85. package/dist/components/data-list/data-list.js +54 -40
  86. package/dist/components/date-field/date-field.js +42 -0
  87. package/dist/components/date-field/index.js +4 -0
  88. package/dist/components/date-picker/date-picker.js +49 -50
  89. package/dist/components/date-range-picker/date-range-picker.js +73 -0
  90. package/dist/components/date-range-picker/index.js +6 -0
  91. package/dist/components/dialog/dialog.js +25 -9
  92. package/dist/components/dock/dock.js +109 -0
  93. package/dist/components/dock/index.js +5 -0
  94. package/dist/components/document-sibling-nav/document-sibling-nav.js +10 -5
  95. package/dist/components/dot-pattern/dot-pattern.js +36 -0
  96. package/dist/components/dot-pattern/index.js +4 -0
  97. package/dist/components/drawer/drawer.js +25 -9
  98. package/dist/components/dropdown-menu/dropdown-menu.js +56 -17
  99. package/dist/components/edge-label/edge-label.js +17 -15
  100. package/dist/components/empty-state/empty-state.js +27 -31
  101. package/dist/components/era-comparison/era-comparison.js +96 -83
  102. package/dist/components/expandable-cards/expandable-cards.js +61 -0
  103. package/dist/components/expandable-cards/index.js +6 -0
  104. package/dist/components/field/field.js +137 -0
  105. package/dist/components/field/index.js +16 -0
  106. package/dist/components/fieldset/fieldset.js +49 -0
  107. package/dist/components/fieldset/index.js +10 -0
  108. package/dist/components/file-upload/file-upload.js +4 -3
  109. package/dist/components/floating-navbar/floating-navbar.js +67 -0
  110. package/dist/components/floating-navbar/index.js +4 -0
  111. package/dist/components/floating-toolbar/floating-toolbar.js +49 -51
  112. package/dist/components/flow-diagram/flow-fullscreen.js +3 -13
  113. package/dist/components/flow-diagram/use-flow-diagram.js +7 -18
  114. package/dist/components/follow-mode/follow-mode.js +67 -69
  115. package/dist/components/form/form.js +131 -112
  116. package/dist/components/gantt-chart/gantt-chart.js +49 -51
  117. package/dist/components/gauge-chart/gauge-chart.js +132 -0
  118. package/dist/components/gauge-chart/index.js +4 -0
  119. package/dist/components/geography-quiz-map/geography-quiz-map.js +88 -78
  120. package/dist/components/glass-card/glass-card.js +25 -0
  121. package/dist/components/glass-card/index.js +4 -0
  122. package/dist/components/glass-panel/glass-panel.js +16 -14
  123. package/dist/components/glass-progress/glass-progress.js +39 -0
  124. package/dist/components/glass-progress/index.js +4 -0
  125. package/dist/components/globe-3d/globe-3d.js +70 -66
  126. package/dist/components/grid/grid.js +100 -0
  127. package/dist/components/grid/index.js +4 -0
  128. package/dist/components/group-hull/group-hull.js +27 -22
  129. package/dist/components/handoff-beacon/handoff-beacon.js +55 -57
  130. package/dist/components/heat-map-overlay/heat-map-overlay.js +55 -55
  131. package/dist/components/heat-overlay/heat-overlay.js +49 -48
  132. package/dist/components/historic-timeline/historic-timeline.js +57 -59
  133. package/dist/components/historical-figure-card/historical-figure-card.js +5 -3
  134. package/dist/components/hover-card/hover-card.js +8 -3
  135. package/dist/components/index.js +271 -0
  136. package/dist/components/infinite-plane/infinite-plane.js +34 -36
  137. package/dist/components/input/input.js +19 -17
  138. package/dist/components/input-group/index.js +14 -0
  139. package/dist/components/input-group/input-group.js +73 -0
  140. package/dist/components/input-otp/input-otp.js +25 -8
  141. package/dist/components/interactive-timeline/interactive-timeline.js +38 -15
  142. package/dist/components/item/index.js +18 -0
  143. package/dist/components/item/item.js +118 -0
  144. package/dist/components/jarvis-dock/jarvis-dock.js +40 -42
  145. package/dist/components/kbd/kbd.js +31 -42
  146. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +7 -18
  147. package/dist/components/knowledge-check/knowledge-check.js +50 -58
  148. package/dist/components/label/label.js +6 -3
  149. package/dist/components/left-rail/left-rail.js +22 -18
  150. package/dist/components/link/index.js +5 -0
  151. package/dist/components/link/link.js +53 -0
  152. package/dist/components/liquid-glass/index.js +4 -0
  153. package/dist/components/liquid-glass/liquid-glass.js +39 -0
  154. package/dist/components/list-box/index.js +8 -0
  155. package/dist/components/list-box/list-box.js +130 -0
  156. package/dist/components/live-cursor/live-cursor.js +49 -51
  157. package/dist/components/live-feed/live-feed.js +51 -76
  158. package/dist/components/magnetic/index.js +4 -0
  159. package/dist/components/magnetic/magnetic.js +63 -0
  160. package/dist/components/magnetic-button/index.js +4 -0
  161. package/dist/components/magnetic-button/magnetic-button.js +64 -0
  162. package/dist/components/map-2d/map-2d.js +120 -101
  163. package/dist/components/map-timeline/map-timeline.js +188 -170
  164. package/dist/components/market-treemap/market-treemap.js +10 -6
  165. package/dist/components/marquee/marquee.js +64 -65
  166. package/dist/components/mdx-content/mdx-content.js +4 -1
  167. package/dist/components/menubar/menubar.js +82 -35
  168. package/dist/components/meteors/index.js +4 -0
  169. package/dist/components/meteors/meteors.js +62 -0
  170. package/dist/components/meter/index.js +5 -0
  171. package/dist/components/meter/meter.js +76 -0
  172. package/dist/components/metric-cluster/metric-cluster.js +47 -49
  173. package/dist/components/metric-gauge/metric-gauge.js +42 -44
  174. package/dist/components/mini-map-panel/mini-map-panel.js +71 -66
  175. package/dist/components/model-comparison/model-comparison.js +76 -67
  176. package/dist/components/multi-select/multi-select.js +100 -102
  177. package/dist/components/multi-select-lasso/multi-select-lasso.js +5 -5
  178. package/dist/components/native-select/index.js +4 -0
  179. package/dist/components/native-select/native-select.js +28 -0
  180. package/dist/components/navbar-saas/navbar-saas.js +54 -46
  181. package/dist/components/navigation-menu/navigation-menu.js +38 -13
  182. package/dist/components/newsletter-signup/newsletter-signup.js +5 -3
  183. package/dist/components/number-input/number-input.js +4 -3
  184. package/dist/components/number-ticker/number-ticker.js +50 -51
  185. package/dist/components/object-card/object-card.js +40 -42
  186. package/dist/components/object-handle/object-handle.js +33 -30
  187. package/dist/components/object-inspector/object-inspector.js +40 -42
  188. package/dist/components/order-book/order-book.js +59 -54
  189. package/dist/components/overview-board/overview-board.js +91 -87
  190. package/dist/components/panel/index.js +16 -0
  191. package/dist/components/panel/panel.js +95 -0
  192. package/dist/components/parallel-timeline/parallel-timeline.js +54 -56
  193. package/dist/components/particles/index.js +4 -0
  194. package/dist/components/particles/particles.js +52 -0
  195. package/dist/components/password-input/password-input.js +35 -36
  196. package/dist/components/phone-input/index.js +6 -0
  197. package/dist/components/phone-input/phone-input.js +63 -0
  198. package/dist/components/pie-chart/index.js +4 -0
  199. package/dist/components/pie-chart/pie-chart.js +130 -0
  200. package/dist/components/plan-badge/plan-badge.js +28 -24
  201. package/dist/components/playback-ghost/playback-ghost.js +46 -48
  202. package/dist/components/policy-delivery-panel/policy-delivery-panel.js +5 -5
  203. package/dist/components/popover/popover.js +8 -3
  204. package/dist/components/presence-stack/presence-stack.js +39 -41
  205. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +5 -5
  206. package/dist/components/pricing-table/pricing-table.js +71 -70
  207. package/dist/components/primary-source-viewer/primary-source-viewer.js +90 -41
  208. package/dist/components/progress-tracker/progress-tracker.js +1 -1
  209. package/dist/components/progressive-blur/index.js +6 -0
  210. package/dist/components/progressive-blur/progressive-blur.js +48 -0
  211. package/dist/components/prompt-input/index.js +4 -0
  212. package/dist/components/prompt-input/prompt-input.js +185 -0
  213. package/dist/components/prompt-templates/prompt-templates.js +36 -36
  214. package/dist/components/property-section/property-section.js +28 -30
  215. package/dist/components/qr-code/index.js +4 -0
  216. package/dist/components/qr-code/qr-code.js +49 -0
  217. package/dist/components/radar-chart/index.js +6 -0
  218. package/dist/components/radar-chart/radar-chart.js +180 -0
  219. package/dist/components/radio-group/radio-group.js +12 -5
  220. package/dist/components/range-calendar/index.js +4 -0
  221. package/dist/components/range-calendar/range-calendar.js +35 -0
  222. package/dist/components/reasoning/index.js +4 -0
  223. package/dist/components/reasoning/reasoning.js +124 -0
  224. package/dist/components/relationship-inspector/relationship-inspector.js +5 -5
  225. package/dist/components/reveal-text/index.js +6 -0
  226. package/dist/components/reveal-text/reveal-text.js +93 -0
  227. package/dist/components/right-dock/right-dock.js +26 -21
  228. package/dist/components/role-badge/role-badge.js +22 -19
  229. package/dist/components/route-map/route-map.js +5 -3
  230. package/dist/components/routing-assignment-panel/routing-assignment-panel.js +5 -5
  231. package/dist/components/run-timeline/run-timeline.js +57 -59
  232. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +5 -5
  233. package/dist/components/sankey-chart/index.js +6 -0
  234. package/dist/components/sankey-chart/sankey-chart.js +255 -0
  235. package/dist/components/scope-selector/scope-selector.js +39 -40
  236. package/dist/components/scramble-text/index.js +4 -0
  237. package/dist/components/scramble-text/scramble-text.js +76 -0
  238. package/dist/components/scroll-area/scroll-area.js +14 -5
  239. package/dist/components/scroll-progress/index.js +4 -0
  240. package/dist/components/scroll-progress/scroll-progress.js +50 -0
  241. package/dist/components/search-bar/search-bar.js +5 -2
  242. package/dist/components/search-field/index.js +4 -0
  243. package/dist/components/search-field/search-field.js +67 -0
  244. package/dist/components/segmented-control/segmented-control.js +14 -5
  245. package/dist/components/select/select.js +46 -15
  246. package/dist/components/selection-halo/selection-halo.js +53 -62
  247. package/dist/components/selection-presence/selection-presence.js +5 -5
  248. package/dist/components/separator/separator.js +19 -16
  249. package/dist/components/share-dialog/share-dialog.js +6 -8
  250. package/dist/components/sheet/sheet.js +26 -9
  251. package/dist/components/shimmer-button/index.js +4 -0
  252. package/dist/components/shimmer-button/shimmer-button.js +41 -0
  253. package/dist/components/shimmer-text/index.js +4 -0
  254. package/dist/components/shimmer-text/shimmer-text.js +40 -0
  255. package/dist/components/shine-border/index.js +4 -0
  256. package/dist/components/shine-border/shine-border.js +38 -0
  257. package/dist/components/shiny-button/index.js +4 -0
  258. package/dist/components/shiny-button/shiny-button.js +39 -0
  259. package/dist/components/sidebar-provider/sidebar-provider.js +2 -7
  260. package/dist/components/slider/slider.js +6 -3
  261. package/dist/components/slideshow/slideshow.js +380 -302
  262. package/dist/components/snap-guides/snap-guides.js +35 -35
  263. package/dist/components/sparkles/index.js +4 -0
  264. package/dist/components/sparkles/sparkles.js +51 -0
  265. package/dist/components/sparkline-grid/sparkline-grid.js +6 -7
  266. package/dist/components/spinner/unicode-spinner.js +57 -56
  267. package/dist/components/spinning-text/index.js +4 -0
  268. package/dist/components/spinning-text/spinning-text.js +58 -0
  269. package/dist/components/spotlight-card/index.js +4 -0
  270. package/dist/components/spotlight-card/spotlight-card.js +53 -0
  271. package/dist/components/stat-card/stat-card.js +37 -39
  272. package/dist/components/state-badge-overlay/state-badge-overlay.js +5 -5
  273. package/dist/components/status-board/status-board.js +20 -22
  274. package/dist/components/status-indicator/status-indicator.js +38 -40
  275. package/dist/components/sticky-metric/sticky-metric.js +58 -60
  276. package/dist/components/story-map/story-map.js +66 -60
  277. package/dist/components/subscription-card/subscription-card.js +68 -70
  278. package/dist/components/switch/switch.js +6 -3
  279. package/dist/components/table/table.js +47 -16
  280. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +7 -18
  281. package/dist/components/tabs/tabs.js +2 -2
  282. package/dist/components/tag-group/index.js +8 -0
  283. package/dist/components/tag-group/tag-group.js +127 -0
  284. package/dist/components/tags-input/tags-input.js +59 -60
  285. package/dist/components/terminal/terminal.js +7 -15
  286. package/dist/components/text-animate/index.js +6 -0
  287. package/dist/components/text-animate/text-animate.js +129 -0
  288. package/dist/components/text-field/index.js +4 -0
  289. package/dist/components/text-field/text-field.js +59 -0
  290. package/dist/components/text-reveal/index.js +4 -0
  291. package/dist/components/text-reveal/text-reveal.js +90 -0
  292. package/dist/components/text-shimmer/index.js +4 -0
  293. package/dist/components/text-shimmer/text-shimmer.js +33 -0
  294. package/dist/components/textarea/textarea.js +17 -16
  295. package/dist/components/thinking-block/thinking-block.js +1 -1
  296. package/dist/components/thread-bubble/thread-bubble.js +51 -53
  297. package/dist/components/threshold-ring/threshold-ring.js +76 -78
  298. package/dist/components/ticker-tape/ticker-tape.js +47 -46
  299. package/dist/components/tilt-card/index.js +4 -0
  300. package/dist/components/tilt-card/tilt-card.js +70 -0
  301. package/dist/components/time-field/index.js +4 -0
  302. package/dist/components/time-field/time-field.js +42 -0
  303. package/dist/components/time-picker/index.js +4 -0
  304. package/dist/components/time-picker/time-picker.js +113 -0
  305. package/dist/components/timeline/timeline.js +70 -66
  306. package/dist/components/timeline-scrubber/timeline-scrubber.js +5 -3
  307. package/dist/components/tldr-section/tldr-section.js +9 -6
  308. package/dist/components/toast/toast.js +32 -11
  309. package/dist/components/toggle/toggle.js +8 -3
  310. package/dist/components/toggle-group/toggle-group.js +20 -6
  311. package/dist/components/toolbar/index.js +8 -0
  312. package/dist/components/toolbar/toolbar.js +87 -0
  313. package/dist/components/tooltip/tooltip.js +7 -3
  314. package/dist/components/top-bar/top-bar.js +30 -24
  315. package/dist/components/transaction-list/transaction-list.js +53 -47
  316. package/dist/components/tree-view/tree-view.js +72 -76
  317. package/dist/components/typewriter/index.js +4 -0
  318. package/dist/components/typewriter/typewriter.js +71 -0
  319. package/dist/components/typography/index.js +26 -0
  320. package/dist/components/typography/typography.js +173 -0
  321. package/dist/components/usage-breakdown/usage-breakdown.js +37 -38
  322. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +5 -5
  323. package/dist/components/wallet-card/wallet-card.js +56 -58
  324. package/dist/components/watchlist/watchlist.js +47 -52
  325. package/dist/components/workspace-switcher/workspace-switcher.js +58 -52
  326. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +43 -45
  327. package/dist/components/world-clock-bar/world-clock-bar.js +34 -61
  328. package/dist/components/zoom-hud/zoom-hud.js +56 -51
  329. package/dist/index.d.ts +6132 -3949
  330. package/dist/index.js +9 -0
  331. package/dist/lib/format.js +14 -0
  332. package/dist/lib/use-body-scroll-lock.js +30 -0
  333. package/dist/lib/use-escape-key.js +24 -0
  334. package/dist/lib/use-live-date.js +26 -0
  335. package/package.json +7 -5
  336. package/styles.css +84 -0
@@ -2,9 +2,8 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import {
4
4
  createContext,
5
- forwardRef,
5
+ use,
6
6
  useCallback,
7
- useContext,
8
7
  useEffect,
9
8
  useId,
10
9
  useMemo,
@@ -14,7 +13,7 @@ import {
14
13
  import { cn } from "../../lib/utils";
15
14
  const ChronoContext = createContext(null);
16
15
  function useChronoContext() {
17
- const ctx = useContext(ChronoContext);
16
+ const ctx = use(ChronoContext);
18
17
  if (!ctx) {
19
18
  throw new Error("ChronoEvent used outside ChronologicalTimeline.");
20
19
  }
@@ -142,74 +141,75 @@ function EventCard({
142
141
  }
143
142
  );
144
143
  }
145
- const ChronoEvent = forwardRef(
146
- (props, forwardedRef) => {
147
- const {
148
- children,
149
- className,
150
- date,
151
- featured = false,
152
- id,
153
- media,
154
- subtitle,
155
- title,
156
- ...rest
157
- } = props;
158
- const generatedId = useId();
159
- const eventId = id ?? generatedId;
160
- const ref = useRef(null);
161
- const { registerEvent, setActiveId } = useChronoContext();
162
- const refCallback = useCallback(
163
- (node) => {
164
- ref.current = node;
165
- registerEvent(eventId, node);
166
- if (typeof forwardedRef === "function") forwardedRef(node);
167
- else if (forwardedRef) forwardedRef.current = node;
168
- },
169
- [eventId, forwardedRef, registerEvent]
170
- );
171
- const handleFocusEvent = useCallback(() => {
172
- setActiveId(eventId);
173
- }, [eventId, setActiveId]);
174
- return (
175
- /* Passive focus tracking: the container observes focus bubbling from
144
+ const ChronoEvent = ({
145
+ ref: forwardedRef,
146
+ ...props
147
+ }) => {
148
+ const {
149
+ children,
150
+ className,
151
+ date,
152
+ featured = false,
153
+ id,
154
+ media,
155
+ subtitle,
156
+ title,
157
+ ...rest
158
+ } = props;
159
+ const generatedId = useId();
160
+ const eventId = id ?? generatedId;
161
+ const ref = useRef(null);
162
+ const { registerEvent, setActiveId } = useChronoContext();
163
+ const refCallback = useCallback(
164
+ (node) => {
165
+ ref.current = node;
166
+ registerEvent(eventId, node);
167
+ if (typeof forwardedRef === "function") forwardedRef(node);
168
+ else if (forwardedRef) forwardedRef.current = node;
169
+ },
170
+ [eventId, forwardedRef, registerEvent]
171
+ );
172
+ const handleFocusEvent = useCallback(() => {
173
+ setActiveId(eventId);
174
+ }, [eventId, setActiveId]);
175
+ return (
176
+ /* Passive focus tracking: the container observes focus bubbling from
176
177
  its interactive children to drive the scroll-spy active state. */
177
- // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
178
- /* @__PURE__ */ jsxs(
179
- "article",
180
- {
181
- "aria-labelledby": `${eventId}-title`,
182
- className: cn(
183
- "group relative grid gap-4 py-6 md:grid-cols-[1fr_auto_1fr] md:gap-8",
184
- className
185
- ),
186
- "data-event-id": eventId,
187
- "data-featured": featured ? "true" : void 0,
188
- id: eventId,
189
- onFocus: handleFocusEvent,
190
- ref: refCallback,
191
- ...rest,
192
- children: [
193
- /* @__PURE__ */ jsx(DateColumn, { date }),
194
- /* @__PURE__ */ jsx(RailColumn, { featured }),
195
- /* @__PURE__ */ jsx(
196
- EventCard,
197
- {
198
- date,
199
- eventId,
200
- featured,
201
- media,
202
- subtitle,
203
- title,
204
- children
205
- }
206
- )
207
- ]
208
- }
209
- )
210
- );
211
- }
212
- );
178
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
179
+ /* @__PURE__ */ jsxs(
180
+ "article",
181
+ {
182
+ "aria-labelledby": `${eventId}-title`,
183
+ className: cn(
184
+ "group relative grid gap-4 py-6 md:grid-cols-[1fr_auto_1fr] md:gap-8",
185
+ className
186
+ ),
187
+ "data-event-id": eventId,
188
+ "data-featured": featured ? "true" : void 0,
189
+ id: eventId,
190
+ onFocus: handleFocusEvent,
191
+ ref: refCallback,
192
+ ...rest,
193
+ children: [
194
+ /* @__PURE__ */ jsx(DateColumn, { date }),
195
+ /* @__PURE__ */ jsx(RailColumn, { featured }),
196
+ /* @__PURE__ */ jsx(
197
+ EventCard,
198
+ {
199
+ date,
200
+ eventId,
201
+ featured,
202
+ media,
203
+ subtitle,
204
+ title,
205
+ children
206
+ }
207
+ )
208
+ ]
209
+ }
210
+ )
211
+ );
212
+ };
213
213
  ChronoEvent.displayName = "ChronoEvent";
214
214
  function ProgressStrip({
215
215
  activeId,
@@ -288,7 +288,10 @@ function EventList({ activeId, children }) {
288
288
  getChildKey(child, index)
289
289
  )) });
290
290
  }
291
- const ChronologicalTimeline = forwardRef((props, ref) => {
291
+ const ChronologicalTimeline = ({
292
+ ref,
293
+ ...props
294
+ }) => {
292
295
  const {
293
296
  children,
294
297
  className,
@@ -319,7 +322,7 @@ const ChronologicalTimeline = forwardRef((props, ref) => {
319
322
  ]
320
323
  }
321
324
  ) });
322
- });
325
+ };
323
326
  ChronologicalTimeline.displayName = "ChronologicalTimeline";
324
327
  function isReactElementWithEventId(child, activeId) {
325
328
  if (!activeId) return false;
@@ -1,7 +1,4 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import {
3
- forwardRef
4
- } from "react";
5
2
  import { Globe } from "lucide-react";
6
3
  import { cn } from "../../lib/utils";
7
4
  import { Badge } from "../badge/badge";
@@ -202,59 +199,65 @@ function CivilizationBody({
202
199
  ) : null
203
200
  ] });
204
201
  }
205
- const CivilizationCard = forwardRef(
206
- (props, ref) => {
207
- const {
208
- achievements,
209
- actionHref,
210
- capital,
211
- className,
212
- color = "neutral",
213
- era,
214
- image,
215
- labels,
216
- leaders,
217
- name,
218
- peakPopulation,
219
- region,
220
- ...rest
221
- } = props;
222
- const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
223
- const palette = CIVILIZATION_COLOR_VARIANTS[color];
224
- const altName = typeof name === "string" ? name : void 0;
225
- return /* @__PURE__ */ jsxs(
226
- "article",
227
- {
228
- className: cn(
229
- "flex flex-col overflow-hidden rounded-2xl border bg-background text-foreground shadow-sm ring-1",
230
- palette.ring,
231
- className
232
- ),
233
- ref,
234
- ...rest,
235
- children: [
236
- /* @__PURE__ */ jsx(CivilizationHero, { color, image, imageAlt: altName }),
237
- /* @__PURE__ */ jsx(
238
- CivilizationBody,
239
- {
240
- achievements,
241
- actionHref,
242
- capital,
243
- era,
244
- labels: resolvedLabels,
245
- leaders,
246
- name,
247
- peakPopulation,
248
- region
249
- }
250
- )
251
- ]
252
- }
253
- );
254
- }
255
- );
202
+ const CivilizationCard = ({
203
+ ref,
204
+ ...props
205
+ }) => {
206
+ const {
207
+ achievements,
208
+ actionHref,
209
+ capital,
210
+ className,
211
+ color = "neutral",
212
+ era,
213
+ image,
214
+ labels,
215
+ leaders,
216
+ name,
217
+ peakPopulation,
218
+ region,
219
+ ...rest
220
+ } = props;
221
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
222
+ const palette = CIVILIZATION_COLOR_VARIANTS[color];
223
+ const altName = typeof name === "string" ? name : void 0;
224
+ return /* @__PURE__ */ jsxs(
225
+ "article",
226
+ {
227
+ className: cn(
228
+ "flex flex-col overflow-hidden rounded-2xl border bg-background text-foreground shadow-sm ring-1",
229
+ palette.ring,
230
+ className
231
+ ),
232
+ ref,
233
+ ...rest,
234
+ children: [
235
+ /* @__PURE__ */ jsx(CivilizationHero, { color, image, imageAlt: altName }),
236
+ /* @__PURE__ */ jsx(
237
+ CivilizationBody,
238
+ {
239
+ achievements,
240
+ actionHref,
241
+ capital,
242
+ era,
243
+ labels: resolvedLabels,
244
+ leaders,
245
+ name,
246
+ peakPopulation,
247
+ region
248
+ }
249
+ )
250
+ ]
251
+ }
252
+ );
253
+ };
256
254
  CivilizationCard.displayName = "CivilizationCard";
257
- const CivilizationComparison = forwardRef(({ children, className, ...rest }, ref) => {
255
+ const CivilizationComparison = ({
256
+ children,
257
+ className,
258
+ ref,
259
+ ...rest
260
+ }) => {
258
261
  return /* @__PURE__ */ jsx(
259
262
  "div",
260
263
  {
@@ -267,7 +270,7 @@ const CivilizationComparison = forwardRef(({ children, className, ...rest }, ref
267
270
  children
268
271
  }
269
272
  );
270
- });
273
+ };
271
274
  CivilizationComparison.displayName = "CivilizationComparison";
272
275
  export {
273
276
  CivilizationCard,
@@ -9,20 +9,21 @@ import { Check, Copy } from "lucide-react";
9
9
  import { useTheme } from "next-themes";
10
10
  import { cn } from "../../lib/utils";
11
11
  import { Button } from "../button/button";
12
- function extractTextFromChildren(children) {
13
- if (typeof children === "string") {
14
- return children;
12
+ import { useCopyToClipboard } from "../copy-button/copy-button";
13
+ function extractTextFromChildren(node) {
14
+ if (typeof node === "string") {
15
+ return node;
15
16
  }
16
- if (typeof children === "number") {
17
- return String(children);
17
+ if (typeof node === "number") {
18
+ return String(node);
18
19
  }
19
- if (Array.isArray(children)) {
20
- return children.map(extractTextFromChildren).join("");
20
+ if (Array.isArray(node)) {
21
+ return node.map(extractTextFromChildren).join("");
21
22
  }
22
- if (children && typeof children === "object" && "props" in children && children.props && typeof children.props === "object" && "children" in children.props) {
23
- return extractTextFromChildren(children.props.children);
23
+ if (node && typeof node === "object" && "props" in node && node.props && typeof node.props === "object" && "children" in node.props) {
24
+ return extractTextFromChildren(node.props.children);
24
25
  }
25
- return String(children ?? "");
26
+ return String(node ?? "");
26
27
  }
27
28
  function findScrollableParent(element) {
28
29
  if (!element) return void 0;
@@ -35,7 +36,7 @@ function CodeBlock({
35
36
  language = "typescript",
36
37
  showLanguage = false
37
38
  }) {
38
- const [copied, setCopied] = useState(false);
39
+ const { copied, copy } = useCopyToClipboard();
39
40
  const [highlighter, setHighlighter] = useState(
40
41
  null
41
42
  );
@@ -77,12 +78,8 @@ function CodeBlock({
77
78
  element.removeEventListener("wheel", onWheel);
78
79
  };
79
80
  }, []);
80
- const handleCopy = async () => {
81
- await navigator.clipboard.writeText(code);
82
- setCopied(true);
83
- setTimeout(() => {
84
- setCopied(false);
85
- }, 2e3);
81
+ const handleCopy = () => {
82
+ void copy(code);
86
83
  };
87
84
  const SyntaxHighlighter = highlighter?.SyntaxHighlighter;
88
85
  const codeStyle = isDark ? highlighter?.oneDark : highlighter?.oneLight;
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { useState } from "react";
4
3
  import { Check, Code, Copy, FileCode } from "lucide-react";
5
4
  import { cn } from "../../lib/utils";
6
5
  import { Button } from "../button/button";
6
+ import { useCopyToClipboard } from "../copy-button/copy-button";
7
7
  function CodeLine({ highlightLines, line, lineNumber }) {
8
8
  const isHighlighted = highlightLines.includes(lineNumber);
9
9
  return /* @__PURE__ */ jsxs("div", { className: cn("flex", isHighlighted && "bg-primary/10 -mx-4 px-4"), children: [
@@ -12,6 +12,9 @@ function CodeLine({ highlightLines, line, lineNumber }) {
12
12
  ] });
13
13
  }
14
14
  const EMPTY_HIGHLIGHT_LINES = [];
15
+ function extractCode(node) {
16
+ return typeof node === "string" ? node : "";
17
+ }
15
18
  function CodePlayground({
16
19
  as: Heading = "h4",
17
20
  children,
@@ -22,15 +25,11 @@ function CodePlayground({
22
25
  showLineNumbers = false,
23
26
  title
24
27
  }) {
25
- const [copied, setCopied] = useState(false);
26
- const code = typeof children === "string" ? children : "";
28
+ const { copied, copy } = useCopyToClipboard();
29
+ const code = extractCode(children);
27
30
  const lines = code.split("\n");
28
- const handleCopy = async () => {
29
- await navigator.clipboard.writeText(code);
30
- setCopied(true);
31
- setTimeout(() => {
32
- setCopied(false);
33
- }, 2e3);
31
+ const handleCopy = () => {
32
+ void copy(code);
34
33
  };
35
34
  return /* @__PURE__ */ jsxs("div", { className: "my-6 rounded-lg border bg-card overflow-hidden", children: [
36
35
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b bg-muted/30", children: [
@@ -0,0 +1,133 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../lib/utils";
5
+ import { Button } from "../button/button";
6
+ import { Input } from "../input/input";
7
+ import { Popover, PopoverContent, PopoverTrigger } from "../popover";
8
+ const presetSwatches = [
9
+ "#ef4444",
10
+ "#f97316",
11
+ "#f59e0b",
12
+ "#84cc16",
13
+ "#22c55e",
14
+ "#14b8a6",
15
+ "#3b82f6",
16
+ "#6366f1",
17
+ "#a855f7",
18
+ "#ec4899",
19
+ "#64748b",
20
+ "#0f172a"
21
+ ];
22
+ function hexPart(value) {
23
+ return value.toString(16).padStart(2, "0");
24
+ }
25
+ function toHex(red, green, blue) {
26
+ return `#${hexPart(red)}${hexPart(green)}${hexPart(blue)}`;
27
+ }
28
+ function hueChannel(hue, offset) {
29
+ const k = (offset + hue / 30) % 12;
30
+ const amount = 0.45;
31
+ const value = 0.5 - amount * Math.max(-1, Math.min(k - 3, 9 - k, 1));
32
+ return Math.round(value * 255);
33
+ }
34
+ function hueToHex(hue) {
35
+ return toHex(hueChannel(hue, 0), hueChannel(hue, 8), hueChannel(hue, 4));
36
+ }
37
+ function SwatchGrid({ onSelect, selected, swatches }) {
38
+ return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-6 gap-2", role: "group", children: swatches.map((swatch) => /* @__PURE__ */ jsx(
39
+ "button",
40
+ {
41
+ "aria-label": swatch,
42
+ "aria-pressed": swatch.toLowerCase() === selected.toLowerCase(),
43
+ className: cn(
44
+ "size-7 rounded-md border outline-none ring-offset-background focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
45
+ swatch.toLowerCase() === selected.toLowerCase() && "ring-2 ring-ring"
46
+ ),
47
+ onClick: () => {
48
+ onSelect(swatch);
49
+ },
50
+ style: { backgroundColor: swatch },
51
+ type: "button"
52
+ },
53
+ swatch
54
+ )) });
55
+ }
56
+ const ColorPicker = ({
57
+ className,
58
+ defaultValue = "#3b82f6",
59
+ onValueChange,
60
+ ref,
61
+ swatches = presetSwatches,
62
+ value
63
+ }) => {
64
+ const [internalValue, setInternalValue] = React.useState(defaultValue);
65
+ const currentValue = value ?? internalValue;
66
+ const update = (next) => {
67
+ if (value === void 0) {
68
+ setInternalValue(next);
69
+ }
70
+ onValueChange?.(next);
71
+ };
72
+ return /* @__PURE__ */ jsxs(Popover, { children: [
73
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
74
+ Button,
75
+ {
76
+ className: cn("w-full justify-start gap-2 font-normal", className),
77
+ ref,
78
+ variant: "outline",
79
+ children: [
80
+ /* @__PURE__ */ jsx(
81
+ "span",
82
+ {
83
+ "aria-hidden": true,
84
+ className: "size-4 rounded-sm border",
85
+ style: { backgroundColor: currentValue }
86
+ }
87
+ ),
88
+ /* @__PURE__ */ jsx("span", { className: "uppercase tabular-nums", children: currentValue })
89
+ ]
90
+ }
91
+ ) }),
92
+ /* @__PURE__ */ jsxs(PopoverContent, { align: "start", className: "w-56 space-y-3", children: [
93
+ /* @__PURE__ */ jsx(
94
+ SwatchGrid,
95
+ {
96
+ onSelect: update,
97
+ selected: currentValue,
98
+ swatches
99
+ }
100
+ ),
101
+ /* @__PURE__ */ jsx(
102
+ "input",
103
+ {
104
+ "aria-label": "Hue",
105
+ className: "h-3 w-full cursor-pointer appearance-none rounded-full",
106
+ max: 360,
107
+ min: 0,
108
+ onChange: (event) => {
109
+ update(hueToHex(Number(event.target.value)));
110
+ },
111
+ style: {
112
+ background: "linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)"
113
+ },
114
+ type: "range"
115
+ }
116
+ ),
117
+ /* @__PURE__ */ jsx(
118
+ Input,
119
+ {
120
+ "aria-label": "Hex value",
121
+ onChange: (event) => {
122
+ update(event.target.value);
123
+ },
124
+ value: currentValue
125
+ }
126
+ )
127
+ ] })
128
+ ] });
129
+ };
130
+ ColorPicker.displayName = "ColorPicker";
131
+ export {
132
+ ColorPicker
133
+ };
@@ -0,0 +1,4 @@
1
+ import { ColorPicker } from "./color-picker";
2
+ export {
3
+ ColorPicker
4
+ };
@@ -85,64 +85,63 @@ function ComboboxListPanel({
85
85
  }
86
86
  );
87
87
  }
88
- const Combobox = React.forwardRef(
89
- ({
90
- className,
91
- commandClassName,
92
- emptyText = "No option found.",
93
- onValueChange,
94
- options,
95
- placeholder = "Select an option",
96
- searchPlaceholder = "Search options...",
97
- triggerClassName,
98
- value
99
- }, reference) => {
100
- const [open, setOpen] = React.useState(false);
101
- const listboxId = React.useId();
102
- const { resolvedValue, setResolvedValue } = useComboboxValue(
103
- value,
104
- onValueChange
105
- );
106
- const selectedOption = options.find(
107
- (option) => option.value === resolvedValue
108
- );
109
- const handleSelect = (nextValue) => {
110
- setResolvedValue(nextValue === resolvedValue ? "" : nextValue);
111
- setOpen(false);
112
- };
113
- return /* @__PURE__ */ jsxs(Popover, { onOpenChange: setOpen, open, children: [
114
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
115
- Button,
116
- {
117
- "aria-controls": listboxId,
118
- "aria-expanded": open,
119
- "aria-haspopup": "listbox",
120
- className: cn("w-full justify-between", triggerClassName),
121
- ref: reference,
122
- role: "combobox",
123
- variant: "outline",
124
- children: [
125
- /* @__PURE__ */ jsx("span", { className: "truncate", children: selectedOption ? selectedOption.label : placeholder }),
126
- /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-2 size-4 shrink-0 opacity-50" })
127
- ]
128
- }
129
- ) }),
130
- /* @__PURE__ */ jsx(
131
- ComboboxListPanel,
132
- {
133
- className,
134
- commandClassName,
135
- emptyText,
136
- listboxId,
137
- onSelect: handleSelect,
138
- options,
139
- resolvedValue,
140
- searchPlaceholder
141
- }
142
- )
143
- ] });
144
- }
145
- );
88
+ const Combobox = ({
89
+ className,
90
+ commandClassName,
91
+ emptyText = "No option found.",
92
+ onValueChange,
93
+ options,
94
+ placeholder = "Select an option",
95
+ ref: reference,
96
+ searchPlaceholder = "Search options...",
97
+ triggerClassName,
98
+ value
99
+ }) => {
100
+ const [open, setOpen] = React.useState(false);
101
+ const listboxId = React.useId();
102
+ const { resolvedValue, setResolvedValue } = useComboboxValue(
103
+ value,
104
+ onValueChange
105
+ );
106
+ const selectedOption = options.find(
107
+ (option) => option.value === resolvedValue
108
+ );
109
+ const handleSelect = (nextValue) => {
110
+ setResolvedValue(nextValue === resolvedValue ? "" : nextValue);
111
+ setOpen(false);
112
+ };
113
+ return /* @__PURE__ */ jsxs(Popover, { onOpenChange: setOpen, open, children: [
114
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
115
+ Button,
116
+ {
117
+ "aria-controls": listboxId,
118
+ "aria-expanded": open,
119
+ "aria-haspopup": "listbox",
120
+ className: cn("w-full justify-between", triggerClassName),
121
+ ref: reference,
122
+ role: "combobox",
123
+ variant: "outline",
124
+ children: [
125
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: selectedOption ? selectedOption.label : placeholder }),
126
+ /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-2 size-4 shrink-0 opacity-50" })
127
+ ]
128
+ }
129
+ ) }),
130
+ /* @__PURE__ */ jsx(
131
+ ComboboxListPanel,
132
+ {
133
+ className,
134
+ commandClassName,
135
+ emptyText,
136
+ listboxId,
137
+ onSelect: handleSelect,
138
+ options,
139
+ resolvedValue,
140
+ searchPlaceholder
141
+ }
142
+ )
143
+ ] });
144
+ };
146
145
  Combobox.displayName = "Combobox";
147
146
  export {
148
147
  Combobox