@vllnt/ui 0.2.1 → 0.3.0-canary.0572c35

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 (331) 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 +264 -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/chain-of-thought/chain-of-thought.js +77 -0
  48. package/dist/components/chain-of-thought/index.js +6 -0
  49. package/dist/components/chart/area-chart.js +1 -0
  50. package/dist/components/chart/line-chart.js +1 -0
  51. package/dist/components/chat-dock-section/chat-dock-section.js +56 -0
  52. package/dist/components/chat-dock-section/index.js +6 -0
  53. package/dist/components/checkbox/checkbox.js +2 -2
  54. package/dist/components/checklist/checklist.js +45 -10
  55. package/dist/components/checklist/index.js +10 -2
  56. package/dist/components/choropleth-map/choropleth-map.js +378 -0
  57. package/dist/components/choropleth-map/index.js +10 -0
  58. package/dist/components/chronological-timeline/chronological-timeline.js +343 -0
  59. package/dist/components/chronological-timeline/index.js +8 -0
  60. package/dist/components/civilization-card/civilization-card.js +275 -0
  61. package/dist/components/civilization-card/index.js +8 -0
  62. package/dist/components/code-block/code-block.js +43 -22
  63. package/dist/components/code-playground/code-playground.js +16 -10
  64. package/dist/components/combobox/combobox.js +49 -30
  65. package/dist/components/command/command.js +1 -1
  66. package/dist/components/comment-pin/comment-pin.js +104 -0
  67. package/dist/components/comment-pin/index.js +6 -0
  68. package/dist/components/comparison/comparison.js +11 -10
  69. package/dist/components/completion-dialog/completion-dialog.js +20 -12
  70. package/dist/components/connector-edge/connector-edge.js +66 -0
  71. package/dist/components/connector-edge/index.js +6 -0
  72. package/dist/components/content-intro/content-intro.js +29 -22
  73. package/dist/components/context-lens/context-lens.js +98 -0
  74. package/dist/components/context-lens/index.js +6 -0
  75. package/dist/components/context-menu/context-menu.js +4 -4
  76. package/dist/components/conversation-thread/conversation-thread.js +348 -0
  77. package/dist/components/conversation-thread/index.js +20 -0
  78. package/dist/components/cookie-consent/cookie-consent.js +1 -1
  79. package/dist/components/copy-button/copy-button.js +189 -0
  80. package/dist/components/copy-button/index.js +8 -0
  81. package/dist/components/countdown-timer/countdown-timer.js +10 -9
  82. package/dist/components/credit-badge/credit-badge.js +1 -7
  83. package/dist/components/curriculum/curriculum.js +349 -0
  84. package/dist/components/curriculum/index.js +10 -0
  85. package/dist/components/data-list/data-list.js +2 -1
  86. package/dist/components/data-table/data-table.js +10 -9
  87. package/dist/components/date-picker/date-picker.js +4 -9
  88. package/dist/components/dialog/dialog.js +1 -1
  89. package/dist/components/document-sibling-nav/document-sibling-nav.js +111 -0
  90. package/dist/components/document-sibling-nav/index.js +8 -0
  91. package/dist/components/dropdown-menu/dropdown-menu.js +3 -3
  92. package/dist/components/edge-label/edge-label.js +26 -0
  93. package/dist/components/edge-label/index.js +4 -0
  94. package/dist/components/empty-state/empty-state.js +93 -0
  95. package/dist/components/empty-state/index.js +8 -0
  96. package/dist/components/era-comparison/era-comparison.js +216 -0
  97. package/dist/components/era-comparison/index.js +16 -0
  98. package/dist/components/exercise/exercise.js +15 -7
  99. package/dist/components/faq/faq.js +8 -4
  100. package/dist/components/file-upload/file-upload.js +4 -9
  101. package/dist/components/filter-bar/filter-bar.js +9 -8
  102. package/dist/components/flashcard/flashcard.js +10 -4
  103. package/dist/components/floating-action-button/floating-action-button.js +1 -1
  104. package/dist/components/floating-toolbar/floating-toolbar.js +66 -0
  105. package/dist/components/floating-toolbar/index.js +6 -0
  106. package/dist/components/flow-diagram/flow-controls.js +9 -9
  107. package/dist/components/flow-diagram/flow-error-boundary.js +2 -2
  108. package/dist/components/flow-diagram/flow-fullscreen.js +2 -2
  109. package/dist/components/follow-mode/follow-mode.js +89 -0
  110. package/dist/components/follow-mode/index.js +6 -0
  111. package/dist/components/form/form.js +432 -0
  112. package/dist/components/form/index.js +20 -0
  113. package/dist/components/gantt-chart/gantt-chart.js +334 -0
  114. package/dist/components/gantt-chart/index.js +6 -0
  115. package/dist/components/geography-quiz-map/geography-quiz-map.js +344 -0
  116. package/dist/components/geography-quiz-map/index.js +12 -0
  117. package/dist/components/glass-panel/glass-panel.js +21 -0
  118. package/dist/components/glass-panel/index.js +4 -0
  119. package/dist/components/globe-3d/globe-3d.js +429 -0
  120. package/dist/components/globe-3d/index.js +10 -0
  121. package/dist/components/group-hull/group-hull.js +29 -0
  122. package/dist/components/group-hull/index.js +4 -0
  123. package/dist/components/handoff-beacon/handoff-beacon.js +78 -0
  124. package/dist/components/handoff-beacon/index.js +6 -0
  125. package/dist/components/heat-map-overlay/heat-map-overlay.js +215 -0
  126. package/dist/components/heat-map-overlay/index.js +6 -0
  127. package/dist/components/heat-overlay/heat-overlay.js +92 -0
  128. package/dist/components/heat-overlay/index.js +6 -0
  129. package/dist/components/historic-timeline/historic-timeline.js +342 -0
  130. package/dist/components/historic-timeline/index.js +6 -0
  131. package/dist/components/historical-figure-card/historical-figure-card.js +270 -0
  132. package/dist/components/historical-figure-card/index.js +6 -0
  133. package/dist/components/horizontal-scroll-row/horizontal-scroll-row.js +6 -5
  134. package/dist/components/index.js +578 -1
  135. package/dist/components/infinite-plane/index.js +6 -0
  136. package/dist/components/infinite-plane/infinite-plane.js +75 -0
  137. package/dist/components/inline-input/inline-input.js +1 -1
  138. package/dist/components/input-otp/input-otp.js +1 -1
  139. package/dist/components/interactive-timeline/index.js +16 -0
  140. package/dist/components/interactive-timeline/interactive-timeline.js +724 -0
  141. package/dist/components/jarvis-dock/index.js +6 -0
  142. package/dist/components/jarvis-dock/jarvis-dock.js +98 -0
  143. package/dist/components/kbd/index.js +5 -0
  144. package/dist/components/kbd/kbd.js +125 -0
  145. package/dist/components/key-concept/key-concept.js +6 -5
  146. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +4 -3
  147. package/dist/components/knowledge-check/index.js +6 -0
  148. package/dist/components/knowledge-check/knowledge-check.js +473 -0
  149. package/dist/components/lang-provider/lang-provider.js +3 -3
  150. package/dist/components/learning-objectives/learning-objectives.js +14 -13
  151. package/dist/components/left-rail/index.js +4 -0
  152. package/dist/components/left-rail/left-rail.js +25 -0
  153. package/dist/components/live-cursor/index.js +6 -0
  154. package/dist/components/live-cursor/live-cursor.js +62 -0
  155. package/dist/components/live-feed/live-feed.js +18 -16
  156. package/dist/components/map-2d/index.js +20 -0
  157. package/dist/components/map-2d/map-2d.js +455 -0
  158. package/dist/components/map-timeline/index.js +16 -0
  159. package/dist/components/map-timeline/map-timeline.js +506 -0
  160. package/dist/components/market-treemap/market-treemap.js +3 -3
  161. package/dist/components/mdx-content/mdx-content.js +25 -11
  162. package/dist/components/menubar/menubar.js +4 -4
  163. package/dist/components/metric-cluster/index.js +6 -0
  164. package/dist/components/metric-cluster/metric-cluster.js +96 -0
  165. package/dist/components/metric-gauge/metric-gauge.js +3 -3
  166. package/dist/components/mini-map-panel/index.js +6 -0
  167. package/dist/components/mini-map-panel/mini-map-panel.js +74 -0
  168. package/dist/components/model-comparison/index.js +12 -0
  169. package/dist/components/model-comparison/model-comparison.js +230 -0
  170. package/dist/components/model-selector/model-selector.js +8 -8
  171. package/dist/components/multi-select/index.js +6 -0
  172. package/dist/components/multi-select/multi-select.js +258 -0
  173. package/dist/components/multi-select-lasso/index.js +6 -0
  174. package/dist/components/multi-select-lasso/multi-select-lasso.js +76 -0
  175. package/dist/components/navbar-saas/navbar-saas.js +11 -10
  176. package/dist/components/navigation-menu/navigation-menu.js +2 -2
  177. package/dist/components/newsletter-signup/index.js +8 -0
  178. package/dist/components/newsletter-signup/newsletter-signup.js +269 -0
  179. package/dist/components/number-input/number-input.js +2 -2
  180. package/dist/components/number-ticker/number-ticker.js +11 -4
  181. package/dist/components/object-card/index.js +6 -0
  182. package/dist/components/object-card/object-card.js +126 -0
  183. package/dist/components/object-handle/index.js +4 -0
  184. package/dist/components/object-handle/object-handle.js +38 -0
  185. package/dist/components/object-inspector/index.js +6 -0
  186. package/dist/components/object-inspector/object-inspector.js +136 -0
  187. package/dist/components/order-book/order-book.js +2 -2
  188. package/dist/components/overview-board/index.js +8 -0
  189. package/dist/components/overview-board/overview-board.js +127 -0
  190. package/dist/components/parallel-timeline/index.js +6 -0
  191. package/dist/components/parallel-timeline/parallel-timeline.js +251 -0
  192. package/dist/components/password-input/password-input.js +1 -1
  193. package/dist/components/plan-badge/plan-badge.js +1 -7
  194. package/dist/components/playback-ghost/index.js +6 -0
  195. package/dist/components/playback-ghost/playback-ghost.js +83 -0
  196. package/dist/components/policy-delivery-panel/index.js +6 -0
  197. package/dist/components/policy-delivery-panel/policy-delivery-panel.js +99 -0
  198. package/dist/components/presence-stack/index.js +6 -0
  199. package/dist/components/presence-stack/presence-stack.js +108 -0
  200. package/dist/components/presence-sync-indicator/index.js +6 -0
  201. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +73 -0
  202. package/dist/components/pricing-table/index.js +8 -0
  203. package/dist/components/pricing-table/pricing-table.js +284 -0
  204. package/dist/components/primary-source-viewer/index.js +26 -0
  205. package/dist/components/primary-source-viewer/primary-source-viewer.js +439 -0
  206. package/dist/components/pro-tip/pro-tip.js +6 -6
  207. package/dist/components/profile-section/profile-section.js +3 -2
  208. package/dist/components/progress-card/progress-card.js +6 -5
  209. package/dist/components/progress-tracker/index.js +20 -0
  210. package/dist/components/progress-tracker/progress-tracker.js +537 -0
  211. package/dist/components/prompt-input/index.js +4 -0
  212. package/dist/components/prompt-input/prompt-input.js +186 -0
  213. package/dist/components/prompt-templates/index.js +6 -0
  214. package/dist/components/prompt-templates/prompt-templates.js +395 -0
  215. package/dist/components/property-section/index.js +6 -0
  216. package/dist/components/property-section/property-section.js +101 -0
  217. package/dist/components/quiz/quiz.js +7 -6
  218. package/dist/components/radio-group/radio-group.js +2 -2
  219. package/dist/components/rating/rating.js +3 -3
  220. package/dist/components/reasoning/index.js +4 -0
  221. package/dist/components/reasoning/reasoning.js +118 -0
  222. package/dist/components/relationship-inspector/index.js +6 -0
  223. package/dist/components/relationship-inspector/relationship-inspector.js +102 -0
  224. package/dist/components/resizable/resizable.js +1 -1
  225. package/dist/components/right-dock/index.js +4 -0
  226. package/dist/components/right-dock/right-dock.js +28 -0
  227. package/dist/components/route-map/index.js +6 -0
  228. package/dist/components/route-map/route-map.js +339 -0
  229. package/dist/components/routing-assignment-panel/index.js +6 -0
  230. package/dist/components/routing-assignment-panel/routing-assignment-panel.js +122 -0
  231. package/dist/components/run-timeline/index.js +6 -0
  232. package/dist/components/run-timeline/run-timeline.js +221 -0
  233. package/dist/components/runtime-overview-panel/index.js +6 -0
  234. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +89 -0
  235. package/dist/components/scope-selector/scope-selector.js +13 -13
  236. package/dist/components/search-bar/search-bar.js +24 -2
  237. package/dist/components/search-dialog/search-dialog.js +485 -52
  238. package/dist/components/segmented-control/index.js +12 -0
  239. package/dist/components/segmented-control/segmented-control.js +61 -0
  240. package/dist/components/select/select.js +5 -5
  241. package/dist/components/selection-halo/index.js +6 -0
  242. package/dist/components/selection-halo/selection-halo.js +72 -0
  243. package/dist/components/selection-presence/index.js +6 -0
  244. package/dist/components/selection-presence/selection-presence.js +50 -0
  245. package/dist/components/severity-badge/severity-badge.js +2 -2
  246. package/dist/components/share-dialog/share-dialog.js +2 -2
  247. package/dist/components/share-section/share-section.js +2 -1
  248. package/dist/components/sheet/sheet.js +1 -1
  249. package/dist/components/sidebar/sidebar.js +31 -26
  250. package/dist/components/sidebar-toggle/sidebar-toggle.js +5 -3
  251. package/dist/components/slider/slider.js +1 -1
  252. package/dist/components/slideshow/slideshow.js +356 -275
  253. package/dist/components/snap-guides/index.js +6 -0
  254. package/dist/components/snap-guides/snap-guides.js +45 -0
  255. package/dist/components/social-fab/social-fab.js +12 -11
  256. package/dist/components/sparkline-grid/sparkline-grid.js +4 -3
  257. package/dist/components/spinner/spinner.js +4 -4
  258. package/dist/components/spinner/unicode-spinner.js +5 -2
  259. package/dist/components/stat-card/stat-card.js +5 -5
  260. package/dist/components/state-badge-overlay/index.js +6 -0
  261. package/dist/components/state-badge-overlay/state-badge-overlay.js +90 -0
  262. package/dist/components/static-code/index.js +4 -0
  263. package/dist/components/static-code/static-code-copy.js +24 -0
  264. package/dist/components/static-code/static-code.js +41 -0
  265. package/dist/components/status-board/status-board.js +15 -8
  266. package/dist/components/status-indicator/status-indicator.js +3 -3
  267. package/dist/components/step-by-step/step-by-step.js +10 -8
  268. package/dist/components/step-navigation/step-navigation.js +2 -2
  269. package/dist/components/stepper/stepper.js +3 -3
  270. package/dist/components/sticky-metric/index.js +6 -0
  271. package/dist/components/sticky-metric/sticky-metric.js +83 -0
  272. package/dist/components/story-map/index.js +8 -0
  273. package/dist/components/story-map/story-map.js +414 -0
  274. package/dist/components/subscription-card/subscription-card.js +1 -1
  275. package/dist/components/switch/switch.js +1 -1
  276. package/dist/components/table-of-contents/table-of-contents.js +5 -2
  277. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +8 -6
  278. package/dist/components/tabs/tabs.js +26 -8
  279. package/dist/components/tags-input/index.js +4 -0
  280. package/dist/components/tags-input/tags-input.js +186 -0
  281. package/dist/components/terminal/terminal.js +61 -37
  282. package/dist/components/theme-preset-provider/index.js +4 -0
  283. package/dist/components/theme-preset-provider/theme-preset-provider.js +55 -0
  284. package/dist/components/theme-switcher/index.js +4 -0
  285. package/dist/components/theme-switcher/theme-switcher.js +43 -0
  286. package/dist/components/theme-toggle/theme-toggle.js +2 -2
  287. package/dist/components/thinking-block/thinking-block.js +3 -3
  288. package/dist/components/thread-bubble/index.js +6 -0
  289. package/dist/components/thread-bubble/thread-bubble.js +85 -0
  290. package/dist/components/threshold-ring/index.js +6 -0
  291. package/dist/components/threshold-ring/threshold-ring.js +160 -0
  292. package/dist/components/ticker-tape/ticker-tape.js +4 -4
  293. package/dist/components/timeline/index.js +12 -0
  294. package/dist/components/timeline/timeline.js +239 -0
  295. package/dist/components/timeline-scrubber/index.js +6 -0
  296. package/dist/components/timeline-scrubber/timeline-scrubber.js +179 -0
  297. package/dist/components/tldr-section/tldr-section.js +11 -9
  298. package/dist/components/top-bar/index.js +4 -0
  299. package/dist/components/top-bar/top-bar.js +31 -0
  300. package/dist/components/tour/tour.js +10 -4
  301. package/dist/components/transaction-list/index.js +14 -0
  302. package/dist/components/transaction-list/transaction-list.js +253 -0
  303. package/dist/components/tree-view/index.js +6 -0
  304. package/dist/components/tree-view/tree-view.js +298 -0
  305. package/dist/components/tutorial-card/tutorial-card.js +2 -2
  306. package/dist/components/tutorial-complete/tutorial-complete.js +18 -16
  307. package/dist/components/tutorial-filters/tutorial-filters.js +2 -2
  308. package/dist/components/tutorial-intro-content/tutorial-intro-content.js +5 -5
  309. package/dist/components/tutorial-mdx/tutorial-mdx.js +20 -20
  310. package/dist/components/usage-breakdown/usage-breakdown.js +12 -7
  311. package/dist/components/video-embed/video-embed.js +2 -2
  312. package/dist/components/viewport-bookmarks/index.js +6 -0
  313. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +118 -0
  314. package/dist/components/wallet-card/wallet-card.js +1 -1
  315. package/dist/components/watchlist/watchlist.js +7 -6
  316. package/dist/components/workspace-switcher/index.js +6 -0
  317. package/dist/components/workspace-switcher/workspace-switcher.js +61 -0
  318. package/dist/components/world-breadcrumbs/index.js +6 -0
  319. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +114 -0
  320. package/dist/components/world-clock-bar/world-clock-bar.js +35 -14
  321. package/dist/components/zoom-hud/index.js +4 -0
  322. package/dist/components/zoom-hud/zoom-hud.js +61 -0
  323. package/dist/index.d.ts +8176 -202
  324. package/dist/index.js +27 -1
  325. package/dist/lib/theme-presets.js +32 -0
  326. package/dist/lib/use-theme-preset.js +95 -0
  327. package/dist/tailwind-preset.js +19 -19
  328. package/package.json +15 -10
  329. package/styles.css +38 -38
  330. package/themes/default.css +39 -39
  331. package/themes/presets.css +547 -0
