@vllnt/ui 0.2.1-canary.06f0e84 → 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 (146) hide show
  1. package/dist/components/accordion/accordion.js +2 -2
  2. package/dist/components/activity-heatmap/activity-heatmap.js +15 -13
  3. package/dist/components/activity-log/activity-log.js +5 -5
  4. package/dist/components/agent-activity/agent-activity.js +8 -8
  5. package/dist/components/ai-artifact/ai-artifact.js +8 -8
  6. package/dist/components/ai-chat-input/ai-chat-input.js +2 -2
  7. package/dist/components/ai-message-bubble/ai-message-bubble.js +1 -1
  8. package/dist/components/ai-sidebar/ai-sidebar.js +4 -4
  9. package/dist/components/ai-source-citation/ai-source-citation.js +2 -2
  10. package/dist/components/ai-tool-call-display/ai-tool-call-display.js +4 -4
  11. package/dist/components/animated-text/animated-text.js +1 -4
  12. package/dist/components/auto-reload/auto-reload.js +14 -4
  13. package/dist/components/avatar/avatar.js +1 -1
  14. package/dist/components/avatar-group/avatar-group.js +4 -4
  15. package/dist/components/banner/banner.js +3 -3
  16. package/dist/components/bottom-activity-strip/bottom-activity-strip.js +1 -1
  17. package/dist/components/breadcrumb/breadcrumb.js +33 -26
  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 +1 -1
  22. package/dist/components/canvas-shell/canvas-foundation-demo.js +4 -4
  23. package/dist/components/carousel/carousel.js +4 -4
  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 +3 -3
  27. package/dist/components/chronological-timeline/chronological-timeline.js +6 -5
  28. package/dist/components/civilization-card/civilization-card.js +1 -1
  29. package/dist/components/code-block/code-block.js +2 -2
  30. package/dist/components/code-playground/code-playground.js +8 -7
  31. package/dist/components/combobox/combobox.js +2 -2
  32. package/dist/components/command/command.js +1 -1
  33. package/dist/components/comment-pin/comment-pin.js +1 -1
  34. package/dist/components/comparison/comparison.js +9 -9
  35. package/dist/components/completion-dialog/completion-dialog.js +1 -1
  36. package/dist/components/content-intro/content-intro.js +7 -6
  37. package/dist/components/context-menu/context-menu.js +4 -4
  38. package/dist/components/conversation-thread/conversation-thread.js +8 -8
  39. package/dist/components/cookie-consent/cookie-consent.js +1 -1
  40. package/dist/components/copy-button/copy-button.js +3 -3
  41. package/dist/components/countdown-timer/countdown-timer.js +8 -7
  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 +5 -4
  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 +4 -4
  51. package/dist/components/faq/faq.js +2 -2
  52. package/dist/components/file-upload/file-upload.js +3 -3
  53. package/dist/components/filter-bar/filter-bar.js +2 -1
  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 +1 -1
  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 +15 -13
  61. package/dist/components/handoff-beacon/handoff-beacon.js +1 -1
  62. package/dist/components/historic-timeline/historic-timeline.js +2 -2
  63. package/dist/components/historical-figure-card/historical-figure-card.js +4 -7
  64. package/dist/components/horizontal-scroll-row/horizontal-scroll-row.js +4 -4
  65. package/dist/components/input-otp/input-otp.js +1 -1
  66. package/dist/components/interactive-timeline/interactive-timeline.js +4 -4
  67. package/dist/components/jarvis-dock/jarvis-dock.js +2 -2
  68. package/dist/components/key-concept/key-concept.js +4 -4
  69. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +2 -2
  70. package/dist/components/knowledge-check/knowledge-check.js +3 -3
  71. package/dist/components/learning-objectives/learning-objectives.js +12 -12
  72. package/dist/components/live-feed/live-feed.js +15 -13
  73. package/dist/components/map-2d/map-2d.js +2 -2
  74. package/dist/components/market-treemap/market-treemap.js +1 -1
  75. package/dist/components/mdx-content/mdx-content.js +2 -1
  76. package/dist/components/menubar/menubar.js +4 -4
  77. package/dist/components/metric-cluster/metric-cluster.js +1 -1
  78. package/dist/components/metric-gauge/metric-gauge.js +1 -1
  79. package/dist/components/model-comparison/model-comparison.js +2 -2
  80. package/dist/components/model-selector/model-selector.js +2 -2
  81. package/dist/components/multi-select/multi-select.js +3 -3
  82. package/dist/components/navbar-saas/navbar-saas.js +3 -2
  83. package/dist/components/navigation-menu/navigation-menu.js +2 -2
  84. package/dist/components/newsletter-signup/newsletter-signup.js +3 -3
  85. package/dist/components/number-input/number-input.js +1 -1
  86. package/dist/components/number-ticker/number-ticker.js +11 -4
  87. package/dist/components/object-inspector/object-inspector.js +1 -1
  88. package/dist/components/parallel-timeline/parallel-timeline.js +2 -2
  89. package/dist/components/password-input/password-input.js +1 -1
  90. package/dist/components/plan-badge/plan-badge.js +1 -7
  91. package/dist/components/presence-stack/presence-stack.js +2 -2
  92. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +1 -1
  93. package/dist/components/pricing-table/pricing-table.js +3 -3
  94. package/dist/components/pro-tip/pro-tip.js +6 -6
  95. package/dist/components/profile-section/profile-section.js +1 -1
  96. package/dist/components/progress-card/progress-card.js +4 -3
  97. package/dist/components/progress-tracker/progress-tracker.js +7 -5
  98. package/dist/components/prompt-templates/prompt-templates.js +2 -2
  99. package/dist/components/quiz/quiz.js +5 -5
  100. package/dist/components/radio-group/radio-group.js +2 -2
  101. package/dist/components/rating/rating.js +3 -3
  102. package/dist/components/resizable/resizable.js +1 -1
  103. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +1 -1
  104. package/dist/components/scope-selector/scope-selector.js +7 -7
  105. package/dist/components/search-bar/search-bar.js +24 -2
  106. package/dist/components/search-dialog/search-dialog.js +1 -1
  107. package/dist/components/select/select.js +5 -5
  108. package/dist/components/selection-halo/selection-halo.js +1 -1
  109. package/dist/components/severity-badge/severity-badge.js +2 -2
  110. package/dist/components/sheet/sheet.js +1 -1
  111. package/dist/components/sidebar/sidebar.js +1 -1
  112. package/dist/components/sidebar-toggle/sidebar-toggle.js +2 -2
  113. package/dist/components/slider/slider.js +1 -1
  114. package/dist/components/slideshow/slideshow.js +12 -11
  115. package/dist/components/social-fab/social-fab.js +2 -1
  116. package/dist/components/sparkline-grid/sparkline-grid.js +1 -1
  117. package/dist/components/spinner/spinner.js +3 -3
  118. package/dist/components/stat-card/stat-card.js +3 -3
  119. package/dist/components/state-badge-overlay/state-badge-overlay.js +1 -1
  120. package/dist/components/status-board/status-board.js +1 -1
  121. package/dist/components/status-indicator/status-indicator.js +3 -3
  122. package/dist/components/step-by-step/step-by-step.js +8 -7
  123. package/dist/components/step-navigation/step-navigation.js +2 -2
  124. package/dist/components/stepper/stepper.js +3 -3
  125. package/dist/components/sticky-metric/sticky-metric.js +1 -1
  126. package/dist/components/subscription-card/subscription-card.js +1 -1
  127. package/dist/components/switch/switch.js +1 -1
  128. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +5 -5
  129. package/dist/components/tags-input/tags-input.js +1 -1
  130. package/dist/components/terminal/terminal.js +48 -34
  131. package/dist/components/thinking-block/thinking-block.js +1 -1
  132. package/dist/components/ticker-tape/ticker-tape.js +3 -3
  133. package/dist/components/timeline/timeline.js +2 -2
  134. package/dist/components/tldr-section/tldr-section.js +2 -2
  135. package/dist/components/tour/tour.js +1 -1
  136. package/dist/components/transaction-list/transaction-list.js +30 -9
  137. package/dist/components/tree-view/tree-view.js +2 -2
  138. package/dist/components/tutorial-complete/tutorial-complete.js +8 -8
  139. package/dist/components/usage-breakdown/usage-breakdown.js +9 -5
  140. package/dist/components/video-embed/video-embed.js +2 -2
  141. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +1 -1
  142. package/dist/components/wallet-card/wallet-card.js +1 -1
  143. package/dist/components/watchlist/watchlist.js +5 -5
  144. package/dist/components/world-clock-bar/world-clock-bar.js +32 -12
  145. package/dist/index.d.ts +1 -1
  146. package/package.json +1 -1
