@vllnt/ui 0.2.1 → 0.3.0-canary.0572c35

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 (331) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +59 -30
  3. package/dist/components/accordion/accordion.js +2 -2
  4. package/dist/components/activity-heatmap/activity-heatmap.js +17 -14
  5. package/dist/components/activity-log/activity-log.js +12 -11
  6. package/dist/components/agent-activity/agent-activity.js +317 -0
  7. package/dist/components/agent-activity/index.js +18 -0
  8. package/dist/components/ai-artifact/ai-artifact.js +439 -0
  9. package/dist/components/ai-artifact/index.js +24 -0
  10. package/dist/components/ai-chat-input/ai-chat-input.js +6 -4
  11. package/dist/components/ai-message-bubble/ai-message-bubble.js +3 -3
  12. package/dist/components/ai-sidebar/ai-sidebar.js +255 -0
  13. package/dist/components/ai-sidebar/index.js +22 -0
  14. package/dist/components/ai-source-citation/ai-source-citation.js +2 -2
  15. package/dist/components/ai-tool-call-display/ai-tool-call-display.js +5 -5
  16. package/dist/components/alert-pulse/alert-pulse.js +93 -0
  17. package/dist/components/alert-pulse/index.js +6 -0
  18. package/dist/components/anchor-port/anchor-port.js +51 -0
  19. package/dist/components/anchor-port/index.js +4 -0
  20. package/dist/components/animated-text/animated-text.js +8 -7
  21. package/dist/components/annotation/annotation.js +1 -1
  22. package/dist/components/auto-reload/auto-reload.js +401 -0
  23. package/dist/components/auto-reload/index.js +6 -0
  24. package/dist/components/avatar/avatar.js +1 -1
  25. package/dist/components/avatar-group/avatar-group.js +5 -5
  26. package/dist/components/banner/banner.js +155 -0
  27. package/dist/components/banner/index.js +10 -0
  28. package/dist/components/blog-card/blog-card.js +5 -3
  29. package/dist/components/border-beam/border-beam.js +2 -2
  30. package/dist/components/bottom-activity-strip/bottom-activity-strip.js +91 -0
  31. package/dist/components/bottom-activity-strip/index.js +6 -0
  32. package/dist/components/bottom-bar/bottom-bar.js +25 -0
  33. package/dist/components/bottom-bar/index.js +4 -0
  34. package/dist/components/breadcrumb/breadcrumb.js +33 -26
  35. package/dist/components/button/button.js +1 -1
  36. package/dist/components/calendar/calendar.js +6 -6
  37. package/dist/components/callout/callout.js +1 -1
  38. package/dist/components/candlestick-chart/candlestick-chart.js +13 -12
  39. package/dist/components/canvas-shell/canvas-foundation-demo.js +183 -0
  40. package/dist/components/canvas-shell/canvas-shell-route-config.js +0 -0
  41. package/dist/components/canvas-shell/canvas-shell.js +264 -0
  42. package/dist/components/canvas-shell/index.js +4 -0
  43. package/dist/components/canvas-view/canvas-view.js +504 -0
  44. package/dist/components/canvas-view/index.js +6 -0
  45. package/dist/components/carousel/carousel.js +18 -10
  46. package/dist/components/category-filter/category-filter.js +1 -1
  47. package/dist/components/chain-of-thought/chain-of-thought.js +77 -0
  48. package/dist/components/chain-of-thought/index.js +6 -0
  49. package/dist/components/chart/area-chart.js +1 -0
  50. package/dist/components/chart/line-chart.js +1 -0
  51. package/dist/components/chat-dock-section/chat-dock-section.js +56 -0
  52. package/dist/components/chat-dock-section/index.js +6 -0
  53. package/dist/components/checkbox/checkbox.js +2 -2
  54. package/dist/components/checklist/checklist.js +45 -10
  55. package/dist/components/checklist/index.js +10 -2
  56. package/dist/components/choropleth-map/choropleth-map.js +378 -0
  57. package/dist/components/choropleth-map/index.js +10 -0
  58. package/dist/components/chronological-timeline/chronological-timeline.js +343 -0
  59. package/dist/components/chronological-timeline/index.js +8 -0
  60. package/dist/components/civilization-card/civilization-card.js +275 -0
  61. package/dist/components/civilization-card/index.js +8 -0
  62. package/dist/components/code-block/code-block.js +43 -22
  63. package/dist/components/code-playground/code-playground.js +16 -10
  64. package/dist/components/combobox/combobox.js +49 -30
  65. package/dist/components/command/command.js +1 -1
  66. package/dist/components/comment-pin/comment-pin.js +104 -0
  67. package/dist/components/comment-pin/index.js +6 -0
  68. package/dist/components/comparison/comparison.js +11 -10
  69. package/dist/components/completion-dialog/completion-dialog.js +20 -12
  70. package/dist/components/connector-edge/connector-edge.js +66 -0
  71. package/dist/components/connector-edge/index.js +6 -0
  72. package/dist/components/content-intro/content-intro.js +29 -22
  73. package/dist/components/context-lens/context-lens.js +98 -0
  74. package/dist/components/context-lens/index.js +6 -0
  75. package/dist/components/context-menu/context-menu.js +4 -4
  76. package/dist/components/conversation-thread/conversation-thread.js +348 -0
  77. package/dist/components/conversation-thread/index.js +20 -0
  78. package/dist/components/cookie-consent/cookie-consent.js +1 -1
  79. package/dist/components/copy-button/copy-button.js +189 -0
  80. package/dist/components/copy-button/index.js +8 -0
  81. package/dist/components/countdown-timer/countdown-timer.js +10 -9
  82. package/dist/components/credit-badge/credit-badge.js +1 -7
  83. package/dist/components/curriculum/curriculum.js +349 -0
  84. package/dist/components/curriculum/index.js +10 -0
  85. package/dist/components/data-list/data-list.js +2 -1
  86. package/dist/components/data-table/data-table.js +10 -9
  87. package/dist/components/date-picker/date-picker.js +4 -9
  88. package/dist/components/dialog/dialog.js +1 -1
  89. package/dist/components/document-sibling-nav/document-sibling-nav.js +111 -0
  90. package/dist/components/document-sibling-nav/index.js +8 -0
  91. package/dist/components/dropdown-menu/dropdown-menu.js +3 -3
  92. package/dist/components/edge-label/edge-label.js +26 -0
  93. package/dist/components/edge-label/index.js +4 -0
  94. package/dist/components/empty-state/empty-state.js +93 -0
  95. package/dist/components/empty-state/index.js +8 -0
  96. package/dist/components/era-comparison/era-comparison.js +216 -0
  97. package/dist/components/era-comparison/index.js +16 -0
  98. package/dist/components/exercise/exercise.js +15 -7
  99. package/dist/components/faq/faq.js +8 -4
  100. package/dist/components/file-upload/file-upload.js +4 -9
  101. package/dist/components/filter-bar/filter-bar.js +9 -8
  102. package/dist/components/flashcard/flashcard.js +10 -4
  103. package/dist/components/floating-action-button/floating-action-button.js +1 -1
  104. package/dist/components/floating-toolbar/floating-toolbar.js +66 -0
  105. package/dist/components/floating-toolbar/index.js +6 -0
  106. package/dist/components/flow-diagram/flow-controls.js +9 -9
  107. package/dist/components/flow-diagram/flow-error-boundary.js +2 -2
  108. package/dist/components/flow-diagram/flow-fullscreen.js +2 -2
  109. package/dist/components/follow-mode/follow-mode.js +89 -0
  110. package/dist/components/follow-mode/index.js +6 -0
  111. package/dist/components/form/form.js +432 -0
  112. package/dist/components/form/index.js +20 -0
  113. package/dist/components/gantt-chart/gantt-chart.js +334 -0
  114. package/dist/components/gantt-chart/index.js +6 -0
  115. package/dist/components/geography-quiz-map/geography-quiz-map.js +344 -0
  116. package/dist/components/geography-quiz-map/index.js +12 -0
  117. package/dist/components/glass-panel/glass-panel.js +21 -0
  118. package/dist/components/glass-panel/index.js +4 -0
  119. package/dist/components/globe-3d/globe-3d.js +429 -0
  120. package/dist/components/globe-3d/index.js +10 -0
  121. package/dist/components/group-hull/group-hull.js +29 -0
  122. package/dist/components/group-hull/index.js +4 -0
  123. package/dist/components/handoff-beacon/handoff-beacon.js +78 -0
  124. package/dist/components/handoff-beacon/index.js +6 -0
  125. package/dist/components/heat-map-overlay/heat-map-overlay.js +215 -0
  126. package/dist/components/heat-map-overlay/index.js +6 -0
  127. package/dist/components/heat-overlay/heat-overlay.js +92 -0
  128. package/dist/components/heat-overlay/index.js +6 -0
  129. package/dist/components/historic-timeline/historic-timeline.js +342 -0
  130. package/dist/components/historic-timeline/index.js +6 -0
  131. package/dist/components/historical-figure-card/historical-figure-card.js +270 -0
  132. package/dist/components/historical-figure-card/index.js +6 -0
  133. package/dist/components/horizontal-scroll-row/horizontal-scroll-row.js +6 -5
  134. package/dist/components/index.js +578 -1
  135. package/dist/components/infinite-plane/index.js +6 -0
  136. package/dist/components/infinite-plane/infinite-plane.js +75 -0
  137. package/dist/components/inline-input/inline-input.js +1 -1
  138. package/dist/components/input-otp/input-otp.js +1 -1
  139. package/dist/components/interactive-timeline/index.js +16 -0
  140. package/dist/components/interactive-timeline/interactive-timeline.js +724 -0
  141. package/dist/components/jarvis-dock/index.js +6 -0
  142. package/dist/components/jarvis-dock/jarvis-dock.js +98 -0
  143. package/dist/components/kbd/index.js +5 -0
  144. package/dist/components/kbd/kbd.js +125 -0
  145. package/dist/components/key-concept/key-concept.js +6 -5
  146. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +4 -3
  147. package/dist/components/knowledge-check/index.js +6 -0
  148. package/dist/components/knowledge-check/knowledge-check.js +473 -0
  149. package/dist/components/lang-provider/lang-provider.js +3 -3
  150. package/dist/components/learning-objectives/learning-objectives.js +14 -13
  151. package/dist/components/left-rail/index.js +4 -0
  152. package/dist/components/left-rail/left-rail.js +25 -0
  153. package/dist/components/live-cursor/index.js +6 -0
  154. package/dist/components/live-cursor/live-cursor.js +62 -0
  155. package/dist/components/live-feed/live-feed.js +18 -16
  156. package/dist/components/map-2d/index.js +20 -0
  157. package/dist/components/map-2d/map-2d.js +455 -0
  158. package/dist/components/map-timeline/index.js +16 -0
  159. package/dist/components/map-timeline/map-timeline.js +506 -0
  160. package/dist/components/market-treemap/market-treemap.js +3 -3
  161. package/dist/components/mdx-content/mdx-content.js +25 -11
  162. package/dist/components/menubar/menubar.js +4 -4
  163. package/dist/components/metric-cluster/index.js +6 -0
  164. package/dist/components/metric-cluster/metric-cluster.js +96 -0
  165. package/dist/components/metric-gauge/metric-gauge.js +3 -3
  166. package/dist/components/mini-map-panel/index.js +6 -0
  167. package/dist/components/mini-map-panel/mini-map-panel.js +74 -0
  168. package/dist/components/model-comparison/index.js +12 -0
  169. package/dist/components/model-comparison/model-comparison.js +230 -0
  170. package/dist/components/model-selector/model-selector.js +8 -8
  171. package/dist/components/multi-select/index.js +6 -0
  172. package/dist/components/multi-select/multi-select.js +258 -0
  173. package/dist/components/multi-select-lasso/index.js +6 -0
  174. package/dist/components/multi-select-lasso/multi-select-lasso.js +76 -0
  175. package/dist/components/navbar-saas/navbar-saas.js +11 -10
  176. package/dist/components/navigation-menu/navigation-menu.js +2 -2
  177. package/dist/components/newsletter-signup/index.js +8 -0
  178. package/dist/components/newsletter-signup/newsletter-signup.js +269 -0
  179. package/dist/components/number-input/number-input.js +2 -2
  180. package/dist/components/number-ticker/number-ticker.js +11 -4
  181. package/dist/components/object-card/index.js +6 -0
  182. package/dist/components/object-card/object-card.js +126 -0
  183. package/dist/components/object-handle/index.js +4 -0
  184. package/dist/components/object-handle/object-handle.js +38 -0
  185. package/dist/components/object-inspector/index.js +6 -0
  186. package/dist/components/object-inspector/object-inspector.js +136 -0
  187. package/dist/components/order-book/order-book.js +2 -2
  188. package/dist/components/overview-board/index.js +8 -0
  189. package/dist/components/overview-board/overview-board.js +127 -0
  190. package/dist/components/parallel-timeline/index.js +6 -0
  191. package/dist/components/parallel-timeline/parallel-timeline.js +251 -0
  192. package/dist/components/password-input/password-input.js +1 -1
  193. package/dist/components/plan-badge/plan-badge.js +1 -7
  194. package/dist/components/playback-ghost/index.js +6 -0
  195. package/dist/components/playback-ghost/playback-ghost.js +83 -0
  196. package/dist/components/policy-delivery-panel/index.js +6 -0
  197. package/dist/components/policy-delivery-panel/policy-delivery-panel.js +99 -0
  198. package/dist/components/presence-stack/index.js +6 -0
  199. package/dist/components/presence-stack/presence-stack.js +108 -0
  200. package/dist/components/presence-sync-indicator/index.js +6 -0
  201. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +73 -0
  202. package/dist/components/pricing-table/index.js +8 -0
  203. package/dist/components/pricing-table/pricing-table.js +284 -0
  204. package/dist/components/primary-source-viewer/index.js +26 -0
  205. package/dist/components/primary-source-viewer/primary-source-viewer.js +439 -0
  206. package/dist/components/pro-tip/pro-tip.js +6 -6
  207. package/dist/components/profile-section/profile-section.js +3 -2
  208. package/dist/components/progress-card/progress-card.js +6 -5
  209. package/dist/components/progress-tracker/index.js +20 -0
  210. package/dist/components/progress-tracker/progress-tracker.js +537 -0
  211. package/dist/components/prompt-input/index.js +4 -0
  212. package/dist/components/prompt-input/prompt-input.js +186 -0
  213. package/dist/components/prompt-templates/index.js +6 -0
  214. package/dist/components/prompt-templates/prompt-templates.js +395 -0
  215. package/dist/components/property-section/index.js +6 -0
  216. package/dist/components/property-section/property-section.js +101 -0
  217. package/dist/components/quiz/quiz.js +7 -6
  218. package/dist/components/radio-group/radio-group.js +2 -2
  219. package/dist/components/rating/rating.js +3 -3
  220. package/dist/components/reasoning/index.js +4 -0
  221. package/dist/components/reasoning/reasoning.js +118 -0
  222. package/dist/components/relationship-inspector/index.js +6 -0
  223. package/dist/components/relationship-inspector/relationship-inspector.js +102 -0
  224. package/dist/components/resizable/resizable.js +1 -1
  225. package/dist/components/right-dock/index.js +4 -0
  226. package/dist/components/right-dock/right-dock.js +28 -0
  227. package/dist/components/route-map/index.js +6 -0
  228. package/dist/components/route-map/route-map.js +339 -0
  229. package/dist/components/routing-assignment-panel/index.js +6 -0
  230. package/dist/components/routing-assignment-panel/routing-assignment-panel.js +122 -0
  231. package/dist/components/run-timeline/index.js +6 -0
  232. package/dist/components/run-timeline/run-timeline.js +221 -0
  233. package/dist/components/runtime-overview-panel/index.js +6 -0
  234. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +89 -0
  235. package/dist/components/scope-selector/scope-selector.js +13 -13
  236. package/dist/components/search-bar/search-bar.js +24 -2
  237. package/dist/components/search-dialog/search-dialog.js +485 -52
  238. package/dist/components/segmented-control/index.js +12 -0
  239. package/dist/components/segmented-control/segmented-control.js +61 -0
  240. package/dist/components/select/select.js +5 -5
  241. package/dist/components/selection-halo/index.js +6 -0
  242. package/dist/components/selection-halo/selection-halo.js +72 -0
  243. package/dist/components/selection-presence/index.js +6 -0
  244. package/dist/components/selection-presence/selection-presence.js +50 -0
  245. package/dist/components/severity-badge/severity-badge.js +2 -2
  246. package/dist/components/share-dialog/share-dialog.js +2 -2
  247. package/dist/components/share-section/share-section.js +2 -1
  248. package/dist/components/sheet/sheet.js +1 -1
  249. package/dist/components/sidebar/sidebar.js +31 -26
  250. package/dist/components/sidebar-toggle/sidebar-toggle.js +5 -3
  251. package/dist/components/slider/slider.js +1 -1
  252. package/dist/components/slideshow/slideshow.js +356 -275
  253. package/dist/components/snap-guides/index.js +6 -0
  254. package/dist/components/snap-guides/snap-guides.js +45 -0
  255. package/dist/components/social-fab/social-fab.js +12 -11
  256. package/dist/components/sparkline-grid/sparkline-grid.js +4 -3
  257. package/dist/components/spinner/spinner.js +4 -4
  258. package/dist/components/spinner/unicode-spinner.js +5 -2
  259. package/dist/components/stat-card/stat-card.js +5 -5
  260. package/dist/components/state-badge-overlay/index.js +6 -0
  261. package/dist/components/state-badge-overlay/state-badge-overlay.js +90 -0
  262. package/dist/components/static-code/index.js +4 -0
  263. package/dist/components/static-code/static-code-copy.js +24 -0
  264. package/dist/components/static-code/static-code.js +41 -0
  265. package/dist/components/status-board/status-board.js +15 -8
  266. package/dist/components/status-indicator/status-indicator.js +3 -3
  267. package/dist/components/step-by-step/step-by-step.js +10 -8
  268. package/dist/components/step-navigation/step-navigation.js +2 -2
  269. package/dist/components/stepper/stepper.js +3 -3
  270. package/dist/components/sticky-metric/index.js +6 -0
  271. package/dist/components/sticky-metric/sticky-metric.js +83 -0
  272. package/dist/components/story-map/index.js +8 -0
  273. package/dist/components/story-map/story-map.js +414 -0
  274. package/dist/components/subscription-card/subscription-card.js +1 -1
  275. package/dist/components/switch/switch.js +1 -1
  276. package/dist/components/table-of-contents/table-of-contents.js +5 -2
  277. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +8 -6
  278. package/dist/components/tabs/tabs.js +26 -8
  279. package/dist/components/tags-input/index.js +4 -0
  280. package/dist/components/tags-input/tags-input.js +186 -0
  281. package/dist/components/terminal/terminal.js +61 -37
  282. package/dist/components/theme-preset-provider/index.js +4 -0
  283. package/dist/components/theme-preset-provider/theme-preset-provider.js +55 -0
  284. package/dist/components/theme-switcher/index.js +4 -0
  285. package/dist/components/theme-switcher/theme-switcher.js +43 -0
  286. package/dist/components/theme-toggle/theme-toggle.js +2 -2
  287. package/dist/components/thinking-block/thinking-block.js +3 -3
  288. package/dist/components/thread-bubble/index.js +6 -0
  289. package/dist/components/thread-bubble/thread-bubble.js +85 -0
  290. package/dist/components/threshold-ring/index.js +6 -0
  291. package/dist/components/threshold-ring/threshold-ring.js +160 -0
  292. package/dist/components/ticker-tape/ticker-tape.js +4 -4
  293. package/dist/components/timeline/index.js +12 -0
  294. package/dist/components/timeline/timeline.js +239 -0
  295. package/dist/components/timeline-scrubber/index.js +6 -0
  296. package/dist/components/timeline-scrubber/timeline-scrubber.js +179 -0
  297. package/dist/components/tldr-section/tldr-section.js +11 -9
  298. package/dist/components/top-bar/index.js +4 -0
  299. package/dist/components/top-bar/top-bar.js +31 -0
  300. package/dist/components/tour/tour.js +10 -4
  301. package/dist/components/transaction-list/index.js +14 -0
  302. package/dist/components/transaction-list/transaction-list.js +253 -0
  303. package/dist/components/tree-view/index.js +6 -0
  304. package/dist/components/tree-view/tree-view.js +298 -0
  305. package/dist/components/tutorial-card/tutorial-card.js +2 -2
  306. package/dist/components/tutorial-complete/tutorial-complete.js +18 -16
  307. package/dist/components/tutorial-filters/tutorial-filters.js +2 -2
  308. package/dist/components/tutorial-intro-content/tutorial-intro-content.js +5 -5
  309. package/dist/components/tutorial-mdx/tutorial-mdx.js +20 -20
  310. package/dist/components/usage-breakdown/usage-breakdown.js +12 -7
  311. package/dist/components/video-embed/video-embed.js +2 -2
  312. package/dist/components/viewport-bookmarks/index.js +6 -0
  313. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +118 -0
  314. package/dist/components/wallet-card/wallet-card.js +1 -1
  315. package/dist/components/watchlist/watchlist.js +7 -6
  316. package/dist/components/workspace-switcher/index.js +6 -0
  317. package/dist/components/workspace-switcher/workspace-switcher.js +61 -0
  318. package/dist/components/world-breadcrumbs/index.js +6 -0
  319. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +114 -0
  320. package/dist/components/world-clock-bar/world-clock-bar.js +35 -14
  321. package/dist/components/zoom-hud/index.js +4 -0
  322. package/dist/components/zoom-hud/zoom-hud.js +61 -0
  323. package/dist/index.d.ts +8176 -202
  324. package/dist/index.js +27 -1
  325. package/dist/lib/theme-presets.js +32 -0
  326. package/dist/lib/use-theme-preset.js +95 -0
  327. package/dist/tailwind-preset.js +19 -19
  328. package/package.json +15 -10
  329. package/styles.css +38 -38
  330. package/themes/default.css +39 -39
  331. package/themes/presets.css +547 -0
