@vllnt/ui 0.3.0-canary.a42d8f4 → 0.3.0-canary.ce98eca

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 (348) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/components/accordion/accordion.js +2 -8
  3. package/dist/components/activity-heatmap/activity-heatmap.js +22 -29
  4. package/dist/components/activity-log/activity-log.js +57 -58
  5. package/dist/components/agent-activity/agent-activity.js +140 -120
  6. package/dist/components/ai-artifact/ai-artifact.js +138 -82
  7. package/dist/components/ai-chat-input/ai-chat-input.js +60 -60
  8. package/dist/components/ai-message-bubble/ai-message-bubble.js +64 -66
  9. package/dist/components/ai-sidebar/ai-sidebar.js +77 -54
  10. package/dist/components/ai-source-citation/ai-source-citation.js +38 -32
  11. package/dist/components/ai-streaming-text/ai-streaming-text.js +33 -35
  12. package/dist/components/ai-tool-call-display/ai-tool-call-display.js +58 -60
  13. package/dist/components/alert/alert.js +20 -7
  14. package/dist/components/alert-dialog/alert-dialog.js +36 -13
  15. package/dist/components/alert-pulse/alert-pulse.js +69 -69
  16. package/dist/components/anchor-port/anchor-port.js +26 -28
  17. package/dist/components/animated-beam/animated-beam.js +157 -0
  18. package/dist/components/animated-beam/index.js +4 -0
  19. package/dist/components/animated-grid-pattern/animated-grid-pattern.js +81 -0
  20. package/dist/components/animated-grid-pattern/index.js +6 -0
  21. package/dist/components/animated-list/animated-list.js +28 -0
  22. package/dist/components/animated-list/index.js +4 -0
  23. package/dist/components/animated-tabs/animated-tabs.js +98 -0
  24. package/dist/components/animated-tabs/index.js +6 -0
  25. package/dist/components/animated-testimonials/animated-testimonials.js +97 -0
  26. package/dist/components/animated-testimonials/index.js +6 -0
  27. package/dist/components/animated-text/animated-text.js +66 -67
  28. package/dist/components/animated-tooltip/animated-tooltip.js +58 -0
  29. package/dist/components/animated-tooltip/index.js +6 -0
  30. package/dist/components/auto-reload/auto-reload.js +137 -109
  31. package/dist/components/avatar/avatar.js +18 -7
  32. package/dist/components/avatar-group/avatar-group.js +35 -30
  33. package/dist/components/banner/banner.js +80 -77
  34. package/dist/components/bento-grid/bento-grid.js +46 -0
  35. package/dist/components/bento-grid/index.js +8 -0
  36. package/dist/components/blog-card/blog-card.js +1 -1
  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 +59 -61
  46. package/dist/components/canvas-shell/canvas-foundation-demo.js +8 -8
  47. package/dist/components/canvas-shell/canvas-shell.js +11 -6
  48. package/dist/components/canvas-view/canvas-view.js +138 -97
  49. package/dist/components/card/card.js +35 -12
  50. package/dist/components/card-flip/card-flip.js +67 -0
  51. package/dist/components/card-flip/index.js +4 -0
  52. package/dist/components/carousel/carousel.js +78 -60
  53. package/dist/components/chain-of-thought/chain-of-thought.js +78 -0
  54. package/dist/components/chain-of-thought/index.js +6 -0
  55. package/dist/components/chart/area-chart.js +66 -67
  56. package/dist/components/chart/bar-chart.js +68 -70
  57. package/dist/components/chart/line-chart.js +69 -70
  58. package/dist/components/chat-dock-section/chat-dock-section.js +43 -45
  59. package/dist/components/checkbox/checkbox.js +6 -3
  60. package/dist/components/checkbox-group/checkbox-group.js +98 -0
  61. package/dist/components/checkbox-group/index.js +8 -0
  62. package/dist/components/choropleth-map/choropleth-map.js +95 -82
  63. package/dist/components/chronological-timeline/chronological-timeline.js +76 -73
  64. package/dist/components/civilization-card/civilization-card.js +77 -57
  65. package/dist/components/code-block/code-block.js +14 -17
  66. package/dist/components/code-playground/code-playground.js +8 -9
  67. package/dist/components/color-picker/color-picker.js +133 -0
  68. package/dist/components/color-picker/index.js +4 -0
  69. package/dist/components/combobox/combobox.js +59 -60
  70. package/dist/components/command/command.js +42 -15
  71. package/dist/components/comment-pin/comment-pin.js +58 -60
  72. package/dist/components/connector-edge/connector-edge.js +59 -54
  73. package/dist/components/content-intro/content-intro.js +4 -1
  74. package/dist/components/context-lens/context-lens.js +74 -73
  75. package/dist/components/context-menu/context-menu.js +55 -17
  76. package/dist/components/contribution-graph/contribution-graph.js +118 -0
  77. package/dist/components/contribution-graph/index.js +6 -0
  78. package/dist/components/conversation-thread/conversation-thread.js +89 -65
  79. package/dist/components/cookie-consent/cookie-consent.js +114 -115
  80. package/dist/components/copy-button/copy-button.js +100 -103
  81. package/dist/components/countdown-timer/countdown-timer.js +48 -76
  82. package/dist/components/credit-badge/credit-badge.js +26 -22
  83. package/dist/components/curriculum/curriculum.js +2 -2
  84. package/dist/components/cursor/cursor.js +52 -0
  85. package/dist/components/cursor/index.js +4 -0
  86. package/dist/components/data-list/data-list.js +54 -40
  87. package/dist/components/data-table/data-table.js +4 -4
  88. package/dist/components/date-field/date-field.js +42 -0
  89. package/dist/components/date-field/index.js +4 -0
  90. package/dist/components/date-picker/date-picker.js +51 -52
  91. package/dist/components/date-range-picker/date-range-picker.js +73 -0
  92. package/dist/components/date-range-picker/index.js +6 -0
  93. package/dist/components/dialog/dialog.js +25 -9
  94. package/dist/components/dock/dock.js +109 -0
  95. package/dist/components/dock/index.js +5 -0
  96. package/dist/components/document-sibling-nav/document-sibling-nav.js +10 -5
  97. package/dist/components/dot-pattern/dot-pattern.js +36 -0
  98. package/dist/components/dot-pattern/index.js +4 -0
  99. package/dist/components/drawer/drawer.js +25 -9
  100. package/dist/components/dropdown-menu/dropdown-menu.js +56 -17
  101. package/dist/components/edge-label/edge-label.js +17 -15
  102. package/dist/components/empty-state/empty-state.js +27 -31
  103. package/dist/components/era-comparison/era-comparison.js +131 -100
  104. package/dist/components/expandable-cards/expandable-cards.js +61 -0
  105. package/dist/components/expandable-cards/index.js +6 -0
  106. package/dist/components/field/field.js +137 -0
  107. package/dist/components/field/index.js +16 -0
  108. package/dist/components/fieldset/fieldset.js +49 -0
  109. package/dist/components/fieldset/index.js +10 -0
  110. package/dist/components/file-upload/file-upload.js +4 -3
  111. package/dist/components/flashcard/flashcard.js +8 -2
  112. package/dist/components/floating-navbar/floating-navbar.js +67 -0
  113. package/dist/components/floating-navbar/index.js +4 -0
  114. package/dist/components/floating-toolbar/floating-toolbar.js +49 -51
  115. package/dist/components/flow-diagram/flow-fullscreen.js +3 -13
  116. package/dist/components/flow-diagram/use-flow-diagram.js +7 -18
  117. package/dist/components/follow-mode/follow-mode.js +67 -69
  118. package/dist/components/form/form.js +131 -112
  119. package/dist/components/gantt-chart/gantt-chart.js +49 -51
  120. package/dist/components/gauge-chart/gauge-chart.js +132 -0
  121. package/dist/components/gauge-chart/index.js +4 -0
  122. package/dist/components/geography-quiz-map/geography-quiz-map.js +94 -83
  123. package/dist/components/glass-card/glass-card.js +25 -0
  124. package/dist/components/glass-card/index.js +4 -0
  125. package/dist/components/glass-panel/glass-panel.js +16 -14
  126. package/dist/components/glass-progress/glass-progress.js +39 -0
  127. package/dist/components/glass-progress/index.js +4 -0
  128. package/dist/components/globe-3d/globe-3d.js +70 -66
  129. package/dist/components/grid/grid.js +100 -0
  130. package/dist/components/grid/index.js +4 -0
  131. package/dist/components/group-hull/group-hull.js +27 -22
  132. package/dist/components/handoff-beacon/handoff-beacon.js +55 -57
  133. package/dist/components/heat-map-overlay/heat-map-overlay.js +55 -55
  134. package/dist/components/heat-overlay/heat-overlay.js +49 -48
  135. package/dist/components/historic-timeline/historic-timeline.js +59 -61
  136. package/dist/components/historical-figure-card/historical-figure-card.js +5 -3
  137. package/dist/components/hover-card/hover-card.js +8 -3
  138. package/dist/components/index.js +271 -0
  139. package/dist/components/infinite-plane/infinite-plane.js +34 -36
  140. package/dist/components/input/input.js +19 -17
  141. package/dist/components/input-group/index.js +14 -0
  142. package/dist/components/input-group/input-group.js +73 -0
  143. package/dist/components/input-otp/input-otp.js +25 -8
  144. package/dist/components/interactive-timeline/interactive-timeline.js +53 -17
  145. package/dist/components/item/index.js +18 -0
  146. package/dist/components/item/item.js +118 -0
  147. package/dist/components/jarvis-dock/jarvis-dock.js +40 -42
  148. package/dist/components/kbd/kbd.js +31 -34
  149. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +7 -18
  150. package/dist/components/knowledge-check/knowledge-check.js +89 -72
  151. package/dist/components/label/label.js +6 -3
  152. package/dist/components/left-rail/left-rail.js +22 -18
  153. package/dist/components/link/index.js +5 -0
  154. package/dist/components/link/link.js +53 -0
  155. package/dist/components/liquid-glass/index.js +4 -0
  156. package/dist/components/liquid-glass/liquid-glass.js +39 -0
  157. package/dist/components/list-box/index.js +8 -0
  158. package/dist/components/list-box/list-box.js +130 -0
  159. package/dist/components/live-cursor/live-cursor.js +49 -51
  160. package/dist/components/live-feed/live-feed.js +52 -77
  161. package/dist/components/magnetic/index.js +4 -0
  162. package/dist/components/magnetic/magnetic.js +63 -0
  163. package/dist/components/magnetic-button/index.js +4 -0
  164. package/dist/components/magnetic-button/magnetic-button.js +64 -0
  165. package/dist/components/map-2d/map-2d.js +120 -101
  166. package/dist/components/map-timeline/map-timeline.js +188 -170
  167. package/dist/components/market-treemap/market-treemap.js +10 -6
  168. package/dist/components/marquee/marquee.js +64 -65
  169. package/dist/components/mdx-content/mdx-content.js +4 -1
  170. package/dist/components/menubar/menubar.js +82 -35
  171. package/dist/components/meteors/index.js +4 -0
  172. package/dist/components/meteors/meteors.js +62 -0
  173. package/dist/components/meter/index.js +5 -0
  174. package/dist/components/meter/meter.js +76 -0
  175. package/dist/components/metric-cluster/metric-cluster.js +47 -49
  176. package/dist/components/metric-gauge/metric-gauge.js +43 -45
  177. package/dist/components/mini-map-panel/mini-map-panel.js +71 -66
  178. package/dist/components/model-comparison/model-comparison.js +90 -62
  179. package/dist/components/model-selector/model-selector.js +5 -5
  180. package/dist/components/multi-select/multi-select.js +103 -105
  181. package/dist/components/multi-select-lasso/multi-select-lasso.js +5 -5
  182. package/dist/components/native-select/index.js +4 -0
  183. package/dist/components/native-select/native-select.js +28 -0
  184. package/dist/components/navbar-saas/navbar-saas.js +2 -2
  185. package/dist/components/navigation-menu/navigation-menu.js +38 -13
  186. package/dist/components/newsletter-signup/newsletter-signup.js +7 -5
  187. package/dist/components/number-input/number-input.js +4 -3
  188. package/dist/components/number-ticker/number-ticker.js +50 -51
  189. package/dist/components/object-card/object-card.js +41 -43
  190. package/dist/components/object-handle/object-handle.js +33 -30
  191. package/dist/components/object-inspector/object-inspector.js +40 -42
  192. package/dist/components/order-book/order-book.js +59 -54
  193. package/dist/components/overview-board/overview-board.js +91 -87
  194. package/dist/components/panel/index.js +16 -0
  195. package/dist/components/panel/panel.js +95 -0
  196. package/dist/components/parallel-timeline/parallel-timeline.js +56 -58
  197. package/dist/components/particles/index.js +4 -0
  198. package/dist/components/particles/particles.js +52 -0
  199. package/dist/components/password-input/password-input.js +35 -36
  200. package/dist/components/phone-input/index.js +6 -0
  201. package/dist/components/phone-input/phone-input.js +63 -0
  202. package/dist/components/pie-chart/index.js +4 -0
  203. package/dist/components/pie-chart/pie-chart.js +130 -0
  204. package/dist/components/plan-badge/plan-badge.js +28 -24
  205. package/dist/components/playback-ghost/playback-ghost.js +46 -48
  206. package/dist/components/policy-delivery-panel/policy-delivery-panel.js +5 -5
  207. package/dist/components/popover/popover.js +8 -3
  208. package/dist/components/presence-stack/presence-stack.js +39 -41
  209. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +5 -5
  210. package/dist/components/pricing-table/pricing-table.js +126 -88
  211. package/dist/components/primary-source-viewer/primary-source-viewer.js +90 -41
  212. package/dist/components/progress-card/progress-card.js +1 -1
  213. package/dist/components/progress-tracker/progress-tracker.js +4 -4
  214. package/dist/components/progressive-blur/index.js +6 -0
  215. package/dist/components/progressive-blur/progressive-blur.js +48 -0
  216. package/dist/components/prompt-input/index.js +4 -0
  217. package/dist/components/prompt-input/prompt-input.js +185 -0
  218. package/dist/components/prompt-templates/prompt-templates.js +51 -59
  219. package/dist/components/property-section/property-section.js +28 -30
  220. package/dist/components/qr-code/index.js +4 -0
  221. package/dist/components/qr-code/qr-code.js +49 -0
  222. package/dist/components/radar-chart/index.js +6 -0
  223. package/dist/components/radar-chart/radar-chart.js +180 -0
  224. package/dist/components/radio-group/radio-group.js +12 -5
  225. package/dist/components/range-calendar/index.js +4 -0
  226. package/dist/components/range-calendar/range-calendar.js +35 -0
  227. package/dist/components/reasoning/index.js +4 -0
  228. package/dist/components/reasoning/reasoning.js +124 -0
  229. package/dist/components/relationship-inspector/relationship-inspector.js +5 -5
  230. package/dist/components/reveal-text/index.js +6 -0
  231. package/dist/components/reveal-text/reveal-text.js +93 -0
  232. package/dist/components/right-dock/right-dock.js +26 -21
  233. package/dist/components/role-badge/role-badge.js +22 -19
  234. package/dist/components/route-map/route-map.js +5 -3
  235. package/dist/components/routing-assignment-panel/routing-assignment-panel.js +5 -5
  236. package/dist/components/run-timeline/run-timeline.js +57 -59
  237. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +5 -5
  238. package/dist/components/sankey-chart/index.js +6 -0
  239. package/dist/components/sankey-chart/sankey-chart.js +255 -0
  240. package/dist/components/scope-selector/scope-selector.js +44 -45
  241. package/dist/components/scramble-text/index.js +4 -0
  242. package/dist/components/scramble-text/scramble-text.js +76 -0
  243. package/dist/components/scroll-area/scroll-area.js +14 -5
  244. package/dist/components/scroll-progress/index.js +4 -0
  245. package/dist/components/scroll-progress/scroll-progress.js +50 -0
  246. package/dist/components/search-bar/search-bar.js +5 -2
  247. package/dist/components/search-dialog/search-dialog.js +1 -1
  248. package/dist/components/search-field/index.js +4 -0
  249. package/dist/components/search-field/search-field.js +67 -0
  250. package/dist/components/segmented-control/segmented-control.js +14 -5
  251. package/dist/components/select/select.js +46 -15
  252. package/dist/components/selection-halo/selection-halo.js +53 -62
  253. package/dist/components/selection-presence/selection-presence.js +5 -5
  254. package/dist/components/separator/separator.js +19 -16
  255. package/dist/components/share-dialog/share-dialog.js +6 -8
  256. package/dist/components/sheet/sheet.js +26 -9
  257. package/dist/components/shimmer-button/index.js +4 -0
  258. package/dist/components/shimmer-button/shimmer-button.js +41 -0
  259. package/dist/components/shimmer-text/index.js +4 -0
  260. package/dist/components/shimmer-text/shimmer-text.js +40 -0
  261. package/dist/components/shine-border/index.js +4 -0
  262. package/dist/components/shine-border/shine-border.js +38 -0
  263. package/dist/components/shiny-button/index.js +4 -0
  264. package/dist/components/shiny-button/shiny-button.js +39 -0
  265. package/dist/components/sidebar-provider/sidebar-provider.js +2 -7
  266. package/dist/components/slider/slider.js +6 -3
  267. package/dist/components/slideshow/slideshow.js +380 -302
  268. package/dist/components/snap-guides/snap-guides.js +35 -35
  269. package/dist/components/sparkles/index.js +4 -0
  270. package/dist/components/sparkles/sparkles.js +51 -0
  271. package/dist/components/sparkline-grid/sparkline-grid.js +9 -9
  272. package/dist/components/spinner/unicode-spinner.js +57 -56
  273. package/dist/components/spinning-text/index.js +4 -0
  274. package/dist/components/spinning-text/spinning-text.js +58 -0
  275. package/dist/components/spotlight-card/index.js +4 -0
  276. package/dist/components/spotlight-card/spotlight-card.js +53 -0
  277. package/dist/components/stat-card/stat-card.js +37 -39
  278. package/dist/components/state-badge-overlay/state-badge-overlay.js +5 -5
  279. package/dist/components/static-code/static-code-copy.js +5 -10
  280. package/dist/components/status-board/status-board.js +21 -23
  281. package/dist/components/status-indicator/status-indicator.js +38 -40
  282. package/dist/components/sticky-metric/sticky-metric.js +58 -60
  283. package/dist/components/story-map/story-map.js +66 -60
  284. package/dist/components/subscription-card/subscription-card.js +68 -70
  285. package/dist/components/switch/switch.js +6 -3
  286. package/dist/components/table/table.js +47 -16
  287. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +7 -18
  288. package/dist/components/tabs/tabs.js +2 -2
  289. package/dist/components/tag-group/index.js +8 -0
  290. package/dist/components/tag-group/tag-group.js +127 -0
  291. package/dist/components/tags-input/tags-input.js +59 -60
  292. package/dist/components/terminal/terminal.js +7 -15
  293. package/dist/components/text-animate/index.js +6 -0
  294. package/dist/components/text-animate/text-animate.js +129 -0
  295. package/dist/components/text-field/index.js +4 -0
  296. package/dist/components/text-field/text-field.js +59 -0
  297. package/dist/components/text-reveal/index.js +4 -0
  298. package/dist/components/text-reveal/text-reveal.js +90 -0
  299. package/dist/components/text-shimmer/index.js +4 -0
  300. package/dist/components/text-shimmer/text-shimmer.js +33 -0
  301. package/dist/components/textarea/textarea.js +17 -16
  302. package/dist/components/thinking-block/thinking-block.js +1 -1
  303. package/dist/components/thread-bubble/thread-bubble.js +51 -53
  304. package/dist/components/threshold-ring/threshold-ring.js +76 -78
  305. package/dist/components/ticker-tape/ticker-tape.js +47 -46
  306. package/dist/components/tilt-card/index.js +4 -0
  307. package/dist/components/tilt-card/tilt-card.js +70 -0
  308. package/dist/components/time-field/index.js +4 -0
  309. package/dist/components/time-field/time-field.js +42 -0
  310. package/dist/components/time-picker/index.js +4 -0
  311. package/dist/components/time-picker/time-picker.js +113 -0
  312. package/dist/components/timeline/timeline.js +70 -66
  313. package/dist/components/timeline-scrubber/timeline-scrubber.js +5 -3
  314. package/dist/components/tldr-section/tldr-section.js +9 -6
  315. package/dist/components/toast/toast.js +32 -11
  316. package/dist/components/toggle/toggle.js +8 -3
  317. package/dist/components/toggle-group/toggle-group.js +20 -6
  318. package/dist/components/toolbar/index.js +8 -0
  319. package/dist/components/toolbar/toolbar.js +87 -0
  320. package/dist/components/tooltip/tooltip.js +7 -3
  321. package/dist/components/top-bar/top-bar.js +30 -24
  322. package/dist/components/tour/tour.js +8 -2
  323. package/dist/components/transaction-list/transaction-list.js +66 -54
  324. package/dist/components/tree-view/tree-view.js +72 -76
  325. package/dist/components/tutorial-card/tutorial-card.js +1 -1
  326. package/dist/components/tutorial-complete/tutorial-complete.js +2 -2
  327. package/dist/components/tutorial-mdx/tutorial-mdx.js +14 -14
  328. package/dist/components/typewriter/index.js +4 -0
  329. package/dist/components/typewriter/typewriter.js +71 -0
  330. package/dist/components/typography/index.js +26 -0
  331. package/dist/components/typography/typography.js +173 -0
  332. package/dist/components/usage-breakdown/usage-breakdown.js +38 -39
  333. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +5 -5
  334. package/dist/components/wallet-card/wallet-card.js +56 -58
  335. package/dist/components/watchlist/watchlist.js +47 -52
  336. package/dist/components/workspace-switcher/workspace-switcher.js +58 -52
  337. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +43 -45
  338. package/dist/components/world-clock-bar/world-clock-bar.js +34 -61
  339. package/dist/components/zoom-hud/zoom-hud.js +56 -51
  340. package/dist/index.d.ts +6186 -3946
  341. package/dist/index.js +15 -0
  342. package/dist/lib/format.js +14 -0
  343. package/dist/lib/use-body-scroll-lock.js +30 -0
  344. package/dist/lib/use-escape-key.js +24 -0
  345. package/dist/lib/use-live-date.js +26 -0
  346. package/dist/lib/use-theme-preset.js +1 -0
  347. package/package.json +8 -6
  348. package/styles.css +57 -0