@@ -45,7 +45,7 @@ const ChatDockSection = forwardRef(
45
45
  },
46
46
  message.id
47
47
  )) }),
48
- /* @__PURE__ */ jsx("div", { className: "rounded-xl border border-dashed border-border/80 bg-background/70 px-3 py-3 text-sm text-muted-foreground", children: composerPlaceholder })
48
+ /* @__PURE__ */ jsx("div", { className: "rounded-xl border border-dashed border-border/80 bg-background/70 p-3 text-sm text-muted-foreground", children: composerPlaceholder })
49
49
  ]
50
50
  }
51
51
  )
@@ -8,7 +8,7 @@ const Checkbox = React.forwardRef(({ className, ...props }, reference) => /* @__
8
8
  CheckboxPrimitive.Root,
9
9
  {
10
10
  className: cn(
11
- "peer h-4 w-4 shrink-0 rounded border border-input bg-background ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary",
11
+ "peer size-4 shrink-0 rounded border border-input bg-background ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary",
12
12
  className
13
13
  ),
14
14
  ref: reference,
@@ -17,7 +17,7 @@ const Checkbox = React.forwardRef(({ className, ...props }, reference) => /* @__
17
17
  CheckboxPrimitive.Indicator,
18
18
  {
19
19
  className: cn("flex items-center justify-center text-current"),
20
- children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" })
20
+ children: /* @__PURE__ */ jsx(Check, { className: "size-4" })
21
21
  }
22
22
  )
23
23
  }
