@vllnt/ui 0.3.0-canary.f3cafe8 → 0.3.0

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 (336) hide show
  1. package/CHANGELOG.md +16 -5
  2. package/README.md +1 -1
  3. package/dist/components/accordion/accordion.js +2 -8
  4. package/dist/components/activity-heatmap/activity-heatmap.js +22 -29
  5. package/dist/components/activity-log/activity-log.js +52 -53
  6. package/dist/components/agent-activity/agent-activity.js +139 -125
  7. package/dist/components/ai-artifact/ai-artifact.js +115 -76
  8. package/dist/components/ai-chat-input/ai-chat-input.js +59 -61
  9. package/dist/components/ai-message-bubble/ai-message-bubble.js +63 -65
  10. package/dist/components/ai-sidebar/ai-sidebar.js +77 -55
  11. package/dist/components/ai-source-citation/ai-source-citation.js +38 -32
  12. package/dist/components/ai-streaming-text/ai-streaming-text.js +33 -35
  13. package/dist/components/ai-tool-call-display/ai-tool-call-display.js +58 -60
  14. package/dist/components/alert/alert.js +20 -7
  15. package/dist/components/alert-dialog/alert-dialog.js +36 -13
  16. package/dist/components/alert-pulse/alert-pulse.js +69 -69
  17. package/dist/components/anchor-port/anchor-port.js +26 -28
  18. package/dist/components/animated-beam/animated-beam.js +157 -0
  19. package/dist/components/animated-beam/index.js +4 -0
  20. package/dist/components/animated-grid-pattern/animated-grid-pattern.js +81 -0
  21. package/dist/components/animated-grid-pattern/index.js +6 -0
  22. package/dist/components/animated-list/animated-list.js +28 -0
  23. package/dist/components/animated-list/index.js +4 -0
  24. package/dist/components/animated-tabs/animated-tabs.js +98 -0
  25. package/dist/components/animated-tabs/index.js +6 -0
  26. package/dist/components/animated-testimonials/animated-testimonials.js +97 -0
  27. package/dist/components/animated-testimonials/index.js +6 -0
  28. package/dist/components/animated-text/animated-text.js +66 -67
  29. package/dist/components/animated-tooltip/animated-tooltip.js +58 -0
  30. package/dist/components/animated-tooltip/index.js +6 -0
  31. package/dist/components/auto-reload/auto-reload.js +109 -105
  32. package/dist/components/avatar/avatar.js +18 -7
  33. package/dist/components/avatar-group/avatar-group.js +35 -30
  34. package/dist/components/banner/banner.js +80 -77
  35. package/dist/components/bento-grid/bento-grid.js +46 -0
  36. package/dist/components/bento-grid/index.js +8 -0
  37. package/dist/components/blur-reveal/blur-reveal.js +83 -0
  38. package/dist/components/blur-reveal/index.js +4 -0
  39. package/dist/components/border-beam/border-beam.js +43 -45
  40. package/dist/components/bottom-activity-strip/bottom-activity-strip.js +5 -5
  41. package/dist/components/bottom-bar/bottom-bar.js +22 -18
  42. package/dist/components/button/button.js +18 -14
  43. package/dist/components/button-group/button-group.js +37 -0
  44. package/dist/components/button-group/index.js +8 -0
  45. package/dist/components/candlestick-chart/candlestick-chart.js +52 -54
  46. package/dist/components/canvas-shell/canvas-shell.js +11 -6
  47. package/dist/components/canvas-view/canvas-view.js +72 -74
  48. package/dist/components/card/card.js +35 -12
  49. package/dist/components/card-flip/card-flip.js +67 -0
  50. package/dist/components/card-flip/index.js +4 -0
  51. package/dist/components/carousel/carousel.js +78 -60
  52. package/dist/components/chain-of-thought/chain-of-thought.js +78 -0
  53. package/dist/components/chain-of-thought/index.js +6 -0
  54. package/dist/components/chart/area-chart.js +66 -67
  55. package/dist/components/chart/bar-chart.js +68 -70
  56. package/dist/components/chart/line-chart.js +69 -70
  57. package/dist/components/chat-dock-section/chat-dock-section.js +43 -45
  58. package/dist/components/checkbox/checkbox.js +6 -3
  59. package/dist/components/checkbox-group/checkbox-group.js +98 -0
  60. package/dist/components/checkbox-group/index.js +8 -0
  61. package/dist/components/choropleth-map/choropleth-map.js +90 -82
  62. package/dist/components/chronological-timeline/chronological-timeline.js +75 -72
  63. package/dist/components/civilization-card/civilization-card.js +59 -56
  64. package/dist/components/code-block/code-block.js +14 -17
  65. package/dist/components/code-playground/code-playground.js +8 -9
  66. package/dist/components/color-picker/color-picker.js +133 -0
  67. package/dist/components/color-picker/index.js +4 -0
  68. package/dist/components/combobox/combobox.js +57 -58
  69. package/dist/components/command/command.js +42 -15
  70. package/dist/components/comment-pin/comment-pin.js +58 -60
  71. package/dist/components/connector-edge/connector-edge.js +59 -54
  72. package/dist/components/content-intro/content-intro.js +4 -1
  73. package/dist/components/context-lens/context-lens.js +74 -73
  74. package/dist/components/context-menu/context-menu.js +55 -17
  75. package/dist/components/contribution-graph/contribution-graph.js +118 -0
  76. package/dist/components/contribution-graph/index.js +6 -0
  77. package/dist/components/conversation-thread/conversation-thread.js +89 -65
  78. package/dist/components/cookie-consent/cookie-consent.js +114 -115
  79. package/dist/components/copy-button/copy-button.js +100 -103
  80. package/dist/components/countdown-timer/countdown-timer.js +47 -75
  81. package/dist/components/credit-badge/credit-badge.js +26 -22
  82. package/dist/components/curriculum/curriculum.js +2 -2
  83. package/dist/components/cursor/cursor.js +52 -0
  84. package/dist/components/cursor/index.js +4 -0
  85. package/dist/components/data-list/data-list.js +54 -40
  86. package/dist/components/date-field/date-field.js +42 -0
  87. package/dist/components/date-field/index.js +4 -0
  88. package/dist/components/date-picker/date-picker.js +49 -50
  89. package/dist/components/date-range-picker/date-range-picker.js +73 -0
  90. package/dist/components/date-range-picker/index.js +6 -0
  91. package/dist/components/dialog/dialog.js +25 -9
  92. package/dist/components/dock/dock.js +109 -0
  93. package/dist/components/dock/index.js +5 -0
  94. package/dist/components/document-sibling-nav/document-sibling-nav.js +10 -5
  95. package/dist/components/dot-pattern/dot-pattern.js +36 -0
  96. package/dist/components/dot-pattern/index.js +4 -0
  97. package/dist/components/drawer/drawer.js +25 -9
  98. package/dist/components/dropdown-menu/dropdown-menu.js +56 -17
  99. package/dist/components/edge-label/edge-label.js +17 -15
  100. package/dist/components/empty-state/empty-state.js +27 -31
  101. package/dist/components/era-comparison/era-comparison.js +96 -83
  102. package/dist/components/expandable-cards/expandable-cards.js +61 -0
  103. package/dist/components/expandable-cards/index.js +6 -0
  104. package/dist/components/field/field.js +137 -0
  105. package/dist/components/field/index.js +16 -0
  106. package/dist/components/fieldset/fieldset.js +49 -0
  107. package/dist/components/fieldset/index.js +10 -0
  108. package/dist/components/file-upload/file-upload.js +4 -3
  109. package/dist/components/floating-navbar/floating-navbar.js +67 -0
  110. package/dist/components/floating-navbar/index.js +4 -0
  111. package/dist/components/floating-toolbar/floating-toolbar.js +49 -51
  112. package/dist/components/flow-diagram/flow-fullscreen.js +3 -13
  113. package/dist/components/flow-diagram/use-flow-diagram.js +7 -18
  114. package/dist/components/follow-mode/follow-mode.js +67 -69
  115. package/dist/components/form/form.js +131 -112
  116. package/dist/components/gantt-chart/gantt-chart.js +49 -51
  117. package/dist/components/gauge-chart/gauge-chart.js +132 -0
  118. package/dist/components/gauge-chart/index.js +4 -0
  119. package/dist/components/geography-quiz-map/geography-quiz-map.js +88 -78
  120. package/dist/components/glass-card/glass-card.js +25 -0
  121. package/dist/components/glass-card/index.js +4 -0
  122. package/dist/components/glass-panel/glass-panel.js +16 -14
  123. package/dist/components/glass-progress/glass-progress.js +39 -0
  124. package/dist/components/glass-progress/index.js +4 -0
  125. package/dist/components/globe-3d/globe-3d.js +70 -66
  126. package/dist/components/grid/grid.js +100 -0
  127. package/dist/components/grid/index.js +4 -0
  128. package/dist/components/group-hull/group-hull.js +27 -22
  129. package/dist/components/handoff-beacon/handoff-beacon.js +55 -57
  130. package/dist/components/heat-map-overlay/heat-map-overlay.js +55 -55
  131. package/dist/components/heat-overlay/heat-overlay.js +49 -48
  132. package/dist/components/historic-timeline/historic-timeline.js +57 -59
  133. package/dist/components/historical-figure-card/historical-figure-card.js +5 -3
  134. package/dist/components/hover-card/hover-card.js +8 -3
  135. package/dist/components/index.js +271 -0
  136. package/dist/components/infinite-plane/infinite-plane.js +34 -36
  137. package/dist/components/input/input.js +19 -17
  138. package/dist/components/input-group/index.js +14 -0
  139. package/dist/components/input-group/input-group.js +73 -0
  140. package/dist/components/input-otp/input-otp.js +25 -8
  141. package/dist/components/interactive-timeline/interactive-timeline.js +38 -15
  142. package/dist/components/item/index.js +18 -0
  143. package/dist/components/item/item.js +118 -0
  144. package/dist/components/jarvis-dock/jarvis-dock.js +40 -42
  145. package/dist/components/kbd/kbd.js +31 -42
  146. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +7 -18
  147. package/dist/components/knowledge-check/knowledge-check.js +50 -58
  148. package/dist/components/label/label.js +6 -3
  149. package/dist/components/left-rail/left-rail.js +22 -18
  150. package/dist/components/link/index.js +5 -0
  151. package/dist/components/link/link.js +53 -0
  152. package/dist/components/liquid-glass/index.js +4 -0
  153. package/dist/components/liquid-glass/liquid-glass.js +39 -0
  154. package/dist/components/list-box/index.js +8 -0
  155. package/dist/components/list-box/list-box.js +130 -0
  156. package/dist/components/live-cursor/live-cursor.js +49 -51
  157. package/dist/components/live-feed/live-feed.js +51 -76
  158. package/dist/components/magnetic/index.js +4 -0
  159. package/dist/components/magnetic/magnetic.js +63 -0
  160. package/dist/components/magnetic-button/index.js +4 -0
  161. package/dist/components/magnetic-button/magnetic-button.js +64 -0
  162. package/dist/components/map-2d/map-2d.js +120 -101
  163. package/dist/components/map-timeline/map-timeline.js +188 -170
  164. package/dist/components/market-treemap/market-treemap.js +10 -6
  165. package/dist/components/marquee/marquee.js +64 -65
  166. package/dist/components/mdx-content/mdx-content.js +4 -1
  167. package/dist/components/menubar/menubar.js +82 -35
  168. package/dist/components/meteors/index.js +4 -0
  169. package/dist/components/meteors/meteors.js +62 -0
  170. package/dist/components/meter/index.js +5 -0
  171. package/dist/components/meter/meter.js +76 -0
  172. package/dist/components/metric-cluster/metric-cluster.js +47 -49
  173. package/dist/components/metric-gauge/metric-gauge.js +42 -44
  174. package/dist/components/mini-map-panel/mini-map-panel.js +71 -66
  175. package/dist/components/model-comparison/model-comparison.js +76 -67
  176. package/dist/components/multi-select/multi-select.js +100 -102
  177. package/dist/components/multi-select-lasso/multi-select-lasso.js +5 -5
  178. package/dist/components/native-select/index.js +4 -0
  179. package/dist/components/native-select/native-select.js +28 -0
  180. package/dist/components/navbar-saas/navbar-saas.js +54 -46
  181. package/dist/components/navigation-menu/navigation-menu.js +38 -13
  182. package/dist/components/newsletter-signup/newsletter-signup.js +5 -3
  183. package/dist/components/number-input/number-input.js +4 -3
  184. package/dist/components/number-ticker/number-ticker.js +50 -51
  185. package/dist/components/object-card/object-card.js +40 -42
  186. package/dist/components/object-handle/object-handle.js +33 -30
  187. package/dist/components/object-inspector/object-inspector.js +40 -42
  188. package/dist/components/order-book/order-book.js +59 -54
  189. package/dist/components/overview-board/overview-board.js +91 -87
  190. package/dist/components/panel/index.js +16 -0
  191. package/dist/components/panel/panel.js +95 -0
  192. package/dist/components/parallel-timeline/parallel-timeline.js +54 -56
  193. package/dist/components/particles/index.js +4 -0
  194. package/dist/components/particles/particles.js +52 -0
  195. package/dist/components/password-input/password-input.js +35 -36
  196. package/dist/components/phone-input/index.js +6 -0
  197. package/dist/components/phone-input/phone-input.js +63 -0
  198. package/dist/components/pie-chart/index.js +4 -0
  199. package/dist/components/pie-chart/pie-chart.js +130 -0
  200. package/dist/components/plan-badge/plan-badge.js +28 -24
  201. package/dist/components/playback-ghost/playback-ghost.js +46 -48
  202. package/dist/components/policy-delivery-panel/policy-delivery-panel.js +5 -5
  203. package/dist/components/popover/popover.js +8 -3
  204. package/dist/components/presence-stack/presence-stack.js +39 -41
  205. package/dist/components/presence-sync-indicator/presence-sync-indicator.js +5 -5
  206. package/dist/components/pricing-table/pricing-table.js +71 -70
  207. package/dist/components/primary-source-viewer/primary-source-viewer.js +90 -41
  208. package/dist/components/progress-tracker/progress-tracker.js +1 -1
  209. package/dist/components/progressive-blur/index.js +6 -0
  210. package/dist/components/progressive-blur/progressive-blur.js +48 -0
  211. package/dist/components/prompt-input/index.js +4 -0
  212. package/dist/components/prompt-input/prompt-input.js +185 -0
  213. package/dist/components/prompt-templates/prompt-templates.js +36 -36
  214. package/dist/components/property-section/property-section.js +28 -30
  215. package/dist/components/qr-code/index.js +4 -0
  216. package/dist/components/qr-code/qr-code.js +49 -0
  217. package/dist/components/radar-chart/index.js +6 -0
  218. package/dist/components/radar-chart/radar-chart.js +180 -0
  219. package/dist/components/radio-group/radio-group.js +12 -5
  220. package/dist/components/range-calendar/index.js +4 -0
  221. package/dist/components/range-calendar/range-calendar.js +35 -0
  222. package/dist/components/reasoning/index.js +4 -0
  223. package/dist/components/reasoning/reasoning.js +124 -0
  224. package/dist/components/relationship-inspector/relationship-inspector.js +5 -5
  225. package/dist/components/reveal-text/index.js +6 -0
  226. package/dist/components/reveal-text/reveal-text.js +93 -0
  227. package/dist/components/right-dock/right-dock.js +26 -21
  228. package/dist/components/role-badge/role-badge.js +22 -19
  229. package/dist/components/route-map/route-map.js +5 -3
  230. package/dist/components/routing-assignment-panel/routing-assignment-panel.js +5 -5
  231. package/dist/components/run-timeline/run-timeline.js +57 -59
  232. package/dist/components/runtime-overview-panel/runtime-overview-panel.js +5 -5
  233. package/dist/components/sankey-chart/index.js +6 -0
  234. package/dist/components/sankey-chart/sankey-chart.js +255 -0
  235. package/dist/components/scope-selector/scope-selector.js +39 -40
  236. package/dist/components/scramble-text/index.js +4 -0
  237. package/dist/components/scramble-text/scramble-text.js +76 -0
  238. package/dist/components/scroll-area/scroll-area.js +14 -5
  239. package/dist/components/scroll-progress/index.js +4 -0
  240. package/dist/components/scroll-progress/scroll-progress.js +50 -0
  241. package/dist/components/search-bar/search-bar.js +5 -2
  242. package/dist/components/search-field/index.js +4 -0
  243. package/dist/components/search-field/search-field.js +67 -0
  244. package/dist/components/segmented-control/segmented-control.js +14 -5
  245. package/dist/components/select/select.js +46 -15
  246. package/dist/components/selection-halo/selection-halo.js +53 -62
  247. package/dist/components/selection-presence/selection-presence.js +5 -5
  248. package/dist/components/separator/separator.js +19 -16
  249. package/dist/components/share-dialog/share-dialog.js +6 -8
  250. package/dist/components/sheet/sheet.js +26 -9
  251. package/dist/components/shimmer-button/index.js +4 -0
  252. package/dist/components/shimmer-button/shimmer-button.js +41 -0
  253. package/dist/components/shimmer-text/index.js +4 -0
  254. package/dist/components/shimmer-text/shimmer-text.js +40 -0
  255. package/dist/components/shine-border/index.js +4 -0
  256. package/dist/components/shine-border/shine-border.js +38 -0
  257. package/dist/components/shiny-button/index.js +4 -0
  258. package/dist/components/shiny-button/shiny-button.js +39 -0
  259. package/dist/components/sidebar-provider/sidebar-provider.js +2 -7
  260. package/dist/components/slider/slider.js +6 -3
  261. package/dist/components/slideshow/slideshow.js +380 -302
  262. package/dist/components/snap-guides/snap-guides.js +35 -35
  263. package/dist/components/sparkles/index.js +4 -0
  264. package/dist/components/sparkles/sparkles.js +51 -0
  265. package/dist/components/sparkline-grid/sparkline-grid.js +6 -7
  266. package/dist/components/spinner/unicode-spinner.js +57 -56
  267. package/dist/components/spinning-text/index.js +4 -0
  268. package/dist/components/spinning-text/spinning-text.js +58 -0
  269. package/dist/components/spotlight-card/index.js +4 -0
  270. package/dist/components/spotlight-card/spotlight-card.js +53 -0
  271. package/dist/components/stat-card/stat-card.js +37 -39
  272. package/dist/components/state-badge-overlay/state-badge-overlay.js +5 -5
  273. package/dist/components/status-board/status-board.js +20 -22
  274. package/dist/components/status-indicator/status-indicator.js +38 -40
  275. package/dist/components/sticky-metric/sticky-metric.js +58 -60
  276. package/dist/components/story-map/story-map.js +66 -60
  277. package/dist/components/subscription-card/subscription-card.js +68 -70
  278. package/dist/components/switch/switch.js +6 -3
  279. package/dist/components/table/table.js +47 -16
  280. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +7 -18
  281. package/dist/components/tabs/tabs.js +2 -2
  282. package/dist/components/tag-group/index.js +8 -0
  283. package/dist/components/tag-group/tag-group.js +127 -0
  284. package/dist/components/tags-input/tags-input.js +59 -60
  285. package/dist/components/terminal/terminal.js +7 -15
  286. package/dist/components/text-animate/index.js +6 -0
  287. package/dist/components/text-animate/text-animate.js +129 -0
  288. package/dist/components/text-field/index.js +4 -0
  289. package/dist/components/text-field/text-field.js +59 -0
  290. package/dist/components/text-reveal/index.js +4 -0
  291. package/dist/components/text-reveal/text-reveal.js +90 -0
  292. package/dist/components/text-shimmer/index.js +4 -0
  293. package/dist/components/text-shimmer/text-shimmer.js +33 -0
  294. package/dist/components/textarea/textarea.js +17 -16
  295. package/dist/components/thinking-block/thinking-block.js +1 -1
  296. package/dist/components/thread-bubble/thread-bubble.js +51 -53
  297. package/dist/components/threshold-ring/threshold-ring.js +76 -78
  298. package/dist/components/ticker-tape/ticker-tape.js +47 -46
  299. package/dist/components/tilt-card/index.js +4 -0
  300. package/dist/components/tilt-card/tilt-card.js +70 -0
  301. package/dist/components/time-field/index.js +4 -0
  302. package/dist/components/time-field/time-field.js +42 -0
  303. package/dist/components/time-picker/index.js +4 -0
  304. package/dist/components/time-picker/time-picker.js +113 -0
  305. package/dist/components/timeline/timeline.js +70 -66
  306. package/dist/components/timeline-scrubber/timeline-scrubber.js +5 -3
  307. package/dist/components/tldr-section/tldr-section.js +9 -6
  308. package/dist/components/toast/toast.js +32 -11
  309. package/dist/components/toggle/toggle.js +8 -3
  310. package/dist/components/toggle-group/toggle-group.js +20 -6
  311. package/dist/components/toolbar/index.js +8 -0
  312. package/dist/components/toolbar/toolbar.js +87 -0
  313. package/dist/components/tooltip/tooltip.js +7 -3
  314. package/dist/components/top-bar/top-bar.js +30 -24
  315. package/dist/components/transaction-list/transaction-list.js +53 -47
  316. package/dist/components/tree-view/tree-view.js +72 -76
  317. package/dist/components/typewriter/index.js +4 -0
  318. package/dist/components/typewriter/typewriter.js +71 -0
  319. package/dist/components/typography/index.js +26 -0
  320. package/dist/components/typography/typography.js +173 -0
  321. package/dist/components/usage-breakdown/usage-breakdown.js +37 -38
  322. package/dist/components/viewport-bookmarks/viewport-bookmarks.js +5 -5
  323. package/dist/components/wallet-card/wallet-card.js +56 -58
  324. package/dist/components/watchlist/watchlist.js +47 -52
  325. package/dist/components/workspace-switcher/workspace-switcher.js +58 -52
  326. package/dist/components/world-breadcrumbs/world-breadcrumbs.js +43 -45
  327. package/dist/components/world-clock-bar/world-clock-bar.js +34 -61
  328. package/dist/components/zoom-hud/zoom-hud.js +56 -51
  329. package/dist/index.d.ts +6132 -3949
  330. package/dist/index.js +9 -0
  331. package/dist/lib/format.js +14 -0
  332. package/dist/lib/use-body-scroll-lock.js +30 -0
  333. package/dist/lib/use-escape-key.js +24 -0
  334. package/dist/lib/use-live-date.js +26 -0
  335. package/package.json +7 -5
  336. package/styles.css +84 -0
