@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,50 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import {
4
+ forwardRef
5
+ } from "react";
6
+ import { cn } from "../../lib/utils";
7
+ const DEFAULT_LABELS = {
8
+ region: "Selection presence"
9
+ };
10
+ const SelectionPresence = forwardRef((props, ref) => {
11
+ const { className, color, height, labels, name, width, x, y, ...rest } = props;
12
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
13
+ const accent = color ?? "var(--foreground)";
14
+ const ariaLabel = typeof name === "string" ? `${resolvedLabels.region}: ${name}` : resolvedLabels.region;
15
+ return /* @__PURE__ */ jsx(
16
+ "div",
17
+ {
18
+ "aria-label": ariaLabel,
19
+ className: cn(
20
+ "pointer-events-none absolute z-20 rounded-md border-2 border-dashed",
21
+ className
22
+ ),
23
+ "data-selection-presence": true,
24
+ ref,
25
+ role: "img",
26
+ style: {
27
+ backgroundColor: `color-mix(in srgb, ${accent} 10%, transparent)`,
28
+ borderColor: accent,
29
+ height,
30
+ left: x,
31
+ top: y,
32
+ width
33
+ },
34
+ ...rest,
35
+ children: name === null || name === void 0 ? null : /* @__PURE__ */ jsx(
36
+ "span",
37
+ {
38
+ className: "absolute -top-5 left-0 inline-flex items-center rounded-md px-1.5 py-0.5 text-[10px] font-medium text-white shadow-sm",
39
+ "data-selection-presence-chip": true,
40
+ style: { backgroundColor: accent },
41
+ children: name
42
+ }
43
+ )
44
+ }
45
+ );
46
+ });
47
+ SelectionPresence.displayName = "SelectionPresence";
48
+ export {
49
+ SelectionPresence
50
+ };
@@ -132,7 +132,7 @@ function SeverityBadge({
132
132
  "data-level": level,
133
133
  ...props,
134
134
  children: [
135
- showDot ? /* @__PURE__ */ jsxs("span", { "aria-hidden": "true", className: "relative flex h-2 w-2", children: [
135
+ showDot ? /* @__PURE__ */ jsxs("span", { "aria-hidden": "true", className: "relative flex size-2", children: [
136
136
  pulse ? /* @__PURE__ */ jsx(
137
137
  "span",
138
138
  {
@@ -146,7 +146,7 @@ function SeverityBadge({
146
146
  "span",
147
147
  {
148
148
  className: cn(
149
- "relative inline-flex h-2 w-2 rounded-full",
149
+ "relative inline-flex size-2 rounded-full",
150
150
  DOT_COLOR[level]
151
151
  )
152
152
  }
@@ -47,7 +47,7 @@ const SheetContent = forwardRef(({ children, className, side = "right", ...props
47
47
  ...props,
48
48
  children: [
49
49
  /* @__PURE__ */ jsxs(SheetPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
50
- /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
50
+ /* @__PURE__ */ jsx(X, { className: "size-4" }),
51
51
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
52
52
  ] }),
53
53
  children
@@ -73,7 +73,7 @@ function CollapsibleSection({
73
73
  ChevronDown,
74
74
  {
75
75
  className: cn(
76
- "h-3 w-3 transition-transform duration-200",
76
+ "size-3 transition-transform duration-200",
77
77
  isOpen && "rotate-180"
78
78
  )
79
79
  }
@@ -16,7 +16,7 @@ function SidebarToggle({
16
16
  onClick: onToggle,
17
17
  size: "icon",
18
18
  variant: "ghost",
19
- children: open ? /* @__PURE__ */ jsx(X, { className: "h-5 w-5" }) : /* @__PURE__ */ jsx(Menu, { className: "h-5 w-5" })
19
+ children: open ? /* @__PURE__ */ jsx(X, { className: "size-5" }) : /* @__PURE__ */ jsx(Menu, { className: "size-5" })
20
20
  }
21
21
  ),
22
22
  /* @__PURE__ */ jsx(
@@ -26,7 +26,7 @@ function SidebarToggle({
26
26
  onClick: onToggle,
27
27
  size: "icon",
28
28
  variant: "ghost",
29
- children: /* @__PURE__ */ jsx(Menu, { className: "h-5 w-5" })
29
+ children: /* @__PURE__ */ jsx(Menu, { className: "size-5" })
30
30
  }
31
31
  )
32
32
  ] });
@@ -14,7 +14,7 @@ const Slider = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs
14
14
  ...props,
15
15
  children: [
16
16
  /* @__PURE__ */ jsx(SliderPrimitive.Track, { className: "relative h-2 w-full grow overflow-hidden rounded-full bg-secondary", children: /* @__PURE__ */ jsx(SliderPrimitive.Range, { className: "absolute h-full bg-primary" }) }),
17
- /* @__PURE__ */ jsx(SliderPrimitive.Thumb, { className: "block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" })
17
+ /* @__PURE__ */ jsx(SliderPrimitive.Thumb, { className: "block size-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" })
18
18
  ]
19
19
  }
20
20
  ));
@@ -15,11 +15,12 @@ const DEFAULT_LABELS = {
15
15
  prevLabel: "Prev",
16
16
  sectionsLabel: "Sections"
17
17
  };
18
+ const EMPTY_SLIDESHOW_LABELS = {};
18
19
  function SlideshowImpl({
19
20
  completedSections,
20
21
  completionDialogTitle = "Mark section as complete?",
21
22
  currentIndex,
22
- labels = {},
23
+ labels = EMPTY_SLIDESHOW_LABELS,
23
24
  onComplete,
24
25
  onExit,
25
26
  onNavigate,
@@ -145,7 +146,7 @@ function SlideshowImpl({
145
146
  children: isTocOpen ? /* @__PURE__ */ jsx(
146
147
  "svg",
147
148
  {
148
- className: "h-5 w-5",
149
+ className: "size-5",
149
150
  fill: "none",
150
151
  stroke: "currentColor",
151
152
  viewBox: "0 0 24 24",
@@ -162,7 +163,7 @@ function SlideshowImpl({
162
163
  ) : /* @__PURE__ */ jsx(
163
164
  "svg",
164
165
  {
165
- className: "h-5 w-5",
166
+ className: "size-5",
166
167
  fill: "none",
167
168
  stroke: "currentColor",
168
169
  viewBox: "0 0 24 24",
@@ -200,7 +201,7 @@ function SlideshowImpl({
200
201
  children: /* @__PURE__ */ jsx(
201
202
  "svg",
202
203
  {
203
- className: "h-5 w-5",
204
+ className: "size-5",
204
205
  fill: "none",
205
206
  stroke: "currentColor",
206
207
  viewBox: "0 0 24 24",
@@ -261,7 +262,7 @@ function SlideshowImpl({
261
262
  children: /* @__PURE__ */ jsx(
262
263
  "svg",
263
264
  {
264
- className: "h-4 w-4",
265
+ className: "size-4",
265
266
  fill: "none",
266
267
  stroke: "currentColor",
267
268
  viewBox: "0 0 24 24",
@@ -298,13 +299,13 @@ function SlideshowImpl({
298
299
  "div",
299
300
  {
300
301
  className: cn(
301
- "flex-shrink-0 w-5 h-5 rounded-full border-2 flex items-center justify-center",
302
+ "flex-shrink-0 size-5 rounded-full border-2 flex items-center justify-center",
302
303
  isCompleted ? "bg-foreground border-foreground" : "border-muted-foreground"
303
304
  ),
304
305
  children: isCompleted ? /* @__PURE__ */ jsx(
305
306
  "svg",
306
307
  {
307
- className: "h-3 w-3 text-background",
308
+ className: "size-3 text-background",
308
309
  fill: "none",
309
310
  stroke: "currentColor",
310
311
  viewBox: "0 0 24 24",
@@ -333,7 +334,7 @@ function SlideshowImpl({
333
334
  )
334
335
  ]
335
336
  },
336
- `${section.id}-${index}`
337
+ section.id
337
338
  );
338
339
  }) })
339
340
  ]
@@ -355,7 +356,7 @@ function SlideshowImpl({
355
356
  }
356
357
  ) }) })
357
358
  ] }),
358
- /* @__PURE__ */ jsxs("div", { className: "relative z-20 flex items-center justify-between px-4 py-4 border-t border-border bg-background", children: [
359
+ /* @__PURE__ */ jsxs("div", { className: "relative z-20 flex items-center justify-between p-4 border-t border-border bg-background", children: [
359
360
  /* @__PURE__ */ jsxs(
360
361
  "button",
361
362
  {
@@ -367,7 +368,7 @@ function SlideshowImpl({
367
368
  /* @__PURE__ */ jsx(
368
369
  "svg",
369
370
  {
370
- className: "h-4 w-4",
371
+ className: "size-4",
371
372
  fill: "none",
372
373
  stroke: "currentColor",
373
374
  viewBox: "0 0 24 24",
@@ -397,7 +398,7 @@ function SlideshowImpl({
397
398
  !isLastSection && /* @__PURE__ */ jsx(
398
399
  "svg",
399
400
  {
400
- className: "h-4 w-4",
401
+ className: "size-4",
401
402
  fill: "none",
402
403
  stroke: "currentColor",
403
404
  viewBox: "0 0 24 24",
@@ -0,0 +1,6 @@
1
+ import {
2
+ SnapGuides
3
+ } from "./snap-guides";
4
+ export {
5
+ SnapGuides
6
+ };
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import { cn } from "../../lib/utils";
5
+ const DEFAULT_LABELS = {
6
+ region: "Snap guides"
7
+ };
8
+ const SnapGuides = forwardRef(
9
+ (props, ref) => {
10
+ const { className, guides, labels, ...rest } = props;
11
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
12
+ return /* @__PURE__ */ jsx(
13
+ "div",
14
+ {
15
+ "aria-label": resolvedLabels.region,
16
+ className: cn("pointer-events-none absolute inset-0 z-30", className),
17
+ "data-snap-guide-count": guides.length,
18
+ ref,
19
+ ...rest,
20
+ children: guides.map((guide) => {
21
+ const isVertical = guide.orientation === "vertical";
22
+ const offset = isVertical ? guide.x : guide.y;
23
+ return /* @__PURE__ */ jsx(
24
+ "span",
25
+ {
26
+ "aria-hidden": "true",
27
+ className: cn(
28
+ "absolute border-primary/70",
29
+ isVertical ? "inset-y-0 w-px border-l border-dashed" : "inset-x-0 h-px border-t border-dashed"
30
+ ),
31
+ "data-snap-guide-id": guide.id,
32
+ "data-snap-orientation": guide.orientation,
33
+ style: isVertical ? { left: `${offset.toString()}px` } : { top: `${offset.toString()}px` }
34
+ },
35
+ guide.id
36
+ );
37
+ })
38
+ }
39
+ );
40
+ }
41
+ );
42
+ SnapGuides.displayName = "SnapGuides";
43
+ export {
44
+ SnapGuides
45
+ };
@@ -140,6 +140,7 @@ function ExpandedPanel({
140
140
  }
141
141
  );
142
142
  }
143
+ const EMPTY_SHARE_PLATFORMS = [];
143
144
  function SocialFAB({
144
145
  actions,
145
146
  bottomOffset = 24,
@@ -150,7 +151,7 @@ function SocialFAB({
150
151
  onClose,
151
152
  onOpen,
152
153
  rightOffset = 24,
153
- sharePlatforms = []
154
+ sharePlatforms = EMPTY_SHARE_PLATFORMS
154
155
  }) {
155
156
  const options = { onAction, onClose, onOpen };
156
157
  const fab = useSocialFab(options);
@@ -49,7 +49,7 @@ const SparklineGrid = React.forwardRef(({ className, columns = 2, items, ...prop
49
49
  isPositive ? "border-emerald-500/30 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400" : "border-rose-500/30 bg-rose-500/10 text-rose-600 dark:text-rose-400"
50
50
  ),
51
51
  children: [
52
- /* @__PURE__ */ jsx(TrendIcon, { className: "h-3.5 w-3.5" }),
52
+ /* @__PURE__ */ jsx(TrendIcon, { className: "size-3.5" }),
53
53
  item.change > 0 ? "+" : "",
54
54
  item.change.toFixed(2),
55
55
  "%"
@@ -7,9 +7,9 @@ function Spinner({ className, size = "md", ...props }) {
7
7
  className: cn(
8
8
  "animate-spin rounded-full border-2 border-current border-t-transparent",
9
9
  {
10
- "h-4 w-4": size === "sm",
11
- "h-6 w-6": size === "md",
12
- "h-8 w-8": size === "lg"
10
+ "size-4": size === "sm",
11
+ "size-6": size === "md",
12
+ "size-8": size === "lg"
13
13
  },
14
14
  className
15
15
  ),
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx, jsxs } from "react/jsx-runtime";
2
3
  import * as React from "react";
3
4
  import { cn } from "../../lib/utils";
@@ -47,12 +47,12 @@ const changeVariants = cva(
47
47
  );
48
48
  function TrendIcon({ trend }) {
49
49
  if (trend === "up") {
50
- return /* @__PURE__ */ jsx(ArrowUpRight, { className: "h-3.5 w-3.5" });
50
+ return /* @__PURE__ */ jsx(ArrowUpRight, { className: "size-3.5" });
51
51
  }
52
52
  if (trend === "down") {
53
- return /* @__PURE__ */ jsx(ArrowDownRight, { className: "h-3.5 w-3.5" });
53
+ return /* @__PURE__ */ jsx(ArrowDownRight, { className: "size-3.5" });
54
54
  }
55
- return /* @__PURE__ */ jsx(ArrowRight, { className: "h-3.5 w-3.5" });
55
+ return /* @__PURE__ */ jsx(ArrowRight, { className: "size-3.5" });
56
56
  }
57
57
  const StatCard = React.forwardRef(
58
58
  ({
@@ -0,0 +1,6 @@
1
+ import {
2
+ StateBadgeOverlay
3
+ } from "./state-badge-overlay";
4
+ export {
5
+ StateBadgeOverlay
6
+ };
@@ -0,0 +1,90 @@
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 STATE_LABEL = {
8
+ complete: "Complete",
9
+ failed: "Failed",
10
+ idle: "Idle",
11
+ queued: "Queued",
12
+ running: "Running",
13
+ stopped: "Stopped"
14
+ };
15
+ const STATE_TONE = {
16
+ complete: "border-emerald-500/40 bg-emerald-500/15 text-emerald-700 dark:text-emerald-300",
17
+ failed: "border-red-500/40 bg-red-500/15 text-red-700 dark:text-red-300",
18
+ idle: "border-border bg-muted/40 text-muted-foreground",
19
+ queued: "border-amber-500/40 bg-amber-500/15 text-amber-700 dark:text-amber-300",
20
+ running: "border-blue-500/40 bg-blue-500/15 text-blue-700 dark:text-blue-300",
21
+ stopped: "border-border bg-background text-foreground"
22
+ };
23
+ const STATE_DOT = {
24
+ complete: "bg-emerald-500",
25
+ failed: "bg-red-500",
26
+ idle: "bg-muted-foreground",
27
+ queued: "bg-amber-500",
28
+ running: "bg-blue-500 animate-pulse",
29
+ stopped: "bg-muted-foreground"
30
+ };
31
+ const ANCHOR_TRANSFORM = {
32
+ "bottom-left": "translate(-100%, 100%)",
33
+ "bottom-right": "translate(0%, 100%)",
34
+ "top-left": "translate(-100%, -100%)",
35
+ "top-right": "translate(0%, -100%)"
36
+ };
37
+ const DEFAULT_LABELS = {
38
+ region: "State"
39
+ };
40
+ const StateBadgeOverlay = forwardRef((props, ref) => {
41
+ const {
42
+ anchor = "top-right",
43
+ className,
44
+ label,
45
+ labels,
46
+ state,
47
+ x,
48
+ y,
49
+ ...rest
50
+ } = props;
51
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
52
+ const text = label ?? STATE_LABEL[state];
53
+ return /* @__PURE__ */ jsxs(
54
+ "div",
55
+ {
56
+ "aria-label": `${resolvedLabels.region}: ${STATE_LABEL[state]}`,
57
+ className: cn(
58
+ "pointer-events-none absolute z-20 inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[10px] font-medium uppercase tracking-wide shadow-sm backdrop-blur",
59
+ STATE_TONE[state],
60
+ className
61
+ ),
62
+ "data-state-anchor": anchor,
63
+ "data-state-badge-overlay": true,
64
+ "data-state-name": state,
65
+ ref,
66
+ role: "status",
67
+ style: {
68
+ left: x,
69
+ top: y,
70
+ transform: ANCHOR_TRANSFORM[anchor]
71
+ },
72
+ ...rest,
73
+ children: [
74
+ /* @__PURE__ */ jsx(
75
+ "span",
76
+ {
77
+ "aria-hidden": "true",
78
+ className: cn("size-1.5 rounded-full", STATE_DOT[state]),
79
+ "data-state-badge-dot": true
80
+ }
81
+ ),
82
+ text
83
+ ]
84
+ }
85
+ );
86
+ });
87
+ StateBadgeOverlay.displayName = "StateBadgeOverlay";
88
+ export {
89
+ StateBadgeOverlay
90
+ };
@@ -96,7 +96,7 @@ function StatusBoardCard({ item }) {
96
96
  "span",
97
97
  {
98
98
  "aria-hidden": "true",
99
- className: cn("h-2.5 w-2.5 rounded-full", meta.dotClassName)
99
+ className: cn("size-2.5 rounded-full", meta.dotClassName)
100
100
  }
101
101
  ),
102
102
  /* @__PURE__ */ jsx(CardTitle, { className: "text-base leading-none", children: item.label })
@@ -115,9 +115,9 @@ const dotVariants = cva("rounded-full", {
115
115
  },
116
116
  variants: {
117
117
  size: {
118
- lg: "h-2.5 w-2.5",
119
- md: "h-2 w-2",
120
- sm: "h-1.5 w-1.5"
118
+ lg: "size-2.5",
119
+ md: "size-2",
120
+ sm: "size-1.5"
121
121
  },
122
122
  tone: {
123
123
  danger: "bg-red-500",
@@ -10,7 +10,7 @@ function Step({
10
10
  }) {
11
11
  return /* @__PURE__ */ jsxs("div", { className: cn("flex gap-4", className), children: [
12
12
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
13
- /* @__PURE__ */ jsx("div", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-primary text-primary-foreground text-sm font-bold", children: number }),
13
+ /* @__PURE__ */ jsx("div", { className: "flex size-8 items-center justify-center rounded-full bg-primary text-primary-foreground text-sm font-bold", children: number }),
14
14
  /* @__PURE__ */ jsx("div", { className: "w-px flex-1 bg-border mt-2" })
15
15
  ] }),
16
16
  /* @__PURE__ */ jsxs("div", { className: "flex-1 pb-8 last:pb-0", children: [
@@ -33,7 +33,7 @@ function InteractiveStep({
33
33
  "button",
34
34
  {
35
35
  className: cn(
36
- "flex h-8 w-8 items-center justify-center rounded-full text-sm font-bold transition-colors",
36
+ "flex size-8 items-center justify-center rounded-full text-sm font-bold transition-colors",
37
37
  isCompleted ? "bg-green-500 text-white" : "bg-primary text-primary-foreground"
38
38
  ),
39
39
  onClick: onToggle,
@@ -41,7 +41,7 @@ function InteractiveStep({
41
41
  children: isCompleted ? /* @__PURE__ */ jsx(
42
42
  "svg",
43
43
  {
44
- className: "h-4 w-4",
44
+ className: "size-4",
45
45
  fill: "none",
46
46
  stroke: "currentColor",
47
47
  viewBox: "0 0 24 24",
@@ -112,7 +112,7 @@ function StepByStep({
112
112
  /* @__PURE__ */ jsx(
113
113
  "svg",
114
114
  {
115
- className: "h-5 w-5 text-primary",
115
+ className: "size-5 text-primary",
116
116
  fill: "none",
117
117
  stroke: "currentColor",
118
118
  viewBox: "0 0 24 24",
@@ -131,6 +131,7 @@ function StepByStep({
131
131
  ] }) : null,
132
132
  /* @__PURE__ */ jsx("div", { className: "space-y-0", children: steps.map((step, index) => {
133
133
  const stepElement = step;
134
+ const stepKey = `${stepElement.props.title}-${index + 1}`;
134
135
  return /* @__PURE__ */ jsx(
135
136
  Step,
136
137
  {
@@ -138,7 +139,7 @@ function StepByStep({
138
139
  title: stepElement.props.title,
139
140
  children: stepElement.props.children
140
141
  },
141
- index
142
+ stepKey
142
143
  );
143
144
  }) })
144
145
  ] });
@@ -148,7 +149,7 @@ function StepByStep({
148
149
  /* @__PURE__ */ jsx(
149
150
  "svg",
150
151
  {
151
- className: "h-5 w-5 text-primary",
152
+ className: "size-5 text-primary",
152
153
  fill: "none",
153
154
  stroke: "currentColor",
154
155
  viewBox: "0 0 24 24",
@@ -183,7 +184,7 @@ function StepByStep({
183
184
  title: step.props.title,
184
185
  children: step.props.children
185
186
  },
186
- index
187
+ `${step.props.title}-${index + 1}`
187
188
  )) })
188
189
  ] });
189
190
  }
@@ -45,7 +45,7 @@ function StepNavigationImpl({
45
45
  "svg",
46
46
  {
47
47
  "aria-hidden": "true",
48
- className: "h-5 w-5",
48
+ className: "size-5",
49
49
  fill: "none",
50
50
  stroke: "currentColor",
51
51
  viewBox: "0 0 24 24",
@@ -90,7 +90,7 @@ function StepNavigationImpl({
90
90
  "svg",
91
91
  {
92
92
  "aria-hidden": "true",
93
- className: "h-5 w-5",
93
+ className: "size-5",
94
94
  fill: "none",
95
95
  stroke: "currentColor",
96
96
  viewBox: "0 0 24 24",
@@ -13,10 +13,10 @@ function StepIcon({
13
13
  stepNumber
14
14
  }) {
15
15
  if (state === "complete") {
16
- return /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" });
16
+ return /* @__PURE__ */ jsx(Check, { className: "size-4" });
17
17
  }
18
18
  if (!showNumbers) {
19
- return /* @__PURE__ */ jsx(Circle, { className: "h-3.5 w-3.5 fill-current stroke-none" });
19
+ return /* @__PURE__ */ jsx(Circle, { className: "size-3.5 fill-current stroke-none" });
20
20
  }
21
21
  return /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold", children: stepNumber });
22
22
  }
@@ -52,7 +52,7 @@ function StepperItem({
52
52
  {
53
53
  "aria-current": stepState === "current" ? "step" : void 0,
54
54
  className: cn(
55
- "relative z-10 flex h-8 w-8 items-center justify-center rounded-full border text-sm transition-colors",
55
+ "relative z-10 flex size-8 items-center justify-center rounded-full border text-sm transition-colors",
56
56
  stepState === "complete" && "border-primary bg-primary text-primary-foreground",
57
57
  stepState === "current" && "border-primary bg-primary/10 text-primary shadow-sm",
58
58
  stepState === "upcoming" && "border-border bg-background text-muted-foreground"
@@ -0,0 +1,6 @@
1
+ import {
2
+ StickyMetric
3
+ } from "./sticky-metric";
4
+ export {
5
+ StickyMetric
6
+ };
@@ -0,0 +1,83 @@
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 TONE_DOT = {
8
+ danger: "bg-red-500",
9
+ neutral: "bg-muted-foreground",
10
+ success: "bg-emerald-500",
11
+ warn: "bg-amber-500"
12
+ };
13
+ const ANCHOR_OFFSET = {
14
+ "bottom-left": { transform: "translate(-100%, 100%)" },
15
+ "bottom-right": { transform: "translate(0%, 100%)" },
16
+ "top-left": { transform: "translate(-100%, -100%)" },
17
+ "top-right": { transform: "translate(0%, -100%)" }
18
+ };
19
+ const DEFAULT_LABELS = {
20
+ region: "Sticky metric"
21
+ };
22
+ const StickyMetric = forwardRef(
23
+ (props, ref) => {
24
+ const {
25
+ anchor = "top-right",
26
+ className,
27
+ detail,
28
+ label,
29
+ labels,
30
+ tone = "neutral",
31
+ value,
32
+ x,
33
+ y,
34
+ ...rest
35
+ } = props;
36
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
37
+ return /* @__PURE__ */ jsxs(
38
+ "div",
39
+ {
40
+ "aria-label": resolvedLabels.region,
41
+ className: cn(
42
+ "pointer-events-none absolute z-20 inline-flex items-center gap-1.5 rounded-full border border-border bg-background/90 px-2 py-1 text-[11px] shadow-sm backdrop-blur",
43
+ className
44
+ ),
45
+ "data-sticky-anchor": anchor,
46
+ "data-sticky-metric": true,
47
+ "data-sticky-tone": tone,
48
+ ref,
49
+ role: "status",
50
+ style: {
51
+ left: x,
52
+ top: y,
53
+ transform: ANCHOR_OFFSET[anchor].transform
54
+ },
55
+ ...rest,
56
+ children: [
57
+ /* @__PURE__ */ jsx(
58
+ "span",
59
+ {
60
+ "aria-hidden": "true",
61
+ className: cn("size-1.5 rounded-full", TONE_DOT[tone]),
62
+ "data-sticky-metric-dot": true
63
+ }
64
+ ),
65
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-muted-foreground", children: label }),
66
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-foreground", children: value }),
67
+ detail ? /* @__PURE__ */ jsx(
68
+ "span",
69
+ {
70
+ className: "text-[10px] text-muted-foreground",
71
+ "data-sticky-metric-detail": true,
72
+ children: detail
73
+ }
74
+ ) : null
75
+ ]
76
+ }
77
+ );
78
+ }
79
+ );
80
+ StickyMetric.displayName = "StickyMetric";
81
+ export {
82
+ StickyMetric
83
+ };