@@ -21,7 +21,7 @@ function ChecklistItemRow({
21
21
  isChecked ? /* @__PURE__ */ jsx(
22
22
  "svg",
23
23
  {
24
- className: "h-5 w-5 text-green-500 flex-shrink-0 mt-0.5",
24
+ className: "size-5 text-green-500 flex-shrink-0 mt-0.5",
25
25
  fill: "none",
26
26
  stroke: "currentColor",
27
27
  viewBox: "0 0 24 24",
@@ -38,7 +38,7 @@ function ChecklistItemRow({
38
38
  ) : /* @__PURE__ */ jsx(
39
39
  "svg",
40
40
  {
41
- className: "h-5 w-5 text-muted-foreground flex-shrink-0 mt-0.5",
41
+ className: "size-5 text-muted-foreground flex-shrink-0 mt-0.5",
42
42
  fill: "none",
43
43
  stroke: "currentColor",
44
44
  viewBox: "0 0 24 24",
@@ -77,7 +77,7 @@ function ChecklistHeader({
77
77
  /* @__PURE__ */ jsx(
78
78
  "svg",
79
79
  {
80
- className: "h-5 w-5 text-primary",
80
+ className: "size-5 text-primary",
81
81
  fill: "none",
82
82
  stroke: "currentColor",
83
83
  viewBox: "0 0 24 24",
@@ -38,6 +38,7 @@ function ImageMedia({ media }) {
38
38
  ] });
39
39
  }
40
40
  function VideoMedia({ media }) {
41
+ const iframeTitle = media.title || "Embedded timeline video";
41
42
  return /* @__PURE__ */ jsxs("figure", { className: "overflow-hidden rounded-xl border bg-muted", children: [
42
43
  /* @__PURE__ */ jsx("div", { className: "aspect-video w-full", children: /* @__PURE__ */ jsx(
43
44
  "iframe",
@@ -46,7 +47,7 @@ function VideoMedia({ media }) {
46
47
  allowFullScreen: true,
47
48
  className: "h-full w-full",
48
49
  src: media.src,
49
- title: media.title ?? "Embedded video"
50
+ title: iframeTitle
50
51
  }
51
52
  ) }),
52
53
  media.caption || media.credit ? /* @__PURE__ */ jsxs("figcaption", { className: "border-t bg-background px-3 py-2 text-xs text-muted-foreground", children: [
@@ -56,7 +57,7 @@ function VideoMedia({ media }) {
56
57
  ] });
57
58
  }
58
59
  function AudioMedia({ media }) {
59
- return /* @__PURE__ */ jsxs("figure", { className: "overflow-hidden rounded-xl border bg-muted px-3 py-3", children: [
60
+ return /* @__PURE__ */ jsxs("figure", { className: "overflow-hidden rounded-xl border bg-muted p-3", children: [
60
61
  /* @__PURE__ */ jsx(
61
62
  "audio",
62
63
  {
@@ -94,8 +95,8 @@ function RailColumn({ featured }) {
94
95
  "span",
95
96
  {
96
97
  className: cn(
97
- "relative z-10 mt-3 block h-3 w-3 rounded-full border-2 border-background bg-primary",
98
- featured ? "h-4 w-4" : ""
98
+ "relative z-10 mt-3 block size-3 rounded-full border-2 border-background bg-primary",
99
+ featured ? "size-4" : ""
99
100
  )
100
101
  }
101
102
  )
@@ -308,7 +309,7 @@ const ChronologicalTimeline = forwardRef((props, ref) => {
308
309
  ...rest,
309
310
  children: [
310
311
  /* @__PURE__ */ jsx(ProgressStrip, { activeId, ids, label: progressLabel }),
311
- title ? /* @__PURE__ */ jsx("header", { className: "px-6 py-6", children: /* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold tracking-tight", id: titleId, children: title }) }) : null,
312
+ title ? /* @__PURE__ */ jsx("header", { className: "p-6", children: /* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold tracking-tight", id: titleId, children: title }) }) : null,
312
313
  /* @__PURE__ */ jsx(EventList, { activeId, children })
313
314
  ]
314
315
  }
@@ -71,7 +71,7 @@ function CivilizationHero({ color, image, imageAlt }) {
71
71
  className: "h-full w-full object-cover mix-blend-multiply",
72
72
  src: image
73
73
  }
74
- ) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center text-muted-foreground/50", children: /* @__PURE__ */ jsx(Globe, { "aria-hidden": "true", className: "h-12 w-12" }) })
74
+ ) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center text-muted-foreground/50", children: /* @__PURE__ */ jsx(Globe, { "aria-hidden": "true", className: "size-12" }) })
75
75
  }
76
76
  );
77
77
  }
@@ -107,11 +107,11 @@ function CodeBlock({
107
107
  /* @__PURE__ */ jsx(
108
108
  Button,
109
109
  {
110
- className: "h-8 w-8",
110
+ className: "size-8",
111
111
  onClick: handleCopy,
112
112
  size: "icon",
113
113
  variant: "ghost",
114
- children: copied ? /* @__PURE__ */ jsx(Check, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(Copy, { className: "h-3 w-3" })
114
+ children: copied ? /* @__PURE__ */ jsx(Check, { className: "size-3" }) : /* @__PURE__ */ jsx(Copy, { className: "size-3" })
115
115
  }
116
116
  )
117
117
  ] })
@@ -11,11 +11,12 @@ function CodeLine({ highlightLines, line, lineNumber }) {
11
11
  /* @__PURE__ */ jsx("span", { children: line })
12
12
  ] });
13
13
  }
14
+ const EMPTY_HIGHLIGHT_LINES = [];
14
15
  function CodePlayground({
15
16
  children,
16
17
  description,
17
18
  filename,
18
- highlightLines = [],
19
+ highlightLines = EMPTY_HIGHLIGHT_LINES,
19
20
  language = "typescript",
20
21
  showLineNumbers = false,
21
22
  title
@@ -33,7 +34,7 @@ function CodePlayground({
33
34
  return /* @__PURE__ */ jsxs("div", { className: "my-6 rounded-lg border bg-card overflow-hidden", children: [
34
35
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b bg-muted/30", children: [
35
36
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
36
- /* @__PURE__ */ jsx("div", { className: "flex h-8 w-8 items-center justify-center rounded bg-primary/10", children: /* @__PURE__ */ jsx(Code, { className: "h-4 w-4 text-primary" }) }),
37
+ /* @__PURE__ */ jsx("div", { className: "flex size-8 items-center justify-center rounded bg-primary/10", children: /* @__PURE__ */ jsx(Code, { className: "size-4 text-primary" }) }),
37
38
  /* @__PURE__ */ jsxs("div", { children: [
38
39
  /* @__PURE__ */ jsx("h4", { className: "font-semibold text-sm", children: title }),
39
40
  description ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: description }) : null
@@ -41,17 +42,17 @@ function CodePlayground({
41
42
  ] }),
42
43
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43
44
  filename ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
44
- /* @__PURE__ */ jsx(FileCode, { className: "h-3 w-3" }),
45
+ /* @__PURE__ */ jsx(FileCode, { className: "size-3" }),
45
46
  /* @__PURE__ */ jsx("span", { className: "font-mono", children: filename })
46
47
  ] }) : null,
47
48
  /* @__PURE__ */ jsx(
48
49
  Button,
49
50
  {
50
- className: "h-8 w-8",
51
+ className: "size-8",
51
52
  onClick: handleCopy,
52
53
  size: "icon",
53
54
  variant: "ghost",
54
- children: copied ? /* @__PURE__ */ jsx(Check, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(Copy, { className: "h-3 w-3" })
55
+ children: copied ? /* @__PURE__ */ jsx(Check, { className: "size-3" }) : /* @__PURE__ */ jsx(Copy, { className: "size-3" })
55
56
  }
56
57
  )
57
58
  ] })
@@ -63,7 +64,7 @@ function CodePlayground({
63
64
  line,
64
65
  lineNumber: index + 1
65
66
  },
66
- index
67
+ `${line}-${index + 1}`
67
68
  )) }) : /* @__PURE__ */ jsx("code", { children: code }) }) }),
68
69
  /* @__PURE__ */ jsx("div", { className: "px-4 py-2 border-t bg-muted/30", children: /* @__PURE__ */ jsx("span", { className: "text-xs font-mono text-muted-foreground uppercase tracking-wider", children: language }) })
69
70
  ] });
@@ -74,7 +75,7 @@ function FileTree({
74
75
  }) {
75
76
  return /* @__PURE__ */ jsxs("div", { className: "my-6 rounded-lg border bg-card overflow-hidden", children: [
76
77
  /* @__PURE__ */ jsx("div", { className: "px-4 py-2 border-b bg-muted/30", children: /* @__PURE__ */ jsxs("h4", { className: "font-semibold text-sm flex items-center gap-2", children: [
77
- /* @__PURE__ */ jsx(FileCode, { className: "h-4 w-4" }),
78
+ /* @__PURE__ */ jsx(FileCode, { className: "size-4" }),
78
79
  title
79
80
  ] }) }),
80
81
  /* @__PURE__ */ jsx("div", { className: "p-4 font-mono text-sm [&>ul]:m-0 [&>ul]:list-none [&_ul]:ml-4 [&_ul]:list-none [&_li]:text-muted-foreground", children })
@@ -48,7 +48,7 @@ function ComboboxOptionItem({
48
48
  Check,
49
49
  {
50
50
  className: cn(
51
- "mr-2 h-4 w-4",
51
+ "mr-2 size-4",
52
52
  selectedValue === option.value ? "opacity-100" : "opacity-0"
53
53
  )
54
54
  }
@@ -128,7 +128,7 @@ const Combobox = React.forwardRef(
128
128
  variant: "outline",
129
129
  children: [
130
130
  /* @__PURE__ */ jsx("span", { className: "truncate", children: selectedOption ? selectedOption.label : placeholder }),
131
- /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })
131
+ /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-2 size-4 shrink-0 opacity-50" })
132
132
  ]
133
133
  }
134
134
  ) }),
@@ -26,7 +26,7 @@ const CommandDialog = ({ children, ...props }) => {
26
26
  const CommandInput = React.forwardRef(({ className, ...props }, reference) => (
27
27
  // eslint-disable-next-line react/no-unknown-property
28
28
  /* @__PURE__ */ jsxs("div", { className: "flex items-center border-b px-3", "cmdk-input-wrapper": "", children: [
29
- /* @__PURE__ */ jsx(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
29
+ /* @__PURE__ */ jsx(Search, { className: "mr-2 size-4 shrink-0 opacity-50" }),
30
30
  /* @__PURE__ */ jsx(
31
31
  CommandPrimitive.Input,
32
32
  {
@@ -21,7 +21,7 @@ const PinBody = (props) => {
21
21
  {
22
22
  "aria-hidden": "true",
23
23
  className: cn(
24
- "flex h-7 w-7 items-center justify-center rounded-full border border-background text-[11px] font-semibold shadow-sm",
24
+ "flex size-7 items-center justify-center rounded-full border border-background text-[11px] font-semibold shadow-sm",
25
25
  STATE_FILL[props.state]
26
26
  ),
27
27
  "data-comment-pin-body": true,
@@ -53,18 +53,18 @@ function Comparison({
53
53
  children: before.title
54
54
  }
55
55
  ),
56
- /* @__PURE__ */ jsx("ul", { className: "p-4 space-y-2", children: before.items.map((item, index) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-sm", children: [
56
+ /* @__PURE__ */ jsx("ul", { className: "p-4 space-y-2", children: before.items.map((item) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-sm", children: [
57
57
  /* @__PURE__ */ jsx(
58
58
  BeforeIcon,
59
59
  {
60
60
  className: cn(
61
- "h-4 w-4 mt-0.5 flex-shrink-0",
61
+ "size-4 mt-0.5 flex-shrink-0",
62
62
  beforeConfig.iconClass
63
63
  )
64
64
  }
65
65
  ),
66
66
  /* @__PURE__ */ jsx("span", { children: item })
67
- ] }, index)) })
67
+ ] }, item)) })
68
68
  ] }),
69
69
  /* @__PURE__ */ jsxs("div", { className: cn("rounded-lg border", afterConfig.className), children: [
70
70
  /* @__PURE__ */ jsx(
@@ -77,18 +77,18 @@ function Comparison({
77
77
  children: after.title
78
78
  }
79
79
  ),
80
- /* @__PURE__ */ jsx("ul", { className: "p-4 space-y-2", children: after.items.map((item, index) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-sm", children: [
80
+ /* @__PURE__ */ jsx("ul", { className: "p-4 space-y-2", children: after.items.map((item) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-sm", children: [
81
81
  /* @__PURE__ */ jsx(
82
82
  AfterIcon,
83
83
  {
84
84
  className: cn(
85
- "h-4 w-4 mt-0.5 flex-shrink-0",
85
+ "size-4 mt-0.5 flex-shrink-0",
86
86
  afterConfig.iconClass
87
87
  )
88
88
  }
89
89
  ),
90
90
  /* @__PURE__ */ jsx("span", { children: item })
91
- ] }, index)) })
91
+ ] }, item)) })
92
92
  ] })
93
93
  ] })
94
94
  ] });
@@ -99,15 +99,15 @@ function BeforeAfter({ after, before, title }) {
99
99
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-[1fr_auto_1fr] gap-4 items-start", children: [
100
100
  /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-red-500/30 bg-red-500/5 overflow-hidden", children: [
101
101
  /* @__PURE__ */ jsxs("div", { className: "px-4 py-2 bg-red-500/10 text-red-700 dark:text-red-300 font-medium text-sm flex items-center gap-2", children: [
102
- /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
102
+ /* @__PURE__ */ jsx(X, { className: "size-4" }),
103
103
  "Before"
104
104
  ] }),
105
105
  /* @__PURE__ */ jsx("div", { className: "p-4 text-sm [&>pre]:my-0", children: before })
106
106
  ] }),