@@ -0,0 +1,56 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { ArrowUpRight, MessageSquareText } from "lucide-react";
4
+ import { cn } from "../../lib/utils";
5
+ import { Button } from "../button/button";
6
+ const ChatDockSection = forwardRef(
7
+ ({
8
+ className,
9
+ composerPlaceholder = "Ask about runs, errors, or pending work\u2026",
10
+ contextLabel,
11
+ messages,
12
+ title = "Assistant",
13
+ ...props
14
+ }, ref) => /* @__PURE__ */ jsxs(
15
+ "section",
16
+ {
17
+ className: cn(
18
+ "flex flex-col gap-4 rounded-2xl border border-border/70 bg-background/75 p-4 shadow-[0_10px_35px_oklch(var(--foreground)/0.06)] backdrop-blur-xl",
19
+ className
20
+ ),
21
+ ref,
22
+ ...props,
23
+ children: [
24
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
25
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
26
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
27
+ /* @__PURE__ */ jsx(MessageSquareText, { className: "size-4 text-primary" }),
28
+ title
29
+ ] }),
30
+ contextLabel ? /* @__PURE__ */ jsx("div", { className: "text-xs uppercase tracking-[0.24em] text-muted-foreground", children: contextLabel }) : null
31
+ ] }),
32
+ /* @__PURE__ */ jsxs(Button, { size: "sm", type: "button", variant: "ghost", children: [
33
+ "Open thread",
34
+ /* @__PURE__ */ jsx(ArrowUpRight, { className: "size-4" })
35
+ ] })
36
+ ] }),
37
+ /* @__PURE__ */ jsx("div", { className: "space-y-3", children: messages.map((message) => /* @__PURE__ */ jsxs(
38
+ "div",
39
+ {
40
+ className: "rounded-xl border border-border/60 bg-background/85 px-3 py-2",
41
+ children: [
42
+ /* @__PURE__ */ jsx("div", { className: "text-[11px] font-medium uppercase tracking-[0.18em] text-muted-foreground", children: message.speaker }),
43
+ /* @__PURE__ */ jsx("div", { className: "mt-2 text-sm leading-6 text-foreground", children: message.body })
44
+ ]
45
+ },
46
+ message.id
47
+ )) }),
48
+ /* @__PURE__ */ jsx("div", { className: "rounded-xl border border-dashed border-border/80 bg-background/70 p-3 text-sm text-muted-foreground", children: composerPlaceholder })
49
+ ]
50
+ }
51
+ )
52
+ );
53
+ ChatDockSection.displayName = "ChatDockSection";
54
+ export {
55
+ ChatDockSection
56
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ ChatDockSection
3
+ } from "./chat-dock-section";
4
+ export {
5
+ ChatDockSection
6
+ };
@@ -8,7 +8,7 @@ const Checkbox = React.forwardRef(({ className, ...props }, reference) => /* @__
8
8
  CheckboxPrimitive.Root,
9
9
  {
10
10
  className: cn(
11
- "peer h-4 w-4 shrink-0 rounded border border-input bg-background ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary",
11
+ "peer size-4 shrink-0 rounded border border-input bg-background ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary",
12
12
  className
13
13
  ),
14
14
  ref: reference,
@@ -17,7 +17,7 @@ const Checkbox = React.forwardRef(({ className, ...props }, reference) => /* @__
17
17
  CheckboxPrimitive.Indicator,
18
18
  {
19
19
  className: cn("flex items-center justify-center text-current"),
20
- children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" })
20
+ children: /* @__PURE__ */ jsx(Check, { className: "size-4" })
21
21
  }
