@vllnt/ui 0.2.0 → 0.2.1-canary.0aaaad2

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 (296) hide show
  1. package/CHANGELOG.md +46 -1
  2. package/README.md +27 -12
  3. package/dist/components/accordion/accordion.js +2 -2
  4. package/dist/components/activity-heatmap/activity-heatmap.js +15 -13
  5. package/dist/components/activity-log/activity-log.js +6 -5
  6. package/dist/components/agent-activity/agent-activity.js +311 -0
  7. package/dist/components/agent-activity/index.js +18 -0
  8. package/dist/components/ai-artifact/ai-artifact.js +422 -0
  9. package/dist/components/ai-artifact/index.js +24 -0
  10. package/dist/components/ai-chat-input/ai-chat-input.js +2 -2
  11. package/dist/components/ai-message-bubble/ai-message-bubble.js +1 -1
  12. package/dist/components/ai-sidebar/ai-sidebar.js +254 -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 +4 -4
  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 +2 -4
  21. package/dist/components/auto-reload/auto-reload.js +377 -0
  22. package/dist/components/auto-reload/index.js +6 -0
  23. package/dist/components/avatar/avatar.js +1 -1
  24. package/dist/components/avatar-group/avatar-group.js +4 -4
  25. package/dist/components/banner/banner.js +155 -0
  26. package/dist/components/banner/index.js +10 -0
  27. package/dist/components/bottom-activity-strip/bottom-activity-strip.js +91 -0
  28. package/dist/components/bottom-activity-strip/index.js +6 -0
  29. package/dist/components/bottom-bar/bottom-bar.js +25 -0
  30. package/dist/components/bottom-bar/index.js +4 -0
  31. package/dist/components/breadcrumb/breadcrumb.js +33 -26
  32. package/dist/components/button/button.js +1 -1
  33. package/dist/components/calendar/calendar.js +6 -6
  34. package/dist/components/callout/callout.js +1 -1
  35. package/dist/components/candlestick-chart/candlestick-chart.js +1 -1
  36. package/dist/components/canvas-shell/canvas-foundation-demo.js +183 -0
  37. package/dist/components/canvas-shell/canvas-shell-route-config.js +0 -0
  38. package/dist/components/canvas-shell/canvas-shell.js +261 -0
  39. package/dist/components/canvas-shell/index.js +4 -0
  40. package/dist/components/canvas-view/canvas-view.js +461 -0
  41. package/dist/components/canvas-view/index.js +6 -0
  42. package/dist/components/carousel/carousel.js +4 -4
  43. package/dist/components/chart/area-chart.js +1 -0
  44. package/dist/components/chart/line-chart.js +1 -0
  45. package/dist/components/chat-dock-section/chat-dock-section.js +56 -0
  46. package/dist/components/chat-dock-section/index.js +6 -0
  47. package/dist/components/checkbox/checkbox.js +2 -2
  48. package/dist/components/checklist/checklist.js +10 -3
  49. package/dist/components/checklist/index.js +3 -1
  50. package/dist/components/choropleth-map/choropleth-map.js +373 -0
  51. package/dist/components/choropleth-map/index.js +10 -0
  52. package/dist/components/chronological-timeline/chronological-timeline.js +338 -0
  53. package/dist/components/chronological-timeline/index.js +8 -0
  54. package/dist/components/civilization-card/civilization-card.js +258 -0
  55. package/dist/components/civilization-card/index.js +8 -0
  56. package/dist/components/code-block/code-block.js +2 -2
  57. package/dist/components/code-playground/code-playground.js +8 -7
  58. package/dist/components/combobox/combobox.js +46 -22
  59. package/dist/components/command/command.js +1 -1
  60. package/dist/components/comment-pin/comment-pin.js +104 -0
  61. package/dist/components/comment-pin/index.js +6 -0
  62. package/dist/components/comparison/comparison.js +9 -9
  63. package/dist/components/completion-dialog/completion-dialog.js +1 -1
  64. package/dist/components/connector-edge/connector-edge.js +66 -0
  65. package/dist/components/connector-edge/index.js +6 -0
  66. package/dist/components/content-intro/content-intro.js +7 -6
  67. package/dist/components/context-lens/context-lens.js +98 -0
  68. package/dist/components/context-lens/index.js +6 -0
  69. package/dist/components/context-menu/context-menu.js +4 -4
  70. package/dist/components/conversation-thread/conversation-thread.js +348 -0
  71. package/dist/components/conversation-thread/index.js +20 -0
  72. package/dist/components/cookie-consent/cookie-consent.js +1 -1
  73. package/dist/components/copy-button/copy-button.js +189 -0
  74. package/dist/components/copy-button/index.js +8 -0
  75. package/dist/components/countdown-timer/countdown-timer.js +8 -7
  76. package/dist/components/credit-badge/credit-badge.js +1 -7
  77. package/dist/components/curriculum/curriculum.js +349 -0
  78. package/dist/components/curriculum/index.js +10 -0
  79. package/dist/components/data-list/data-list.js +2 -1
  80. package/dist/components/data-table/data-table.js +5 -4
  81. package/dist/components/date-picker/date-picker.js +1 -1
  82. package/dist/components/dialog/dialog.js +1 -1
  83. package/dist/components/document-sibling-nav/document-sibling-nav.js +111 -0
  84. package/dist/components/document-sibling-nav/index.js +8 -0
  85. package/dist/components/dropdown-menu/dropdown-menu.js +3 -3
  86. package/dist/components/edge-label/edge-label.js +26 -0
  87. package/dist/components/edge-label/index.js +4 -0
  88. package/dist/components/empty-state/empty-state.js +93 -0
  89. package/dist/components/empty-state/index.js +8 -0
  90. package/dist/components/era-comparison/era-comparison.js +198 -0
  91. package/dist/components/era-comparison/index.js +16 -0
  92. package/dist/components/exercise/exercise.js +4 -4
  93. package/dist/components/faq/faq.js +2 -2
  94. package/dist/components/file-upload/file-upload.js +3 -3
  95. package/dist/components/filter-bar/filter-bar.js +2 -1
  96. package/dist/components/flashcard/flashcard.js +1 -1
  97. package/dist/components/floating-action-button/floating-action-button.js +1 -1
  98. package/dist/components/floating-toolbar/floating-toolbar.js +66 -0
  99. package/dist/components/floating-toolbar/index.js +6 -0
  100. package/dist/components/flow-diagram/flow-controls.js +9 -9
  101. package/dist/components/flow-diagram/flow-error-boundary.js +2 -2
  102. package/dist/components/flow-diagram/flow-fullscreen.js +2 -2
  103. package/dist/components/follow-mode/follow-mode.js +89 -0
  104. package/dist/components/follow-mode/index.js +6 -0
  105. package/dist/components/form/form.js +432 -0
  106. package/dist/components/form/index.js +20 -0
  107. package/dist/components/gantt-chart/gantt-chart.js +333 -0
  108. package/dist/components/gantt-chart/index.js +6 -0
  109. package/dist/components/geography-quiz-map/geography-quiz-map.js +343 -0
  110. package/dist/components/geography-quiz-map/index.js +12 -0
  111. package/dist/components/glass-panel/glass-panel.js +21 -0
  112. package/dist/components/glass-panel/index.js +4 -0
  113. package/dist/components/globe-3d/globe-3d.js +417 -0
  114. package/dist/components/globe-3d/index.js +10 -0
  115. package/dist/components/group-hull/group-hull.js +29 -0
  116. package/dist/components/group-hull/index.js +4 -0
  117. package/dist/components/handoff-beacon/handoff-beacon.js +78 -0
  118. package/dist/components/handoff-beacon/index.js +6 -0
  119. package/dist/components/heat-map-overlay/heat-map-overlay.js +215 -0
  120. package/dist/components/heat-map-overlay/index.js +6 -0
  121. package/dist/components/heat-overlay/heat-overlay.js +92 -0
  122. package/dist/components/heat-overlay/index.js +6 -0
  123. package/dist/components/historic-timeline/historic-timeline.js +342 -0
  124. package/dist/components/historic-timeline/index.js +6 -0
  125. package/dist/components/historical-figure-card/historical-figure-card.js +270 -0
  126. package/dist/components/historical-figure-card/index.js +6 -0
  127. package/dist/components/horizontal-scroll-row/horizontal-scroll-row.js +4 -4
  128. package/dist/components/index.js +568 -1
  129. package/dist/components/infinite-plane/index.js +6 -0
  130. package/dist/components/infinite-plane/infinite-plane.js +75 -0
  131. package/dist/components/input-otp/input-otp.js +1 -1
  132. package/dist/components/interactive-timeline/index.js +16 -0
  133. package/dist/components/interactive-timeline/interactive-timeline.js +708 -0
  134. package/dist/components/jarvis-dock/index.js +6 -0
  135. package/dist/components/jarvis-dock/jarvis-dock.js +98 -0
  136. package/dist/components/kbd/index.js +5 -0
  137. package/dist/components/kbd/kbd.js +117 -0
  138. package/dist/components/key-concept/key-concept.js +4 -4
  139. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +2 -2
  140. package/dist/components/knowledge-check/index.js +6 -0
  141. package/dist/components/knowledge-check/knowledge-check.js +448 -0
  142. package/dist/components/learning-objectives/learning-objectives.js +12 -12
  143. package/dist/components/left-rail/index.js +4 -0
  144. package/dist/components/left-rail/left-rail.js +25 -0
  145. package/dist/components/live-cursor/index.js +6 -0
  146. package/dist/components/live-cursor/live-cursor.js +62 -0
  147. package/dist/components/live-feed/live-feed.js +15 -13
  148. package/dist/components/map-2d/index.js +20 -0
  149. package/dist/components/map-2d/map-2d.js +455 -0
  150. package/dist/components/map-timeline/index.js +16 -0
  151. package/dist/components/map-timeline/map-timeline.js +506 -0
  152. package/dist/components/market-treemap/market-treemap.js +1 -1
  153. package/dist/components/mdx-content/mdx-content.js +2 -1
  154. package/dist/components/menubar/menubar.js +4 -4
  155. package/dist/components/metric-cluster/index.js +6 -0
  156. package/dist/components/metric-cluster/metric-cluster.js +96 -0
  157. package/dist/components/metric-gauge/metric-gauge.js +1 -1
  158. package/dist/components/mini-map-panel/index.js +6 -0
  159. package/dist/components/mini-map-panel/mini-map-panel.js +74 -0
  160. package/dist/components/model-comparison/index.js +12 -0
  161. package/dist/components/model-comparison/model-comparison.js +211 -0
  162. package/dist/components/model-selector/model-selector.js +2 -2
  163. package/dist/components/multi-select/index.js +6 -0
  164. package/dist/components/multi-select/multi-select.js +258 -0
  165. package/dist/components/multi-select-lasso/index.js +6 -0
  166. package/dist/components/multi-select-lasso/multi-select-lasso.js +76 -0
  167. package/dist/components/navbar-saas/navbar-saas.js +3 -2
  168. package/dist/components/navigation-menu/navigation-menu.js +2 -2
  169. package/dist/components/newsletter-signup/index.js +8 -0
  170. package/dist/components/newsletter-signup/newsletter-signup.js +269 -0
  171. package/dist/components/number-input/number-input.js +1 -1
  172. package/dist/components/number-ticker/number-ticker.js +11 -4
  173. package/dist/components/object-card/index.js +6 -0
  174. package/dist/components/object-card/object-card.js +126 -0
  175. package/dist/components/object-handle/index.js +4 -0
  176. package/dist/components/object-handle/object-handle.js +38 -0
  177. package/dist/components/object-inspector/index.js +6 -0
  178. package/dist/components/object-inspector/object-inspector.js +136 -0
  179. package/dist/components/overview-board/index.js +8 -0
  180. package/dist/components/overview-board/overview-board.js +127 -0
  181. package/dist/components/parallel-timeline/index.js +6 -0
  182. package/dist/components/parallel-timeline/parallel-timeline.js +251 -0
  183. package/dist/components/password-input/password-input.js +1 -1
  184. package/dist/components/plan-badge/plan-badge.js +1 -7
  185. package/dist/components/playback-ghost/index.js +6 -0
  186. package/dist/components/playback-ghost/playback-ghost.js +83 -0
  187. package/dist/components/policy-delivery-panel/index.js +6 -0
  188. package/dist/components/policy-delivery-panel/policy-delivery-panel.js +99 -0
  189. package/dist/components/presence-stack/index.js +6 -0
  190. package/dist/components/presence-stack/presence-stack.js +108 -0
  191. package/dist/components/presence-sync-indicator/index.js +6 -0
  192. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +73 -0
  193. package/dist/components/pricing-table/index.js +8 -0
  194. package/dist/components/pricing-table/pricing-table.js +247 -0
  195. package/dist/components/primary-source-viewer/index.js +26 -0
  196. package/dist/components/primary-source-viewer/primary-source-viewer.js +439 -0
  197. package/dist/components/pro-tip/pro-tip.js +6 -6
  198. package/dist/components/profile-section/profile-section.js +1 -1
  199. package/dist/components/progress-card/progress-card.js +4 -3
  200. package/dist/components/progress-tracker/index.js +20 -0
  201. package/dist/components/progress-tracker/progress-tracker.js +529 -0
  202. package/dist/components/prompt-templates/index.js +6 -0
  203. package/dist/components/prompt-templates/prompt-templates.js +403 -0
  204. package/dist/components/property-section/index.js +6 -0
  205. package/dist/components/property-section/property-section.js +101 -0
  206. package/dist/components/quiz/quiz.js +5 -5
  207. package/dist/components/radio-group/radio-group.js +2 -2
  208. package/dist/components/rating/rating.js +3 -3
  209. package/dist/components/relationship-inspector/index.js +6 -0
  210. package/dist/components/relationship-inspector/relationship-inspector.js +102 -0
  211. package/dist/components/resizable/resizable.js +1 -1
  212. package/dist/components/right-dock/index.js +4 -0
  213. package/dist/components/right-dock/right-dock.js +28 -0
  214. package/dist/components/route-map/index.js +6 -0
  215. package/dist/components/route-map/route-map.js +339 -0
  216. package/dist/components/routing-assignment-panel/index.js +6 -0
  217. package/dist/components/routing-assignment-panel/routing-assignment-panel.js +122 -0
  218. package/dist/components/run-timeline/index.js +6 -0
  219. package/dist/components/run-timeline/run-timeline.js +221 -0
  220. package/dist/components/runtime-overview-panel/index.js +6 -0
  221. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +89 -0
  222. package/dist/components/scope-selector/scope-selector.js +7 -7
  223. package/dist/components/search-bar/search-bar.js +24 -2
  224. package/dist/components/search-dialog/search-dialog.js +1 -1
  225. package/dist/components/segmented-control/index.js +12 -0
  226. package/dist/components/segmented-control/segmented-control.js +61 -0
  227. package/dist/components/select/select.js +5 -5
  228. package/dist/components/selection-halo/index.js +6 -0
  229. package/dist/components/selection-halo/selection-halo.js +72 -0
  230. package/dist/components/selection-presence/index.js +6 -0
  231. package/dist/components/selection-presence/selection-presence.js +50 -0
  232. package/dist/components/severity-badge/severity-badge.js +2 -2
  233. package/dist/components/sheet/sheet.js +1 -1
  234. package/dist/components/sidebar/sidebar.js +1 -1
  235. package/dist/components/sidebar-toggle/sidebar-toggle.js +2 -2
  236. package/dist/components/slider/slider.js +1 -1
  237. package/dist/components/slideshow/slideshow.js +12 -11
  238. package/dist/components/snap-guides/index.js +6 -0
  239. package/dist/components/snap-guides/snap-guides.js +45 -0
  240. package/dist/components/social-fab/social-fab.js +2 -1
  241. package/dist/components/sparkline-grid/sparkline-grid.js +1 -1
  242. package/dist/components/spinner/spinner.js +3 -3
  243. package/dist/components/spinner/unicode-spinner.js +1 -0
  244. package/dist/components/stat-card/stat-card.js +3 -3
  245. package/dist/components/state-badge-overlay/index.js +6 -0
  246. package/dist/components/state-badge-overlay/state-badge-overlay.js +90 -0
  247. package/dist/components/status-board/status-board.js +1 -1
  248. package/dist/components/status-indicator/status-indicator.js +3 -3
  249. package/dist/components/step-by-step/step-by-step.js +8 -7
  250. package/dist/components/step-navigation/step-navigation.js +2 -2
  251. package/dist/components/stepper/stepper.js +3 -3
  252. package/dist/components/sticky-metric/index.js +6 -0
  253. package/dist/components/sticky-metric/sticky-metric.js +83 -0
  254. package/dist/components/story-map/index.js +8 -0
  255. package/dist/components/story-map/story-map.js +414 -0
  256. package/dist/components/subscription-card/subscription-card.js +1 -1
  257. package/dist/components/switch/switch.js +1 -1
  258. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +5 -5
  259. package/dist/components/tags-input/index.js +4 -0
  260. package/dist/components/tags-input/tags-input.js +178 -0
  261. package/dist/components/terminal/terminal.js +48 -34
  262. package/dist/components/thinking-block/thinking-block.js +1 -1
  263. package/dist/components/thread-bubble/index.js +6 -0
  264. package/dist/components/thread-bubble/thread-bubble.js +85 -0
  265. package/dist/components/threshold-ring/index.js +6 -0
  266. package/dist/components/threshold-ring/threshold-ring.js +160 -0
  267. package/dist/components/ticker-tape/ticker-tape.js +3 -3
  268. package/dist/components/timeline/index.js +12 -0
  269. package/dist/components/timeline/timeline.js +239 -0
  270. package/dist/components/timeline-scrubber/index.js +6 -0
  271. package/dist/components/timeline-scrubber/timeline-scrubber.js +179 -0
  272. package/dist/components/tldr-section/tldr-section.js +2 -2
  273. package/dist/components/top-bar/index.js +4 -0
  274. package/dist/components/top-bar/top-bar.js +31 -0
  275. package/dist/components/tour/tour.js +1 -1
  276. package/dist/components/transaction-list/index.js +14 -0
  277. package/dist/components/transaction-list/transaction-list.js +247 -0
  278. package/dist/components/tree-view/index.js +6 -0
  279. package/dist/components/tree-view/tree-view.js +298 -0
  280. package/dist/components/tutorial-complete/tutorial-complete.js +8 -8
  281. package/dist/components/usage-breakdown/usage-breakdown.js +10 -5
  282. package/dist/components/video-embed/video-embed.js +2 -2
  283. package/dist/components/viewport-bookmarks/index.js +6 -0
  284. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +116 -0
  285. package/dist/components/wallet-card/wallet-card.js +1 -1
  286. package/dist/components/watchlist/watchlist.js +5 -5
  287. package/dist/components/workspace-switcher/index.js +6 -0
  288. package/dist/components/workspace-switcher/workspace-switcher.js +61 -0
  289. package/dist/components/world-breadcrumbs/index.js +6 -0
  290. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +114 -0
  291. package/dist/components/world-clock-bar/world-clock-bar.js +32 -12
  292. package/dist/components/zoom-hud/index.js +4 -0
  293. package/dist/components/zoom-hud/zoom-hud.js +61 -0
  294. package/dist/index.d.ts +7907 -226
  295. package/dist/index.js +3 -1
  296. package/package.json +9 -5