107
- /* @__PURE__ */ jsx("div", { className: "hidden md:flex items-center justify-center h-full", children: /* @__PURE__ */ jsx(ArrowRight, { className: "h-6 w-6 text-muted-foreground" }) }),
107
+ /* @__PURE__ */ jsx("div", { className: "hidden md:flex items-center justify-center h-full", children: /* @__PURE__ */ jsx(ArrowRight, { className: "size-6 text-muted-foreground" }) }),
108
108
  /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-green-500/30 bg-green-500/5 overflow-hidden", children: [
109
109
  /* @__PURE__ */ jsxs("div", { className: "px-4 py-2 bg-green-500/10 text-green-700 dark:text-green-300 font-medium text-sm flex items-center gap-2", children: [
110
- /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }),
110
+ /* @__PURE__ */ jsx(Check, { className: "size-4" }),
111
111
  "After"
112
112
  ] }),
113
113
  /* @__PURE__ */ jsx("div", { className: "p-4 text-sm [&>pre]:my-0", children: after })
@@ -39,7 +39,7 @@ function DialogContent({
39
39
  children: closeIcon ?? /* @__PURE__ */ jsx(
40
40
  "svg",
41
41
  {
42
- className: "h-4 w-4",
42
+ className: "size-4",
43
43
  fill: "none",
44
44
  stroke: "currentColor",
45
45
  viewBox: "0 0 24 24",
@@ -8,12 +8,13 @@ const DEFAULT_LABELS = {
8
8
  startLabel: "Start Tutorial",
9
9
  tableOfContentsLabel: "Table of Contents"
10
10
  };
11
+ const EMPTY_CONTENT_INTRO_LABELS = {};
11
12
  function ContentIntroImpl({
12
13
  additionalContent,
13
14
  completedSections,
14
15
  estimatedTime,
15
16
  isLoading = false,
16
- labels = {},
17
+ labels = EMPTY_CONTENT_INTRO_LABELS,
17
18
  onGoToSection,
18
19
  onStart,
19
20
  renderIntroContent,
@@ -60,7 +61,7 @@ function ContentIntroImpl({
60
61
  "span",
61
62
  {
62
63
  className: cn(
63
- "flex-shrink-0 w-6 h-6 rounded-full flex items-center justify-center text-xs font-medium tabular-nums transition-colors",
64
+ "flex-shrink-0 size-6 rounded-full flex items-center justify-center text-xs font-medium tabular-nums transition-colors",
64
65
  isLoading && "animate-pulse bg-muted",
65
66
  !isLoading && isCompleted && "bg-foreground text-background",
66
67
  !isLoading && !isCompleted && "bg-muted"
@@ -68,7 +69,7 @@ function ContentIntroImpl({
68
69
  children: isCompleted ? /* @__PURE__ */ jsx(
69
70
  "svg",
70
71
  {
71
- className: "h-3 w-3",
72
+ className: "size-3",
72
73
  fill: "none",
73
74
  stroke: "currentColor",
74
75
  viewBox: "0 0 24 24",
@@ -97,12 +98,12 @@ function ContentIntroImpl({
97
98
  )
98
99
  ]
99
100
  }
100
- ) }, `${section.id}-${index}`);
101
+ ) }, section.id);
101
102
  }) })
102
103
  ] }),