@@ -1,29 +1,28 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { useEffect, useRef, useState } from "react";
3
+ import {
4
+ useEffect,
5
+ useRef,
6
+ useState
7
+ } from "react";
4
8
  import { Check, Copy } from "lucide-react";
5
9
  import { useTheme } from "next-themes";
6
- import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
7
- import {
8
- oneDark,
9
- oneLight
10
- } from "react-syntax-highlighter/dist/esm/styles/prism";
11
10
  import { cn } from "../../lib/utils";
12
11
  import { Button } from "../button/button";
13
- function extractTextFromChildren(children) {
14
- if (typeof children === "string") {
15
- return children;
12
+ function extractTextFromChildren(node) {
13
+ if (typeof node === "string") {
14
+ return node;
16
15
  }
17
- if (typeof children === "number") {
18
- return String(children);
16
+ if (typeof node === "number") {
17
+ return String(node);
19
18
  }
20
- if (Array.isArray(children)) {
21
- return children.map(extractTextFromChildren).join("");
19
+ if (Array.isArray(node)) {
20
+ return node.map(extractTextFromChildren).join("");
22
21
  }
23
- if (children && typeof children === "object" && "props" in children && children.props && typeof children.props === "object" && "children" in children.props) {
24
- return extractTextFromChildren(children.props.children);
22
+ if (node && typeof node === "object" && "props" in node && node.props && typeof node.props === "object" && "children" in node.props) {
23
+ return extractTextFromChildren(node.props.children);
25
24
  }
26
- return String(children ?? "");
25
+ return String(node ?? "");
27
26
  }
28
27
  function findScrollableParent(element) {
29
28
  if (!element) return void 0;
@@ -37,12 +36,31 @@ function CodeBlock({
37
36
  showLanguage = false
38
37
  }) {
39
38
  const [copied, setCopied] = useState(false);
39
+ const [highlighter, setHighlighter] = useState(
40
+ null
41
+ );
40
42
  const { systemTheme, theme } = useTheme();
41
43
  const resolvedTheme = theme === "system" ? systemTheme : theme;
42
44
  const isDark = resolvedTheme !== "light";
43
- const codeStyle = isDark ? oneDark : oneLight;
44
45
  const code = extractTextFromChildren(children);
45
46
  const scrollRef = useRef(null);
47
+ useEffect(() => {
48
+ let active = true;
49
+ void Promise.all([
50
+ import("react-syntax-highlighter"),
51
+ import("react-syntax-highlighter/dist/esm/styles/prism")
52
+ ]).then(([module_, styles]) => {
53
+ if (!active) return;
54
+ setHighlighter({
55
+ oneDark: styles.oneDark,
56
+ oneLight: styles.oneLight,
57
+ SyntaxHighlighter: module_.Prism
58
+ });
59
+ });
60
+ return () => {
61
+ active = false;
62
+ };
63
+ }, []);
46
64
  useEffect(() => {
47
65
  const element = scrollRef.current;
48
66
  if (!element) return;
@@ -66,6 +84,8 @@ function CodeBlock({
66
84
  setCopied(false);
67
85
  }, 2e3);
68
86
  };
87
+ const SyntaxHighlighter = highlighter?.SyntaxHighlighter;
88
+ const codeStyle = isDark ? highlighter?.oneDark : highlighter?.oneLight;
69
89
  return /* @__PURE__ */ jsx(
70
90
  "div",
71
91
  {
@@ -79,7 +99,7 @@ function CodeBlock({
79
99
  className: "relative overflow-x-auto overflow-y-hidden touch-pan-y",
80
100
  ref: scrollRef,
81
101
  children: [
82
- /* @__PURE__ */ jsx(
102
+ SyntaxHighlighter ? /* @__PURE__ */ jsx(
83
103
  SyntaxHighlighter,
84
104
  {
85
105
  codeTagProps: {
@@ -90,7 +110,7 @@ function CodeBlock({
90
110
  }
91
111
  },
92
112
  customStyle: {
93
- background: "hsl(var(--background))",
113
+ background: "oklch(var(--background))",
94
114
  fontSize: "0.875rem",
95
115
  margin: 0,
96
116
  minWidth: "fit-content",
@@ -101,17 +121,18 @@ function CodeBlock({
101
121
  style: codeStyle,
102
122
  children: code
103
123
  }
104
- ),
124
+ ) : /* @__PURE__ */ jsx("pre", { className: "m-0 min-w-fit overflow-y-hidden p-4 font-mono text-sm", children: /* @__PURE__ */ jsx("code", { className: "block bg-transparent", children: code }) }),
105
125
  /* @__PURE__ */ jsxs("div", { className: "absolute right-2 top-2 flex items-center gap-2", children: [
106
126
  showLanguage ? /* @__PURE__ */ jsx("span", { className: "text-xs font-mono text-muted-foreground uppercase tracking-wider", children: language }) : null,
107
127
  /* @__PURE__ */ jsx(
108
128
  Button,
109
129
  {
110
- className: "h-8 w-8",
130
+ "aria-label": copied ? "Copied" : "Copy code",
131
+ className: "size-8",
111
132
  onClick: handleCopy,
112
133
  size: "icon",
113
134
  variant: "ghost",
114
- children: copied ? /* @__PURE__ */ jsx(Check, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(Copy, { className: "h-3 w-3" })
135
+ children: copied ? /* @__PURE__ */ jsx(Check, { className: "size-3" }) : /* @__PURE__ */ jsx(Copy, { className: "size-3" })
115
136
  }
116
137
  )
117
138
  ] })
@@ -3,7 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
4
  import { Check, Code, Copy, FileCode } from "lucide-react";
5
5
  import { cn } from "../../lib/utils";
6
- import { Button } from "../button";
6
+ import { Button } from "../button/button";
7
7
  function CodeLine({ highlightLines, line, lineNumber }) {
8
8
  const isHighlighted = highlightLines.includes(lineNumber);
9
9
  return /* @__PURE__ */ jsxs("div", { className: cn("flex", isHighlighted && "bg-primary/10 -mx-4 px-4"), children: [
@@ -11,17 +11,22 @@ function CodeLine({ highlightLines, line, lineNumber }) {
11
11
  /* @__PURE__ */ jsx("span", { children: line })
12
12
  ] });
13
13
  }
14
+ const EMPTY_HIGHLIGHT_LINES = [];
15
+ function extractCode(node) {
16
+ return typeof node === "string" ? node : "";
17
+ }
14
18
  function CodePlayground({
19
+ as: Heading = "h4",
15
20
  children,
16
21
  description,
17
22
  filename,
18
- highlightLines = [],
23
+ highlightLines = EMPTY_HIGHLIGHT_LINES,
19
24
  language = "typescript",
20
25
  showLineNumbers = false,
21
26
  title
22
27
  }) {
23
28
  const [copied, setCopied] = useState(false);
24
- const code = typeof children === "string" ? children : "";
29
+ const code = extractCode(children);
25
30
  const lines = code.split("\n");
26
31
  const handleCopy = async () => {
27
32
  await navigator.clipboard.writeText(code);
@@ -33,25 +38,26 @@ function CodePlayground({
33
38
  return /* @__PURE__ */ jsxs("div", { className: "my-6 rounded-lg border bg-card overflow-hidden", children: [
34
39
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b bg-muted/30", children: [
35
40
  /* @__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" }) }),
41
+ /* @__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
42
  /* @__PURE__ */ jsxs("div", { children: [
38
- /* @__PURE__ */ jsx("h4", { className: "font-semibold text-sm", children: title }),
43
+ /* @__PURE__ */ jsx(Heading, { className: "font-semibold text-sm", children: title }),
39
44
  description ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: description }) : null
40
45
  ] })
41
46
  ] }),
42
47
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43
48
  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" }),
49
+ /* @__PURE__ */ jsx(FileCode, { className: "size-3" }),
45
50
  /* @__PURE__ */ jsx("span", { className: "font-mono", children: filename })
46
51
  ] }) : null,
47
52
  /* @__PURE__ */ jsx(
48
53
  Button,
49
54
  {
50
- className: "h-8 w-8",
55
+ "aria-label": copied ? "Copied" : "Copy code",
56
+ className: "size-8",
51
57
  onClick: handleCopy,
52
58
  size: "icon",
53
59
  variant: "ghost",
54
- children: copied ? /* @__PURE__ */ jsx(Check, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(Copy, { className: "h-3 w-3" })
60
+ children: copied ? /* @__PURE__ */ jsx(Check, { className: "size-3" }) : /* @__PURE__ */ jsx(Copy, { className: "size-3" })
55
61
  }
56
62
  )
57
63
  ] })
@@ -63,7 +69,7 @@ function CodePlayground({
63
69
  line,
64
70
  lineNumber: index + 1
65
71
  },
66
- index
72
+ `${line}-${index + 1}`
67
73
  )) }) : /* @__PURE__ */ jsx("code", { children: code }) }) }),
68
74
  /* @__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
75
  ] });
@@ -74,7 +80,7 @@ function FileTree({
74
80
  }) {
75
81
  return /* @__PURE__ */ jsxs("div", { className: "my-6 rounded-lg border bg-card overflow-hidden", children: [
76
82
  /* @__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" }),
83
+ /* @__PURE__ */ jsx(FileCode, { className: "size-4" }),
78
84
  title
79
85
  ] }) }),
80
86
  /* @__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 })
@@ -3,7 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { Check, ChevronsUpDown } from "lucide-react";
5
5
  import { cn } from "../../lib/utils";
6
- import { Button } from "../button";
6
+ import { Button } from "../button/button";
7
7
  import {
8
8
  Command,
9
9
  CommandEmpty,
@@ -11,15 +11,10 @@ import {
11
11
  CommandInput,
12
12
  CommandItem,
13
13
  CommandList
14
- } from "../command";
15
- import { Popover, PopoverContent, PopoverTrigger } from "../popover";
14
+ } from "../command/command";
15
+ import { Popover, PopoverContent, PopoverTrigger } from "../popover/popover";
16
16
  function useComboboxValue(value, onValueChange) {
17
17
  const [internalValue, setInternalValue] = React.useState(value ?? "");
18
- React.useEffect(() => {
19
- if (value !== void 0) {
20
- setInternalValue(value);
21
- }
22
- }, [value]);
23
18
  const resolvedValue = value ?? internalValue;
24
19
  const setResolvedValue = (nextValue) => {
25
20
  if (value === void 0) {
@@ -48,7 +43,7 @@ function ComboboxOptionItem({
48
43
  Check,
49
44
  {
50
45
  className: cn(
51
- "mr-2 h-4 w-4",
46
+ "mr-2 size-4",
52
47
  selectedValue === option.value ? "opacity-100" : "opacity-0"
53
48
  )
54
49
  }
@@ -58,6 +53,38 @@ function ComboboxOptionItem({
58
53
  }
59
54
  );
60
55
  }
56
+ function ComboboxListPanel({
57
+ className,
58
+ commandClassName,
59
+ emptyText,
60
+ listboxId,
61
+ onSelect,
62
+ options,
63
+ resolvedValue,
64
+ searchPlaceholder
65
+ }) {
66
+ return /* @__PURE__ */ jsx(
67
+ PopoverContent,
68
+ {
69
+ className: cn("w-[var(--radix-popover-trigger-width)] p-0", className),
70
+ children: /* @__PURE__ */ jsxs(Command, { className: commandClassName, children: [
71
+ /* @__PURE__ */ jsx(CommandInput, { placeholder: searchPlaceholder }),
72
+ /* @__PURE__ */ jsxs(CommandList, { id: listboxId, children: [
73
+ /* @__PURE__ */ jsx(CommandEmpty, { children: emptyText }),
74
+ /* @__PURE__ */ jsx(CommandGroup, { children: options.map((option) => /* @__PURE__ */ jsx(
75
+ ComboboxOptionItem,
76
+ {
77
+ onSelect,
78
+ option,
79
+ selectedValue: resolvedValue
80
+ },
81
+ option.value
82
+ )) })
83
+ ] })
84
+ ] })
85
+ }
86
+ );
87
+ }
61
88
  const Combobox = React.forwardRef(
62
89
  ({
63
90
  className,
@@ -71,6 +98,7 @@ const Combobox = React.forwardRef(
71
98
  value
72
99
  }, reference) => {
73
100
  const [open, setOpen] = React.useState(false);
101
+ const listboxId = React.useId();
74
102
  const { resolvedValue, setResolvedValue } = useComboboxValue(
75
103
  value,
76
104
  onValueChange
@@ -86,39 +114,30 @@ const Combobox = React.forwardRef(
86
114
  /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
87
115
  Button,
88
116
  {
117
+ "aria-controls": listboxId,
89
118
  "aria-expanded": open,
119
+ "aria-haspopup": "listbox",
90
120
  className: cn("w-full justify-between", triggerClassName),
91
121
  ref: reference,
92
122
  role: "combobox",
93
123
  variant: "outline",
94
124
  children: [
95
125
  /* @__PURE__ */ jsx("span", { className: "truncate", children: selectedOption ? selectedOption.label : placeholder }),
96
- /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })
126
+ /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-2 size-4 shrink-0 opacity-50" })
97
127
  ]
98
128
  }
99
129
  ) }),
100
130
  /* @__PURE__ */ jsx(
101
- PopoverContent,
131
+ ComboboxListPanel,
102
132
  {
103
- className: cn(
104
- "w-[var(--radix-popover-trigger-width)] p-0",
105
- className
106
- ),
107
- children: /* @__PURE__ */ jsxs(Command, { className: commandClassName, children: [
108
- /* @__PURE__ */ jsx(CommandInput, { placeholder: searchPlaceholder }),
109
- /* @__PURE__ */ jsxs(CommandList, { children: [
110
- /* @__PURE__ */ jsx(CommandEmpty, { children: emptyText }),
111
- /* @__PURE__ */ jsx(CommandGroup, { children: options.map((option) => /* @__PURE__ */ jsx(
112
- ComboboxOptionItem,
113
- {
114
- onSelect: handleSelect,
115
- option,
116
- selectedValue: resolvedValue
117
- },
118
- option.value
119
- )) })
120
- ] })
121
- ] })
133
+ className,
134
+ commandClassName,
135
+ emptyText,
136
+ listboxId,
137
+ onSelect: handleSelect,
138
+ options,
139
+ resolvedValue,
140
+ searchPlaceholder
122
141
  }
123
142
  )
124
143
  ] });
@@ -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
  {
@@ -0,0 +1,104 @@
1
+ "use client";
2
+ import { Fragment, 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: "Comment",
9
+ unreadSuffix: "unread"
10
+ };
11
+ const STATE_FILL = {
12
+ open: "bg-foreground text-background",
13
+ resolved: "bg-muted text-muted-foreground"
14
+ };
15
+ const PinBody = (props) => {
16
+ const showBadge = typeof props.unread === "number" && props.unread > 0;
17
+ const useAccent = props.accent && props.state === "open";
18
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
19
+ /* @__PURE__ */ jsx(
20
+ "span",
21
+ {
22
+ "aria-hidden": "true",
23
+ className: cn(
24
+ "flex size-7 items-center justify-center rounded-full border border-background text-[11px] font-semibold shadow-sm",
25
+ STATE_FILL[props.state]
26
+ ),
27
+ "data-comment-pin-body": true,
28
+ style: useAccent ? { backgroundColor: props.accent, color: "white" } : void 0,
29
+ children: props.authorInitial ?? "\u2022"
30
+ }
31
+ ),
32
+ showBadge ? /* @__PURE__ */ jsx(
33
+ "span",
34
+ {
35
+ "aria-hidden": "true",
36
+ className: "absolute -right-1 -top-1 inline-flex min-h-[14px] min-w-[14px] items-center justify-center rounded-full bg-red-500 px-1 text-[9px] font-medium text-white",
37
+ "data-comment-pin-unread": true,
38
+ children: props.unread
39
+ }
40
+ ) : null
41
+ ] });
42
+ };
43
+ const CommentPin = forwardRef(
44
+ (props, ref) => {
45
+ const {
46
+ authorInitial,
47
+ className,
48
+ color,
49
+ labels,
50
+ onActivate,
51
+ state = "open",
52
+ unread,
53
+ x,
54
+ y,
55
+ ...rest
56
+ } = props;
57
+ const resolvedLabels = { ...DEFAULT_LABELS, ...labels };
58
+ const showBadge = typeof unread === "number" && unread > 0;
59
+ const ariaLabel = showBadge ? `${resolvedLabels.region}, ${unread} ${resolvedLabels.unreadSuffix}` : resolvedLabels.region;
60
+ const handleActivateComment = () => {
61
+ onActivate?.();
62
+ };
63
+ const body = /* @__PURE__ */ jsx(
64
+ PinBody,
65
+ {
66
+ accent: color,
67
+ authorInitial,
68
+ state,
69
+ unread
70
+ }
71
+ );
72
+ return /* @__PURE__ */ jsx(
73
+ "div",
74
+ {
75
+ "aria-label": ariaLabel,
76
+ className: cn(
77
+ "absolute z-30 inline-flex -translate-x-1/2 -translate-y-1/2",
78
+ className
79
+ ),
80
+ "data-comment-pin": true,
81
+ "data-comment-pin-state": state,
82
+ ref,
83
+ role: "img",
84
+ style: { left: x, top: y },
85
+ ...rest,
86
+ children: onActivate ? /* @__PURE__ */ jsx(
87
+ "button",
88
+ {
89
+ "aria-label": ariaLabel,
90
+ className: "relative inline-flex rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
91
+ "data-comment-pin-trigger": true,
92
+ onClick: handleActivateComment,
93
+ type: "button",
94
+ children: body
95
+ }
96
+ ) : /* @__PURE__ */ jsx("span", { className: "relative inline-flex", children: body })
97
+ }
98
+ );
99
+ }
100
+ );
101
+ CommentPin.displayName = "CommentPin";
102
+ export {
103
+ CommentPin
104
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ CommentPin
3
+ } from "./comment-pin";
4
+ export {
5
+ CommentPin
6
+ };
@@ -24,6 +24,7 @@ const variantConfig = {
24
24
  };
25
25
  function Comparison({
26
26
  after,
27
+ as: Heading = "h4",
27
28
  before,
28
29
  title,
29
30
  ...rest
@@ -40,7 +41,7 @@ function Comparison({
40
41
  const BeforeIcon = beforeConfig.icon;
41
42
  const AfterIcon = afterConfig.icon;
42
43
  return /* @__PURE__ */ jsxs("div", { className: "my-6", children: [
43
- title ? /* @__PURE__ */ jsx("h4", { className: "font-semibold mb-3", children: title }) : null,
44
+ title ? /* @__PURE__ */ jsx(Heading, { className: "font-semibold mb-3", children: title }) : null,
44
45
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
45
46
  /* @__PURE__ */ jsxs("div", { className: cn("rounded-lg border", beforeConfig.className), children: [
46
47
  /* @__PURE__ */ jsx(
@@ -53,18 +54,18 @@ function Comparison({
53
54
  children: before.title
54
55
  }
55
56
  ),
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: [
57
+ /* @__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
58
  /* @__PURE__ */ jsx(
58
59
  BeforeIcon,
59
60
  {
60
61
  className: cn(
61
- "h-4 w-4 mt-0.5 flex-shrink-0",
62
+ "size-4 mt-0.5 flex-shrink-0",
62
63
  beforeConfig.iconClass
63
64
  )
64
65
  }
65
66
  ),
66
67
  /* @__PURE__ */ jsx("span", { children: item })
67
- ] }, index)) })
68
+ ] }, item)) })
68
69
  ] }),
