@vllnt/ui 0.2.1 → 0.3.0-canary.f3cafe8

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 (325) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +59 -30
  3. package/dist/components/accordion/accordion.js +2 -2
  4. package/dist/components/activity-heatmap/activity-heatmap.js +17 -14
  5. package/dist/components/activity-log/activity-log.js +12 -11
  6. package/dist/components/agent-activity/agent-activity.js +317 -0
  7. package/dist/components/agent-activity/index.js +18 -0
  8. package/dist/components/ai-artifact/ai-artifact.js +439 -0
  9. package/dist/components/ai-artifact/index.js +24 -0
  10. package/dist/components/ai-chat-input/ai-chat-input.js +6 -4
  11. package/dist/components/ai-message-bubble/ai-message-bubble.js +3 -3
  12. package/dist/components/ai-sidebar/ai-sidebar.js +255 -0
  13. package/dist/components/ai-sidebar/index.js +22 -0
  14. package/dist/components/ai-source-citation/ai-source-citation.js +2 -2
  15. package/dist/components/ai-tool-call-display/ai-tool-call-display.js +5 -5
  16. package/dist/components/alert-pulse/alert-pulse.js +93 -0
  17. package/dist/components/alert-pulse/index.js +6 -0
  18. package/dist/components/anchor-port/anchor-port.js +51 -0
  19. package/dist/components/anchor-port/index.js +4 -0
  20. package/dist/components/animated-text/animated-text.js +8 -7
  21. package/dist/components/annotation/annotation.js +1 -1
  22. package/dist/components/auto-reload/auto-reload.js +401 -0
  23. package/dist/components/auto-reload/index.js +6 -0
  24. package/dist/components/avatar/avatar.js +1 -1
  25. package/dist/components/avatar-group/avatar-group.js +5 -5
  26. package/dist/components/banner/banner.js +155 -0
  27. package/dist/components/banner/index.js +10 -0
  28. package/dist/components/blog-card/blog-card.js +5 -3
  29. package/dist/components/border-beam/border-beam.js +2 -2
  30. package/dist/components/bottom-activity-strip/bottom-activity-strip.js +91 -0
  31. package/dist/components/bottom-activity-strip/index.js +6 -0
  32. package/dist/components/bottom-bar/bottom-bar.js +25 -0
  33. package/dist/components/bottom-bar/index.js +4 -0
  34. package/dist/components/breadcrumb/breadcrumb.js +33 -26
  35. package/dist/components/button/button.js +1 -1
  36. package/dist/components/calendar/calendar.js +6 -6
  37. package/dist/components/callout/callout.js +1 -1
  38. package/dist/components/candlestick-chart/candlestick-chart.js +13 -12
  39. package/dist/components/canvas-shell/canvas-foundation-demo.js +183 -0
  40. package/dist/components/canvas-shell/canvas-shell-route-config.js +0 -0
  41. package/dist/components/canvas-shell/canvas-shell.js +261 -0
  42. package/dist/components/canvas-shell/index.js +4 -0
  43. package/dist/components/canvas-view/canvas-view.js +504 -0
  44. package/dist/components/canvas-view/index.js +6 -0
  45. package/dist/components/carousel/carousel.js +18 -10
  46. package/dist/components/category-filter/category-filter.js +1 -1
  47. package/dist/components/chart/area-chart.js +1 -0
  48. package/dist/components/chart/line-chart.js +1 -0
  49. package/dist/components/chat-dock-section/chat-dock-section.js +56 -0
  50. package/dist/components/chat-dock-section/index.js +6 -0
  51. package/dist/components/checkbox/checkbox.js +2 -2
  52. package/dist/components/checklist/checklist.js +45 -10
  53. package/dist/components/checklist/index.js +10 -2
  54. package/dist/components/choropleth-map/choropleth-map.js +378 -0
  55. package/dist/components/choropleth-map/index.js +10 -0
  56. package/dist/components/chronological-timeline/chronological-timeline.js +343 -0
  57. package/dist/components/chronological-timeline/index.js +8 -0
  58. package/dist/components/civilization-card/civilization-card.js +275 -0
  59. package/dist/components/civilization-card/index.js +8 -0
  60. package/dist/components/code-block/code-block.js +33 -12
  61. package/dist/components/code-playground/code-playground.js +12 -9
  62. package/dist/components/combobox/combobox.js +49 -30
  63. package/dist/components/command/command.js +1 -1
  64. package/dist/components/comment-pin/comment-pin.js +104 -0
  65. package/dist/components/comment-pin/index.js +6 -0
  66. package/dist/components/comparison/comparison.js +11 -10
  67. package/dist/components/completion-dialog/completion-dialog.js +20 -12
  68. package/dist/components/connector-edge/connector-edge.js +66 -0
  69. package/dist/components/connector-edge/index.js +6 -0
  70. package/dist/components/content-intro/content-intro.js +25 -21
  71. package/dist/components/context-lens/context-lens.js +98 -0
  72. package/dist/components/context-lens/index.js +6 -0
  73. package/dist/components/context-menu/context-menu.js +4 -4
  74. package/dist/components/conversation-thread/conversation-thread.js +348 -0
  75. package/dist/components/conversation-thread/index.js +20 -0
  76. package/dist/components/cookie-consent/cookie-consent.js +1 -1
  77. package/dist/components/copy-button/copy-button.js +189 -0
  78. package/dist/components/copy-button/index.js +8 -0
  79. package/dist/components/countdown-timer/countdown-timer.js +10 -9
  80. package/dist/components/credit-badge/credit-badge.js +1 -7
  81. package/dist/components/curriculum/curriculum.js +349 -0
  82. package/dist/components/curriculum/index.js +10 -0
  83. package/dist/components/data-list/data-list.js +2 -1
  84. package/dist/components/data-table/data-table.js +10 -9
  85. package/dist/components/date-picker/date-picker.js +4 -9
  86. package/dist/components/dialog/dialog.js +1 -1
  87. package/dist/components/document-sibling-nav/document-sibling-nav.js +111 -0
  88. package/dist/components/document-sibling-nav/index.js +8 -0
  89. package/dist/components/dropdown-menu/dropdown-menu.js +3 -3
  90. package/dist/components/edge-label/edge-label.js +26 -0
  91. package/dist/components/edge-label/index.js +4 -0
  92. package/dist/components/empty-state/empty-state.js +93 -0
  93. package/dist/components/empty-state/index.js +8 -0
  94. package/dist/components/era-comparison/era-comparison.js +216 -0
  95. package/dist/components/era-comparison/index.js +16 -0
  96. package/dist/components/exercise/exercise.js +15 -7
  97. package/dist/components/faq/faq.js +8 -4
  98. package/dist/components/file-upload/file-upload.js +4 -9
  99. package/dist/components/filter-bar/filter-bar.js +9 -8
  100. package/dist/components/flashcard/flashcard.js +10 -4
  101. package/dist/components/floating-action-button/floating-action-button.js +1 -1
  102. package/dist/components/floating-toolbar/floating-toolbar.js +66 -0
  103. package/dist/components/floating-toolbar/index.js +6 -0
  104. package/dist/components/flow-diagram/flow-controls.js +9 -9
  105. package/dist/components/flow-diagram/flow-error-boundary.js +2 -2
  106. package/dist/components/flow-diagram/flow-fullscreen.js +2 -2
  107. package/dist/components/follow-mode/follow-mode.js +89 -0
  108. package/dist/components/follow-mode/index.js +6 -0
  109. package/dist/components/form/form.js +432 -0
  110. package/dist/components/form/index.js +20 -0
  111. package/dist/components/gantt-chart/gantt-chart.js +334 -0
  112. package/dist/components/gantt-chart/index.js +6 -0
  113. package/dist/components/geography-quiz-map/geography-quiz-map.js +344 -0
  114. package/dist/components/geography-quiz-map/index.js +12 -0
  115. package/dist/components/glass-panel/glass-panel.js +21 -0
  116. package/dist/components/glass-panel/index.js +4 -0
  117. package/dist/components/globe-3d/globe-3d.js +429 -0
  118. package/dist/components/globe-3d/index.js +10 -0
  119. package/dist/components/group-hull/group-hull.js +29 -0
  120. package/dist/components/group-hull/index.js +4 -0
  121. package/dist/components/handoff-beacon/handoff-beacon.js +78 -0
  122. package/dist/components/handoff-beacon/index.js +6 -0
  123. package/dist/components/heat-map-overlay/heat-map-overlay.js +215 -0
  124. package/dist/components/heat-map-overlay/index.js +6 -0
  125. package/dist/components/heat-overlay/heat-overlay.js +92 -0
  126. package/dist/components/heat-overlay/index.js +6 -0
  127. package/dist/components/historic-timeline/historic-timeline.js +342 -0
  128. package/dist/components/historic-timeline/index.js +6 -0
  129. package/dist/components/historical-figure-card/historical-figure-card.js +270 -0
  130. package/dist/components/historical-figure-card/index.js +6 -0
  131. package/dist/components/horizontal-scroll-row/horizontal-scroll-row.js +6 -5
  132. package/dist/components/index.js +570 -1
  133. package/dist/components/infinite-plane/index.js +6 -0
  134. package/dist/components/infinite-plane/infinite-plane.js +75 -0
  135. package/dist/components/inline-input/inline-input.js +1 -1
  136. package/dist/components/input-otp/input-otp.js +1 -1
  137. package/dist/components/interactive-timeline/index.js +16 -0
  138. package/dist/components/interactive-timeline/interactive-timeline.js +724 -0
  139. package/dist/components/jarvis-dock/index.js +6 -0
  140. package/dist/components/jarvis-dock/jarvis-dock.js +98 -0
  141. package/dist/components/kbd/index.js +5 -0
  142. package/dist/components/kbd/kbd.js +125 -0
  143. package/dist/components/key-concept/key-concept.js +6 -5
  144. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +4 -3
  145. package/dist/components/knowledge-check/index.js +6 -0
  146. package/dist/components/knowledge-check/knowledge-check.js +473 -0
  147. package/dist/components/lang-provider/lang-provider.js +3 -3
  148. package/dist/components/learning-objectives/learning-objectives.js +14 -13
  149. package/dist/components/left-rail/index.js +4 -0
  150. package/dist/components/left-rail/left-rail.js +25 -0
  151. package/dist/components/live-cursor/index.js +6 -0
  152. package/dist/components/live-cursor/live-cursor.js +62 -0
  153. package/dist/components/live-feed/live-feed.js +18 -16
  154. package/dist/components/map-2d/index.js +20 -0
  155. package/dist/components/map-2d/map-2d.js +455 -0
  156. package/dist/components/map-timeline/index.js +16 -0
  157. package/dist/components/map-timeline/map-timeline.js +506 -0
  158. package/dist/components/market-treemap/market-treemap.js +3 -3
  159. package/dist/components/mdx-content/mdx-content.js +21 -10
  160. package/dist/components/menubar/menubar.js +4 -4
  161. package/dist/components/metric-cluster/index.js +6 -0
  162. package/dist/components/metric-cluster/metric-cluster.js +96 -0
  163. package/dist/components/metric-gauge/metric-gauge.js +3 -3
  164. package/dist/components/mini-map-panel/index.js +6 -0
  165. package/dist/components/mini-map-panel/mini-map-panel.js +74 -0
  166. package/dist/components/model-comparison/index.js +12 -0
  167. package/dist/components/model-comparison/model-comparison.js +230 -0
  168. package/dist/components/model-selector/model-selector.js +8 -8
  169. package/dist/components/multi-select/index.js +6 -0
  170. package/dist/components/multi-select/multi-select.js +258 -0
  171. package/dist/components/multi-select-lasso/index.js +6 -0
  172. package/dist/components/multi-select-lasso/multi-select-lasso.js +76 -0
  173. package/dist/components/navbar-saas/navbar-saas.js +11 -10
  174. package/dist/components/navigation-menu/navigation-menu.js +2 -2
  175. package/dist/components/newsletter-signup/index.js +8 -0
  176. package/dist/components/newsletter-signup/newsletter-signup.js +269 -0
  177. package/dist/components/number-input/number-input.js +2 -2
  178. package/dist/components/number-ticker/number-ticker.js +11 -4
  179. package/dist/components/object-card/index.js +6 -0
  180. package/dist/components/object-card/object-card.js +126 -0
  181. package/dist/components/object-handle/index.js +4 -0
  182. package/dist/components/object-handle/object-handle.js +38 -0
  183. package/dist/components/object-inspector/index.js +6 -0
  184. package/dist/components/object-inspector/object-inspector.js +136 -0
  185. package/dist/components/order-book/order-book.js +2 -2
  186. package/dist/components/overview-board/index.js +8 -0
  187. package/dist/components/overview-board/overview-board.js +127 -0
  188. package/dist/components/parallel-timeline/index.js +6 -0
  189. package/dist/components/parallel-timeline/parallel-timeline.js +251 -0
  190. package/dist/components/password-input/password-input.js +1 -1
  191. package/dist/components/plan-badge/plan-badge.js +1 -7
  192. package/dist/components/playback-ghost/index.js +6 -0
  193. package/dist/components/playback-ghost/playback-ghost.js +83 -0
  194. package/dist/components/policy-delivery-panel/index.js +6 -0
  195. package/dist/components/policy-delivery-panel/policy-delivery-panel.js +99 -0
  196. package/dist/components/presence-stack/index.js +6 -0
  197. package/dist/components/presence-stack/presence-stack.js +108 -0
  198. package/dist/components/presence-sync-indicator/index.js +6 -0
  199. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +73 -0
  200. package/dist/components/pricing-table/index.js +8 -0
  201. package/dist/components/pricing-table/pricing-table.js +284 -0
  202. package/dist/components/primary-source-viewer/index.js +26 -0
  203. package/dist/components/primary-source-viewer/primary-source-viewer.js +439 -0
  204. package/dist/components/pro-tip/pro-tip.js +6 -6
  205. package/dist/components/profile-section/profile-section.js +3 -2
  206. package/dist/components/progress-card/progress-card.js +6 -5
  207. package/dist/components/progress-tracker/index.js +20 -0
  208. package/dist/components/progress-tracker/progress-tracker.js +537 -0
  209. package/dist/components/prompt-templates/index.js +6 -0
  210. package/dist/components/prompt-templates/prompt-templates.js +395 -0
  211. package/dist/components/property-section/index.js +6 -0
  212. package/dist/components/property-section/property-section.js +101 -0
  213. package/dist/components/quiz/quiz.js +7 -6
  214. package/dist/components/radio-group/radio-group.js +2 -2
  215. package/dist/components/rating/rating.js +3 -3
  216. package/dist/components/relationship-inspector/index.js +6 -0
  217. package/dist/components/relationship-inspector/relationship-inspector.js +102 -0
  218. package/dist/components/resizable/resizable.js +1 -1
  219. package/dist/components/right-dock/index.js +4 -0
  220. package/dist/components/right-dock/right-dock.js +28 -0
  221. package/dist/components/route-map/index.js +6 -0
  222. package/dist/components/route-map/route-map.js +339 -0
  223. package/dist/components/routing-assignment-panel/index.js +6 -0
  224. package/dist/components/routing-assignment-panel/routing-assignment-panel.js +122 -0
  225. package/dist/components/run-timeline/index.js +6 -0
  226. package/dist/components/run-timeline/run-timeline.js +221 -0
  227. package/dist/components/runtime-overview-panel/index.js +6 -0
  228. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +89 -0
  229. package/dist/components/scope-selector/scope-selector.js +13 -13
  230. package/dist/components/search-bar/search-bar.js +24 -2
  231. package/dist/components/search-dialog/search-dialog.js +485 -52
  232. package/dist/components/segmented-control/index.js +12 -0
  233. package/dist/components/segmented-control/segmented-control.js +61 -0
  234. package/dist/components/select/select.js +5 -5
  235. package/dist/components/selection-halo/index.js +6 -0
  236. package/dist/components/selection-halo/selection-halo.js +72 -0
  237. package/dist/components/selection-presence/index.js +6 -0
  238. package/dist/components/selection-presence/selection-presence.js +50 -0
  239. package/dist/components/severity-badge/severity-badge.js +2 -2
  240. package/dist/components/share-dialog/share-dialog.js +2 -2
  241. package/dist/components/share-section/share-section.js +2 -1
  242. package/dist/components/sheet/sheet.js +1 -1
  243. package/dist/components/sidebar/sidebar.js +31 -26
  244. package/dist/components/sidebar-toggle/sidebar-toggle.js +5 -3
  245. package/dist/components/slider/slider.js +1 -1
  246. package/dist/components/slideshow/slideshow.js +15 -13
  247. package/dist/components/snap-guides/index.js +6 -0
  248. package/dist/components/snap-guides/snap-guides.js +45 -0
  249. package/dist/components/social-fab/social-fab.js +12 -11
  250. package/dist/components/sparkline-grid/sparkline-grid.js +4 -3
  251. package/dist/components/spinner/spinner.js +4 -4
  252. package/dist/components/spinner/unicode-spinner.js +5 -2
  253. package/dist/components/stat-card/stat-card.js +5 -5
  254. package/dist/components/state-badge-overlay/index.js +6 -0
  255. package/dist/components/state-badge-overlay/state-badge-overlay.js +90 -0
  256. package/dist/components/static-code/index.js +4 -0
  257. package/dist/components/static-code/static-code-copy.js +24 -0
  258. package/dist/components/static-code/static-code.js +41 -0
  259. package/dist/components/status-board/status-board.js +15 -8
  260. package/dist/components/status-indicator/status-indicator.js +3 -3
  261. package/dist/components/step-by-step/step-by-step.js +10 -8
  262. package/dist/components/step-navigation/step-navigation.js +2 -2
  263. package/dist/components/stepper/stepper.js +3 -3
  264. package/dist/components/sticky-metric/index.js +6 -0
  265. package/dist/components/sticky-metric/sticky-metric.js +83 -0
  266. package/dist/components/story-map/index.js +8 -0
  267. package/dist/components/story-map/story-map.js +414 -0
  268. package/dist/components/subscription-card/subscription-card.js +1 -1
  269. package/dist/components/switch/switch.js +1 -1
  270. package/dist/components/table-of-contents/table-of-contents.js +5 -2
  271. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +8 -6
  272. package/dist/components/tabs/tabs.js +26 -8
  273. package/dist/components/tags-input/index.js +4 -0
  274. package/dist/components/tags-input/tags-input.js +186 -0
  275. package/dist/components/terminal/terminal.js +61 -37
  276. package/dist/components/theme-preset-provider/index.js +4 -0
  277. package/dist/components/theme-preset-provider/theme-preset-provider.js +55 -0
  278. package/dist/components/theme-switcher/index.js +4 -0
  279. package/dist/components/theme-switcher/theme-switcher.js +43 -0
  280. package/dist/components/theme-toggle/theme-toggle.js +2 -2
  281. package/dist/components/thinking-block/thinking-block.js +3 -3
  282. package/dist/components/thread-bubble/index.js +6 -0
  283. package/dist/components/thread-bubble/thread-bubble.js +85 -0
  284. package/dist/components/threshold-ring/index.js +6 -0
  285. package/dist/components/threshold-ring/threshold-ring.js +160 -0
  286. package/dist/components/ticker-tape/ticker-tape.js +4 -4
  287. package/dist/components/timeline/index.js +12 -0
  288. package/dist/components/timeline/timeline.js +239 -0
  289. package/dist/components/timeline-scrubber/index.js +6 -0
  290. package/dist/components/timeline-scrubber/timeline-scrubber.js +179 -0
  291. package/dist/components/tldr-section/tldr-section.js +11 -9
  292. package/dist/components/top-bar/index.js +4 -0
  293. package/dist/components/top-bar/top-bar.js +31 -0
  294. package/dist/components/tour/tour.js +10 -4
  295. package/dist/components/transaction-list/index.js +14 -0
  296. package/dist/components/transaction-list/transaction-list.js +253 -0
  297. package/dist/components/tree-view/index.js +6 -0
  298. package/dist/components/tree-view/tree-view.js +298 -0
  299. package/dist/components/tutorial-card/tutorial-card.js +2 -2
  300. package/dist/components/tutorial-complete/tutorial-complete.js +18 -16
  301. package/dist/components/tutorial-filters/tutorial-filters.js +2 -2
  302. package/dist/components/tutorial-intro-content/tutorial-intro-content.js +5 -5
  303. package/dist/components/tutorial-mdx/tutorial-mdx.js +20 -20
  304. package/dist/components/usage-breakdown/usage-breakdown.js +12 -7
  305. package/dist/components/video-embed/video-embed.js +2 -2
  306. package/dist/components/viewport-bookmarks/index.js +6 -0
  307. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +118 -0
  308. package/dist/components/wallet-card/wallet-card.js +1 -1
  309. package/dist/components/watchlist/watchlist.js +7 -6
  310. package/dist/components/workspace-switcher/index.js +6 -0
  311. package/dist/components/workspace-switcher/workspace-switcher.js +61 -0
  312. package/dist/components/world-breadcrumbs/index.js +6 -0
  313. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +114 -0
  314. package/dist/components/world-clock-bar/world-clock-bar.js +35 -14
  315. package/dist/components/zoom-hud/index.js +4 -0
  316. package/dist/components/zoom-hud/zoom-hud.js +61 -0
  317. package/dist/index.d.ts +8108 -231
  318. package/dist/index.js +27 -1
  319. package/dist/lib/theme-presets.js +32 -0
  320. package/dist/lib/use-theme-preset.js +95 -0
  321. package/dist/tailwind-preset.js +19 -19
  322. package/package.json +15 -10
  323. package/styles.css +38 -38
  324. package/themes/default.css +39 -39
  325. package/themes/presets.css +547 -0