@@ -2,10 +2,11 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import {
4
4
  createContext,
5
- forwardRef,
5
+ use,
6
6
  useCallback,
7
- useContext,
7
+ useEffect,
8
8
  useMemo,
9
+ useRef,
9
10
  useState
10
11
  } from "react";
11
12
  import {
@@ -47,7 +48,7 @@ const DEFAULT_CONTEXT = {
47
48
  };
48
49
  const AIArtifactContext = createContext(DEFAULT_CONTEXT);
49
50
  function useAIArtifact() {
50
- return useContext(AIArtifactContext);
51
+ return use(AIArtifactContext);
51
52
  }
52
53
  function pickExtension(type, language) {
53
54
  if (language) return language;
@@ -121,6 +122,24 @@ function ArtifactHeader({
121
122
  subtitle ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: subtitle }) : null
122
123
  ] });
123
124
  }
125
+ function useCopiedFlag() {
126
+ const [copied, setCopied] = useState(false);
127
+ const timerRef = useRef(void 0);
128
+ useEffect(
129
+ () => () => {
130
+ clearTimeout(timerRef.current);
131
+ },
132
+ []
133
+ );
134
+ const flagCopied = useCallback(() => {
135
+ setCopied(true);
136
+ clearTimeout(timerRef.current);
137
+ timerRef.current = setTimeout(() => {
138
+ setCopied(false);
139
+ }, COPIED_TIMEOUT_MS);
140
+ }, []);
141
+ return { copied, flagCopied };
142
+ }
124
143
  function useArtifactController(options) {
125
144
  const {
126
145
  defaultFullscreen,
@@ -133,7 +152,7 @@ function useArtifactController(options) {
133
152
  value
134
153
  } = options;
135
154
  const [fullscreen, setFullscreen] = useState(defaultFullscreen);
136
- const [copied, setCopied] = useState(false);
155
+ const { copied, flagCopied } = useCopiedFlag();
137
156
  const resolvedFilename = useMemo(
138
157
  () => buildFilename({ filename, language, title, type }),
139
158
  [filename, language, title, type]
@@ -141,12 +160,9 @@ function useArtifactController(options) {
141
160
  const copy = useCallback(async () => {
142
161
  const ok = await writeToClipboard(value);
143
162
  if (!ok) return false;
144
- setCopied(true);
145
- setTimeout(() => {
146
- setCopied(false);
147
- }, COPIED_TIMEOUT_MS);
163
+ flagCopied();
148
164
  return true;
149
- }, [value]);
165
+ }, [flagCopied, value]);
150
166
  const download = useCallback(() => {
151
167
  downloadValueAsFile(value, resolvedFilename);
152
168
  }, [resolvedFilename, value]);
@@ -185,66 +201,71 @@ function useArtifactController(options) {
185
201
  ]
186
202
  );
187
203
  }