@@ -0,0 +1,8 @@
1
+ import {
2
+ EmptyState,
3
+ emptyStateVariants
4
+ } from "./empty-state";
5
+ export {
6
+ EmptyState,
7
+ emptyStateVariants
8
+ };
@@ -0,0 +1,198 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ createContext,
5
+ forwardRef,
6
+ useContext,
7
+ useMemo
8
+ } from "react";
9
+ import { cn } from "../../lib/utils";
10
+ const ERA_PALETTE = {
11
+ amber: {
12
+ accent: "bg-amber-500",
13
+ chip: "bg-amber-500/15 text-amber-700 dark:text-amber-300"
14
+ },
15
+ blue: {
16
+ accent: "bg-blue-500",
17
+ chip: "bg-blue-500/15 text-blue-700 dark:text-blue-300"
18
+ },
19
+ emerald: {
20
+ accent: "bg-emerald-500",
21
+ chip: "bg-emerald-500/15 text-emerald-700 dark:text-emerald-300"
22
+ },
23
+ neutral: {
24
+ accent: "bg-muted-foreground/40",
25
+ chip: "bg-muted text-muted-foreground"
26
+ },
27
+ purple: {
28
+ accent: "bg-purple-500",
29
+ chip: "bg-purple-500/15 text-purple-700 dark:text-purple-300"
30
+ },
31
+ red: {
32
+ accent: "bg-red-500",
33
+ chip: "bg-red-500/15 text-red-700 dark:text-red-300"
34
+ },
35
+ rose: {
36
+ accent: "bg-rose-500",
37
+ chip: "bg-rose-500/15 text-rose-700 dark:text-rose-300"
38
+ }
39
+ };
40
+ const EraColumnContext = createContext({
41
+ color: "neutral"
42
+ });
43
+ function useEraColumnColor() {
44
+ return useContext(EraColumnContext).color;
45
+ }
46
+ const EraComparison = forwardRef(
47
+ ({ children, className, ...rest }, ref) => /* @__PURE__ */ jsx(
48
+ "section",
49
+ {
50
+ className: cn(
51
+ "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",
52
+ className
53
+ ),
54
+ ref,
55
+ ...rest,
56
+ children
57
+ }
58
+ )
59
+ );
60
+ EraComparison.displayName = "EraComparison";
61
+ function ColumnHeader({
62
+ color,
63
+ name,
64
+ period,
65
+ region
66
+ }) {
67
+ const palette = ERA_PALETTE[color];
68
+ return /* @__PURE__ */ jsxs("header", { className: "flex flex-col gap-2", children: [
69
+ /* @__PURE__ */ jsx(
70
+ "span",
71
+ {
72
+ "aria-hidden": "true",
73
+ className: cn("h-1 w-12 rounded-full", palette.accent)
74
+ }
75
+ ),
76
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [
77
+ /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold tracking-tight text-foreground", children: name }),
78
+ period ? /* @__PURE__ */ jsx(
79
+ "span",
80
+ {
81
+ className: cn(
82
+ "rounded-full px-2 py-0.5 text-xs font-mono",
83
+ palette.chip
84
+ ),
85
+ children: period
86
+ }
87
+ ) : null
88
+ ] }),
89
+ region ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: region }) : null
90
+ ] });
91
+ }
92
+ const EraColumn = forwardRef(
93
+ (props, ref) => {
94
+ const {
95
+ children,
96
+ className,
97
+ color = "neutral",
98
+ name,
99
+ period,
100
+ region,
101
+ ...rest
102
+ } = props;
103
+ const contextValue = useMemo(
104
+ () => ({ color }),
105
+ [color]
106
+ );
107
+ return /* @__PURE__ */ jsx(EraColumnContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxs(
108
+ "article",
109
+ {
110
+ className: cn(
111
+ "flex flex-col gap-3 rounded-2xl border border-border bg-background p-4 shadow-sm",
112
+ className
113
+ ),
114
+ "data-color": color,
115
+ ref,
116
+ ...rest,
117
+ children: [
118
+ /* @__PURE__ */ jsx(
119
+ ColumnHeader,
120
+ {
121
+ color,
122
+ name,
123
+ period,
124
+ region
125
+ }
126
+ ),
127
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-3", children })
128
+ ]
129
+ }
130
+ ) });
131
+ }
132
+ );
133
+ EraColumn.displayName = "EraColumn";
134
+ const EraDomain = forwardRef(
135
+ ({ children, className, name, ...rest }, ref) => /* @__PURE__ */ jsxs(
136
+ "section",
137
+ {
138
+ className: cn("flex flex-col gap-2", className),
139
+ "data-domain": typeof name === "string" ? name : void 0,
140
+ ref,
141
+ ...rest,
142
+ children: [
143
+ /* @__PURE__ */ jsx("h4", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: name }),
144
+ children
145
+ ]
146
+ }
147
+ )
148
+ );
149
+ EraDomain.displayName = "EraDomain";
150
+ const EraHighlight = forwardRef(
151
+ ({ children, className, ...rest }, ref) => {
152
+ const color = useEraColumnColor();
153
+ const palette = ERA_PALETTE[color];
154
+ return /* @__PURE__ */ jsx(
155
+ "p",
156
+ {
157
+ className: cn("rounded-md px-2 py-1 text-sm", palette.chip, className),
158
+ ref,
159
+ ...rest,
160
+ children
161
+ }
162
+ );
163
+ }
164
+ );
165
+ EraHighlight.displayName = "EraHighlight";
166
+ const EraFigure = forwardRef(
167
+ (props, ref) => {
168
+ const { anchorProps, className, href, name, ...rest } = props;
169
+ const color = useEraColumnColor();
170
+ const palette = ERA_PALETTE[color];
171
+ const baseClass = cn(
172
+ "inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium",
173
+ palette.chip,
174
+ className
175
+ );
176
+ if (href) {
177
+ return /* @__PURE__ */ jsx(
178
+ "a",
179
+ {
180
+ className: cn(baseClass, "underline-offset-4 hover:underline"),
181
+ href,
182
+ ...anchorProps,
183
+ children: name
184
+ }
185
+ );
186
+ }
187
+ return /* @__PURE__ */ jsx("span", { className: baseClass, ref, ...rest, children: name });
188
+ }
189
+ );
190
+ EraFigure.displayName = "EraFigure";
191
+ export {
192
+ EraColumn,
193
+ EraComparison,
194
+ EraDomain,
195
+ EraFigure,
196
+ EraHighlight,
197
+ useEraColumnColor
198
+ };
@@ -0,0 +1,16 @@
1
+ import {
2
+ EraColumn,
3
+ EraComparison,
4
+ EraDomain,
5
+ EraFigure,
6
+ EraHighlight,
7
+ useEraColumnColor
8
+ } from "./era-comparison";
9
+ export {
10
+ EraColumn,
11
+ EraComparison,
12
+ EraDomain,
13
+ EraFigure,
14
+ EraHighlight,
15
+ useEraColumnColor
16
+ };
@@ -12,7 +12,7 @@ const difficultyConfig = {
12
12
  function ExerciseHeader({ completed, config, onToggle, title }) {
13
13
  return /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4 mb-4", children: [
14
14
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
15
- /* @__PURE__ */ jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(Dumbbell, { className: "h-5 w-5 text-primary" }) }),
15
+ /* @__PURE__ */ jsx("div", { className: "flex size-10 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(Dumbbell, { className: "size-5 text-primary" }) }),
16
16
  /* @__PURE__ */ jsxs("div", { children: [
17
17
  /* @__PURE__ */ jsx("h4", { className: "font-semibold text-foreground", children: title }),
18
18
  /* @__PURE__ */ jsx("span", { className: cn("text-xs font-medium", config.className), children: config.label })
@@ -26,7 +26,7 @@ function ExerciseHeader({ completed, config, onToggle, title }) {
26
26
  size: "sm",
27
27
  variant: completed ? "default" : "outline",
28
28
  children: completed ? /* @__PURE__ */ jsxs(Fragment, { children: [
29
- /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 mr-1" }),
29
+ /* @__PURE__ */ jsx(Check, { className: "size-4 mr-1" }),
30
30
  "Done"
31
31
  ] }) : "Mark Complete"
32
32
  }
@@ -50,10 +50,10 @@ function ExerciseHint({ hint, onShow, showHint }) {
50
50
  function ExerciseSolution({ onToggle, showSolution, solution }) {
51
51
  return /* @__PURE__ */ jsxs("div", { children: [
52
52
  /* @__PURE__ */ jsx(Button, { className: "mb-3", onClick: onToggle, size: "sm", variant: "outline", children: showSolution ? /* @__PURE__ */ jsxs(Fragment, { children: [
53
- /* @__PURE__ */ jsx(EyeOff, { className: "h-4 w-4 mr-1" }),
53
+ /* @__PURE__ */ jsx(EyeOff, { className: "size-4 mr-1" }),
54
54
  "Hide Solution"
55
55
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
56
- /* @__PURE__ */ jsx(Eye, { className: "h-4 w-4 mr-1" }),
56
+ /* @__PURE__ */ jsx(Eye, { className: "size-4 mr-1" }),
57
57
  "Show Solution"
58
58
  ] }) }),
59
59
  showSolution ? /* @__PURE__ */ jsxs("div", { className: "p-4 rounded-lg bg-card border text-sm [&>pre]:my-0", children: [
@@ -20,7 +20,7 @@ function FAQItem({ children, defaultOpen = false, question }) {
20
20
  ChevronDown,
21
21
  {
22
22
  className: cn(
23
- "h-4 w-4 flex-shrink-0 transition-transform duration-200",
23
+ "size-4 flex-shrink-0 transition-transform duration-200",
24
24
  isOpen && "rotate-180"
25
25
  )
26
26
  }
@@ -43,7 +43,7 @@ function FAQItem({ children, defaultOpen = false, question }) {
43
43
  function FAQ({ children, title = "Frequently Asked Questions" }) {
44
44
  return /* @__PURE__ */ jsxs("div", { className: "my-6 rounded-lg border bg-card", children: [
45
45
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 p-4 border-b border-border", children: [
46
- /* @__PURE__ */ jsx(HelpCircle, { className: "h-5 w-5 text-primary" }),
46
+ /* @__PURE__ */ jsx(HelpCircle, { className: "size-5 text-primary" }),
47
47
  /* @__PURE__ */ jsx("h4", { className: "font-semibold", children: title })
48
48
  ] }),
49
49
  /* @__PURE__ */ jsx("div", { className: "px-4", children })
@@ -73,7 +73,7 @@ function FileListItem({
73
73
  size: "icon",
74
74
  type: "button",
75
75
  variant: "ghost",
76
- children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
76
+ children: /* @__PURE__ */ jsx(X, { className: "size-4" })
77
77
  }
78
78
  )
79
79
  ] });
@@ -127,13 +127,13 @@ function FileUploadDropzone({
127
127
  role: "button",
128
128
  tabIndex: disabled ? -1 : 0,
129
129
  children: [
130
- /* @__PURE__ */ jsx(UploadCloud, { className: "mb-3 h-10 w-10 text-muted-foreground" }),
130
+ /* @__PURE__ */ jsx(UploadCloud, { className: "mb-3 size-10 text-muted-foreground" }),
131
131
  /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
132
132
  /* @__PURE__ */ jsx("p", { className: "font-medium", children: dropzoneText }),
133
133
  /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: helperText })
134
134
  ] }),
135
135
  /* @__PURE__ */ jsxs("span", { className: "mt-4 inline-flex h-10 items-center justify-center rounded-md border border-input bg-secondary px-4 py-2 text-sm font-medium text-secondary-foreground shadow-sm", children: [
136
- /* @__PURE__ */ jsx(FileUp, { className: "mr-2 h-4 w-4" }),
136
+ /* @__PURE__ */ jsx(FileUp, { className: "mr-2 size-4" }),
137
137
  browseLabel
138
138
  ] }),
139
139
  children
@@ -149,12 +149,13 @@ const DEFAULT_LABELS = {
149
149
  searchPlaceholder: "Search...",
150
150
  tagsLabel: "Tags:"
151
151
  };
152
+ const EMPTY_FILTER_BAR_LABELS = {};
152
153
  function FilterBarImpl({
153
154
  className,
154
155
  currentDifficulty,
155
156
  currentTags,
156
157
  difficultyOptions,
157
- labels = {},
158
+ labels = EMPTY_FILTER_BAR_LABELS,
158
159
  onFiltersChange,
159
160
  searchQuery,
160
161
  tags
@@ -39,7 +39,7 @@ function Flashcard({
39
39
  /* @__PURE__ */ jsx(CardTitle, { children: title })
40
40
  ] }),
41
41
  /* @__PURE__ */ jsxs(Button, { onClick: toggleFlipped, size: "sm", variant: "outline", children: [
42
- /* @__PURE__ */ jsx(RefreshCcw, { className: "mr-2 h-4 w-4" }),
42
+ /* @__PURE__ */ jsx(RefreshCcw, { className: "mr-2 size-4" }),
43
43
  "Flip"
44
44
  ] })
45
45
  ] }),
@@ -14,7 +14,7 @@ function FloatingActionButtonImpl({
14
14
  {
15
15
  "aria-label": ariaLabel,
16
16
  className: cn(
17
- "fixed z-40 flex h-12 w-12 items-center justify-center rounded-full",
17
+ "fixed z-40 flex size-12 items-center justify-center rounded-full",
18
18
  "bg-primary text-primary-foreground shadow-lg",
19
19
  "transition-transform hover:scale-110",
20
20
  "focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2",
@@ -0,0 +1,66 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ forwardRef
5
+ } from "react";
6
+ import { cn } from "../../lib/utils";
7
+ const VARIANT_CLASSES = {
8
+ destructive: "border-red-300 bg-red-500/10 text-red-700 hover:bg-red-500/20 dark:text-red-300",
9
+ ghost: "border-border bg-background text-foreground hover:bg-accent",
10
+ primary: "border-primary bg-primary text-primary-foreground hover:bg-primary/90"
11
+ };
12
+ const DEFAULT_LABELS = {
13
+ region: "Selection actions"
14
+ };
15
+ const FloatingToolbar = forwardRef(
16
+ (props, ref) => {
17
+ const { actions, className, labels, x, y, ...rest } = props;
18
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
19
+ return /* @__PURE__ */ jsx(
20
+ "div",
21
+ {
22
+ "aria-label": resolvedLabels.region,
23
+ className: cn(
24
+ "absolute z-30 flex -translate-y-full items-center gap-1 rounded-md border border-border bg-background/95 p-1 shadow-md backdrop-blur",
25
+ className
26
+ ),
27
+ "data-floating-toolbar": true,
28
+ ref,
29
+ role: "toolbar",
30
+ style: { left: `${x.toString()}px`, top: `${y.toString()}px` },
31
+ ...rest,
32
+ children: actions.map((action) => {
33
+ const variant = action.variant ?? "ghost";
34
+ const handleClick = () => {
35
+ action.onActivate();
36
+ };
37
+ return /* @__PURE__ */ jsxs(
38
+ "button",
39
+ {
40
+ "aria-label": action.ariaLabel ?? void 0,
41
+ className: cn(
42
+ "inline-flex h-7 items-center gap-1 rounded-md border px-2 text-xs font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
43
+ VARIANT_CLASSES[variant],
44
+ action.disabled ? "cursor-not-allowed opacity-50" : ""
45
+ ),
46
+ "data-action-id": action.id,
47
+ "data-variant": variant,
48
+ disabled: action.disabled,
49
+ onClick: handleClick,
50
+ type: "button",
51
+ children: [
52
+ action.glyph ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "inline-flex size-3", children: action.glyph }) : null,
53
+ /* @__PURE__ */ jsx("span", { children: action.label })
54
+ ]
55
+ },
56
+ action.id
57
+ );
58
+ })
59
+ }
60
+ );
61
+ }
62
+ );
63
+ FloatingToolbar.displayName = "FloatingToolbar";
64
+ export {
65
+ FloatingToolbar
66
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ FloatingToolbar
3
+ } from "./floating-toolbar";
4
+ export {
5
+ FloatingToolbar
6
+ };
@@ -12,7 +12,7 @@ import {
12
12
  X
13
13
  } from "lucide-react";
14
14
  import { cn } from "../../lib/utils";
15
- const BUTTON_CLASS = "flex h-8 w-8 items-center justify-center rounded hover:bg-muted transition-colors disabled:opacity-50 disabled:cursor-not-allowed";
15
+ const BUTTON_CLASS = "flex size-8 items-center justify-center rounded hover:bg-muted transition-colors disabled:opacity-50 disabled:cursor-not-allowed";
16
16
  function ControlButton({
17
17
  disabled,
18
18
  icon,
@@ -36,14 +36,14 @@ function ControlButton({
36
36
  function getCopyIcon(status) {
37
37
  switch (status) {
38
38
  case "copying":
39
- return /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" });
39
+ return /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin" });
40
40
  case "success":
41
- return /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 text-green-500" });
41
+ return /* @__PURE__ */ jsx(Check, { className: "size-4 text-green-500" });
42
42
  case "error":
43
- return /* @__PURE__ */ jsx(X, { className: "h-4 w-4 text-destructive" });
43
+ return /* @__PURE__ */ jsx(X, { className: "size-4 text-destructive" });
44
44
  case "idle":
45
45
  case void 0:
46
- return /* @__PURE__ */ jsx(Copy, { className: "h-4 w-4" });
46
+ return /* @__PURE__ */ jsx(Copy, { className: "size-4" });
47
47
  }
48
48
  }
49
49
  function getCopyTitle(status) {
@@ -81,7 +81,7 @@ const FlowControls = memo(function FlowControls2({
81
81
  /* @__PURE__ */ jsx(
82
82
  ControlButton,
83
83
  {
84
- icon: /* @__PURE__ */ jsx(Plus, { className: "h-4 w-4" }),
84
+ icon: /* @__PURE__ */ jsx(Plus, { className: "size-4" }),
85
85
  label: "Zoom in",
86
86
  onClick: onZoomIn,
87
87
  title: "Zoom in"
@@ -90,7 +90,7 @@ const FlowControls = memo(function FlowControls2({
90
90
  /* @__PURE__ */ jsx(
91
91
  ControlButton,
92
92
  {
93
- icon: /* @__PURE__ */ jsx(Minus, { className: "h-4 w-4" }),
93
+ icon: /* @__PURE__ */ jsx(Minus, { className: "size-4" }),
94
94
  label: "Zoom out",
95
95
  onClick: onZoomOut,
96
96
  title: "Zoom out"
@@ -100,7 +100,7 @@ const FlowControls = memo(function FlowControls2({
100
100
  /* @__PURE__ */ jsx(
101
101
  ControlButton,
102
102
  {
103
- icon: /* @__PURE__ */ jsx(Move, { className: "h-4 w-4" }),
103
+ icon: /* @__PURE__ */ jsx(Move, { className: "size-4" }),
104
104
  label: "Fit view",
105
105
  onClick: onFitView,
106
106
  title: "Fit view"
@@ -124,7 +124,7 @@ const FlowControls = memo(function FlowControls2({
124
124
  /* @__PURE__ */ jsx(
125
125
  ControlButton,
126
126
  {
127
- icon: /* @__PURE__ */ jsx(Maximize2, { className: "h-4 w-4" }),
127
+ icon: /* @__PURE__ */ jsx(Maximize2, { className: "size-4" }),
128
128
  label: "Fullscreen",
129
129
  onClick: onFullscreen,
130
130
  title: "Toggle fullscreen"
@@ -34,7 +34,7 @@ class FlowErrorBoundary extends Component {
34
34
  ),
35
35
  style: { height },
36
36
  children: [
37
- /* @__PURE__ */ jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full bg-destructive/10", children: /* @__PURE__ */ jsx(AlertTriangle, { className: "h-6 w-6 text-destructive" }) }),
37
+ /* @__PURE__ */ jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-destructive/10", children: /* @__PURE__ */ jsx(AlertTriangle, { className: "size-6 text-destructive" }) }),
38
38
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
39
39
  /* @__PURE__ */ jsx("h3", { className: "text-sm font-medium text-foreground", children: "Failed to render diagram" }),
40
40
  /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: error?.message ?? "An unexpected error occurred while rendering the flow diagram." })
@@ -46,7 +46,7 @@ class FlowErrorBoundary extends Component {
46
46
  onClick: this.handleRetry,
47
47
  type: "button",
48
48
  children: [
49
- /* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4" }),
49
+ /* @__PURE__ */ jsx(RefreshCw, { className: "size-4" }),
50
50
  "Try again"
51
51
  ]
52
52
  }
@@ -39,11 +39,11 @@ const FlowFullscreen = memo(function FlowFullscreen2({
39
39
  "button",
40
40
  {
41
41
  "aria-label": "Close fullscreen",
42
- className: "flex h-8 w-8 items-center justify-center rounded hover:bg-muted transition-colors",
42
+ className: "flex size-8 items-center justify-center rounded hover:bg-muted transition-colors",
43
43
  onClick: onClose,
44
44
  title: "Close fullscreen (Esc)",
45
45
  type: "button",
46
- children: /* @__PURE__ */ jsx(X, { className: "h-5 w-5" })
46
+ children: /* @__PURE__ */ jsx(X, { className: "size-5" })
47
47
  }
48
48
  ) }),
49
49
  /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-hidden", children })
@@ -0,0 +1,89 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ forwardRef
5
+ } from "react";
6
+ import { cn } from "../../lib/utils";
7
+ const PALETTE = {
8
+ amber: { chip: "bg-amber-500 text-white", ring: "ring-amber-500" },
9
+ blue: { chip: "bg-blue-500 text-white", ring: "ring-blue-500" },
10
+ emerald: { chip: "bg-emerald-500 text-white", ring: "ring-emerald-500" },
11
+ purple: { chip: "bg-purple-500 text-white", ring: "ring-purple-500" },
12
+ red: { chip: "bg-red-500 text-white", ring: "ring-red-500" },
13
+ rose: { chip: "bg-rose-500 text-white", ring: "ring-rose-500" }
14
+ };
15
+ const DEFAULT_LABELS = {
16
+ region: "Follow mode",
17
+ stop: "Stop"
18
+ };
19
+ const FollowMode = forwardRef(
20
+ (props, ref) => {
21
+ const {
22
+ children,
23
+ className,
24
+ color = "blue",
25
+ labels,
26
+ name,
27
+ onStop,
28
+ ...rest
29
+ } = props;
30
+ const palette = PALETTE[color];
31
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
32
+ return /* @__PURE__ */ jsxs(
33
+ "div",
34
+ {
35
+ "aria-label": resolvedLabels.region,
36
+ className: cn(
37
+ "relative h-full w-full rounded-2xl ring-2 ring-inset",
38
+ palette.ring,
39
+ className
40
+ ),
41
+ "data-follow-color": color,
42
+ ref,
43
+ ...rest,
44
+ children: [
45
+ /* @__PURE__ */ jsxs(
46
+ "div",
47
+ {
48
+ className: "pointer-events-auto absolute left-1/2 top-2 z-30 flex -translate-x-1/2 items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-semibold shadow-sm",
49
+ "data-follow-chip": true,
50
+ children: [
51
+ /* @__PURE__ */ jsxs(
52
+ "span",
53
+ {
54
+ className: cn(
55
+ "inline-flex items-center gap-1 rounded-full px-1.5 py-0.5",
56
+ palette.chip
57
+ ),
58
+ children: [
59
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\u25B8" }),
60
+ /* @__PURE__ */ jsxs("span", { children: [
61
+ "Following ",
62
+ name
63
+ ] })
64
+ ]
65
+ }
66
+ ),
67
+ onStop ? /* @__PURE__ */ jsx(
68
+ "button",
69
+ {
70
+ "aria-label": resolvedLabels.stop,
71
+ className: "inline-flex h-5 items-center rounded-full border border-border bg-background px-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground hover:bg-accent focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
72
+ onClick: onStop,
73
+ type: "button",
74
+ children: resolvedLabels.stop
75
+ }
76
+ ) : null
77
+ ]
78
+ }
79
+ ),
80
+ children
81
+ ]
82
+ }
83
+ );
84
+ }
85
+ );
86
+ FollowMode.displayName = "FollowMode";
87
+ export {
88
+ FollowMode
89
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ FollowMode
3
+ } from "./follow-mode";
4
+ export {
5
+ FollowMode
6
+ };