@@ -1,6 +1,8 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
+ import { normalizeDate } from "../../lib/format";
5
+ import { useLiveDate } from "../../lib/use-live-date";
4
6
  import { cn } from "../../lib/utils";
5
7
  import { Badge } from "../badge/badge";
6
8
  import {
@@ -17,32 +19,6 @@ const SECOND_MS = 1e3;
17
19
  const MINUTE_MS = 60 * SECOND_MS;
18
20
  const HOUR_MS = 60 * MINUTE_MS;
19
21
  const DAY_MS = 24 * HOUR_MS;
20
- function normalizeDate(input) {
21
- if (input instanceof Date) {
22
- return new Date(input.getTime());
23
- }
24
- return new Date(input);
25
- }
26
- function useLiveDate(now, tickMs) {
27
- const fixedNow = React.useMemo(
28
- () => now ? normalizeDate(now) : void 0,
29
- [now]
30
- );
31
- const [liveNow, setLiveNow] = React.useState(fixedNow ?? /* @__PURE__ */ new Date());
32
- React.useEffect(() => {
33
- if (fixedNow) {
34
- setLiveNow(fixedNow);
35
- return;
36
- }
37
- const interval = window.setInterval(() => {
38
- setLiveNow(/* @__PURE__ */ new Date());
39
- }, tickMs);
40
- return () => {
41
- window.clearInterval(interval);
42
- };
43
- }, [fixedNow, tickMs]);
44
- return liveNow;
45
- }
46
22
  function formatRelative(eventDate, now) {
47
23
  const deltaMs = now.getTime() - eventDate.getTime();
48
24
  if (deltaMs < 5 * SECOND_MS) {
@@ -113,57 +89,56 @@ function LiveFeedRow({
113
89
  ] })
114
90
  ] });