188
- const AIArtifact = forwardRef(
189
- (props, ref) => {
190
- const {
191
- children,
192
- className,
193
- defaultFullscreen = false,
194
- filename,
195
- labels,
196
- language = "",
197
- onEdit,
198
- subtitle,
199
- title,
200
- type = "code",
201
- value = "",
202
- ...rest
203
- } = props;
204
- const resolvedLabels = useMemo(
205
- () => ({ ...DEFAULT_LABELS, ...labels }),
206
- [labels]
207
- );
208
- const contextValue = useArtifactController({
209
- defaultFullscreen,
210
- filename,
211
- labels: resolvedLabels,
212
- language,
213
- onEdit,
214
- title,
215
- type,
216
- value
217
- });
218
- return /* @__PURE__ */ jsx(AIArtifactContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxs(
219
- "section",
220
- {
221
- "aria-label": typeof title === "string" ? title : void 0,
222
- className: cn(
223
- "flex flex-col gap-3 rounded-2xl border bg-background p-4",
224
- className
204
+ const AIArtifact = ({
205
+ ref,
206
+ ...props
207
+ }) => {
208
+ const {
209
+ children,
210
+ className,
211
+ defaultFullscreen = false,
212
+ filename,
213
+ labels,
214
+ language = "",
215
+ onEdit,
216
+ subtitle,
217
+ title,
218
+ type = "code",
219
+ value = "",
220
+ ...rest
221
+ } = props;
222
+ const resolvedLabels = useMemo(
223
+ () => ({ ...DEFAULT_LABELS, ...labels }),
224
+ [labels]
225
+ );
226
+ const contextValue = useArtifactController({
227
+ defaultFullscreen,
228
+ filename,
229
+ labels: resolvedLabels,
230
+ language,
231
+ onEdit,
232
+ title,
233
+ type,
234
+ value
235
+ });
236
+ return /* @__PURE__ */ jsx(AIArtifactContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxs(
237
+ "section",
238
+ {
239
+ "aria-label": typeof title === "string" ? title : void 0,
240
+ className: cn(
241
+ "flex flex-col gap-3 rounded-2xl border bg-background p-4",
242
+ className
243
+ ),
244
+ "data-fullscreen": contextValue.fullscreen ? "true" : "false",
245
+ "data-type": type,
246
+ ref,
247
+ ...rest,
248
+ children: [
249
+ /* @__PURE__ */ jsx(
250
+ ArtifactHeader,
251
+ {
252
+ language,
253
+ subtitle,
254
+ title,
255
+ type
256
+ }
225
257
  ),
226
- "data-fullscreen": contextValue.fullscreen ? "true" : "false",
227
- "data-type": type,
228
- ref,
229
- ...rest,
230
- children: [
231
- /* @__PURE__ */ jsx(
232
- ArtifactHeader,
233
- {
234
- language,
235
- subtitle,
236
- title,
237
- type
238
- }
239
- ),
240
- children
241
- ]
242
- }
243
- ) });
244
- }
245
- );
258
+ children
259
+ ]
260
+ }
261
+ ) });
262
+ };
246
263
  AIArtifact.displayName = "AIArtifact";