22
22
  )
23
23
  }
@@ -2,6 +2,32 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
4
  import { cn } from "../../lib/utils";
5
+ const CHECKLIST_PROGRESS_EVENT = "vllnt:checklist-progress-change";
6
+ const CHECKLIST_STORAGE_VERSION = 1;
7
+ function stringItemsFromUnknown(value) {
8
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
9
+ }
10
+ function parseChecklistStorageValue(saved) {
11
+ try {
12
+ const parsed = JSON.parse(saved);
13
+ if (Array.isArray(parsed)) {
14
+ return stringItemsFromUnknown(parsed);
15
+ }
16
+ if (typeof parsed === "object" && parsed !== null && "version" in parsed && "checked" in parsed && parsed.version === CHECKLIST_STORAGE_VERSION) {
17
+ return stringItemsFromUnknown(parsed.checked);
18
+ }
19
+ } catch {
20
+ return [];
21
+ }
22
+ return [];
23
+ }
24
+ function createChecklistStorageValue(ids) {
25
+ const payload = {
26
+ checked: [...ids],
27
+ version: CHECKLIST_STORAGE_VERSION
28
+ };
29
+ return JSON.stringify(payload);
30
+ }
5
31
  function ChecklistItemRow({
6
32
  isChecked,
7
33
  item,
@@ -20,7 +46,7 @@ function ChecklistItemRow({
20
46
  isChecked ? /* @__PURE__ */ jsx(
21
47
  "svg",
22
48
  {
23
- className: "h-5 w-5 text-green-500 flex-shrink-0 mt-0.5",
49
+ className: "size-5 text-green-500 flex-shrink-0 mt-0.5",
24
50
  fill: "none",
25
51
  stroke: "currentColor",
26
52
  viewBox: "0 0 24 24",
@@ -37,7 +63,7 @@ function ChecklistItemRow({
37
63
  ) : /* @__PURE__ */ jsx(
38
64
  "svg",
39
65
  {
40
- className: "h-5 w-5 text-muted-foreground flex-shrink-0 mt-0.5",
66
+ className: "size-5 text-muted-foreground flex-shrink-0 mt-0.5",
41
67
  fill: "none",
42
68
  stroke: "currentColor",
43
69
  viewBox: "0 0 24 24",
@@ -66,17 +92,18 @@ function ChecklistItemRow({
66
92
  }
67
93
  function ChecklistHeader({
68
94
  checked,
95
+ Heading,
69
96
  progress,
70
97
  title,
71
98
  total
72
99
  }) {
73
100
  if (!title) return null;
74
101
  return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-3", children: [
75
- /* @__PURE__ */ jsxs("h4", { className: "font-semibold flex items-center gap-2", children: [
102
+ /* @__PURE__ */ jsxs(Heading, { className: "font-semibold flex items-center gap-2", children: [
76
103
  /* @__PURE__ */ jsx(
77
104
  "svg",
78
105
  {
79
- className: "h-5 w-5 text-primary",
106
+ className: "size-5 text-primary",
80
107
  fill: "none",
81
108
  stroke: "currentColor",
82
109
  viewBox: "0 0 24 24",
@@ -104,6 +131,7 @@ function ChecklistHeader({
104
131
  ] });
105
132
  }
106
133
  function Checklist({
134
+ as: Heading = "h4",
107
135
  className,
108
136
  items,
109
137
  onComplete,
@@ -114,10 +142,7 @@ function Checklist({
114
142
  if (typeof window !== "undefined" && persistKey) {
115
143
  const saved = localStorage.getItem(`checklist:${persistKey}`);
116
144
  if (saved) {
117
- try {
118
- return new Set(JSON.parse(saved));
119
- } catch {
120
- }
145
+ return new Set(parseChecklistStorageValue(saved));
121
146
  }
122
147
  }
123
148
  return /* @__PURE__ */ new Set();
@@ -131,7 +156,12 @@ function Checklist({
131
156
  try {
132
157
  localStorage.setItem(
133
158
  `checklist:${persistKey}`,
134
- JSON.stringify([...newChecked])
159
+ createChecklistStorageValue(newChecked)
160
+ );
161
+ window.dispatchEvent(
162
+ new CustomEvent(CHECKLIST_PROGRESS_EVENT, {
163
+ detail: { persistKey }
164
+ })
135
165
  );
136
166
  } catch {
137
167
  }
@@ -147,6 +177,7 @@ function Checklist({
147
177
  ChecklistHeader,
148
178
  {
149
179
  checked: checked.size,
180
+ Heading,
150
181
  progress,
151
182
  title,
152
183
  total: items.length
@@ -177,5 +208,9 @@ function Checklist({
177
208
  ] });
178
209
  }
179
210
  export {
180
- Checklist
211
+ CHECKLIST_PROGRESS_EVENT,
212
+ CHECKLIST_STORAGE_VERSION,
213
+ Checklist,
214
+ createChecklistStorageValue,
215
+ parseChecklistStorageValue
181
216
  };
@@ -1,6 +1,14 @@
1
1
  import {
2
- Checklist
2
+ Checklist,
3
+ CHECKLIST_PROGRESS_EVENT,
4
+ CHECKLIST_STORAGE_VERSION,
5
+ createChecklistStorageValue,
6
+ parseChecklistStorageValue
3
7
  } from "./checklist";
4
8
  export {
5
- Checklist
9
+ CHECKLIST_PROGRESS_EVENT,
10
+ CHECKLIST_STORAGE_VERSION,
11
+ Checklist,
12
+ createChecklistStorageValue,
13
+ parseChecklistStorageValue
6
14
  };
@@ -0,0 +1,378 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ createContext,
5
+ forwardRef,
6
+ useCallback,
7
+ useContext,
8
+ useId,
9
+ useMemo,
10
+ useState
11
+ } from "react";
12
+ import { cn } from "../../lib/utils";
13
+ const VIEWBOX_WIDTH = 1e3;
14
+ const VIEWBOX_HEIGHT = 500;
15
+ const DEFAULT_LABELS = {
16
+ region: "Choropleth map"
17
+ };
18
+ const DEFAULT_SCALE = ["#f1f5f9", "#1d4ed8"];
19
+ const DEFAULT_MISSING = "#e5e7eb";
20
+ function resolveMissingColor() {
21
+ if (typeof window === "undefined") return DEFAULT_MISSING;
22
+ const muted = getComputedStyle(document.documentElement).getPropertyValue("--muted").trim();
23
+ return muted ? `oklch(${muted})` : DEFAULT_MISSING;
24
+ }
25
+ const ChoroplethContext = createContext(null);
26
+ function useChoroplethContext() {
27
+ const ctx = useContext(ChoroplethContext);
28
+ if (!ctx) {
29
+ throw new Error("ChoroplethMap subcomponent used outside its root.");
30
+ }
31
+ return ctx;
32
+ }
33
+ function projectEquirectangular(position, width, height) {
34
+ const [lng, lat] = position;
35
+ const x = (lng + 180) / 360 * width;
36
+ const y = (90 - lat) / 180 * height;
37
+ return { x, y };
38
+ }
39
+ function clamp(value, min, max) {
40
+ return Math.min(Math.max(value, min), max);
41
+ }
42
+ function parseHex(color) {
43
+ const match = /^#([\da-f]{6})$/i.exec(color.trim());
44
+ if (!match) return void 0;
45
+ const hex = match[1] ?? "";
46
+ return [
47
+ Number.parseInt(hex.slice(0, 2), 16),
48
+ Number.parseInt(hex.slice(2, 4), 16),
49
+ Number.parseInt(hex.slice(4, 6), 16)
50
+ ];
51
+ }
52
+ function toHex(channel) {
53
+ return clamp(Math.round(channel), 0, 255).toString(16).padStart(2, "0");
54
+ }
55
+ function lerp(a, b, t) {
56
+ return a + (b - a) * t;
57
+ }
58
+ function interpolateColor(stops, t) {
59
+ if (stops.length === 0) return "#000000";
60
+ if (stops.length === 1) return stops[0] ?? "#000000";
61
+ const segments = stops.length - 1;
62
+ const scaledT = clamp(t, 0, 1) * segments;
63
+ const segmentIndex = Math.min(Math.floor(scaledT), segments - 1);
64
+ const localT = scaledT - segmentIndex;
65
+ const lower = stops[segmentIndex];
66
+ const upper = stops[segmentIndex + 1];
67
+ if (!lower || !upper) return stops[0] ?? "#000000";
68
+ const lowerRgb = parseHex(lower);
69
+ const upperRgb = parseHex(upper);
70
+ if (!lowerRgb || !upperRgb) return lower;
71
+ const [lr, lg, lb] = lowerRgb;
72
+ const [ur, ug, ub] = upperRgb;
73
+ const r = lerp(lr, ur, localT);
74
+ const g = lerp(lg, ug, localT);
75
+ const b = lerp(lb, ub, localT);
76
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
77
+ }
78
+ function computeDomain(values) {
79
+ const first = values[0];
80
+ if (first === void 0) return [0, 1];
81
+ const min = values.reduce(
82
+ (accumulator, value) => Math.min(accumulator, value),
83
+ first
84
+ );
85
+ const max = values.reduce(
86
+ (accumulator, value) => Math.max(accumulator, value),
87
+ first
88
+ );
89
+ if (min === max) return [min, max + 1];
90
+ return [min, max];
91
+ }
92
+ function regionPath(region) {
93
+ return region.coordinates.map((coord, index) => {
94
+ const projected = projectEquirectangular(
95
+ coord,
96
+ VIEWBOX_WIDTH,
97
+ VIEWBOX_HEIGHT
98
+ );
99
+ return `${index === 0 ? "M" : "L"}${projected.x.toString()},${projected.y.toString()}`;
100
+ }).join(" ");
101
+ }
102
+ function RegionPath({
103
+ active,
104
+ onSelect,
105
+ region,
106
+ selectedId,
107
+ setHoverFn
108
+ }) {
109
+ const { colorFor, valueFor } = useChoroplethContext();
110
+ const value = valueFor(region.id) ?? void 0;
111
+ const fill = colorFor(value);
112
+ const handleEnter = () => {
113
+ setHoverFn({ id: region.id, value });
114
+ };
115
+ const handleLeave = () => {
116
+ setHoverFn();
117
+ };
118
+ const handleSelect = () => {
119
+ onSelect(region);
120
+ };
121
+ return /* @__PURE__ */ jsx(
122
+ "path",
123
+ {
124
+ "aria-label": `${region.name}${value === void 0 ? " no data" : ` ${value.toString()}`}`,
125
+ className: cn(
126
+ "cursor-pointer outline-none transition-[opacity,filter]",
127
+ active ? "opacity-100" : "opacity-90 hover:opacity-100",
128
+ selectedId === region.id ? "stroke-foreground" : "stroke-background"
129
+ ),
130
+ d: regionPath(region) + " Z",
131
+ "data-region-id": region.id,
132
+ "data-selected": selectedId === region.id ? "true" : void 0,
133
+ "data-value": value,
134
+ fill,
135
+ onBlur: handleLeave,
136
+ onClick: handleSelect,
137
+ onFocus: handleEnter,
138
+ onMouseEnter: handleEnter,
139
+ onMouseLeave: handleLeave,
140
+ strokeWidth: selectedId === region.id ? 2 : 0.75,
141
+ tabIndex: 0
142
+ }
143
+ );
144
+ }
145
+ const ChoroplethTooltip = forwardRef(({ children, className, ...rest }, ref) => {
146
+ const { hover, regionByid } = useChoroplethContext();
147
+ if (!hover) return null;
148
+ const region = regionByid.get(hover.id);
149
+ if (!region) return null;
150
+ return /* @__PURE__ */ jsx(
151
+ "div",
152
+ {
153
+ className: cn(
154
+ "pointer-events-none absolute left-3 top-3 z-10 max-w-xs rounded-md border bg-popover px-2 py-1 text-xs text-popover-foreground shadow-md",
155
+ className
156
+ ),
157
+ "data-tooltip-region-id": region.id,
158
+ ref,
159
+ role: "status",
160
+ ...rest,
161
+ children: children ? children({ region, value: hover.value }) : /* @__PURE__ */ jsxs("span", { children: [
162
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: region.name }),
163
+ hover.value === void 0 ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: " \xB7 no data" }) : /* @__PURE__ */ jsxs("span", { children: [
164
+ " \xB7 ",
165
+ hover.value.toLocaleString()
166
+ ] })
167
+ ] })
168
+ }
169
+ );
170
+ });
171
+ ChoroplethTooltip.displayName = "ChoroplethTooltip";
172
+ const ChoroplethLegend = forwardRef(({ className, title, ...rest }, ref) => {
173
+ const { legend } = useChoroplethContext();
174
+ if (!legend) return null;
175
+ const stops = legend.scale.join(", ");
176
+ return /* @__PURE__ */ jsxs(
177
+ "div",
178
+ {
179
+ className: cn(
180
+ "absolute bottom-3 right-3 z-10 flex flex-col gap-1 rounded-md border bg-background/95 px-2 py-1 text-[11px] text-foreground shadow-sm backdrop-blur",
181
+ className
182
+ ),
183
+ "data-legend": true,
184
+ ref,
185
+ ...rest,
186
+ children: [
187
+ title ? /* @__PURE__ */ jsx("span", { className: "font-medium uppercase tracking-wide text-muted-foreground", children: title }) : null,
188
+ /* @__PURE__ */ jsx(
189
+ "div",
190
+ {
191
+ "aria-hidden": "true",
192
+ className: "h-2 w-32 rounded-full",
193
+ style: { background: `linear-gradient(to right, ${stops})` }
194
+ }
195
+ ),
196
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-muted-foreground", children: [
197
+ /* @__PURE__ */ jsx("span", { children: legend.domain[0].toLocaleString() }),
198
+ /* @__PURE__ */ jsx("span", { children: legend.domain[1].toLocaleString() })
199
+ ] })
200
+ ]
201
+ }
202
+ );
203
+ });
204
+ ChoroplethLegend.displayName = "ChoroplethLegend";
205
+ function DataSummary({ data, regions, titleId }) {
206
+ return /* @__PURE__ */ jsxs("div", { "aria-labelledby": titleId, className: "sr-only", role: "region", children: [
207
+ /* @__PURE__ */ jsx("h3", { id: titleId, children: "Choropleth data summary" }),
208
+ /* @__PURE__ */ jsxs("table", { children: [
209
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
210
+ /* @__PURE__ */ jsx("th", { scope: "col", children: "Region" }),
211
+ /* @__PURE__ */ jsx("th", { scope: "col", children: "Value" })
212
+ ] }) }),
213
+ /* @__PURE__ */ jsx("tbody", { children: regions.map((region) => {
214
+ const value = data[region.id];
215
+ return /* @__PURE__ */ jsxs("tr", { children: [
216
+ /* @__PURE__ */ jsx("td", { children: region.name }),
217
+ /* @__PURE__ */ jsx("td", { children: value === void 0 ? "no data" : value.toLocaleString() })
218
+ ] }, region.id);
219
+ }) })
220
+ ] })
221
+ ] });
222
+ }
223
+ function bucketChildren(children) {
224
+ const list = Array.isArray(children) ? children : [children];
225
+ return list.reduce(
226
+ (accumulator, child) => {
227
+ const name = displayName(child);
228
+ if (name === ChoroplethLegend.displayName) accumulator.legend = child;
229
+ else if (name === ChoroplethTooltip.displayName)
230
+ accumulator.tooltip = child;
231
+ return accumulator;
232
+ },
233
+ { legend: null, tooltip: null }
234
+ );
235
+ }
236
+ function displayName(child) {
237
+ if (typeof child !== "object" || child === null) return void 0;
238
+ if (!("type" in child)) return void 0;
239
+ const type = child.type;
240
+ if (typeof type !== "object" && typeof type !== "function") return void 0;
241
+ const name = type.displayName;
242
+ return typeof name === "string" ? name : void 0;
243
+ }
244
+ function useChoroplethState(arguments_) {
245
+ const { colorScale, data, domain, missingColor, regions } = arguments_;
246
+ const regionByid = useMemo(
247
+ () => new Map(
248
+ regions.map((region) => [region.id, region])
249
+ ),
250
+ [regions]
251
+ );
252
+ const valueFor = useCallback(
253
+ (id) => data[id] ?? null,
254
+ [data]
255
+ );
256
+ const colorFor = useCallback(
257
+ (value) => {
258
+ if (value === void 0) return missingColor;
259
+ const [min, max] = domain;
260
+ const span = max - min;
261
+ const t = span === 0 ? 0.5 : (value - min) / span;
262
+ return interpolateColor(colorScale, t);
263
+ },
264
+ [colorScale, domain, missingColor]
265
+ );
266
+ const [hover, setHover] = useState();
267
+ return useMemo(
268
+ () => ({
269
+ colorFor,
270
+ hover,
271
+ legend: { domain, scale: colorScale },
272
+ regionByid,
273
+ setHover,
274
+ valueFor
275
+ }),
276
+ [colorFor, colorScale, domain, hover, regionByid, valueFor]
277
+ );
278
+ }
279
+ function RegionsLayer({
280
+ onSelect,
281
+ regions,
282
+ selectedId,
283
+ setHoverFn
284
+ }) {
285
+ return /* @__PURE__ */ jsx("g", { children: regions.map((region) => /* @__PURE__ */ jsx(
286
+ RegionPath,
287
+ {
288
+ active: selectedId === region.id,
289
+ onSelect,
290
+ region,
291
+ selectedId,
292
+ setHoverFn
293
+ },
294
+ region.id
295
+ )) });
296
+ }
297
+ const ChoroplethMap = forwardRef(
298
+ (props, ref) => {
299
+ const {
300
+ children,
301
+ className,
302
+ colorScale = DEFAULT_SCALE,
303
+ data,
304
+ domain: domainProperty,
305
+ labels,
306
+ missingColor = resolveMissingColor(),
307
+ onSelectRegion,
308
+ regions,
309
+ ...rest
310
+ } = props;
311
+ const titleId = useId();
312
+ const resolvedLabels = useMemo(
313
+ () => ({ ...DEFAULT_LABELS, ...labels }),
314
+ [labels]
315
+ );
316
+ const domain = useMemo(
317
+ () => domainProperty ?? computeDomain(Object.values(data)),
318
+ [data, domainProperty]
319
+ );
320
+ const ctx = useChoroplethState({
321
+ colorScale,
322
+ data,
323
+ domain,
324
+ missingColor,
325
+ regions
326
+ });
327
+ const buckets = useMemo(() => bucketChildren(children), [children]);
328
+ const [selectedId, setSelectedId] = useState();
329
+ const handleSelect = useCallback(
330
+ (region) => {
331
+ setSelectedId(region.id);
332
+ onSelectRegion?.(region);
333
+ },
334
+ [onSelectRegion]
335
+ );
336
+ return /* @__PURE__ */ jsx(ChoroplethContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxs(
337
+ "section",
338
+ {
339
+ "aria-label": resolvedLabels.region,
340
+ className: cn(
341
+ "relative aspect-[2/1] w-full overflow-hidden rounded-2xl border bg-background text-foreground",
342
+ className
343
+ ),
344
+ ref,
345
+ ...rest,
346
+ children: [
347
+ /* @__PURE__ */ jsx(
348
+ "svg",
349
+ {
350
+ "aria-hidden": "true",
351
+ className: "block h-full w-full",
352
+ preserveAspectRatio: "xMidYMid meet",
353
+ viewBox: `0 0 ${VIEWBOX_WIDTH.toString()} ${VIEWBOX_HEIGHT.toString()}`,
354
+ children: /* @__PURE__ */ jsx(
355
+ RegionsLayer,
356
+ {
357
+ onSelect: handleSelect,
358
+ regions,
359
+ selectedId,
360
+ setHoverFn: ctx.setHover
361
+ }
362
+ )
363
+ }
364
+ ),
365
+ buckets.tooltip,
366
+ buckets.legend,
367
+ /* @__PURE__ */ jsx(DataSummary, { data, regions, titleId })
368
+ ]
369
+ }
370
+ ) });
371
+ }
372
+ );
373
+ ChoroplethMap.displayName = "ChoroplethMap";
374
+ export {
375
+ ChoroplethLegend,
376
+ ChoroplethMap,
377
+ ChoroplethTooltip
378
+ };
@@ -0,0 +1,10 @@
1
+ import {
2
+ ChoroplethLegend,
3
+ ChoroplethMap,
4
+ ChoroplethTooltip
5
+ } from "./choropleth-map";
6
+ export {
7
+ ChoroplethLegend,
8
+ ChoroplethMap,
9
+ ChoroplethTooltip
10
+ };