115
91
  }
116
- const LiveFeed = React.forwardRef(
117
- ({
118
- className,
119
- description,
120
- emptyLabel = "No events yet",
121
- events,
122
- maxItems = 50,
123
- now,
124
- tickMs = 3e4,
125
- title = "Live feed",
126
- ...props
127
- }, ref) => {
128
- const liveNow = useLiveDate(now, tickMs);
129
- const visibleEvents = React.useMemo(
130
- () => sortEventsDesc(events).slice(0, maxItems),
131
- [events, maxItems]
132
- );
133
- return /* @__PURE__ */ jsxs(Card, { className: cn("shadow-sm", className), ref, ...props, children: [
134
- /* @__PURE__ */ jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-3 gap-y-0 pb-3", children: [
135
- /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
136
- /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: title }),
137
- description ? /* @__PURE__ */ jsx(CardDescription, { children: description }) : null
138
- ] }),
139
- /* @__PURE__ */ jsxs(Badge, { variant: "outline", children: [
140
- /* @__PURE__ */ jsxs(
141
- "span",
142
- {
143
- "aria-hidden": "true",
144
- className: "relative mr-1.5 inline-flex size-2",
145
- children: [
146
- /* @__PURE__ */ jsx("span", { className: "absolute inline-flex size-2 animate-ping rounded-full bg-emerald-500 opacity-70" }),
147
- /* @__PURE__ */ jsx("span", { className: "relative inline-flex size-2 rounded-full bg-emerald-500" })
148
- ]
149
- }
150
- ),
151
- " ",
152
- "Live"
153
- ] })
92
+ const LiveFeed = ({
93
+ className,
94
+ description,
95
+ emptyLabel = "No events yet",
96
+ events,
97
+ maxItems = 50,
98
+ now,
99
+ ref,
100
+ tickMs = 3e4,
101
+ title = "Live feed",
102
+ ...props
103
+ }) => {
104
+ const liveNow = useLiveDate(now, tickMs);
105
+ const visibleEvents = React.useMemo(
106
+ () => sortEventsDesc(events).slice(0, maxItems),
107
+ [events, maxItems]
108
+ );
109
+ return /* @__PURE__ */ jsxs(Card, { className: cn("shadow-sm", className), ref, ...props, children: [
110
+ /* @__PURE__ */ jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-3 gap-y-0 pb-3", children: [
111
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
112
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: title }),
113
+ description ? /* @__PURE__ */ jsx(CardDescription, { children: description }) : null
154
114
  ] }),
