@vllnt/ui 0.2.1-canary.55e0e0a → 0.2.1-canary.614266d

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 (161) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/dist/components/accordion/accordion.js +2 -2
  3. package/dist/components/activity-heatmap/activity-heatmap.js +3 -2
  4. package/dist/components/activity-log/activity-log.js +5 -5
  5. package/dist/components/agent-activity/agent-activity.js +8 -8
  6. package/dist/components/ai-artifact/ai-artifact.js +16 -16
  7. package/dist/components/ai-chat-input/ai-chat-input.js +2 -2
  8. package/dist/components/ai-message-bubble/ai-message-bubble.js +1 -1
  9. package/dist/components/ai-sidebar/ai-sidebar.js +8 -8
  10. package/dist/components/ai-source-citation/ai-source-citation.js +2 -2
  11. package/dist/components/ai-tool-call-display/ai-tool-call-display.js +4 -4
  12. package/dist/components/auto-reload/auto-reload.js +1 -1
  13. package/dist/components/avatar/avatar.js +1 -1
  14. package/dist/components/avatar-group/avatar-group.js +3 -3
  15. package/dist/components/banner/banner.js +3 -3
  16. package/dist/components/blog-card/blog-card.js +3 -1
  17. package/dist/components/bottom-activity-strip/bottom-activity-strip.js +3 -3
  18. package/dist/components/button/button.js +1 -1
  19. package/dist/components/calendar/calendar.js +6 -6
  20. package/dist/components/callout/callout.js +1 -1
  21. package/dist/components/candlestick-chart/candlestick-chart.js +3 -2
  22. package/dist/components/canvas-shell/canvas-foundation-demo.js +4 -4
  23. package/dist/components/carousel/carousel.js +18 -10
  24. package/dist/components/chat-dock-section/chat-dock-section.js +1 -1
  25. package/dist/components/checkbox/checkbox.js +2 -2
  26. package/dist/components/checklist/checklist.js +38 -10
  27. package/dist/components/checklist/index.js +8 -2
  28. package/dist/components/chronological-timeline/chronological-timeline.js +6 -6
  29. package/dist/components/civilization-card/civilization-card.js +1 -1
  30. package/dist/components/code-block/code-block.js +2 -2
  31. package/dist/components/code-playground/code-playground.js +7 -6
  32. package/dist/components/combobox/combobox.js +2 -2
  33. package/dist/components/command/command.js +1 -1
  34. package/dist/components/comment-pin/comment-pin.js +3 -3
  35. package/dist/components/comparison/comparison.js +7 -6
  36. package/dist/components/completion-dialog/completion-dialog.js +19 -11
  37. package/dist/components/content-intro/content-intro.js +21 -18
  38. package/dist/components/context-menu/context-menu.js +4 -4
  39. package/dist/components/conversation-thread/conversation-thread.js +8 -8
  40. package/dist/components/cookie-consent/cookie-consent.js +1 -1
  41. package/dist/components/copy-button/copy-button.js +3 -3
  42. package/dist/components/credit-badge/credit-badge.js +1 -7
  43. package/dist/components/curriculum/curriculum.js +10 -10
  44. package/dist/components/data-list/data-list.js +1 -1
  45. package/dist/components/data-table/data-table.js +3 -3
  46. package/dist/components/date-picker/date-picker.js +1 -1
  47. package/dist/components/dialog/dialog.js +1 -1
  48. package/dist/components/dropdown-menu/dropdown-menu.js +3 -3
  49. package/dist/components/empty-state/empty-state.js +3 -3
  50. package/dist/components/exercise/exercise.js +14 -6
  51. package/dist/components/faq/faq.js +8 -4
  52. package/dist/components/file-upload/file-upload.js +3 -3
  53. package/dist/components/filter-bar/filter-bar.js +6 -6
  54. package/dist/components/flashcard/flashcard.js +1 -1
  55. package/dist/components/floating-action-button/floating-action-button.js +1 -1
  56. package/dist/components/floating-toolbar/floating-toolbar.js +3 -3
  57. package/dist/components/flow-diagram/flow-controls.js +9 -9
  58. package/dist/components/flow-diagram/flow-error-boundary.js +2 -2
  59. package/dist/components/flow-diagram/flow-fullscreen.js +2 -2
  60. package/dist/components/gantt-chart/gantt-chart.js +9 -8
  61. package/dist/components/globe-3d/globe-3d.js +16 -4
  62. package/dist/components/handoff-beacon/handoff-beacon.js +1 -1
  63. package/dist/components/historic-timeline/historic-timeline.js +2 -2
  64. package/dist/components/historical-figure-card/historical-figure-card.js +4 -7
  65. package/dist/components/horizontal-scroll-row/horizontal-scroll-row.js +6 -5
  66. package/dist/components/input-otp/input-otp.js +1 -1
  67. package/dist/components/interactive-timeline/interactive-timeline.js +12 -9
  68. package/dist/components/jarvis-dock/jarvis-dock.js +4 -4
  69. package/dist/components/key-concept/key-concept.js +6 -5
  70. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +4 -3
  71. package/dist/components/knowledge-check/knowledge-check.js +5 -5
  72. package/dist/components/learning-objectives/learning-objectives.js +8 -7
  73. package/dist/components/live-feed/live-feed.js +4 -4
  74. package/dist/components/map-2d/map-2d.js +3 -3
  75. package/dist/components/map-timeline/map-timeline.js +5 -5
  76. package/dist/components/market-treemap/market-treemap.js +3 -3
  77. package/dist/components/mdx-content/mdx-content.js +17 -8
  78. package/dist/components/menubar/menubar.js +4 -4
  79. package/dist/components/metric-cluster/metric-cluster.js +1 -1
  80. package/dist/components/metric-gauge/metric-gauge.js +1 -1
  81. package/dist/components/model-comparison/model-comparison.js +2 -2
  82. package/dist/components/model-selector/model-selector.js +2 -2
  83. package/dist/components/multi-select/multi-select.js +3 -3
  84. package/dist/components/navbar-saas/navbar-saas.js +2 -1
  85. package/dist/components/navigation-menu/navigation-menu.js +2 -2
  86. package/dist/components/newsletter-signup/newsletter-signup.js +3 -3
  87. package/dist/components/number-input/number-input.js +1 -1
  88. package/dist/components/number-ticker/number-ticker.js +1 -1
  89. package/dist/components/object-inspector/object-inspector.js +1 -1
  90. package/dist/components/order-book/order-book.js +2 -2
  91. package/dist/components/parallel-timeline/parallel-timeline.js +2 -2
  92. package/dist/components/password-input/password-input.js +1 -1
  93. package/dist/components/plan-badge/plan-badge.js +1 -7
  94. package/dist/components/policy-delivery-panel/policy-delivery-panel.js +2 -2
  95. package/dist/components/presence-stack/presence-stack.js +2 -2
  96. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +1 -1
  97. package/dist/components/pricing-table/pricing-table.js +3 -3
  98. package/dist/components/pro-tip/pro-tip.js +6 -6
  99. package/dist/components/profile-section/profile-section.js +3 -2
  100. package/dist/components/progress-tracker/progress-tracker.js +15 -9
  101. package/dist/components/prompt-templates/prompt-templates.js +4 -4
  102. package/dist/components/quiz/quiz.js +7 -6
  103. package/dist/components/radio-group/radio-group.js +2 -2
  104. package/dist/components/rating/rating.js +3 -3
  105. package/dist/components/relationship-inspector/relationship-inspector.js +2 -2
  106. package/dist/components/resizable/resizable.js +1 -1
  107. package/dist/components/routing-assignment-panel/routing-assignment-panel.js +2 -2
  108. package/dist/components/run-timeline/run-timeline.js +2 -2
  109. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +1 -1
  110. package/dist/components/scope-selector/scope-selector.js +7 -7
  111. package/dist/components/search-dialog/search-dialog.js +483 -50
  112. package/dist/components/select/select.js +5 -5
  113. package/dist/components/selection-halo/selection-halo.js +1 -1
  114. package/dist/components/severity-badge/severity-badge.js +2 -2
  115. package/dist/components/share-dialog/share-dialog.js +2 -2
  116. package/dist/components/share-section/share-section.js +2 -1
  117. package/dist/components/sheet/sheet.js +1 -1
  118. package/dist/components/sidebar/sidebar.js +20 -19
  119. package/dist/components/sidebar-toggle/sidebar-toggle.js +2 -2
  120. package/dist/components/slider/slider.js +1 -1
  121. package/dist/components/slideshow/slideshow.js +11 -10
  122. package/dist/components/social-fab/social-fab.js +10 -10
  123. package/dist/components/sparkline-grid/sparkline-grid.js +1 -1
  124. package/dist/components/spinner/spinner.js +4 -4
  125. package/dist/components/stat-card/stat-card.js +4 -4
  126. package/dist/components/state-badge-overlay/state-badge-overlay.js +1 -1
  127. package/dist/components/status-board/status-board.js +13 -6
  128. package/dist/components/status-indicator/status-indicator.js +3 -3
  129. package/dist/components/step-by-step/step-by-step.js +7 -6
  130. package/dist/components/step-navigation/step-navigation.js +2 -2
  131. package/dist/components/stepper/stepper.js +3 -3
  132. package/dist/components/sticky-metric/sticky-metric.js +1 -1
  133. package/dist/components/subscription-card/subscription-card.js +1 -1
  134. package/dist/components/switch/switch.js +1 -1
  135. package/dist/components/table-of-contents/table-of-contents.js +5 -2
  136. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +7 -5
  137. package/dist/components/tabs/tabs.js +26 -8
  138. package/dist/components/tags-input/tags-input.js +12 -4
  139. package/dist/components/terminal/terminal.js +22 -14
  140. package/dist/components/theme-toggle/theme-toggle.js +2 -2
  141. package/dist/components/thinking-block/thinking-block.js +3 -3
  142. package/dist/components/ticker-tape/ticker-tape.js +3 -3
  143. package/dist/components/timeline/timeline.js +2 -2
  144. package/dist/components/timeline-scrubber/timeline-scrubber.js +2 -2
  145. package/dist/components/tldr-section/tldr-section.js +11 -9
  146. package/dist/components/tour/tour.js +1 -1
  147. package/dist/components/transaction-list/transaction-list.js +2 -2
  148. package/dist/components/tree-view/tree-view.js +2 -2
  149. package/dist/components/tutorial-complete/tutorial-complete.js +14 -12
  150. package/dist/components/tutorial-filters/tutorial-filters.js +1 -1
  151. package/dist/components/tutorial-intro-content/tutorial-intro-content.js +5 -5
  152. package/dist/components/tutorial-mdx/tutorial-mdx.js +5 -5
  153. package/dist/components/usage-breakdown/usage-breakdown.js +2 -2
  154. package/dist/components/video-embed/video-embed.js +2 -2
  155. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +3 -3
  156. package/dist/components/wallet-card/wallet-card.js +1 -1
  157. package/dist/components/watchlist/watchlist.js +7 -6
  158. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +2 -2
  159. package/dist/components/world-clock-bar/world-clock-bar.js +4 -3
  160. package/dist/index.d.ts +113 -29
  161. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