247
- const AIArtifactToolbar = forwardRef(({ className, ...rest }, ref) => /* @__PURE__ */ jsx(
264
+ const AIArtifactToolbar = ({
265
+ className,
266
+ ref,
267
+ ...rest
268
+ }) => /* @__PURE__ */ jsx(
248
269
  "div",
249
270
  {
250
271
  className: cn(
@@ -255,9 +276,14 @@ const AIArtifactToolbar = forwardRef(({ className, ...rest }, ref) => /* @__PURE
255
276
  role: "toolbar",
256
277
  ...rest
257
278
  }
258
- ));
279
+ );
259
280
  AIArtifactToolbar.displayName = "AIArtifactToolbar";
260
- const AIArtifactCopyButton = forwardRef(({ className, onClick, ...rest }, ref) => {
281
+ const AIArtifactCopyButton = ({
282
+ className,
283
+ onClick,
284
+ ref,
285
+ ...rest
286
+ }) => {
261
287
  const { copied, copy, labels } = useAIArtifact();
262
288
  const handleCopyArtifact = useCallback(
263
289
  (event) => {
@@ -281,9 +307,14 @@ const AIArtifactCopyButton = forwardRef(({ className, onClick, ...rest }, ref) =
281
307
  children: copied ? /* @__PURE__ */ jsx(Check, { "aria-hidden": "true", className: "size-4" }) : /* @__PURE__ */ jsx(Copy, { "aria-hidden": "true", className: "size-4" })
282
308
  }
283
309
  );
284
- });
310
+ };
285
311
  AIArtifactCopyButton.displayName = "AIArtifactCopyButton";
286
- const AIArtifactEditButton = forwardRef(({ className, onClick, ...rest }, ref) => {
312
+ const AIArtifactEditButton = ({
313
+ className,
314
+ onClick,
315
+ ref,
316
+ ...rest
317
+ }) => {
287
318
  const { hasOnEdit, labels, onEdit } = useAIArtifact();
288
319
  const handleEditArtifact = useCallback(
289
320
  (event) => {
@@ -308,9 +339,14 @@ const AIArtifactEditButton = forwardRef(({ className, onClick, ...rest }, ref) =
308
339
  children: /* @__PURE__ */ jsx(Pencil, { "aria-hidden": "true", className: "size-4" })
309
340
  }
310
341
  );
311
- });
342
+ };
312
343
  AIArtifactEditButton.displayName = "AIArtifactEditButton";
313
- const AIArtifactDownloadButton = forwardRef(({ className, onClick, ...rest }, ref) => {
344
+ const AIArtifactDownloadButton = ({
345
+ className,
346
+ onClick,
347
+ ref,
348
+ ...rest
349
+ }) => {
314
350
  const { download, labels } = useAIArtifact();
315
351
  const handleDownloadArtifact = useCallback(
316
352
  (event) => {
@@ -334,9 +370,14 @@ const AIArtifactDownloadButton = forwardRef(({ className, onClick, ...rest }, re
334
370
  children: /* @__PURE__ */ jsx(Download, { "aria-hidden": "true", className: "size-4" })
335
371
  }
336
372
  );
337
- });
373
+ };
338
374
  AIArtifactDownloadButton.displayName = "AIArtifactDownloadButton";
339
- const AIArtifactFullscreenButton = forwardRef(({ className, onClick, ...rest }, ref) => {
375
+ const AIArtifactFullscreenButton = ({
376
+ className,
377
+ onClick,
378
+ ref,
379
+ ...rest
380
+ }) => {
340
381
  const { fullscreen, labels, toggleFullscreen } = useAIArtifact();
341
382
  const handleToggleArtifactFullscreen = useCallback(
342
383
  (event) => {
@@ -361,9 +402,13 @@ const AIArtifactFullscreenButton = forwardRef(({ className, onClick, ...rest },
361
402
  children: fullscreen ? /* @__PURE__ */ jsx(Minimize2, { "aria-hidden": "true", className: "size-4" }) : /* @__PURE__ */ jsx(Maximize2, { "aria-hidden": "true", className: "size-4" })
362
403
  }
363
404
  );
364
- });
405
+ };
365
406
  AIArtifactFullscreenButton.displayName = "AIArtifactFullscreenButton";
366
- const AIArtifactContent = forwardRef(({ className, ...rest }, ref) => /* @__PURE__ */ jsx(
407
+ const AIArtifactContent = ({
408
+ className,
409
+ ref,
410
+ ...rest
411
+ }) => /* @__PURE__ */ jsx(
367
412
  "div",
368
413
  {
369
414
  className: cn(
@@ -373,9 +418,14 @@ const AIArtifactContent = forwardRef(({ className, ...rest }, ref) => /* @__PURE
373
418
  ref,
374
419
  ...rest
375
420
  }
376
- ));
421
+ );
377
422
  AIArtifactContent.displayName = "AIArtifactContent";
378
- const AIArtifactVersions = forwardRef(({ children, className, ...rest }, ref) => {
423
+ const AIArtifactVersions = ({
424
+ children,
425
+ className,
426
+ ref,
427
+ ...rest
428
+ }) => {
379
429
  const { labels } = useAIArtifact();
380
430
  return /* @__PURE__ */ jsx(
381
431
  "nav",
@@ -390,9 +440,15 @@ const AIArtifactVersions = forwardRef(({ children, className, ...rest }, ref) =>
390
440
  children
391
441
  }
392
442
  );
393
- });
443
+ };
394
444
  AIArtifactVersions.displayName = "AIArtifactVersions";
395
- const AIArtifactVersion = forwardRef(({ active = false, className, label, ...rest }, ref) => /* @__PURE__ */ jsx(
445
+ const AIArtifactVersion = ({
446
+ active = false,
447
+ className,
448
+ label,
449
+ ref,
450
+ ...rest
451
+ }) => /* @__PURE__ */ jsx(
396
452
  "button",
397
453
  {
398
454
  "aria-current": active ? "true" : void 0,
@@ -406,7 +462,7 @@ const AIArtifactVersion = forwardRef(({ active = false, className, label, ...res
406
462
  ...rest,
407
463
  children: label
408
464
  }
409
- ));
465
+ );
410
466
  AIArtifactVersion.displayName = "AIArtifactVersion";
411
467
  export {
412
468
  AIArtifact,
@@ -1,10 +1,9 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { forwardRef } from "react";
3
2
  import { cva } from "class-variance-authority";
4
3
  import { LoaderCircle, SendHorizontal } from "lucide-react";
5
4
  import { cn } from "../../lib/utils";
6
5
  import { Button } from "../button/button";
7
- import { Textarea } from "../textarea";
6
+ import { Textarea } from "../textarea/textarea";
8
7
  const formShellVariants = cva(
9
8
  "rounded-2xl border border-border/70 bg-background shadow-sm"
10
9
  );
@@ -43,64 +42,65 @@ function AIChatInputFooter({
43
42
  )
44
43
  ] });
45
44
  }
46
- const AIChatInput = forwardRef(
47
- ({
48
- className,
49
- disabled = false,
50
- helperText,
51
- isSubmitting = false,
52
- onSubmit,
53
- onValueChange,
54
- status,
55
- submitLabel = "Send",
56
- textareaProps,
57
- toolbar,
58
- value,
59
- ...props
60
- }, ref) => {
61
- const currentValue = value ?? "";
62
- const maxLength = textareaProps?.maxLength;
63
- const isSubmitDisabled = disabled || isSubmitting || currentValue.trim().length === 0;
64
- return /* @__PURE__ */ jsx(
65
- "form",
66
- {
67
- className: cn(formShellVariants(), "w-full p-3", className),
68
- onSubmit,
69
- ref,
70
- ...props,
71
- children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
72
- /* @__PURE__ */ jsx(
73
- Textarea,
74
- {
75
- className: "min-h-[120px] resize-none rounded-xl border-0 bg-transparent p-1 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0",
76
- disabled,
77
- onChange: (event) => {
78
- textareaProps?.onChange?.(event);
79
- onValueChange?.(event.target.value);
80
- },
81
- placeholder: "Ask a follow-up question, paste context, or describe what you need...",
82
- value,
83
- ...textareaProps
84
- }
85
- ),
86
- toolbar ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: toolbar }) : null,
87
- /* @__PURE__ */ jsx(
88
- AIChatInputFooter,
89
- {
90
- currentLength: currentValue.length,
91
- helperText,
92
- isSubmitDisabled,
93
- isSubmitting,
94
- maxLength,
95
- status,
96
- submitLabel
97
- }
98
- )
99
- ] })
100
- }
101
- );
102
- }
103
- );
45
+ const AIChatInput = ({
46
+ className,
47
+ disabled = false,
48
+ helperText,
49
+ inputLabel = "Chat message",
50
+ isSubmitting = false,
51
+ onSubmit,
52
+ onValueChange,
53
+ ref,
54
+ status,
55
+ submitLabel = "Send",
56
+ textareaProps,
57
+ toolbar,
58
+ value,
59
+ ...props
60
+ }) => {
61
+ const currentValue = value ?? "";
62
+ const maxLength = textareaProps?.maxLength;
63
+ const isSubmitDisabled = disabled || isSubmitting || currentValue.trim().length === 0;
64
+ return /* @__PURE__ */ jsx(
65
+ "form",
66
+ {
67
+ className: cn(formShellVariants(), "w-full p-3", className),
68
+ onSubmit,
69
+ ref,
70
+ ...props,
71
+ children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
72
+ /* @__PURE__ */ jsx(
73
+ Textarea,
74
+ {
75
+ "aria-label": inputLabel,
76
+ className: "min-h-[120px] resize-none rounded-xl border-0 bg-transparent p-1 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0",
77
+ disabled,
78
+ onChange: (event) => {
79
+ textareaProps?.onChange?.(event);
80
+ onValueChange?.(event.target.value);
81
+ },
82
+ placeholder: "Ask a follow-up question, paste context, or describe what you need...",
83
+ value,
84
+ ...textareaProps
85
+ }
86
+ ),
87
+ toolbar ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: toolbar }) : null,
88
+ /* @__PURE__ */ jsx(
89
+ AIChatInputFooter,
90
+ {
91
+ currentLength: currentValue.length,
92
+ helperText,
93
+ isSubmitDisabled,
94
+ isSubmitting,
95
+ maxLength,
96
+ status,
97
+ submitLabel
98
+ }
99
+ )
100
+ ] })
101
+ }
102
+ );
103
+ };
104
104
  AIChatInput.displayName = "AIChatInput";