@@ -0,0 +1,72 @@
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 DEFAULT_LABELS = {
8
+ region: "Selection"
9
+ };
10
+ const SelectionHalo = forwardRef(
11
+ (props, ref) => {
12
+ const {
13
+ bounds,
14
+ className,
15
+ label,
16
+ labels,
17
+ pulsing = false,
18
+ ...rest
19
+ } = props;
20
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
21
+ return /* @__PURE__ */ jsxs(
22
+ "div",
23
+ {
24
+ "aria-label": resolvedLabels.region,
25
+ className: cn(
26
+ "pointer-events-none absolute z-20 rounded-md ring-2 ring-primary",
27
+ pulsing ? "animate-pulse" : "",
28
+ className
29
+ ),
30
+ "data-pulsing": pulsing ? "true" : void 0,
31
+ "data-selection-halo": true,
32
+ ref,
33
+ style: {
34
+ height: `${bounds.height.toString()}px`,
35
+ left: `${bounds.x.toString()}px`,
36
+ top: `${bounds.y.toString()}px`,
37
+ width: `${bounds.width.toString()}px`
38
+ },
39
+ ...rest,
40
+ children: [
41
+ ["nw", "ne", "se", "sw"].map((corner) => /* @__PURE__ */ jsx(
42
+ "span",
43
+ {
44
+ "aria-hidden": "true",
45
+ className: cn(
46
+ "absolute size-2 rounded-sm border-2 border-primary bg-background",
47
+ corner === "nw" && "-left-1 -top-1",
48
+ corner === "ne" && "-right-1 -top-1",
49
+ corner === "se" && "-bottom-1 -right-1",
50
+ corner === "sw" && "-bottom-1 -left-1"
51
+ ),
52
+ "data-handle-corner": corner
53
+ },
54
+ corner
55
+ )),
56
+ label ? /* @__PURE__ */ jsx(
57
+ "span",
58
+ {
59
+ className: "absolute -top-6 left-0 inline-flex items-center rounded-md bg-primary px-1.5 py-0.5 text-[10px] font-semibold text-primary-foreground shadow-sm",
60
+ "data-selection-label": true,
61
+ children: label
62
+ }
63
+ ) : null
64
+ ]
65
+ }
66
+ );
67
+ }
68
+ );
69
+ SelectionHalo.displayName = "SelectionHalo";
70
+ export {
71
+ SelectionHalo
72
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ SelectionPresence
3
+ } from "./selection-presence";
4
+ export {
5
+ SelectionPresence
6
+ };
@@ -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
  }