10
10
 
11
11
  ### Added
12
12
 
13
+ - **Release intelligence surface** — `/changelog`, `/releases`, `/rss.xml`, and `/atom.xml` expose one changelog source through HTML, GitHub release cards, and feed readers. `/docs/changelog` redirects to `/changelog`.
13
14
  - **Hooks + utility primitives** — `CopyButton` (+ `useCopyToClipboard` hook), `Banner` + `BannerAction`, `Kbd`, `EmptyState`, `DocumentSiblingNav`.
14
15
  - **Pricing + identity cards** — `PricingTable` + `PricingPlan`, `HistoricalFigureCard`, `CivilizationCard` (+ `CivilizationComparison`).
15
16
  - **Newsletter** — `NewsletterSignup` (state-machine driven submit flow).
@@ -29,6 +30,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
29
30
  - **Time navigation** — `TimelineScrubber`, `PlaybackGhost`, `BottomActivityStrip`, `RunTimeline`.
30
31
  - Total component count: **225** (up from 140).
31
32
 
33
+ - **A11y heading-level override** — every title-bearing component (`ProfileSection`, `FAQ`, `Slideshow`, `WorldClockBar`, `TableOfContentsPanel`, `TableOfContents`, `KeyboardShortcutsHelp`, `Watchlist`, `OrderBook`, `HorizontalScrollRow`, `MarketTreemap`, `ActivityHeatmap`, `Glossary`, `StatusBoard`, `CodePlayground`, `Comparison`, `Quiz`, `Exercise`, `ShareSection`, `CompletionDialog`, `Checklist`, `LearningObjectives`, `CandlestickChart`, `StepByStep`) accepts an `as` prop (`"h1"`–`"h6"`); multi-title components (`ContentIntro`, `TutorialComplete`) expose `titleAs` + `tocLabelAs` / `sectionLabelAs`. Defaults preserve existing heading tags. `HeadingTag` is re-exported from `@vllnt/ui`.
34
+
32
35
  ### Changed