105
105
  export {
106
106
  AIChatInput
@@ -1,9 +1,8 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { forwardRef } from "react";
3
2
  import { cva } from "class-variance-authority";
4
3
  import { cn } from "../../lib/utils";
5
4
  import { Avatar, AvatarFallback } from "../avatar/avatar";
6
- import { Badge } from "../badge";
5
+ import { Badge } from "../badge/badge";
7
6
  const bubbleVariants = cva(
8
7
  "rounded-2xl border px-4 py-3 shadow-sm transition-colors",
9
8
  {
@@ -48,71 +47,70 @@ function AIMessageMeta({
48
47
  }
49
48
  );
50
49
  }
51
- const AIMessageBubble = forwardRef(
52
- ({
53
- author,
54
- children,
55
- className,
56
- messageRole = "assistant",
57
- status,
58
- timestamp,
59
- ...props
60
- }, ref) => {
61
- const resolvedMessageRole = messageRole ?? "assistant";
62
- const isUser = resolvedMessageRole === "user";
63
- const fallbackLabel = (author ?? resolvedMessageRole).charAt(0).toUpperCase();
64
- return /* @__PURE__ */ jsx(
65
- "div",
66
- {
67
- className: cn("flex w-full", isUser ? "justify-end" : "justify-start"),
68
- children: /* @__PURE__ */ jsxs(
69
- "div",
70
- {
71
- className: cn(
72
- "flex w-full max-w-3xl gap-3",
73
- isUser ? "flex-row-reverse text-right" : "flex-row"
74
- ),
75
- children: [
76
- /* @__PURE__ */ jsx(Avatar, { className: "mt-0.5 size-8 border border-border/70", children: /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-muted text-[11px] font-medium uppercase text-muted-foreground", children: fallbackLabel }) }),
77
- /* @__PURE__ */ jsxs(
78
- "div",
79
- {
80
- className: cn(
81
- "min-w-0 space-y-2",
82
- isUser ? "items-end" : "items-start"
50
+ const AIMessageBubble = ({
51
+ author,
52
+ children,
53
+ className,
54
+ messageRole = "assistant",
55
+ ref,
56
+ status,
57
+ timestamp,
58
+ ...props
59
+ }) => {
60
+ const resolvedMessageRole = messageRole ?? "assistant";
61
+ const isUser = resolvedMessageRole === "user";
62
+ const fallbackLabel = (author ?? resolvedMessageRole).charAt(0).toUpperCase();
63
+ return /* @__PURE__ */ jsx(
64
+ "div",
65
+ {
66
+ className: cn("flex w-full", isUser ? "justify-end" : "justify-start"),
67
+ children: /* @__PURE__ */ jsxs(
68
+ "div",
69
+ {
70
+ className: cn(
71
+ "flex w-full max-w-3xl gap-3",
72
+ isUser ? "flex-row-reverse text-right" : "flex-row"
73
+ ),
74
+ children: [
75
+ /* @__PURE__ */ jsx(Avatar, { className: "mt-0.5 size-8 border border-border/70", children: /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-muted text-[11px] font-medium uppercase text-muted-foreground", children: fallbackLabel }) }),
76
+ /* @__PURE__ */ jsxs(
77
+ "div",
78
+ {
79
+ className: cn(
80
+ "min-w-0 space-y-2",
81
+ isUser ? "items-end" : "items-start"
82
+ ),
83
+ children: [
84
+ /* @__PURE__ */ jsx(
85
+ AIMessageMeta,
86
+ {
87
+ author,
88
+ isUser,
89
+ status,
90
+ timestamp
91
+ }
83
92
  ),
84
- children: [
85
- /* @__PURE__ */ jsx(
86
- AIMessageMeta,
87
- {
88
- author,
89
- isUser,
90
- status,
91
- timestamp
92
- }
93
- ),
94
- /* @__PURE__ */ jsx(
95
- "div",
96
- {
97
- className: cn(
98
- bubbleVariants({ messageRole: resolvedMessageRole }),
99
- className
100
- ),
101
- ref,
102
- ...props,
103
- children: /* @__PURE__ */ jsx("div", { className: "text-sm leading-6 whitespace-pre-wrap", children })
104
- }
105
- )
106
- ]
107
- }
108
- )
109
- ]
110
- }
111
- )
112
- }
113
- );
114
- }
115
- );
93
+ /* @__PURE__ */ jsx(
94
+ "div",
95
+ {
96
+ className: cn(
97
+ bubbleVariants({ messageRole: resolvedMessageRole }),
98
+ className
99
+ ),
100
+ ref,
101
+ ...props,
102
+ children: /* @__PURE__ */ jsx("div", { className: "text-sm leading-6 whitespace-pre-wrap", children })
103
+ }
104
+ )
105
+ ]
106
+ }
107
+ )
108
+ ]
109
+ }
110
+ )
111
+ }
112
+ );
113
+ };
116
114
  AIMessageBubble.displayName = "AIMessageBubble";
117
115
  export {
118
116
  AIMessageBubble