@@ -13,7 +13,7 @@ function PlatformButton({
13
13
  onClick,
14
14
  platform
15
15
  }) {
16
- const handleClick = () => {
16
+ const handleSelectPlatform = () => {
17
17
  onClick(platform.key);
18
18
  };
19
19
  return /* @__PURE__ */ jsx(
@@ -26,7 +26,7 @@ function PlatformButton({
26
26
  "hover:bg-accent hover:text-accent-foreground",
27
27
  "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2"
28
28
  ),
29
- onClick: handleClick,
29
+ onClick: handleSelectPlatform,
30
30
  type: "button",
31
31
  children: platform.label
32
32
  }
@@ -26,6 +26,7 @@ function buildShareUrl(platform, url, title) {
26
26
  }
27
27
  }
28
28
  function ShareSection({
29
+ as: Heading = "h3",
29
30
  buildUrl: buildUrlFunction = buildShareUrl,
30
31
  platforms = defaultPlatforms,
31
32
  shareOn,
@@ -34,7 +35,7 @@ function ShareSection({
34
35
  url
35
36
  }) {
36
37
  return /* @__PURE__ */ jsxs("div", { className: "border-t border-border pt-6 mt-8", children: [
37
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold mb-4", children: shareTitle }),
38
+ /* @__PURE__ */ jsx(Heading, { className: "text-lg font-semibold mb-4", children: shareTitle }),
38
39
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-3", children: platforms.map((platform) => /* @__PURE__ */ jsxs(
39
40
  "a",
40
41
  {
@@ -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
@@ -1,29 +1,29 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { useEffect, useRef, useState } from "react";
3
+ import { useEffect, useRef, useState, useSyncExternalStore } from "react";
4
4
  import { ChevronDown } from "lucide-react";
5
5
  import Link from "next/link";
6
6
  import { usePathname } from "next/navigation";
7
+ import { useMounted } from "../../lib/use-mounted";
7
8
  import { cn } from "../../lib/utils";
8
- import { useSidebar } from "../sidebar-provider";
9
+ import { useSidebar } from "../sidebar-provider/sidebar-provider";
10
+ const getMobileSnapshot = () => typeof window === "undefined" ? false : window.innerWidth < 1024;
11
+ const getServerMobileSnapshot = () => false;
12
+ const subscribeToViewportResize = (onStoreChange) => {
13
+ window.addEventListener("resize", onStoreChange);
14
+ return () => {
15
+ window.removeEventListener("resize", onStoreChange);
16
+ };
17
+ };
9
18
  function useMobile(setOpen) {
10
- const [isMobile, setIsMobile] = useState(false);
19
+ const isMobile = useSyncExternalStore(
20
+ subscribeToViewportResize,
21
+ getMobileSnapshot,
22
+ getServerMobileSnapshot
23
+ );
11
24
  useEffect(() => {
12
- const checkMobile = () => {
13
- const mobile = window.innerWidth < 1024;
14
- setIsMobile(mobile);
15
- if (mobile) {
16
- setOpen(false);
17
- } else {
18
- setOpen(true);
19
- }
20
- };
21
- checkMobile();
22
- window.addEventListener("resize", checkMobile);
23
- return () => {
24
- window.removeEventListener("resize", checkMobile);
25
- };
26
- }, [setOpen]);
25
+ setOpen(!isMobile);
26
+ }, [isMobile, setOpen]);
27
27
  return isMobile;
28
28
  }
29
29
  function useScrollFade(containerReference) {
@@ -38,7 +38,7 @@ function useScrollFade(containerReference) {
38
38
  setShowBottomFade(scrollTop < scrollHeight - clientHeight - 1);
39
39
  };
40
40
  checkScroll();
41
- container.addEventListener("scroll", checkScroll);
41
+ container.addEventListener("scroll", checkScroll, { passive: true });
42
42
  return () => {
43
43
  container.removeEventListener("scroll", checkScroll);
44
44
  };
@@ -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
  }
@@ -88,6 +88,7 @@ function CollapsibleSection({
88
88
  "grid transition-all duration-200 ease-in-out",
89
89
  isOpen ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0"
90
90
  ),
91
+ hidden: !isOpen,
91
92
  children: /* @__PURE__ */ jsx("div", { className: "overflow-hidden", children })
92
93
  }
93
94
  )
@@ -97,15 +98,18 @@ function Sidebar({ sections }) {
97
98
  const pathname = usePathname();
98
99
  const { open, setOpen } = useSidebar();
99
100
  const isMobile = useMobile(setOpen);
101
+ const mounted = useMounted();
100
102
  const scrollContainerReference = useRef(null);
101
103
  const { showBottomFade, showTopFade } = useScrollFade(
102
104
  scrollContainerReference
103
105
  );
106
+ const collapsed = mounted && !isMobile && !open;
104
107
  return /* @__PURE__ */ jsxs(Fragment, { children: [
105
108
  isMobile && open ? /* @__PURE__ */ jsx(
106
109
  "div",
107
110
  {
108
111
  className: "fixed inset-0 bg-black/50 z-40 lg:hidden",
112
+ "data-testid": "sidebar-overlay",
109
113
  onClick: () => {
110
114
  setOpen(false);
111
115
  },
@@ -122,15 +126,16 @@ function Sidebar({ sections }) {
122
126
  "aside",
123
127
  {
124
128
  className: cn(
125
- "fixed lg:relative top-16 lg:top-0 bottom-0 lg:bottom-auto left-0 z-40 lg:h-full border-r bg-background transition-transform duration-300 ease-in-out",
129
+ "fixed lg:relative top-16 lg:top-0 bottom-0 lg:bottom-auto left-0 z-40 lg:h-full bg-background transition-[transform,width] duration-300 ease-in-out",
126
130
  "flex flex-col",
127
131
  "overflow-hidden",
128
132
  "shrink-0",
129
- isMobile ? "w-full" : "w-64",
130
- isMobile && !open && "-translate-x-full",
133
+ collapsed ? "border-r-0" : "border-r",
134
+ collapsed ? "w-0" : isMobile ? "w-full" : "w-64",
131
135
  isMobile && open && "translate-x-0",
132
- !isMobile && !open && "-translate-x-full lg:translate-x-0",
133
- !isMobile && "lg:translate-x-0"
136
+ isMobile && !open && "-translate-x-full",
137
+ !isMobile && !collapsed && "-translate-x-full lg:translate-x-0",
138
+ !isMobile && collapsed && "-translate-x-full"
134
139
  ),
135
140
  children: /* @__PURE__ */ jsxs("div", { className: "relative flex-1 overflow-hidden", children: [
136
141
  showTopFade ? /* @__PURE__ */ jsx("div", { className: "absolute top-0 left-0 right-0 h-8 bg-gradient-to-b from-background to-transparent pointer-events-none z-20" }) : null,
@@ -138,7 +143,7 @@ function Sidebar({ sections }) {
138
143
  /* @__PURE__ */ jsx(
139
144
  "nav",
140
145
  {
141
- className: "flex-1 p-4 overflow-y-auto h-full",
146
+ className: "flex-1 p-4 overflow-y-auto overscroll-contain h-full [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
142
147
  ref: scrollContainerReference,
143
148
  children: /* @__PURE__ */ jsx("div", { className: "space-y-4", children: sections.map((section, sectionIndex) => {
144
149
  const sectionItems = /* @__PURE__ */ jsx("div", { className: section.title ? "space-y-0.5" : "space-y-1", children: section.items.map((item) => /* @__PURE__ */ jsx(
@@ -2,7 +2,7 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Menu, X } from "lucide-react";
4
4
  import { cn } from "../../lib/utils";
5
- import { Button } from "../button";
5
+ import { Button } from "../button/button";
6
6
  function SidebarToggle({
7
7
  className,
8
8
  onToggle,
@@ -12,21 +12,23 @@ function SidebarToggle({
12
12
  /* @__PURE__ */ jsx(
13
13
  Button,
14
14
  {
15
+ "aria-label": open ? "Close menu" : "Open menu",
15
16
  className: cn("lg:hidden", className),
16
17
  onClick: onToggle,
17
18
  size: "icon",
18
19
  variant: "ghost",
19
- children: open ? /* @__PURE__ */ jsx(X, { className: "h-5 w-5" }) : /* @__PURE__ */ jsx(Menu, { className: "h-5 w-5" })
20
+ children: open ? /* @__PURE__ */ jsx(X, { className: "size-5" }) : /* @__PURE__ */ jsx(Menu, { className: "size-5" })
20
21
  }
21
22
  ),
22
23
  /* @__PURE__ */ jsx(
23
24
  Button,
24
25
  {
26
+ "aria-label": "Toggle sidebar",
25
27
  className: cn("hidden lg:flex", className),
26
28
  onClick: onToggle,
27
29
  size: "icon",
28
30
  variant: "ghost",
29
- children: /* @__PURE__ */ jsx(Menu, { className: "h-5 w-5" })
31
+ children: /* @__PURE__ */ jsx(Menu, { className: "size-5" })
30
32
  }
31
33
  )
32
34
  ] });
@@ -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
  ));
@@ -4,7 +4,7 @@ import { memo, useCallback, useEffect, useState } from "react";
4
4
  import { createPortal } from "react-dom";
5
5
  import { useMounted } from "../../lib/use-mounted";
6
6
  import { cn } from "../../lib/utils";
7
- import { CompletionDialog } from "../completion-dialog";
7
+ import { CompletionDialog } from "../completion-dialog/completion-dialog";
8
8
  const DEFAULT_LABELS = {
9
9
  closeLabel: "Close",
10
10
  closeTocLabel: "Close table of contents",
@@ -15,11 +15,13 @@ const DEFAULT_LABELS = {
15
15
  prevLabel: "Prev",
16
16
  sectionsLabel: "Sections"
17
17
  };
18
+ const EMPTY_SLIDESHOW_LABELS = {};
18
19
  function SlideshowImpl({
20
+ as: SectionsHeading = "h3",
19
21
  completedSections,
20
22
  completionDialogTitle = "Mark section as complete?",
21
23
  currentIndex,
22
- labels = {},
24
+ labels = EMPTY_SLIDESHOW_LABELS,
23
25
  onComplete,
24
26
  onExit,
25
27
  onNavigate,
@@ -145,7 +147,7 @@ function SlideshowImpl({
145
147
  children: isTocOpen ? /* @__PURE__ */ jsx(
146
148
  "svg",
147
149
  {
148
- className: "h-5 w-5",
150
+ className: "size-5",
149
151
  fill: "none",
150
152
  stroke: "currentColor",
151
153
  viewBox: "0 0 24 24",
@@ -162,7 +164,7 @@ function SlideshowImpl({
162
164
  ) : /* @__PURE__ */ jsx(
163
165
  "svg",
164
166
  {
165
- className: "h-5 w-5",
167
+ className: "size-5",
166
168
  fill: "none",
167
169
  stroke: "currentColor",
168
170
  viewBox: "0 0 24 24",
@@ -200,7 +202,7 @@ function SlideshowImpl({
200
202
  children: /* @__PURE__ */ jsx(
201
203
  "svg",
202
204
  {
203
- className: "h-5 w-5",
205
+ className: "size-5",
204
206
  fill: "none",
205
207
  stroke: "currentColor",
206
208
  viewBox: "0 0 24 24",
@@ -248,7 +250,7 @@ function SlideshowImpl({
248
250
  role: "dialog",
249
251
  children: [
250
252
  /* @__PURE__ */ jsxs("div", { className: "sticky top-0 flex items-center justify-between px-4 py-3 border-b border-border bg-background", children: [
251
- /* @__PURE__ */ jsx("h3", { className: "font-semibold", children: mergedLabels.sectionsLabel }),
253
+ /* @__PURE__ */ jsx(SectionsHeading, { className: "font-semibold", children: mergedLabels.sectionsLabel }),
252
254
  /* @__PURE__ */ jsx(
253
255
  "button",
254
256
  {
@@ -261,7 +263,7 @@ function SlideshowImpl({
261
263
  children: /* @__PURE__ */ jsx(
262
264
  "svg",
263
265
  {
264
- className: "h-4 w-4",
266
+ className: "size-4",
265
267
  fill: "none",
266
268
  stroke: "currentColor",
267
269
  viewBox: "0 0 24 24",
@@ -298,13 +300,13 @@ function SlideshowImpl({
298
300
  "div",
299
301
  {
300
302
  className: cn(
301
- "flex-shrink-0 w-5 h-5 rounded-full border-2 flex items-center justify-center",
303
+ "flex-shrink-0 size-5 rounded-full border-2 flex items-center justify-center",
302
304
  isCompleted ? "bg-foreground border-foreground" : "border-muted-foreground"
303
305
  ),
304
306
  children: isCompleted ? /* @__PURE__ */ jsx(
305
307
  "svg",
306
308
  {
307
- className: "h-3 w-3 text-background",
309
+ className: "size-3 text-background",
308
310
  fill: "none",
309
311
  stroke: "currentColor",
310
312
  viewBox: "0 0 24 24",
@@ -333,7 +335,7 @@ function SlideshowImpl({
333
335
  )
334
336
  ]
335
337
  },
336
- `${section.id}-${index}`
338
+ section.id
337
339
  );
338
340
  }) })
339
341
  ]
@@ -355,7 +357,7 @@ function SlideshowImpl({
355
357
  }
356
358
  ) }) })
357
359
  ] }),
358
- /* @__PURE__ */ jsxs("div", { className: "relative z-20 flex items-center justify-between px-4 py-4 border-t border-border bg-background", children: [
360
+ /* @__PURE__ */ jsxs("div", { className: "relative z-20 flex items-center justify-between p-4 border-t border-border bg-background", children: [
359
361
  /* @__PURE__ */ jsxs(
360
362
  "button",
361
363
  {
@@ -367,7 +369,7 @@ function SlideshowImpl({
367
369
  /* @__PURE__ */ jsx(
368
370
  "svg",
369
371
  {
370
- className: "h-4 w-4",
372
+ className: "size-4",
371
373
  fill: "none",
372
374
  stroke: "currentColor",
373
375
  viewBox: "0 0 24 24",
@@ -397,7 +399,7 @@ function SlideshowImpl({
397
399
  !isLastSection && /* @__PURE__ */ jsx(
398
400
  "svg",
399
401
  {
400
- className: "h-4 w-4",
402
+ className: "size-4",
401
403
  fill: "none",
402
404
  stroke: "currentColor",
403
405
  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
+ };
@@ -7,15 +7,15 @@ function ShareMenu({
7
7
  onPlatformSelect,
8
8
  platforms
9
9
  }) {
10
- return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-0.5 rounded-md border border-gray-300 bg-background p-1.5 shadow-md dark:border-gray-600", children: platforms.map((p) => {
11
- const handleClick = () => {
10
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-0.5 rounded-md border border-zinc-300 bg-background p-1.5 shadow-md dark:border-zinc-600", children: platforms.map((p) => {
11
+ const handleSelectSharePlatform = () => {
12
12
  onPlatformSelect(p.key);
13
13
  };
14
14
  return /* @__PURE__ */ jsx(
15
15
  "button",
16
16
  {
17
17
  className: "rounded px-3 py-1.5 text-left text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",
18
- onClick: handleClick,
18
+ onClick: handleSelectSharePlatform,
19
19
  type: "button",
20
20
  children: p.label
21
21
  },
@@ -24,12 +24,12 @@ function ShareMenu({
24
24
  }) });
25
25
  }
26
26
  function ActionButton({ action }) {
27
- const handleClick = action.onClick;
27
+ const handleRunAction = action.onClick;
28
28
  return /* @__PURE__ */ jsx(
29
29
  "button",
30
30
  {
31
31
  className: "rounded px-3 py-1.5 text-left text-sm transition-colors hover:bg-accent",
32
- onClick: handleClick,
32
+ onClick: handleRunAction,
33
33
  type: "button",
34
34
  children: action.label
35
35
  }
@@ -47,7 +47,7 @@ function ActionPanel({
47
47
  const handleShareClick = shareAction?.onClick;
48
48
  const handleShareMouseEnter = isMobile ? void 0 : onShareHover;
49
49
  const handleShareMouseLeave = isMobile ? void 0 : onShareLeave;
50
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5 rounded-md border border-gray-300 bg-background p-1.5 shadow-md dark:border-gray-600", children: [
50
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5 rounded-md border border-zinc-300 bg-background p-1.5 shadow-md dark:border-zinc-600", children: [
51
51
  shareAction ? /* @__PURE__ */ jsx(
52
52
  "button",
53
53
  {
@@ -69,7 +69,7 @@ function MainFabButton({
69
69
  mainText,
70
70
  onToggle
71
71
  }) {
72
- const handleClick = onToggle;
72
+ const handleToggleSharePanel = onToggle;
73
73
  return /* @__PURE__ */ jsx(
74
74
  "button",
75
75
  {
@@ -77,11 +77,11 @@ function MainFabButton({
77
77
  "aria-label": isExpanded ? labels.close : labels.share,
78
78
  className: cn(
79
79
  "flex size-10 items-center justify-center rounded-md",
80
- "border border-gray-300 bg-background dark:border-gray-600",
80
+ "border border-zinc-300 bg-background dark:border-zinc-600",
81
81
  "transition-all duration-200 ease-out",
82
- "hover:-translate-y-0.5 hover:border-gray-400 hover:shadow-md dark:hover:border-gray-500"
82
+ "hover:-translate-y-0.5 hover:border-zinc-400 hover:shadow-md dark:hover:border-zinc-500"
83
83
  ),
84
- onClick: handleClick,
84
+ onClick: handleToggleSharePanel,
85
85
  type: "button",
86
86
  children: /* @__PURE__ */ jsx("span", { className: "text-sm font-mono", children: isMobile && isExpanded ? "\u2715" : mainText })
87
87
  }
@@ -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);
@@ -30,7 +30,7 @@ const SparklineGrid = React.forwardRef(({ className, columns = 2, items, ...prop
30
30
  children: items.map((item) => {
31
31
  const isPositive = item.change >= 0;
32
32
  const TrendIcon = isPositive ? ArrowUpRight : ArrowDownRight;
33
- const stroke = isPositive ? "hsl(142 71% 45%)" : "hsl(348 83% 47%)";
33
+ const strokeClass = isPositive ? "text-emerald-600 dark:text-emerald-400" : "text-rose-600 dark:text-rose-400";
34
34
  return /* @__PURE__ */ jsxs(
35
35
  "section",
36
36
  {
@@ -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
  "%"
@@ -67,9 +67,10 @@ const SparklineGrid = React.forwardRef(({ className, columns = 2, items, ...prop
67
67
  children: /* @__PURE__ */ jsx(
68
68
  "path",
69
69
  {
70
+ className: strokeClass,
70
71
  d: buildSparklinePath(item.data, 120, 48),
71
72
  fill: "none",
72
- stroke,
73
+ stroke: "currentColor",
73
74
  strokeLinecap: "round",
74
75
  strokeLinejoin: "round",
75
76
  strokeWidth: "2.5",