33
36
 
34
37
  - Registry installs use a **hybrid CLI strategy** — leaf component source is inlined, sibling registry items resolve via `@vllnt/ui` to keep installs minimal and dedupe shared primitives.
@@ -104,7 +104,7 @@ function AccordionTrigger({
104
104
  "span",
105
105
  {
106
106
  className: cn(
107
- "h-4 w-4 flex-shrink-0 transition-transform duration-200",
107
+ "size-4 flex-shrink-0 transition-transform duration-200",
108
108
  isOpen && "rotate-180"
109
109
  ),
110
110
  children: icon
@@ -113,7 +113,7 @@ function AccordionTrigger({
113
113
  "svg",
114
114
  {
115
115
  className: cn(
116
- "h-4 w-4 flex-shrink-0 transition-transform duration-200",
116
+ "size-4 flex-shrink-0 transition-transform duration-200",
117
117
  isOpen && "rotate-180"
118
118
  ),
119
119
  fill: "none",
@@ -133,7 +133,7 @@ function HeatmapGrid({
133
133
  "span",
134
134
  {
135
135
  className: cn(
136
- "h-3 w-3 rounded-[3px] border border-border/40",
136
+ "size-3 rounded-[3px] border border-border/40",
137
137
  className
138
138
  )
139
139
  },
@@ -145,6 +145,7 @@ function HeatmapGrid({
145
145
  }
146
146
  const ActivityHeatmap = React.forwardRef(
147
147
  ({
148
+ as: Heading = "h2",
148
149
  className,
149
150
  data,
150
151
  description,
@@ -157,7 +158,7 @@ const ActivityHeatmap = React.forwardRef(
157
158
  const gridData = getGridData(data, normalizedEndDate, weeks);
158
159
  return /* @__PURE__ */ jsxs("div", { className: cn("space-y-4", className), ref, ...props, children: [
159
160
  /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
160
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold tracking-tight", children: title }),
161
+ /* @__PURE__ */ jsx(Heading, { className: "text-lg font-semibold tracking-tight", children: title }),
161
162
  description ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: description }) : null
162
163
  ] }),
163
164
  /* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded-lg border bg-card p-4 shadow-sm", children: /* @__PURE__ */ jsx(HeatmapGrid, { gridData, weeks }) })
@@ -82,7 +82,7 @@ function PaginationControls({
82
82
  size: "sm",
83
83
  variant: "outline",
84
84
  children: [
85
- /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" }),
85
+ /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4" }),
86
86
  "Previous"
87
87
  ]
88
88
  }
@@ -111,7 +111,7 @@ function PaginationControls({
111
111
  variant: "outline",
112
112
  children: [
113
113
  "Next",
114
- /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
114
+ /* @__PURE__ */ jsx(ChevronRight, { className: "size-4" })
115
115
  ]
116
116
  }
117
117
  )
@@ -132,18 +132,18 @@ function ActivityRow({ item }) {
132
132
  {
133
133
  "aria-hidden": "true",
134
134
  className: cn(
135
- "absolute left-4 top-3 h-3 w-3 rounded-full ring-4 ring-background",
135
+ "absolute left-4 top-3 size-3 rounded-full ring-4 ring-background",
136
136
  palette.markerClassName
137
137
  )
138
138
  }
139
139
  ),
140
140
  /* @__PURE__ */ jsx("div", { className: "rounded-lg border bg-background/70 p-4", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
141
141
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-start gap-3", children: [
142
- /* @__PURE__ */ jsx(Avatar, { className: "h-9 w-9 border bg-muted", children: /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(item.actor) }) }),
142
+ /* @__PURE__ */ jsx(Avatar, { className: "size-9 border bg-muted", children: /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(item.actor) }) }),
143
143
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-1", children: [
144
144
  /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
145
145
  /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: item.actor }),
146
- /* @__PURE__ */ jsx(ArrowRight, { className: "h-3.5 w-3.5 text-muted-foreground" }),
146
+ /* @__PURE__ */ jsx(ArrowRight, { className: "size-3.5 text-muted-foreground" }),
147
147
  /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: item.action }),
148
148
  item.target ? /* @__PURE__ */ jsx("span", { className: "truncate text-sm font-medium text-foreground", children: item.target }) : null
149
149
  ] }),
@@ -46,11 +46,11 @@ const STATUS_CLASSES = {
46
46
  }
47
47
  };