69
70
  /* @__PURE__ */ jsxs("div", { className: cn("rounded-lg border", afterConfig.className), children: [
70
71
  /* @__PURE__ */ jsx(
@@ -77,18 +78,18 @@ function Comparison({
77
78
  children: after.title
78
79
  }
79
80
  ),
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: [
81
+ /* @__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
82
  /* @__PURE__ */ jsx(
82
83
  AfterIcon,
83
84
  {
84
85
  className: cn(
85
- "h-4 w-4 mt-0.5 flex-shrink-0",
86
+ "size-4 mt-0.5 flex-shrink-0",
86
87
  afterConfig.iconClass
87
88
  )
88
89
  }
89
90
  ),
90
91
  /* @__PURE__ */ jsx("span", { children: item })
91
- ] }, index)) })
92
+ ] }, item)) })
92
93
  ] })
93
94
  ] })
94
95
  ] });
@@ -99,15 +100,15 @@ function BeforeAfter({ after, before, title }) {
99
100
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-[1fr_auto_1fr] gap-4 items-start", children: [
100
101
  /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-red-500/30 bg-red-500/5 overflow-hidden", children: [
101
102
  /* @__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" }),
103
+ /* @__PURE__ */ jsx(X, { className: "size-4" }),
103
104
  "Before"
104
105
  ] }),