103
104
  additionalContent
104
105
  ] }),
105
- /* @__PURE__ */ jsx("div", { className: "fixed bottom-0 left-0 right-0 z-50 border-t border-border bg-background/80 backdrop-blur-sm safe-bottom", children: /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-3xl px-4 py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4", children: [
106
+ /* @__PURE__ */ jsx("div", { className: "fixed bottom-0 left-0 right-0 z-50 border-t border-border bg-background/80 backdrop-blur-sm safe-bottom", children: /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-3xl p-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4", children: [
106
107
  /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground hidden sm:block", children: hasProgress ? `${completedSections.size}/${sections.length} completed` : `${sections.length} sections \xB7 ${estimatedTime}` }),
107
108
  /* @__PURE__ */ jsxs(
108
109
  Button,
@@ -114,7 +115,7 @@ function ContentIntroImpl({
114
115
  /* @__PURE__ */ jsx(
115
116
  "svg",
116
117
  {
117
- className: "h-5 w-5",
118
+ className: "size-5",
118
119
  fill: "none",
119
120
  stroke: "currentColor",
120
121
  viewBox: "0 0 24 24",
@@ -22,7 +22,7 @@ const ContextMenuSubTrigger = forwardRef(({ children, className, inset, ...props
22
22
  ...props,
23
23
  children: [
24
24
  children,
25
- /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto h-4 w-4" })
25
+ /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto size-4" })
26
26
  ]
27
27
  }
28
28
  ));
@@ -75,7 +75,7 @@ const ContextMenuCheckboxItem = forwardRef(({ checked, children, className, ...p
75
75
  ref,
76
76
  ...props,
77
77
  children: [
78
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) }) }),
78
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "size-4" }) }) }),
79
79
  children
80
80
  ]
81
81
  }