48
48
  const DEFAULT_STATUS_ICON = {
49
- completed: /* @__PURE__ */ jsx(CheckCircle2, { "aria-hidden": "true", className: "h-4 w-4" }),
50
- error: /* @__PURE__ */ jsx(AlertTriangle, { "aria-hidden": "true", className: "h-4 w-4" }),
51
- pending: /* @__PURE__ */ jsx(Circle, { "aria-hidden": "true", className: "h-4 w-4" }),
52
- running: /* @__PURE__ */ jsx(Loader2, { "aria-hidden": "true", className: "h-4 w-4 animate-spin" }),
53
- skipped: /* @__PURE__ */ jsx(MinusCircle, { "aria-hidden": "true", className: "h-4 w-4" })
49
+ completed: /* @__PURE__ */ jsx(CheckCircle2, { "aria-hidden": "true", className: "size-4" }),
50
+ error: /* @__PURE__ */ jsx(AlertTriangle, { "aria-hidden": "true", className: "size-4" }),
51
+ pending: /* @__PURE__ */ jsx(Circle, { "aria-hidden": "true", className: "size-4" }),
52
+ running: /* @__PURE__ */ jsx(Loader2, { "aria-hidden": "true", className: "size-4 animate-spin" }),
53
+ skipped: /* @__PURE__ */ jsx(MinusCircle, { "aria-hidden": "true", className: "size-4" })
54
54
  };
55
55
  const StepContext = createContext({ status: "pending" });