155
- /* @__PURE__ */ jsx(CardContent, { className: "pt-0", children: visibleEvents.length === 0 ? /* @__PURE__ */ jsx("div", { className: "py-8 text-center text-sm text-muted-foreground", children: emptyLabel }) : /* @__PURE__ */ jsx("ul", { className: "max-h-[360px] divide-y divide-border/60 overflow-y-auto", children: visibleEvents.map((event, index) => /* @__PURE__ */ jsx(
156
- LiveFeedRow,
157
- {
158
- event,
159
- isLatest: index === 0,
160
- now: liveNow
161
- },
162
- event.id
163
- )) }) })
164
- ] });
165
- }
166
- );
115
+ /* @__PURE__ */ jsxs(Badge, { variant: "outline", children: [
116
+ /* @__PURE__ */ jsxs(
117
+ "span",
118
+ {
119
+ "aria-hidden": "true",
120
+ className: "relative mr-1.5 inline-flex size-2",
121
+ children: [
122
+ /* @__PURE__ */ jsx("span", { className: "absolute inline-flex size-2 animate-ping rounded-full bg-emerald-500 opacity-70" }),
123
+ /* @__PURE__ */ jsx("span", { className: "relative inline-flex size-2 rounded-full bg-emerald-500" })
124
+ ]
125
+ }
126
+ ),
127
+ " ",
128
+ "Live"
129
+ ] })
130
+ ] }),
131
+ /* @__PURE__ */ jsx(CardContent, { className: "pt-0", children: visibleEvents.length === 0 ? /* @__PURE__ */ jsx("div", { className: "py-8 text-center text-sm text-muted-foreground", children: emptyLabel }) : /* @__PURE__ */ jsx("ul", { className: "max-h-[360px] divide-y divide-border/60 overflow-y-auto", children: visibleEvents.map((event, index) => /* @__PURE__ */ jsx(
132
+ LiveFeedRow,
133
+ {
134
+ event,
135
+ isLatest: index === 0,
136
+ now: liveNow
137
+ },
138
+ event.id
139
+ )) }) })
140
+ ] });
141
+ };
167
142
  LiveFeed.displayName = "LiveFeed";