@@ -91,7 +91,7 @@ const ContextMenuRadioItem = forwardRef(({ children, className, ...props }, ref)
91
91
  ref,
92
92
  ...props,
93
93
  children: [
94
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "h-2 w-2 fill-current" }) }) }),
94
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "size-2 fill-current" }) }) }),
95
95
  children
96
96
  ]
97
97
  }
@@ -113,7 +113,7 @@ ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;
113
113
  const ContextMenuSeparator = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
114
114
  ContextMenuPrimitive.Separator,
115
115
  {
116
- className: cn("-mx-1 my-1 h-px bg-border", className),
116
+ className: cn("-m-1 h-px bg-border", className),
117
117
  ref,
118
118
  ...props
119
119
  }
@@ -35,7 +35,7 @@ function MessageActions({ messageId }) {
35
35
  onRetry(messageId);
36
36
  },
37
37
  type: "button",
38
- children: /* @__PURE__ */ jsx(RefreshCw, { className: "h-3 w-3" })
38
+ children: /* @__PURE__ */ jsx(RefreshCw, { className: "size-3" })
39
39
  }
40
40
  ) : null,
41
41
  onFeedback ? /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -48,7 +48,7 @@ function MessageActions({ messageId }) {
48
48
  onFeedback(messageId, "positive");
49
49
  },
50
50
  type: "button",
51
- children: /* @__PURE__ */ jsx(ThumbsUp, { className: "h-3 w-3" })
51
+ children: /* @__PURE__ */ jsx(ThumbsUp, { className: "size-3" })
52
52
  }
53
53
  ),