105
106
  /* @__PURE__ */ jsx("div", { className: "p-4 text-sm [&>pre]:my-0", children: before })
106
107
  ] }),
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" }) }),
108
+ /* @__PURE__ */ jsx("div", { className: "hidden md:flex items-center justify-center h-full", children: /* @__PURE__ */ jsx(ArrowRight, { className: "size-6 text-muted-foreground" }) }),
108
109
  /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-green-500/30 bg-green-500/5 overflow-hidden", children: [
109
110
  /* @__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" }),
111
+ /* @__PURE__ */ jsx(Check, { className: "size-4" }),
111
112
  "After"
112
113
  ] }),
113
114
  /* @__PURE__ */ jsx("div", { className: "p-4 text-sm [&>pre]:my-0", children: after })
@@ -1,9 +1,10 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { memo, useCallback, useEffect, useRef } from "react";
3
+ import { memo, useEffect, useRef } from "react";
4
4
  import { cn } from "../../lib/utils";
5
- import { Button } from "../button";
5
+ import { Button } from "../button/button";
6
6
  function DialogContent({
7
+ as: Heading = "h2",
7
8
  cancelLabel = "Skip",
8
9
  cancelShortcut = "S",
9
10
  className,
@@ -39,7 +40,7 @@ function DialogContent({
39
40
  children: closeIcon ?? /* @__PURE__ */ jsx(
40
41
  "svg",
41
42
  {
42
- className: "h-4 w-4",
43
+ className: "size-4",
43
44
  fill: "none",
44
45
  stroke: "currentColor",
45
46
  viewBox: "0 0 24 24",
@@ -57,7 +58,7 @@ function DialogContent({
57
58
  }
58
59
  ),
59
60
  /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
60
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", id: "completion-dialog-title", children: title }),
61
+ /* @__PURE__ */ jsx(Heading, { className: "text-lg font-semibold", id: "completion-dialog-title", children: title }),
61
62
  description ? /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground mt-1.5", children: description }) : null
62
63
  ] }),
63
64
  /* @__PURE__ */ jsxs("div", { className: "flex flex-row gap-2", children: [
@@ -83,6 +84,7 @@ function DialogContent({
83
84
  );
84
85
  }
85
86
  function CompletionDialogImpl({
87
+ as,
86
88
  cancelLabel,
87
89
  cancelShortcut = "S",
88
90
  className,
@@ -96,8 +98,11 @@ function CompletionDialogImpl({
96
98
  onConfirm,
97
99
  title
98
100
  }) {
99
- const handleKeyDown = useCallback(
100
- (event) => {
101
+ const keyDownHandlerRef = useRef(() => {
102
+ return;
103
+ });
104
+ useEffect(() => {
105
+ keyDownHandlerRef.current = (event) => {
101
106
  if (!isOpen) return;
102
107
  if (event.key === "Escape") {
103
108
  event.preventDefault();
@@ -116,16 +121,18 @@ function CompletionDialogImpl({
116
121
  event.stopPropagation();
117
122
  onCancel();
118
123
  }
119
- },
120
- [isOpen, onClose, onConfirm, onCancel, confirmShortcut, cancelShortcut]
121
- );
124
+ };
125
+ }, [cancelShortcut, confirmShortcut, isOpen, onCancel, onClose, onConfirm]);
122
126
  useEffect(() => {
123
127
  if (!isOpen) return;
124
- document.addEventListener("keydown", handleKeyDown, true);
128
+ const onDocumentKeyDown = (event) => {
129
+ keyDownHandlerRef.current(event);
130
+ };
131
+ document.addEventListener("keydown", onDocumentKeyDown, true);
125
132
  return () => {
126
- document.removeEventListener("keydown", handleKeyDown, true);
133
+ document.removeEventListener("keydown", onDocumentKeyDown, true);
127
134
  };
128
- }, [isOpen, handleKeyDown]);
135
+ }, [isOpen]);
129
136
  if (!isOpen) return null;
130
137
  return /* @__PURE__ */ jsxs(
131
138
  "div",
@@ -149,6 +156,7 @@ function CompletionDialogImpl({
149
156
  /* @__PURE__ */ jsx(
150
157
  DialogContent,
151
158
  {
159
+ as,
152
160
  cancelLabel,
153
161
  cancelShortcut,
154
162
  className,