168
143
  export {
169
144
  LiveFeed
@@ -0,0 +1,4 @@
1
+ import { Magnetic } from "./magnetic";
2
+ export {
3
+ Magnetic
4
+ };
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../lib/utils";
5
+ function usePrefersReducedMotion() {
6
+ const [reduced, setReduced] = React.useState(false);
7
+ React.useEffect(() => {
8
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
9
+ return;
10
+ }
11
+ const query = window.matchMedia("(prefers-reduced-motion: reduce)");
12
+ const onChange = () => {
13
+ setReduced(query.matches);
14
+ };
15
+ onChange();
16
+ query.addEventListener("change", onChange);
17
+ return () => {
18
+ query.removeEventListener("change", onChange);
19
+ };
20
+ }, []);
21
+ return reduced;
22
+ }
23
+ const Magnetic = ({
24
+ children,
25
+ className,
26
+ ref,
27
+ strength = 0.4,
28
+ style,
29
+ ...props
30
+ }) => {
31
+ const reduced = usePrefersReducedMotion();
32
+ const [transform, setTransform] = React.useState();
33
+ const handlePointerMove = (event) => {
34
+ if (reduced) {
35
+ return;
36
+ }
37
+ const bounds = event.currentTarget.getBoundingClientRect();
38
+ const offsetX = (event.clientX - bounds.left - bounds.width / 2) * strength;
39
+ const offsetY = (event.clientY - bounds.top - bounds.height / 2) * strength;
40
+ setTransform(`translate(${offsetX}px, ${offsetY}px)`);
41
+ };
42
+ return /* @__PURE__ */ jsx(
43
+ "div",
44
+ {
45
+ className: cn(
46
+ "transition-transform duration-200 ease-out will-change-transform",
47
+ className
48
+ ),
49
+ onPointerLeave: () => {
50
+ setTransform(void 0);
51
+ },
52
+ onPointerMove: handlePointerMove,
53
+ ref,
54
+ style: { transform, ...style },
55
+ ...props,
56
+ children
57
+ }
58
+ );
59
+ };
60
+ Magnetic.displayName = "Magnetic";
61
+ export {
62
+ Magnetic
63
+ };
@@ -0,0 +1,4 @@
1
+ import { MagneticButton } from "./magnetic-button";
2
+ export {
3
+ MagneticButton
4
+ };
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../lib/utils";
5
+ function usePrefersReducedMotion() {
6
+ const [reduced, setReduced] = React.useState(false);
7
+ React.useEffect(() => {
8
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
9
+ return;
10
+ }
11
+ const query = window.matchMedia("(prefers-reduced-motion: reduce)");
12
+ const onChange = () => {
13
+ setReduced(query.matches);
14
+ };
15
+ onChange();
16
+ query.addEventListener("change", onChange);
17
+ return () => {
18
+ query.removeEventListener("change", onChange);
19
+ };
20
+ }, []);
21
+ return reduced;
22
+ }
23
+ const MagneticButton = ({
24
+ children,
25
+ className,
26
+ ref,
27
+ strength = 0.4,
28
+ style,
29
+ ...props
30
+ }) => {
31
+ const reduced = usePrefersReducedMotion();
32
+ const [transform, setTransform] = React.useState();
33
+ const handlePointerMove = (event) => {
34
+ if (reduced) {
35
+ return;
36
+ }
37
+ const bounds = event.currentTarget.getBoundingClientRect();
38
+ const offsetX = (event.clientX - bounds.left - bounds.width / 2) * strength;
39
+ const offsetY = (event.clientY - bounds.top - bounds.height / 2) * strength;
40
+ setTransform(`translate(${offsetX}px, ${offsetY}px)`);
41
+ };
42
+ return /* @__PURE__ */ jsx(
43
+ "button",
44
+ {
45
+ className: cn(
46
+ "transition-transform duration-200 ease-out will-change-transform",
47
+ className
48
+ ),
49
+ onPointerLeave: () => {
50
+ setTransform(void 0);
51
+ },
52
+ onPointerMove: handlePointerMove,
53
+ ref,
54
+ style: { transform, ...style },
55
+ type: "button",
56
+ ...props,
57
+ children
58
+ }
59
+ );
60
+ };
61
+ MagneticButton.displayName = "MagneticButton";
62
+ export {
63
+ MagneticButton
64
+ };
@@ -2,9 +2,8 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import {
4
4
  createContext,
5
- forwardRef,
5
+ use,
6
6
  useCallback,
7
- useContext,
8
7
  useId,
9
8
  useMemo,
10
9
  useRef,
@@ -23,7 +22,7 @@ const DEFAULT_LABELS = {
23
22
  };
24
23
  const MapContext = createContext(null);
25
24
  function useMapContext() {
26
- const ctx = useContext(MapContext);
25
+ const ctx = use(MapContext);
27
26
  if (!ctx) {
28
27
  throw new Error("Map2D subcomponent used outside its root.");
29
28
  }
@@ -80,7 +79,12 @@ function useMapState(arguments_) {
80
79
  [pan, project, resolvedLabels, zoom, zoomIn, zoomOut]
81
80
  );
82
81
  }
83
- const MapControls = forwardRef(({ children, className, ...rest }, ref) => /* @__PURE__ */ jsx(
82
+ const MapControls = ({
83
+ children,
84
+ className,
85
+ ref,
86
+ ...rest
87
+ }) => /* @__PURE__ */ jsx(
84
88
  "div",
85
89
  {
86
90
  "aria-label": "Map controls",
@@ -92,27 +96,35 @@ const MapControls = forwardRef(({ children, className, ...rest }, ref) => /* @__
92
96
  ...rest,
93
97
  children
94
98
  }
95
- ));
99
+ );
96
100
  MapControls.displayName = "MapControls";
97
- const ControlButton = forwardRef(
98
- ({ ariaLabel, className, glyph, onActivate, ...rest }, ref) => /* @__PURE__ */ jsx(
99
- "button",
100
- {
101
- "aria-label": ariaLabel,
102
- className: cn(
103
- "inline-flex size-7 items-center justify-center rounded text-sm font-semibold hover:bg-accent focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
104
- className
105
- ),
106
- onClick: onActivate,
107
- ref,
108
- type: "button",
109
- ...rest,
110
- children: glyph
111
- }
112
- )
101
+ const ControlButton = ({
102
+ ariaLabel,
103
+ className,
104
+ glyph,
105
+ onActivate,
106
+ ref,
107
+ ...rest
108
+ }) => /* @__PURE__ */ jsx(
109
+ "button",
110
+ {
111
+ "aria-label": ariaLabel,
112
+ className: cn(
113
+ "inline-flex size-7 items-center justify-center rounded text-sm font-semibold hover:bg-accent focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
114
+ className
115
+ ),
116
+ onClick: onActivate,
117
+ ref,
118
+ type: "button",
119
+ ...rest,
120
+ children: glyph
121
+ }
113
122
  );
114
123
  ControlButton.displayName = "ControlButton";
115
- const MapZoomIn = forwardRef(({ ...rest }, ref) => {
124
+ const MapZoomIn = ({
125
+ ref,
126
+ ...rest
127
+ }) => {
116
128
  const { labels, zoomIn } = useMapContext();
117
129
  return /* @__PURE__ */ jsx(
118
130
  ControlButton,
@@ -124,9 +136,12 @@ const MapZoomIn = forwardRef(({ ...rest }, ref) => {
124
136
  ...rest
125
137
  }
126
138
  );
127
- });
139
+ };
128
140
  MapZoomIn.displayName = "MapZoomIn";
129
- const MapZoomOut = forwardRef(({ ...rest }, ref) => {
141
+ const MapZoomOut = ({
142
+ ref,
143
+ ...rest
144
+ }) => {
130
145
  const { labels, zoomOut } = useMapContext();
131
146
  return /* @__PURE__ */ jsx(
132
147
  ControlButton,
@@ -138,9 +153,14 @@ const MapZoomOut = forwardRef(({ ...rest }, ref) => {
138
153
  ...rest
139
154
  }
140
155
  );
141
- });
156
+ };
142
157
  MapZoomOut.displayName = "MapZoomOut";
143
- const MapMarkerIcon = forwardRef(({ children, className, ...rest }, ref) => /* @__PURE__ */ jsx("g", { className: cn("text-primary", className), ref, ...rest, children }));
158
+ const MapMarkerIcon = ({
159
+ children,
160
+ className,
161
+ ref,
162
+ ...rest
163
+ }) => /* @__PURE__ */ jsx("g", { className: cn("text-primary", className), ref, ...rest, children });
144
164
  MapMarkerIcon.displayName = "MapMarkerIcon";
145
165
  function MarkerVisual({ children }) {
146
166
  if (children) return children;
@@ -158,82 +178,78 @@ function MarkerVisual({ children }) {
158
178
  /* @__PURE__ */ jsx("circle", { className: "fill-background", cx: "0", cy: "0", r: "2" })
159
179
  ] });
160
180
  }
161
- const MapMarker = forwardRef(
162
- (props, ref) => {
163
- const { children, className, onSelect, popup, position, title, ...rest } = props;
164
- const { project } = useMapContext();
165
- const point = project(position);
166
- const markerId = useId();
167
- const popupId = `${markerId}-popup`;
168
- const labelText = title ?? (typeof popup === "string" ? popup : `Marker at ${position.join(", ")}`);
169
- return /* @__PURE__ */ jsx("foreignObject", { height: "48", width: "48", x: point.x - 24, y: point.y - 24, children: /* @__PURE__ */ jsxs(
170
- "button",
171
- {
172
- "aria-describedby": popup ? popupId : void 0,
173
- "aria-label": labelText,
174
- className: cn(
175
- "group relative inline-flex h-full w-full cursor-pointer items-center justify-center bg-transparent p-0 outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
176
- className
181
+ const MapMarker = ({
182
+ ref,
183
+ ...props
184
+ }) => {
185
+ const { children, className, onSelect, popup, position, title, ...rest } = props;
186
+ const { project } = useMapContext();
187
+ const point = project(position);
188
+ const markerId = useId();
189
+ const popupId = `${markerId}-popup`;
190
+ const labelText = title ?? (typeof popup === "string" ? popup : `Marker at ${position.join(", ")}`);
191
+ return /* @__PURE__ */ jsx("foreignObject", { height: "48", width: "48", x: point.x - 24, y: point.y - 24, children: /* @__PURE__ */ jsxs(
192
+ "button",
193
+ {
194
+ "aria-describedby": popup ? popupId : void 0,
195
+ "aria-label": labelText,
196
+ className: cn(
197
+ "group relative inline-flex h-full w-full cursor-pointer items-center justify-center bg-transparent p-0 outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
198
+ className
199
+ ),
200
+ "data-marker-id": markerId,
201
+ onClick: onSelect,
202
+ ref,
203
+ type: "button",
204
+ ...rest,
205
+ children: [
206
+ /* @__PURE__ */ jsx(
207
+ "svg",
208
+ {
209
+ className: "pointer-events-none size-6 overflow-visible",
210
+ viewBox: "-10 -10 20 20",
211
+ children: /* @__PURE__ */ jsx(MarkerVisual, { children })
212
+ }
177
213
  ),
178
- "data-marker-id": markerId,
179
- onClick: onSelect,
180
- ref,
181
- type: "button",
182
- ...rest,
183
- children: [
184
- /* @__PURE__ */ jsx(
185
- "svg",
186
- {
187
- className: "pointer-events-none size-6 overflow-visible",
188
- viewBox: "-10 -10 20 20",
189
- children: /* @__PURE__ */ jsx(MarkerVisual, { children })
190
- }
191
- ),
192
- popup ? /* @__PURE__ */ jsx(
193
- "span",
194
- {
195
- className: "pointer-events-none absolute bottom-full left-1/2 z-10 mb-1 hidden min-w-32 max-w-xs -translate-x-1/2 rounded-md border bg-popover px-2 py-1 text-center text-xs text-popover-foreground shadow-md group-hover:block group-focus-visible:block",
196
- id: popupId,
197
- role: "tooltip",
198
- children: popup
199
- }
200
- ) : null
201
- ]
202
- }
203
- ) });
204
- }
205
- );
206
- MapMarker.displayName = "MapMarker";
207
- const MapPopup = forwardRef(
208
- (props, ref) => {
209
- const { children, className, position, ...rest } = props;
210
- const { project } = useMapContext();
211
- const point = project(position);
212
- return /* @__PURE__ */ jsx(
213
- "foreignObject",
214
- {
215
- height: "200",
216
- width: "320",
217
- x: point.x - 160,
218
- y: point.y - 220,
219
- children: /* @__PURE__ */ jsx(
220
- "div",
214
+ popup ? /* @__PURE__ */ jsx(
215
+ "span",
221
216
  {
222
- className: cn(
223
- "pointer-events-auto inline-block max-w-xs -translate-y-2 rounded-md border bg-popover px-3 py-2 text-sm text-popover-foreground shadow-md",
224
- className
225
- ),
226
- ref,
227
- ...rest,
228
- children
217
+ className: "pointer-events-none absolute bottom-full left-1/2 z-10 mb-1 hidden min-w-32 max-w-xs -translate-x-1/2 rounded-md border bg-popover px-2 py-1 text-center text-xs text-popover-foreground shadow-md group-hover:block group-focus-visible:block",
218
+ id: popupId,
219
+ role: "tooltip",
220
+ children: popup
229
221
  }
230
- )
231
- }
232
- );
233
- }
234
- );
222
+ ) : null
223
+ ]
224
+ }
225
+ ) });
226
+ };
227
+ MapMarker.displayName = "MapMarker";
228
+ const MapPopup = ({
229
+ ref,
230
+ ...props
231
+ }) => {
232
+ const { children, className, position, ...rest } = props;
233
+ const { project } = useMapContext();
234
+ const point = project(position);
235
+ return /* @__PURE__ */ jsx("foreignObject", { height: "200", width: "320", x: point.x - 160, y: point.y - 220, children: /* @__PURE__ */ jsx(
236
+ "div",
237
+ {
238
+ className: cn(
239
+ "pointer-events-auto inline-block max-w-xs -translate-y-2 rounded-md border bg-popover px-3 py-2 text-sm text-popover-foreground shadow-md",
240
+ className
241
+ ),
242
+ ref,
243
+ ...rest,
244
+ children
245
+ }
246
+ ) });
247
+ };
235
248
  MapPopup.displayName = "MapPopup";
236
- const MapLayer = forwardRef((props, ref) => {
249
+ const MapLayer = ({
250
+ ref,
251
+ ...props
252
+ }) => {
237
253
  const {
238
254
  className,
239
255
  data,
@@ -269,7 +285,7 @@ const MapLayer = forwardRef((props, ref) => {
269
285
  })
270
286
  }
271
287
  );
272
- });
288
+ };
273
289
  MapLayer.displayName = "MapLayer";
274
290
  function usePanHandlers() {
275
291
  const { height, pan, setPan, width, zoom } = useMapContext();
@@ -404,7 +420,10 @@ function bucketChildren(children) {
404
420
  { controls: null, layers: [], markers: [], popups: [] }
405
421
  );
406
422
  }
407
- const Map2D = forwardRef((props, ref) => {
423
+ const Map2D = ({
424
+ ref,
425
+ ...props
426
+ }) => {
408
427
  const {
409
428
  backdrop,
410
429
  backdropAlt,
@@ -441,7 +460,7 @@ const Map2D = forwardRef((props, ref) => {
441
460
  ]
442
461
  }
443
462
  ) });
444
- });
463
+ };
445
464
  Map2D.displayName = "Map2D";
446
465
  export {
447
466
  Map2D,