54
54
  /* @__PURE__ */ jsx(
@@ -60,7 +60,7 @@ function MessageActions({ messageId }) {
60
60
  onFeedback(messageId, "negative");
61
61
  },
62
62
  type: "button",
63
- children: /* @__PURE__ */ jsx(ThumbsDown, { className: "h-3 w-3" })
63
+ children: /* @__PURE__ */ jsx(ThumbsDown, { className: "size-3" })
64
64
  }
65
65
  )
66
66
  ] }) : null
@@ -290,13 +290,13 @@ const ConversationScrollButton = forwardRef(({ className }, reference) => {
290
290
  {
291
291
  "aria-label": "Scroll to bottom",
292
292
  className: cn(
293
- "absolute bottom-4 right-4 flex h-8 w-8 items-center justify-center rounded-full border bg-background shadow-md transition-colors hover:bg-muted",
293
+ "absolute bottom-4 right-4 flex size-8 items-center justify-center rounded-full border bg-background shadow-md transition-colors hover:bg-muted",
294
294
  className
295
295
  ),
296
296
  onClick: scrollToBottom,
297
297
  ref: reference,
298
298
  type: "button",
299
- children: /* @__PURE__ */ jsx(ArrowDown, { className: "h-4 w-4" })
299
+ children: /* @__PURE__ */ jsx(ArrowDown, { className: "size-4" })
300
300
  }
301
301
  );
302
302
  });
@@ -319,18 +319,18 @@ const ConversationLoading = forwardRef(({ className }, reference) => {
319
319
  /* @__PURE__ */ jsx(
320
320
  "span",
321
321
  {
322
- className: "h-2 w-2 animate-bounce rounded-full bg-muted-foreground",
322
+ className: "size-2 animate-bounce rounded-full bg-muted-foreground",
323
323
  style: { animationDelay: "-0.3s" }
324
324
  }
325
325
  ),
326
326
  /* @__PURE__ */ jsx(
327
327
  "span",
328
328
  {
329
- className: "h-2 w-2 animate-bounce rounded-full bg-muted-foreground",
329
+ className: "size-2 animate-bounce rounded-full bg-muted-foreground",
330
330
  style: { animationDelay: "-0.15s" }
331
331
  }
332
332
  ),
333
- /* @__PURE__ */ jsx("span", { className: "h-2 w-2 animate-bounce rounded-full bg-muted-foreground" })
333
+ /* @__PURE__ */ jsx("span", { className: "size-2 animate-bounce rounded-full bg-muted-foreground" })
334
334
  ]
335
335
  }
336
336
  );
@@ -160,7 +160,7 @@ const CookieConsent = forwardRef(
160
160
  className: "absolute -right-2 -top-2 rounded-full border bg-background p-1 text-muted-foreground hover:text-foreground",
161
161
  onClick: handleClose,
162
162
  type: "button",
163
- children: /* @__PURE__ */ jsx(X, { className: "h-3 w-3" })
163
+ children: /* @__PURE__ */ jsx(X, { className: "size-3" })
164
164
  }
165
165
  ) : null
166
166
  ]
@@ -59,7 +59,7 @@ function CopyIcon({
59
59
  size
60
60
  }) {
61
61
  const Icon = copied ? Check : Copy;
62
- const sizeClass = size === "xs" ? "h-3 w-3" : "h-4 w-4";
62
+ const sizeClass = size === "xs" ? "size-3" : "size-4";
63
63
  return /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true", className: cn(sizeClass, className) });
64
64
  }