56
56
  const DEFAULT_LABELS = {
@@ -148,7 +148,7 @@ function StepRow({
148
148
  {
149
149
  "aria-hidden": "true",
150
150
  className: cn(
151
- "mt-0.5 inline-flex h-5 w-5 shrink-0 items-center justify-center",
151
+ "mt-0.5 inline-flex size-5 shrink-0 items-center justify-center",
152
152
  iconClass
153
153
  ),
154
154
  children: icon
@@ -161,7 +161,7 @@ function StepRow({
161
161
  "aria-controls": detailsId,
162
162
  "aria-expanded": open,
163
163
  "aria-label": open ? labels.collapse : labels.expand,
164
- className: "ml-auto inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
164
+ className: "ml-auto inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
165
165
  onClick: onToggle,
166
166
  type: "button",
167
167
  children: /* @__PURE__ */ jsx(
@@ -169,7 +169,7 @@ function StepRow({
169
169
  {
170
170
  "aria-hidden": "true",
171
171
  className: cn(
172
- "h-4 w-4 transition-transform",
172
+ "size-4 transition-transform",
173
173
  open ? "rotate-180" : "rotate-0"
174
174
  )
175
175
  }
@@ -259,7 +259,7 @@ const AIArtifactToolbar = forwardRef(({ className, ...rest }, ref) => /* @__PURE
259
259
  AIArtifactToolbar.displayName = "AIArtifactToolbar";
260
260
  const AIArtifactCopyButton = forwardRef(({ className, onClick, ...rest }, ref) => {
261
261
  const { copied, copy, labels } = useAIArtifact();
262
- const handleClick = useCallback(
262
+ const handleCopyArtifact = useCallback(
263
263
  (event) => {
264
264
  onClick?.(event);
265
265
  if (event.defaultPrevented) return;
@@ -271,21 +271,21 @@ const AIArtifactCopyButton = forwardRef(({ className, onClick, ...rest }, ref) =
271
271
  Button,
272
272
  {
273
273
  "aria-label": copied ? labels.copied : labels.copy,
274
- className: cn("h-8 w-8", className),
275
- onClick: handleClick,
274
+ className: cn("size-8", className),
275
+ onClick: handleCopyArtifact,
276
276
  ref,
277
277
  size: "icon",
278
278
  type: "button",
279
279
  variant: "ghost",
280
280
  ...rest,
281
- children: copied ? /* @__PURE__ */ jsx(Check, { "aria-hidden": "true", className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Copy, { "aria-hidden": "true", className: "h-4 w-4" })
281
+ children: copied ? /* @__PURE__ */ jsx(Check, { "aria-hidden": "true", className: "size-4" }) : /* @__PURE__ */ jsx(Copy, { "aria-hidden": "true", className: "size-4" })
282
282
  }
283
283
  );
284
284
  });
285
285
  AIArtifactCopyButton.displayName = "AIArtifactCopyButton";
286
286
  const AIArtifactEditButton = forwardRef(({ className, onClick, ...rest }, ref) => {
287
287
  const { hasOnEdit, labels, onEdit } = useAIArtifact();
288
- const handleClick = useCallback(
288
+ const handleEditArtifact = useCallback(
289
289
  (event) => {
290
290
  onClick?.(event);
291
291
  if (event.defaultPrevented) return;
@@ -298,21 +298,21 @@ const AIArtifactEditButton = forwardRef(({ className, onClick, ...rest }, ref) =
298
298
  Button,
299
299
  {
300
300
  "aria-label": labels.edit,
301
- className: cn("h-8 w-8", className),
302
- onClick: handleClick,
301
+ className: cn("size-8", className),
302
+ onClick: handleEditArtifact,
303
303
  ref,
304
304
  size: "icon",
305
305
  type: "button",
306
306
  variant: "ghost",
307
307
  ...rest,
308
- children: /* @__PURE__ */ jsx(Pencil, { "aria-hidden": "true", className: "h-4 w-4" })
308
+ children: /* @__PURE__ */ jsx(Pencil, { "aria-hidden": "true", className: "size-4" })
309
309
  }
310
310
  );
311
311
  });
312
312
  AIArtifactEditButton.displayName = "AIArtifactEditButton";
313
313
  const AIArtifactDownloadButton = forwardRef(({ className, onClick, ...rest }, ref) => {
314
314
  const { download, labels } = useAIArtifact();
315
- const handleClick = useCallback(
315
+ const handleDownloadArtifact = useCallback(
316
316
  (event) => {
317
317
  onClick?.(event);
318
318
  if (event.defaultPrevented) return;
@@ -324,21 +324,21 @@ const AIArtifactDownloadButton = forwardRef(({ className, onClick, ...rest }, re
324
324
  Button,
325
325
  {
326
326
  "aria-label": labels.download,
327
- className: cn("h-8 w-8", className),
328
- onClick: handleClick,
327
+ className: cn("size-8", className),
328
+ onClick: handleDownloadArtifact,
329
329
  ref,
330
330
  size: "icon",
331
331
  type: "button",
332
332
  variant: "ghost",
333
333
  ...rest,
334
- children: /* @__PURE__ */ jsx(Download, { "aria-hidden": "true", className: "h-4 w-4" })
334
+ children: /* @__PURE__ */ jsx(Download, { "aria-hidden": "true", className: "size-4" })
335
335
  }
336
336
  );
337
337
  });
338
338
  AIArtifactDownloadButton.displayName = "AIArtifactDownloadButton";
339
339
  const AIArtifactFullscreenButton = forwardRef(({ className, onClick, ...rest }, ref) => {
340
340
  const { fullscreen, labels, toggleFullscreen } = useAIArtifact();
341
- const handleClick = useCallback(
341
+ const handleToggleArtifactFullscreen = useCallback(
342
342
  (event) => {
343
343
  onClick?.(event);
344
344
  if (event.defaultPrevented) return;
@@ -351,14 +351,14 @@ const AIArtifactFullscreenButton = forwardRef(({ className, onClick, ...rest },
351
351
  {
352
352
  "aria-label": fullscreen ? labels.exitFullscreen : labels.enterFullscreen,
353
353
  "aria-pressed": fullscreen,
354
- className: cn("h-8 w-8", className),
355
- onClick: handleClick,
354
+ className: cn("size-8", className),
355
+ onClick: handleToggleArtifactFullscreen,
356
356
  ref,
357
357
  size: "icon",
358
358
  type: "button",
359
359
  variant: "ghost",
360
360
  ...rest,
361
- children: fullscreen ? /* @__PURE__ */ jsx(Minimize2, { "aria-hidden": "true", className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Maximize2, { "aria-hidden": "true", className: "h-4 w-4" })
361
+ children: fullscreen ? /* @__PURE__ */ jsx(Minimize2, { "aria-hidden": "true", className: "size-4" }) : /* @__PURE__ */ jsx(Maximize2, { "aria-hidden": "true", className: "size-4" })
362
362
  }
363
363
  );
364
364
  });
@@ -36,7 +36,7 @@ function AIChatInputFooter({
36
36
  disabled: isSubmitDisabled,
37
37
  type: "submit",
38
38
  children: [
39
- isSubmitting ? /* @__PURE__ */ jsx(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsx(SendHorizontal, { className: "mr-2 h-4 w-4" }),
39
+ isSubmitting ? /* @__PURE__ */ jsx(LoaderCircle, { className: "mr-2 size-4 animate-spin" }) : /* @__PURE__ */ jsx(SendHorizontal, { className: "mr-2 size-4" }),
40
40
  submitLabel
41
41
  ]
42
42
  }
@@ -72,7 +72,7 @@ const AIChatInput = forwardRef(
72
72
  /* @__PURE__ */ jsx(
73
73
  Textarea,
74
74
  {
75
- className: "min-h-[120px] resize-none rounded-xl border-0 bg-transparent px-1 py-1 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0",
75
+ className: "min-h-[120px] resize-none rounded-xl border-0 bg-transparent p-1 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0",
76
76
  disabled,
77
77
  onChange: (event) => {
78
78
  textareaProps?.onChange?.(event);
@@ -73,7 +73,7 @@ const AIMessageBubble = forwardRef(
73
73
  isUser ? "flex-row-reverse text-right" : "flex-row"
74
74
  ),
75
75
  children: [
76
- /* @__PURE__ */ jsx(Avatar, { className: "mt-0.5 h-8 w-8 border border-border/70", children: /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-muted text-[11px] font-medium uppercase text-muted-foreground", children: fallbackLabel }) }),
76
+ /* @__PURE__ */ jsx(Avatar, { className: "mt-0.5 size-8 border border-border/70", children: /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-muted text-[11px] font-medium uppercase text-muted-foreground", children: fallbackLabel }) }),
77
77
  /* @__PURE__ */ jsxs(
78
78
  "div",
79
79
  {
@@ -160,7 +160,7 @@ const AISidebarTitle = forwardRef(({ children, className, ...rest }, ref) => {
160
160
  ref,
161
161
  ...rest,
162
162
  children: [
163
- /* @__PURE__ */ jsx(Bot, { "aria-hidden": "true", className: "h-4 w-4 text-muted-foreground" }),
163
+ /* @__PURE__ */ jsx(Bot, { "aria-hidden": "true", className: "size-4 text-muted-foreground" }),
164
164
  children ?? labels.defaultTitle
165
165
  ]
166
166
  }
@@ -169,7 +169,7 @@ const AISidebarTitle = forwardRef(({ children, className, ...rest }, ref) => {
169
169
  AISidebarTitle.displayName = "AISidebarTitle";
170
170
  const AISidebarClose = forwardRef(({ className, onClick, ...rest }, ref) => {
171
171
  const { close, labels } = useAISidebar();
172
- const handleClick = useCallback(
172
+ const handleCloseSidebar = useCallback(
173
173
  (event) => {
174
174
  onClick?.(event);
175
175
  if (event.defaultPrevented) return;
@@ -181,14 +181,14 @@ const AISidebarClose = forwardRef(({ className, onClick, ...rest }, ref) => {
181
181
  Button,
182
182
  {
183
183
  "aria-label": labels.close,
184
- className: cn("h-8 w-8", className),
185
- onClick: handleClick,
184
+ className: cn("size-8", className),
185
+ onClick: handleCloseSidebar,
186
186
  ref,
187
187
  size: "icon",
188
188
  type: "button",
189
189
  variant: "ghost",
190
190
  ...rest,
191
- children: /* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "h-4 w-4" })
191
+ children: /* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "size-4" })
192
192
  }
193
193
  );
194
194
  });
@@ -215,7 +215,7 @@ const AISidebarFooter = forwardRef(({ children, className, ...rest }, ref) => /*
215
215
  AISidebarFooter.displayName = "AISidebarFooter";
216
216
  const AISidebarTrigger = forwardRef(({ children, className, onClick, ...rest }, ref) => {
217
217
  const { labels, openState, toggle } = useAISidebar();
218
- const handleClick = useCallback(
218
+ const handleToggleSidebar = useCallback(
219
219
  (event) => {
220
220
  onClick?.(event);
221
221
  if (event.defaultPrevented) return;
@@ -230,13 +230,13 @@ const AISidebarTrigger = forwardRef(({ children, className, onClick, ...rest },
230
230
  "aria-label": children ? void 0 : labels.open,
231
231
  className: cn(className),
232
232
  "data-state": openState ? "open" : "closed",
233
- onClick: handleClick,
233
+ onClick: handleToggleSidebar,
234
234
  ref,
235
235
  size: children ? "sm" : "icon",
236
236
  type: "button",
237
237
  variant: "outline",
238
238
  ...rest,
239
- children: children ?? /* @__PURE__ */ jsx(MessageSquarePlus, { "aria-hidden": "true", className: "h-4 w-4" })
239
+ children: children ?? /* @__PURE__ */ jsx(MessageSquarePlus, { "aria-hidden": "true", className: "size-4" })
240
240
  }
241
241
  );
242
242
  });
@@ -18,13 +18,13 @@ const AISourceCitation = forwardRef(
18
18
  ...props,
19
19
  children: [
20
20
  /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2", children: [
21
- /* @__PURE__ */ jsx(Quote, { className: "mt-0.5 h-4 w-4 shrink-0 text-muted-foreground" }),
21
+ /* @__PURE__ */ jsx(Quote, { className: "mt-0.5 size-4 shrink-0 text-muted-foreground" }),
22
22
  /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
23
23
  /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
24
24
  /* @__PURE__ */ jsx("p", { className: "truncate text-sm font-medium text-foreground", children: title }),
25
25
  /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: source })
26
26
  ] }),
27
- /* @__PURE__ */ jsx(ExternalLink, { className: "h-4 w-4 shrink-0 text-muted-foreground transition-transform group-hover:-translate-y-0.5 group-hover:translate-x-0.5" })
27
+ /* @__PURE__ */ jsx(ExternalLink, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-hover:-translate-y-0.5 group-hover:translate-x-0.5" })
28
28
  ] }) })
29
29
  ] }),
30
30
  snippet ? /* @__PURE__ */ jsx("p", { className: "line-clamp-3 text-sm leading-6 text-muted-foreground", children: snippet }) : null
@@ -21,10 +21,10 @@ const statusVariants = cva(
21
21
  }
22
22
  );
23
23
  const statusIconMap = {
24
- complete: /* @__PURE__ */ jsx(CheckCircle2, { className: "h-4 w-4" }),
25
- error: /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4" }),
26
- queued: /* @__PURE__ */ jsx(Clock3, { className: "h-4 w-4" }),
27
- running: /* @__PURE__ */ jsx(Wrench, { className: "h-4 w-4 animate-pulse" })
24
+ complete: /* @__PURE__ */ jsx(CheckCircle2, { className: "size-4" }),
25
+ error: /* @__PURE__ */ jsx(AlertCircle, { className: "size-4" }),
26
+ queued: /* @__PURE__ */ jsx(Clock3, { className: "size-4" }),
27
+ running: /* @__PURE__ */ jsx(Wrench, { className: "size-4 animate-pulse" })
28
28
  };
29
29
  const AIToolCallDisplay = forwardRef(
30
30
  ({
@@ -39,7 +39,7 @@ function getCurrencyFormatter(locale, currency) {
39
39
  const key = `${locale}|${currency}`;
40
40
  let formatter = CURRENCY_FORMATTER_CACHE.get(key);
41
41
  if (!formatter) {
42
- formatter = new Intl.NumberFormat(locale, {
42
+ formatter = Intl.NumberFormat(locale, {
43
43
  currency,
44
44
  style: "currency"
45
45
  });
@@ -7,7 +7,7 @@ const Avatar = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
7
7
  AvatarPrimitive.Root,
8
8
  {
9
9
  className: cn(
10
- "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
10
+ "relative flex size-10 shrink-0 overflow-hidden rounded-full",
11
11
  className
12
12
  ),
13
13
  ref,
@@ -23,9 +23,9 @@ const avatarItemVariants = cva(
23
23
  },
24
24
  variants: {
25
25
  size: {
26
- lg: "h-12 w-12 text-sm",
27
- md: "h-10 w-10 text-xs",
28
- sm: "h-8 w-8 text-[11px]"
26
+ lg: "size-12 text-sm",
27
+ md: "size-10 text-xs",
28
+ sm: "size-8 text-[11px]"
29
29
  }
30
30
  }
31
31
  }
@@ -108,7 +108,7 @@ const Banner = forwardRef(
108
108
  "span",
109
109
  {
110
110
  "aria-hidden": "true",
111
- className: "mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center [&>svg]:h-4 [&>svg]:w-4",
111
+ className: "mt-0.5 flex size-4 shrink-0 items-center justify-center [&>svg]:h-4 [&>svg]:w-4",
112
112
  children: icon
113
113
  }
114
114
  ) : null,
@@ -117,10 +117,10 @@ const Banner = forwardRef(
117
117
  "button",
118
118
  {
119
119
  "aria-label": dismissLabel,
120
- className: "ml-auto inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md opacity-70 transition-colors hover:bg-foreground/10 hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
120
+ className: "ml-auto inline-flex size-6 shrink-0 items-center justify-center rounded-md opacity-70 transition-colors hover:bg-foreground/10 hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
121
121
  onClick: handleDismiss,
122
122
  type: "button",
123
- children: /* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "h-4 w-4" })
123
+ children: /* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "size-4" })
124
124
  }
125
125
  ) : null
126
126
  ]
@@ -43,7 +43,9 @@ function ContentCard({
43
43
  ] }) }) : null
44
44
  ] }) });
45
45
  }
46
- const BlogCard = ContentCard;
46
+ function BlogCard(props) {
47
+ return /* @__PURE__ */ jsx(ContentCard, { ...props });
48
+ }
47
49
  export {
48
50
  BlogCard,
49
51
  ContentCard
@@ -23,7 +23,7 @@ const ChipBody = (props) => {
23
23
  "span",
24
24
  {
25
25
  "aria-hidden": "true",
26
- className: cn("h-1.5 w-1.5 rounded-full", TONE_DOT[tone])
26
+ className: cn("size-1.5 rounded-full", TONE_DOT[tone])
27
27
  }
28
28
  ),
29
29
  /* @__PURE__ */ jsx("span", { className: "text-foreground", children: event.label }),
@@ -34,7 +34,7 @@ const Chip = (props) => {
34
34
  const { event } = props;
35
35
  const tone = event.tone ?? "neutral";
36
36
  if (event.onActivate) {
37
- const handleClick = () => {
37
+ const handleActivateEvent = () => {
38
38
  event.onActivate?.();
39
39
  };
40
40
  return /* @__PURE__ */ jsx(
@@ -43,7 +43,7 @@ const Chip = (props) => {
43
43
  className: "flex items-center rounded-full border border-border bg-background px-2 py-1 text-[11px] transition-colors hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
44
44
  "data-strip-event": event.id,
45
45
  "data-strip-event-tone": tone,
46
- onClick: handleClick,
46
+ onClick: handleActivateEvent,
47
47
  type: "button",
48
48
  children: /* @__PURE__ */ jsx(ChipBody, { event })
49
49
  }
@@ -13,7 +13,7 @@ const buttonVariants = cva(
13
13
  variants: {
14
14
  size: {
15
15
  default: "h-10 px-4 py-2",
16
- icon: "h-10 w-10",
16
+ icon: "size-10",
17
17
  lg: "h-11 rounded-md px-8",
18
18
  sm: "h-9 rounded-md px-3"
19
19
  },
@@ -5,10 +5,10 @@ import { DayPicker } from "react-day-picker";
5
5
  import { cn } from "../../lib/utils";
6
6
  import { buttonVariants } from "../button/button";
7
7
  function IconLeft() {
8
- return /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" });
8
+ return /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4" });
9
9
  }
10
10
  function IconRight() {
11
- return /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" });
11
+ return /* @__PURE__ */ jsx(ChevronRight, { className: "size-4" });
12
12
  }
13
13
  function ChevronComponent({
14
14
  orientation = "right"
@@ -28,17 +28,17 @@ function Calendar({
28
28
  classNames: {
29
29
  button_next: cn(
30
30
  buttonVariants({ variant: "outline" }),
31
- "h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute right-1"
31
+ "size-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute right-1"
32
32
  ),
33
33
  button_previous: cn(
34
34
  buttonVariants({ variant: "outline" }),
35
- "h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute left-1"
35
+ "size-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute left-1"
36
36
  ),
37
37
  caption_label: "text-sm font-medium",
38
- day: "h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20",
38
+ day: "size-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20",
39
39
  day_button: cn(
40
40
  buttonVariants({ variant: "ghost" }),
41
- "h-9 w-9 p-0 font-normal aria-selected:opacity-100"
41
+ "size-9 p-0 font-normal aria-selected:opacity-100"
42
42
  ),
43
43
  disabled: "text-muted-foreground opacity-50",
44
44
  hidden: "invisible",
@@ -45,7 +45,7 @@ function Callout({
45
45
  ),
46
46
  role: "alert",
47
47
  children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
48
- icon ? /* @__PURE__ */ jsx("span", { className: "h-5 w-5 flex-shrink-0 mt-0.5", children: icon }) : null,
48
+ icon ? /* @__PURE__ */ jsx("span", { className: "size-5 flex-shrink-0 mt-0.5", children: icon }) : null,
49
49
  /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
50
50
  displayTitle ? /* @__PURE__ */ jsx("p", { className: "font-semibold mb-1", children: displayTitle }) : null,
51
51
  /* @__PURE__ */ jsx("div", { className: "text-sm [&>p]:mb-0 [&>p:last-child]:mb-0", children })
@@ -149,7 +149,7 @@ function SessionPill({ sessionChange }) {
149
149
  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"
150
150
  ),
151
151
  children: [
152
- /* @__PURE__ */ jsx(TrendIcon, { className: "h-4 w-4" }),
152
+ /* @__PURE__ */ jsx(TrendIcon, { className: "size-4" }),
153
153
  sessionChange >= 0 ? "+" : "",
154
154
  formatValue(sessionChange)
155
155
  ]
@@ -158,6 +158,7 @@ function SessionPill({ sessionChange }) {
158
158
  }
159
159
  const CandlestickChart = React.forwardRef(
160
160
  ({
161
+ as: Heading = "h3",
161
162
  className,
162
163
  data,
163
164
  height = DEFAULT_HEIGHT,
@@ -185,7 +186,7 @@ const CandlestickChart = React.forwardRef(
185
186
  /* @__PURE__ */ jsxs("div", { className: "mb-4 flex flex-wrap items-start justify-between gap-3", children: [
186
187
  /* @__PURE__ */ jsxs("div", { children: [
187
188
  /* @__PURE__ */ jsx("p", { className: "text-xs font-medium uppercase tracking-[0.28em] text-muted-foreground", children: "OHLC session" }),
188
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-foreground", children: "Candlestick chart" })
189
+ /* @__PURE__ */ jsx(Heading, { className: "text-lg font-semibold text-foreground", children: "Candlestick chart" })
189
190
  ] }),
190
191
  /* @__PURE__ */ jsx(SessionPill, { sessionChange })
191
192
  ] }),
@@ -115,7 +115,7 @@ function DemoCanvasObjects() {
115
115
  /* @__PURE__ */ jsxs("div", { className: "absolute left-[14%] top-[22%] w-72 rounded-[2rem] border border-border/18 bg-background/18 p-5 shadow-[0_22px_80px_hsl(var(--foreground)/0.05)] backdrop-blur-xl", children: [
116
116
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
117
117
  /* @__PURE__ */ jsx("div", { className: "flex size-11 items-center justify-center rounded-2xl bg-primary/10 text-primary", children: /* @__PURE__ */ jsx(Layers3, { className: "size-5" }) }),
118
- /* @__PURE__ */ jsx("div", { className: "h-2 w-2 rounded-full bg-primary/50" })
118
+ /* @__PURE__ */ jsx("div", { className: "size-2 rounded-full bg-primary/50" })
119
119
  ] }),
120
120
  /* @__PURE__ */ jsxs("div", { className: "mt-5 space-y-3", children: [
121
121
  /* @__PURE__ */ jsx("div", { className: "h-3 w-24 rounded-full bg-foreground/10" }),
@@ -130,9 +130,9 @@ function DemoCanvasObjects() {
130
130
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
131
131
  /* @__PURE__ */ jsx("div", { className: "flex size-10 items-center justify-center rounded-2xl bg-background/60 text-foreground/70", children: /* @__PURE__ */ jsx(Activity, { className: "size-4" }) }),
132
132
  /* @__PURE__ */ jsxs("div", { className: "flex gap-1.5", children: [
133
- /* @__PURE__ */ jsx("div", { className: "h-2 w-2 rounded-full bg-foreground/10" }),
134
- /* @__PURE__ */ jsx("div", { className: "h-2 w-2 rounded-full bg-foreground/10" }),
135
- /* @__PURE__ */ jsx("div", { className: "h-2 w-2 rounded-full bg-primary/45" })
133
+ /* @__PURE__ */ jsx("div", { className: "size-2 rounded-full bg-foreground/10" }),
134
+ /* @__PURE__ */ jsx("div", { className: "size-2 rounded-full bg-foreground/10" }),
135
+ /* @__PURE__ */ jsx("div", { className: "size-2 rounded-full bg-primary/45" })
136
136
  ] })
137
137
  ] }),
138
138
  /* @__PURE__ */ jsxs("div", { className: "mt-4 space-y-3", children: [