65
65
  const ButtonTrigger = forwardRef(
@@ -101,7 +101,7 @@ const ButtonTrigger = forwardRef(
101
101
  {
102
102
  "aria-label": accessibleLabel,
103
103
  className: cn(
104
- "h-6 w-6 align-middle text-muted-foreground hover:text-foreground",
104
+ "size-6 align-middle text-muted-foreground hover:text-foreground",
105
105
  className
106
106
  ),
107
107
  onClick: onClickHandler,
@@ -118,7 +118,7 @@ const ButtonTrigger = forwardRef(
118
118
  Button,
119
119
  {
120
120
  "aria-label": accessibleLabel,
121
- className: cn("h-8 w-8", className),
121
+ className: cn("size-8", className),
122
122
  onClick: onClickHandler,
123
123
  ref,
124
124
  size: "icon",
@@ -73,14 +73,15 @@ function formatSegments(milliseconds) {
73
73
  { label: "Seconds", value: String(seconds).padStart(2, "0") }
74
74
  ];
75
75
  }
76
+ const DEADLINE_FORMATTER = new Intl.DateTimeFormat("en-US", {
77
+ day: "numeric",
78
+ hour: "numeric",
79
+ minute: "2-digit",
80
+ month: "short",
81
+ timeZoneName: "short"
82
+ });
76
83
  function formatDeadline(date) {
77
- return new Intl.DateTimeFormat("en-US", {
78
- day: "numeric",
79
- hour: "numeric",
80
- minute: "2-digit",
81
- month: "short",
82
- timeZoneName: "short"
83
- }).format(date);
84
+ return DEADLINE_FORMATTER.format(date);
84
85
  }
85
86
  function getProgress(deadline, now, startedAt) {
86
87
  if (!startedAt) {
@@ -40,13 +40,7 @@ const CreditBadge = React.forwardRef(
40
40
  ref: reference,
41
41
  ...props,
42
42
  children: [
43
- /* @__PURE__ */ jsx(
44
- "span",
45
- {
46
- "aria-hidden": "true",
47
- className: "h-1.5 w-1.5 rounded-full bg-current"
48
- }
49
- ),
43
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "size-1.5 rounded-full bg-current" }),
50
44
  /* @__PURE__ */ jsx("span", { children: amount ? `${amount} \u2022 ${label ?? getStatusLabel(status)}` : label ?? getStatusLabel(status) })
51
45
  ]
52
46
  }
@@ -56,15 +56,15 @@ function statusLabel(status) {
56
56
  }
57
57
  function statusIcon(status) {
58
58
  if (status === "completed") {
59
- return /* @__PURE__ */ jsx(CheckCircle2, { className: "h-4 w-4 flex-shrink-0 text-green-500" });
59
+ return /* @__PURE__ */ jsx(CheckCircle2, { className: "size-4 flex-shrink-0 text-green-500" });
60
60
  }
61
61
  if (status === "in-progress") {
62
- return /* @__PURE__ */ jsx(PlayCircle, { className: "h-4 w-4 flex-shrink-0 text-primary" });
62
+ return /* @__PURE__ */ jsx(PlayCircle, { className: "size-4 flex-shrink-0 text-primary" });
63
63
  }
64
64
  if (status === "locked") {
65
- return /* @__PURE__ */ jsx(Lock, { className: "h-4 w-4 flex-shrink-0 text-muted-foreground" });
65
+ return /* @__PURE__ */ jsx(Lock, { className: "size-4 flex-shrink-0 text-muted-foreground" });
66
66
  }
67
- return /* @__PURE__ */ jsx(BookOpen, { className: "h-4 w-4 flex-shrink-0 text-muted-foreground" });
67
+ return /* @__PURE__ */ jsx(BookOpen, { className: "size-4 flex-shrink-0 text-muted-foreground" });
68
68
  }
69
69
  const difficultyStyles = {
70
70
  advanced: "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",
@@ -105,7 +105,7 @@ function LessonMeta({
105
105
  "aria-label": prerequisitesLabel,
106
106
  className: "flex items-center gap-1 text-xs text-muted-foreground",
107
107
  title: prerequisitesLabel,
108
- children: /* @__PURE__ */ jsx(Link2, { "aria-hidden": "true", className: "h-3 w-3" })
108
+ children: /* @__PURE__ */ jsx(Link2, { "aria-hidden": "true", className: "size-3" })
109
109
  }
110
110
  ) : null,
111
111
  difficulty ? /* @__PURE__ */ jsx(
@@ -119,7 +119,7 @@ function LessonMeta({
119
119
  }
120
120
  ) : null,
121
121
  duration ? /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
122
- /* @__PURE__ */ jsx(Clock, { className: "h-3 w-3" }),
122
+ /* @__PURE__ */ jsx(Clock, { className: "size-3" }),
123
123
  duration
124
124
  ] }) : null
125
125
  ] });
@@ -162,7 +162,7 @@ function ModuleTrigger({
162
162
  ] }),
163
163
  /* @__PURE__ */ jsxs("div", { className: "mt-0.5 flex flex-shrink-0 items-center gap-3", children: [
164
164
  estimatedHours === void 0 ? null : /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
165
- /* @__PURE__ */ jsx(Clock, { className: "h-3.5 w-3.5" }),
165
+ /* @__PURE__ */ jsx(Clock, { className: "size-3.5" }),
166
166
  estimatedHours,
167
167
  "h"
168
168
  ] }),
@@ -170,7 +170,7 @@ function ModuleTrigger({
170
170
  ChevronDown,
171
171
  {
172
172
  className: cn(
173
- "h-4 w-4 text-muted-foreground transition-transform duration-200",
173
+ "size-4 text-muted-foreground transition-transform duration-200",
174
174
  isExpanded && "rotate-180"
175
175
  )
176
176
  }
@@ -215,11 +215,11 @@ function CurriculumRoot({
215
215
  children: [
216
216
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b px-6 py-4", children: [
217
217
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
218
- /* @__PURE__ */ jsx(GraduationCap, { className: "h-5 w-5 text-primary" }),
218
+ /* @__PURE__ */ jsx(GraduationCap, { className: "size-5 text-primary" }),
219
219
  /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: title })
220
220
  ] }),
221
221
  totalHours === void 0 ? null : /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-sm text-muted-foreground", children: [
222
- /* @__PURE__ */ jsx(Clock, { className: "h-4 w-4" }),
222
+ /* @__PURE__ */ jsx(Clock, { className: "size-4" }),
223
223
  /* @__PURE__ */ jsxs("span", { children: [
224
224
  totalHours,
225
225
  "h total"
@@ -18,7 +18,7 @@ const dataListVariants = cva(
18
18
  }
19
19
  );
20
20
  const dataListItemVariants = cva(
21
- "grid gap-1 px-4 py-4 sm:grid-cols-[minmax(0,12rem)_1fr] sm:gap-4 sm:px-5",
21
+ "grid gap-1 p-4 sm:grid-cols-[minmax(0,12rem)_1fr] sm:gap-4 sm:px-5",
22
22
  {
23
23
  defaultVariants: {
24
24
  density: "default"