@refraction-ui/react 0.19.1 → 0.20.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 (342) hide show
  1. package/dist/chunk-533MCMSU.js +2355 -0
  2. package/dist/chunk-533MCMSU.js.map +7 -0
  3. package/dist/chunk-AMK4VCBG.js +250 -0
  4. package/dist/chunk-AMK4VCBG.js.map +7 -0
  5. package/dist/chunk-BOLFYVI6.js +90 -0
  6. package/dist/chunk-BOLFYVI6.js.map +7 -0
  7. package/dist/chunk-F7B64KT3.js +187 -0
  8. package/dist/chunk-F7B64KT3.js.map +7 -0
  9. package/dist/chunk-FD37DFCC.js +77 -0
  10. package/dist/chunk-FD37DFCC.js.map +7 -0
  11. package/dist/chunk-H54FLNAF.js +132 -0
  12. package/dist/chunk-H54FLNAF.js.map +7 -0
  13. package/dist/chunk-INP46354.js +664 -0
  14. package/dist/chunk-INP46354.js.map +7 -0
  15. package/dist/chunk-ONACRMG4.js +116 -0
  16. package/dist/chunk-ONACRMG4.js.map +7 -0
  17. package/dist/chunk-SDZ3LROZ.js +7 -0
  18. package/dist/chunk-SDZ3LROZ.js.map +7 -0
  19. package/dist/chunk-TOZBR4GL.js +154 -0
  20. package/dist/chunk-TOZBR4GL.js.map +7 -0
  21. package/dist/chunk-UNEM2TRI.js +225 -0
  22. package/dist/chunk-UNEM2TRI.js.map +7 -0
  23. package/dist/chunk-VK3EQ34F.js +92 -0
  24. package/dist/chunk-VK3EQ34F.js.map +7 -0
  25. package/dist/chunk-WK2IIUFO.js +316 -0
  26. package/dist/chunk-WK2IIUFO.js.map +7 -0
  27. package/dist/chunk-WSPJTQAV.js +59 -0
  28. package/dist/chunk-WSPJTQAV.js.map +7 -0
  29. package/dist/chunk-XWP763SH.js +3 -2
  30. package/dist/chunk-XWP763SH.js.map +7 -1
  31. package/dist/chunk-Y2FNNAIL.js +80 -0
  32. package/dist/chunk-Y2FNNAIL.js.map +1 -0
  33. package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
  34. package/dist/chunk-ZF3OHCGV.js.map +7 -0
  35. package/dist/form.cjs +5 -11
  36. package/dist/form.cjs.map +1 -1
  37. package/dist/form.js +6 -12
  38. package/dist/form.js.map +1 -1
  39. package/dist/index.cjs +2879 -33936
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +126 -28780
  44. package/dist/internal/react-app-shell/index.d.cts +2 -22
  45. package/dist/internal/react-app-shell/index.d.ts +2 -22
  46. package/dist/internal/react-badge/index.d.cts +5 -0
  47. package/dist/internal/react-badge/index.d.ts +5 -0
  48. package/dist/internal/react-callout/index.d.cts +4 -0
  49. package/dist/internal/react-callout/index.d.ts +4 -0
  50. package/dist/internal/react-card/index.d.cts +8 -1
  51. package/dist/internal/react-card/index.d.ts +8 -1
  52. package/dist/internal/react-collapsible/index.d.cts +0 -3
  53. package/dist/internal/react-collapsible/index.d.ts +0 -3
  54. package/dist/internal/react-combobox/index.d.cts +0 -3
  55. package/dist/internal/react-combobox/index.d.ts +0 -3
  56. package/dist/internal/react-command/index.d.cts +0 -3
  57. package/dist/internal/react-command/index.d.ts +0 -3
  58. package/dist/internal/react-data-table/index.d.cts +0 -3
  59. package/dist/internal/react-data-table/index.d.ts +0 -3
  60. package/dist/internal/react-dialog/index.d.cts +0 -3
  61. package/dist/internal/react-dialog/index.d.ts +0 -3
  62. package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
  63. package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
  64. package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
  65. package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
  66. package/dist/internal/react-form/index.d.cts +2 -21
  67. package/dist/internal/react-form/index.d.ts +2 -21
  68. package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
  69. package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
  70. package/dist/internal/react-link-card/index.d.cts +8 -2
  71. package/dist/internal/react-link-card/index.d.ts +8 -2
  72. package/dist/internal/react-popover/index.d.cts +0 -3
  73. package/dist/internal/react-popover/index.d.ts +0 -3
  74. package/dist/internal/react-sheet/index.d.cts +0 -3
  75. package/dist/internal/react-sheet/index.d.ts +0 -3
  76. package/dist/internal/react-slot/index.d.cts +23 -0
  77. package/dist/internal/react-slot/index.d.ts +23 -0
  78. package/dist/internal/react-toast/index.d.cts +0 -3
  79. package/dist/internal/react-toast/index.d.ts +0 -3
  80. package/dist/internal/react-tooltip/index.d.cts +0 -3
  81. package/dist/internal/react-tooltip/index.d.ts +0 -3
  82. package/dist/react-accordion.js +125 -0
  83. package/dist/react-accordion.js.map +7 -0
  84. package/dist/react-ai.js +257 -0
  85. package/dist/react-ai.js.map +7 -0
  86. package/dist/react-analytics.js +1698 -0
  87. package/dist/react-analytics.js.map +7 -0
  88. package/dist/react-animated-text.js +164 -0
  89. package/dist/react-animated-text.js.map +7 -0
  90. package/dist/react-app-shell.js +631 -0
  91. package/dist/react-app-shell.js.map +7 -0
  92. package/dist/react-audience-feature-card.js +53 -0
  93. package/dist/react-audience-feature-card.js.map +7 -0
  94. package/dist/react-audio-room.js +166 -0
  95. package/dist/react-audio-room.js.map +7 -0
  96. package/dist/react-auth.js +211 -0
  97. package/dist/react-auth.js.map +7 -0
  98. package/dist/react-avatar-group.js +154 -0
  99. package/dist/react-avatar-group.js.map +7 -0
  100. package/dist/react-avatar.js +168 -0
  101. package/dist/react-avatar.js.map +7 -0
  102. package/dist/react-badge.js +86 -0
  103. package/dist/react-badge.js.map +7 -0
  104. package/dist/react-bottom-nav.js +67 -0
  105. package/dist/react-bottom-nav.js.map +7 -0
  106. package/dist/react-brand-network-cell.js +92 -0
  107. package/dist/react-brand-network-cell.js.map +7 -0
  108. package/dist/react-breadcrumbs.js +104 -0
  109. package/dist/react-breadcrumbs.js.map +7 -0
  110. package/dist/react-browser-chrome-mock.js +89 -0
  111. package/dist/react-browser-chrome-mock.js.map +7 -0
  112. package/dist/react-button.js +13 -0
  113. package/dist/react-button.js.map +7 -0
  114. package/dist/react-calendar.js +301 -0
  115. package/dist/react-calendar.js.map +7 -0
  116. package/dist/react-call-controls.js +113 -0
  117. package/dist/react-call-controls.js.map +7 -0
  118. package/dist/react-callout.js +152 -0
  119. package/dist/react-callout.js.map +7 -0
  120. package/dist/react-card-grid.js +34 -0
  121. package/dist/react-card-grid.js.map +7 -0
  122. package/dist/react-card.js +200 -0
  123. package/dist/react-card.js.map +7 -0
  124. package/dist/react-carousel.js +132 -0
  125. package/dist/react-carousel.js.map +7 -0
  126. package/dist/react-charts.js +509 -0
  127. package/dist/react-charts.js.map +7 -0
  128. package/dist/react-checkbox.js +156 -0
  129. package/dist/react-checkbox.js.map +7 -0
  130. package/dist/react-checklist.js +168 -0
  131. package/dist/react-checklist.js.map +7 -0
  132. package/dist/react-code-block.js +78 -0
  133. package/dist/react-code-block.js.map +7 -0
  134. package/dist/react-code-editor.js +184 -0
  135. package/dist/react-code-editor.js.map +7 -0
  136. package/dist/react-collapsible.js +192 -0
  137. package/dist/react-collapsible.js.map +7 -0
  138. package/dist/react-combobox.js +609 -0
  139. package/dist/react-combobox.js.map +7 -0
  140. package/dist/react-command-input.js +202 -0
  141. package/dist/react-command-input.js.map +7 -0
  142. package/dist/react-command.js +364 -0
  143. package/dist/react-command.js.map +7 -0
  144. package/dist/react-composer.js +2036 -0
  145. package/dist/react-composer.js.map +7 -0
  146. package/dist/react-content-protection.js +133 -0
  147. package/dist/react-content-protection.js.map +7 -0
  148. package/dist/react-conversation.js +1226 -0
  149. package/dist/react-conversation.js.map +7 -0
  150. package/dist/react-cookie-consent.js +291 -0
  151. package/dist/react-cookie-consent.js.map +7 -0
  152. package/dist/react-data-table.js +310 -0
  153. package/dist/react-data-table.js.map +7 -0
  154. package/dist/react-date-picker.js +95 -0
  155. package/dist/react-date-picker.js.map +7 -0
  156. package/dist/react-device-frame.js +137 -0
  157. package/dist/react-device-frame.js.map +7 -0
  158. package/dist/react-dialog.js +218 -0
  159. package/dist/react-dialog.js.map +7 -0
  160. package/dist/react-diff-viewer.js +460 -0
  161. package/dist/react-diff-viewer.js.map +7 -0
  162. package/dist/react-dropdown-menu.js +292 -0
  163. package/dist/react-dropdown-menu.js.map +7 -0
  164. package/dist/react-editor-status-bar.js +148 -0
  165. package/dist/react-editor-status-bar.js.map +7 -0
  166. package/dist/react-editor-tabs.js +159 -0
  167. package/dist/react-editor-tabs.js.map +7 -0
  168. package/dist/react-emoji-picker.js +238 -0
  169. package/dist/react-emoji-picker.js.map +7 -0
  170. package/dist/react-empty-state.js +90 -0
  171. package/dist/react-empty-state.js.map +7 -0
  172. package/dist/react-feedback-dialog.js +275 -0
  173. package/dist/react-feedback-dialog.js.map +7 -0
  174. package/dist/react-file-tree.js +376 -0
  175. package/dist/react-file-tree.js.map +7 -0
  176. package/dist/react-file-upload.js +360 -0
  177. package/dist/react-file-upload.js.map +7 -0
  178. package/dist/react-floating-reactions.js +124 -0
  179. package/dist/react-floating-reactions.js.map +7 -0
  180. package/dist/react-flow-editor.js +198 -0
  181. package/dist/react-flow-editor.js.map +7 -0
  182. package/dist/react-footer.js +67 -0
  183. package/dist/react-footer.js.map +7 -0
  184. package/dist/react-graph-view.js +197 -0
  185. package/dist/react-graph-view.js.map +7 -0
  186. package/dist/react-icon-system.js +9 -0
  187. package/dist/react-icon-system.js.map +7 -0
  188. package/dist/react-infinite-canvas.js +8 -0
  189. package/dist/react-infinite-canvas.js.map +7 -0
  190. package/dist/react-inline-editor.js +216 -0
  191. package/dist/react-inline-editor.js.map +7 -0
  192. package/dist/react-input-group.js +150 -0
  193. package/dist/react-input-group.js.map +7 -0
  194. package/dist/react-input.js +10 -0
  195. package/dist/react-input.js.map +7 -0
  196. package/dist/react-install-prompt.js +132 -0
  197. package/dist/react-install-prompt.js.map +7 -0
  198. package/dist/react-kanban-board.js +198 -0
  199. package/dist/react-kanban-board.js.map +7 -0
  200. package/dist/react-keyboard-shortcut.js +36 -0
  201. package/dist/react-keyboard-shortcut.js.map +7 -0
  202. package/dist/react-language-selector.js +311 -0
  203. package/dist/react-language-selector.js.map +7 -0
  204. package/dist/react-link-card.js +48 -0
  205. package/dist/react-link-card.js.map +7 -0
  206. package/dist/react-live-captions.js +92 -0
  207. package/dist/react-live-captions.js.map +7 -0
  208. package/dist/react-live-cursors.js +145 -0
  209. package/dist/react-live-cursors.js.map +7 -0
  210. package/dist/react-live-transcript.js +117 -0
  211. package/dist/react-live-transcript.js.map +7 -0
  212. package/dist/react-location-selector.js +252 -0
  213. package/dist/react-location-selector.js.map +7 -0
  214. package/dist/react-logger.js +415 -0
  215. package/dist/react-logger.js.map +7 -0
  216. package/dist/react-markdown-renderer.js +12 -0
  217. package/dist/react-markdown-renderer.js.map +7 -0
  218. package/dist/react-marquee-strip.js +62 -0
  219. package/dist/react-marquee-strip.js.map +7 -0
  220. package/dist/react-mascot.js +367 -0
  221. package/dist/react-mascot.js.map +7 -0
  222. package/dist/react-mastery-bar.js +97 -0
  223. package/dist/react-mastery-bar.js.map +7 -0
  224. package/dist/react-mini-map.js +207 -0
  225. package/dist/react-mini-map.js.map +7 -0
  226. package/dist/react-mobile-nav.js +216 -0
  227. package/dist/react-mobile-nav.js.map +7 -0
  228. package/dist/react-navbar.js +96 -0
  229. package/dist/react-navbar.js.map +7 -0
  230. package/dist/react-numbered-steps.js +67 -0
  231. package/dist/react-numbered-steps.js.map +7 -0
  232. package/dist/react-otp-input.js +318 -0
  233. package/dist/react-otp-input.js.map +7 -0
  234. package/dist/react-pagination.js +199 -0
  235. package/dist/react-pagination.js.map +7 -0
  236. package/dist/react-password-input.js +104 -0
  237. package/dist/react-password-input.js.map +7 -0
  238. package/dist/react-payment.js +81 -0
  239. package/dist/react-payment.js.map +7 -0
  240. package/dist/react-popover.js +176 -0
  241. package/dist/react-popover.js.map +7 -0
  242. package/dist/react-pre-call-lobby.js +309 -0
  243. package/dist/react-pre-call-lobby.js.map +7 -0
  244. package/dist/react-presence-indicator.js +86 -0
  245. package/dist/react-presence-indicator.js.map +7 -0
  246. package/dist/react-pricing-card.js +142 -0
  247. package/dist/react-pricing-card.js.map +7 -0
  248. package/dist/react-progress-display.js +188 -0
  249. package/dist/react-progress-display.js.map +7 -0
  250. package/dist/react-radial-gauge.js +193 -0
  251. package/dist/react-radial-gauge.js.map +7 -0
  252. package/dist/react-radio.js +169 -0
  253. package/dist/react-radio.js.map +7 -0
  254. package/dist/react-rating-scale.js +171 -0
  255. package/dist/react-rating-scale.js.map +7 -0
  256. package/dist/react-reaction-bar.js +111 -0
  257. package/dist/react-reaction-bar.js.map +7 -0
  258. package/dist/react-resizable-layout.js +298 -0
  259. package/dist/react-resizable-layout.js.map +7 -0
  260. package/dist/react-rich-editor.js +1 -0
  261. package/dist/react-rich-editor.js.map +7 -0
  262. package/dist/react-search-bar.js +285 -0
  263. package/dist/react-search-bar.js.map +7 -0
  264. package/dist/react-section-head.js +65 -0
  265. package/dist/react-section-head.js.map +7 -0
  266. package/dist/react-segmented-control.js +215 -0
  267. package/dist/react-segmented-control.js.map +7 -0
  268. package/dist/react-select.js +389 -0
  269. package/dist/react-select.js.map +7 -0
  270. package/dist/react-separator.js +86 -0
  271. package/dist/react-separator.js.map +7 -0
  272. package/dist/react-sheet.js +310 -0
  273. package/dist/react-sheet.js.map +7 -0
  274. package/dist/react-sidebar.js +100 -0
  275. package/dist/react-sidebar.js.map +7 -0
  276. package/dist/react-skeleton.js +91 -0
  277. package/dist/react-skeleton.js.map +7 -0
  278. package/dist/react-skip-to-content.js +38 -0
  279. package/dist/react-skip-to-content.js.map +7 -0
  280. package/dist/react-slide-viewer.js +264 -0
  281. package/dist/react-slide-viewer.js.map +7 -0
  282. package/dist/react-slider.js +105 -0
  283. package/dist/react-slider.js.map +7 -0
  284. package/dist/react-slot-picker.js +184 -0
  285. package/dist/react-slot-picker.js.map +7 -0
  286. package/dist/react-slot.js +7 -0
  287. package/dist/react-slot.js.map +7 -0
  288. package/dist/react-social-auth-button.js +169 -0
  289. package/dist/react-social-auth-button.js.map +7 -0
  290. package/dist/react-sortable-list.js +204 -0
  291. package/dist/react-sortable-list.js.map +7 -0
  292. package/dist/react-stat-grid.js +69 -0
  293. package/dist/react-stat-grid.js.map +7 -0
  294. package/dist/react-status-indicator.js +117 -0
  295. package/dist/react-status-indicator.js.map +7 -0
  296. package/dist/react-steps.js +167 -0
  297. package/dist/react-steps.js.map +7 -0
  298. package/dist/react-sticky-note.js +131 -0
  299. package/dist/react-sticky-note.js.map +7 -0
  300. package/dist/react-switch.js +139 -0
  301. package/dist/react-switch.js.map +7 -0
  302. package/dist/react-table-of-contents.js +80 -0
  303. package/dist/react-table-of-contents.js.map +7 -0
  304. package/dist/react-tabs.js +230 -0
  305. package/dist/react-tabs.js.map +7 -0
  306. package/dist/react-terminal.js +101 -0
  307. package/dist/react-terminal.js.map +7 -0
  308. package/dist/react-test-results.js +158 -0
  309. package/dist/react-test-results.js.map +7 -0
  310. package/dist/react-textarea.js +89 -0
  311. package/dist/react-textarea.js.map +7 -0
  312. package/dist/react-thread-view.js +139 -0
  313. package/dist/react-thread-view.js.map +7 -0
  314. package/dist/react-timeline.js +153 -0
  315. package/dist/react-timeline.js.map +7 -0
  316. package/dist/react-toast.js +253 -0
  317. package/dist/react-toast.js.map +7 -0
  318. package/dist/react-tooltip.js +221 -0
  319. package/dist/react-tooltip.js.map +7 -0
  320. package/dist/react-version-selector.js +270 -0
  321. package/dist/react-version-selector.js.map +7 -0
  322. package/dist/react-video-grid.js +129 -0
  323. package/dist/react-video-grid.js.map +7 -0
  324. package/dist/react-video-player.js +206 -0
  325. package/dist/react-video-player.js.map +7 -0
  326. package/dist/react-video-tile.js +8 -0
  327. package/dist/react-video-tile.js.map +7 -0
  328. package/dist/react-voice-pill.js +314 -0
  329. package/dist/react-voice-pill.js.map +7 -0
  330. package/dist/react-waveform.js +558 -0
  331. package/dist/react-waveform.js.map +7 -0
  332. package/dist/react-wizard.js +337 -0
  333. package/dist/react-wizard.js.map +7 -0
  334. package/dist/styles.css +7 -0
  335. package/dist/theme.js +1 -1
  336. package/package.json +3 -2
  337. package/dist/applicationinsights-web-H7OBLIVJ.js +0 -23393
  338. package/dist/applicationinsights-web-H7OBLIVJ.js.map +0 -1
  339. package/dist/chunk-4A4BW3GR.js.map +0 -1
  340. package/dist/index.js.map +0 -1
  341. package/dist/module-X3HTTRQK.js +0 -6438
  342. package/dist/module-X3HTTRQK.js.map +0 -1
@@ -0,0 +1,221 @@
1
+ import {
2
+ cn,
3
+ cva,
4
+ devWarn,
5
+ generateId
6
+ } from "./chunk-ZF3OHCGV.js";
7
+
8
+ // ../react-tooltip/dist/index.js
9
+ import * as React from "react";
10
+ import { createPortal } from "react-dom";
11
+
12
+ // ../tooltip/dist/index.js
13
+ function createTooltip(props = {}) {
14
+ const {
15
+ open: controlledOpen,
16
+ defaultOpen = false,
17
+ onOpenChange,
18
+ placement = "top",
19
+ delayDuration = 300
20
+ } = props;
21
+ const contentId = generateId("rfr-tooltip");
22
+ let isOpen = controlledOpen ?? defaultOpen;
23
+ let delayTimer = null;
24
+ const state = { open: isOpen };
25
+ function setOpen(value) {
26
+ isOpen = value;
27
+ state.open = value;
28
+ onOpenChange?.(value);
29
+ }
30
+ function cancelDelay() {
31
+ if (delayTimer !== null) {
32
+ clearTimeout(delayTimer);
33
+ delayTimer = null;
34
+ }
35
+ }
36
+ function open() {
37
+ cancelDelay();
38
+ setOpen(true);
39
+ }
40
+ function close() {
41
+ cancelDelay();
42
+ setOpen(false);
43
+ }
44
+ function openWithDelay() {
45
+ cancelDelay();
46
+ if (delayDuration <= 0) {
47
+ setOpen(true);
48
+ return;
49
+ }
50
+ delayTimer = setTimeout(() => {
51
+ setOpen(true);
52
+ delayTimer = null;
53
+ }, delayDuration);
54
+ }
55
+ const triggerProps = {
56
+ "aria-describedby": contentId
57
+ };
58
+ const contentProps = {
59
+ role: "tooltip",
60
+ id: contentId
61
+ };
62
+ return {
63
+ state,
64
+ triggerProps,
65
+ contentProps,
66
+ placement,
67
+ open,
68
+ close,
69
+ openWithDelay,
70
+ delayDuration,
71
+ cancelDelay
72
+ };
73
+ }
74
+ var tooltipContentVariants = cva({
75
+ base: "z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground shadow-md",
76
+ variants: {
77
+ side: {
78
+ top: "animate-slide-down-fade",
79
+ right: "animate-slide-left-fade",
80
+ bottom: "animate-slide-up-fade",
81
+ left: "animate-slide-right-fade"
82
+ }
83
+ },
84
+ defaultVariants: {
85
+ side: "top"
86
+ }
87
+ });
88
+
89
+ // ../react-tooltip/dist/index.js
90
+ import { jsx } from "react/jsx-runtime";
91
+ var TooltipContext = React.createContext(null);
92
+ function useTooltipContext() {
93
+ const ctx = React.useContext(TooltipContext);
94
+ if (!ctx) {
95
+ devWarn(
96
+ "react-tooltip/context-outside-provider",
97
+ "Tooltip compound components (TooltipTrigger/TooltipContent/etc.) must be rendered inside a <Tooltip>. The missing TooltipContext makes this throw."
98
+ );
99
+ throw new Error("Tooltip compound components must be used within <Tooltip>");
100
+ }
101
+ return ctx;
102
+ }
103
+ function Tooltip({
104
+ open: controlledOpen,
105
+ defaultOpen = false,
106
+ onOpenChange,
107
+ placement,
108
+ delayDuration = 300,
109
+ children
110
+ }) {
111
+ const [internalOpen, setInternalOpen] = React.useState(controlledOpen ?? defaultOpen);
112
+ const isControlled = controlledOpen !== void 0;
113
+ const isOpen = isControlled ? controlledOpen : internalOpen;
114
+ const timerRef = React.useRef(null);
115
+ const handleOpenChange = React.useCallback(
116
+ (value) => {
117
+ if (!isControlled) {
118
+ setInternalOpen(value);
119
+ }
120
+ onOpenChange?.(value);
121
+ },
122
+ [isControlled, onOpenChange]
123
+ );
124
+ const api = React.useMemo(
125
+ () => createTooltip({ open: isOpen, onOpenChange: handleOpenChange, placement, delayDuration }),
126
+ [isOpen, handleOpenChange, placement, delayDuration]
127
+ );
128
+ const cancelDelay = React.useCallback(() => {
129
+ if (timerRef.current !== null) {
130
+ clearTimeout(timerRef.current);
131
+ timerRef.current = null;
132
+ }
133
+ }, []);
134
+ const openWithDelay = React.useCallback(() => {
135
+ cancelDelay();
136
+ if (delayDuration <= 0) {
137
+ handleOpenChange(true);
138
+ return;
139
+ }
140
+ timerRef.current = setTimeout(() => {
141
+ handleOpenChange(true);
142
+ timerRef.current = null;
143
+ }, delayDuration);
144
+ }, [cancelDelay, delayDuration, handleOpenChange]);
145
+ React.useEffect(() => {
146
+ return () => {
147
+ if (timerRef.current !== null) {
148
+ clearTimeout(timerRef.current);
149
+ }
150
+ };
151
+ }, []);
152
+ const ctx = React.useMemo(
153
+ () => ({ api, open: isOpen, setOpen: handleOpenChange, openWithDelay, cancelDelay }),
154
+ [api, isOpen, handleOpenChange, openWithDelay, cancelDelay]
155
+ );
156
+ return React.createElement(TooltipContext.Provider, { value: ctx }, children);
157
+ }
158
+ var TooltipTrigger = React.forwardRef(
159
+ function TooltipTrigger2({ onMouseEnter, onMouseLeave, onFocus, onBlur, children, ...props }, ref) {
160
+ const { api, setOpen, openWithDelay, cancelDelay } = useTooltipContext();
161
+ const handleMouseEnter = (e) => {
162
+ openWithDelay();
163
+ onMouseEnter?.(e);
164
+ };
165
+ const handleMouseLeave = (e) => {
166
+ cancelDelay();
167
+ setOpen(false);
168
+ onMouseLeave?.(e);
169
+ };
170
+ const handleFocus = (e) => {
171
+ openWithDelay();
172
+ onFocus?.(e);
173
+ };
174
+ const handleBlur = (e) => {
175
+ cancelDelay();
176
+ setOpen(false);
177
+ onBlur?.(e);
178
+ };
179
+ return /* @__PURE__ */ jsx(
180
+ "span",
181
+ {
182
+ ref,
183
+ "aria-describedby": api.triggerProps["aria-describedby"],
184
+ onMouseEnter: handleMouseEnter,
185
+ onMouseLeave: handleMouseLeave,
186
+ onFocus: handleFocus,
187
+ onBlur: handleBlur,
188
+ ...props,
189
+ children
190
+ }
191
+ );
192
+ }
193
+ );
194
+ var TooltipContent = React.forwardRef(
195
+ function TooltipContent2({ side, className, children, ...props }, ref) {
196
+ const { api, open } = useTooltipContext();
197
+ if (!open) return null;
198
+ const content = /* @__PURE__ */ jsx(
199
+ "div",
200
+ {
201
+ ref,
202
+ role: api.contentProps.role,
203
+ id: api.contentProps.id,
204
+ className: cn(tooltipContentVariants({ side: side ?? api.placement }), className),
205
+ ...props,
206
+ children
207
+ }
208
+ );
209
+ if (typeof document !== "undefined") {
210
+ return createPortal(content, document.body);
211
+ }
212
+ return content;
213
+ }
214
+ );
215
+ export {
216
+ Tooltip,
217
+ TooltipContent,
218
+ TooltipTrigger,
219
+ tooltipContentVariants
220
+ };
221
+ //# sourceMappingURL=react-tooltip.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../tooltip/src/tooltip.ts", "../../tooltip/src/tooltip.styles.ts", "../../react-tooltip/src/tooltip.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps, Side } from '@refraction-ui/shared'\nimport { generateId } from '@refraction-ui/shared'\n\nexport interface TooltipProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: Side\n delayDuration?: number\n}\n\nexport interface TooltipAPI {\n /** Current open state */\n state: { open: boolean }\n /** Props to spread on the trigger element */\n triggerProps: Partial<AccessibilityProps> & {\n 'aria-describedby': string\n }\n /** Props to spread on the content element */\n contentProps: {\n role: 'tooltip'\n id: string\n }\n /** Resolved placement */\n placement: Side\n /** Open the tooltip */\n open: () => void\n /** Close the tooltip (and clear any pending delay) */\n close: () => void\n /** Open with delay */\n openWithDelay: () => void\n /** The configured delay duration */\n delayDuration: number\n /** Cancel any pending delay timer */\n cancelDelay: () => void\n}\n\nexport function createTooltip(props: TooltipProps = {}): TooltipAPI {\n const {\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n placement = 'top',\n delayDuration = 300,\n } = props\n\n const contentId = generateId('rfr-tooltip')\n\n let isOpen = controlledOpen ?? defaultOpen\n let delayTimer: ReturnType<typeof setTimeout> | null = null\n\n const state = { open: isOpen }\n\n function setOpen(value: boolean) {\n isOpen = value\n state.open = value\n onOpenChange?.(value)\n }\n\n function cancelDelay() {\n if (delayTimer !== null) {\n clearTimeout(delayTimer)\n delayTimer = null\n }\n }\n\n function open() {\n cancelDelay()\n setOpen(true)\n }\n\n function close() {\n cancelDelay()\n setOpen(false)\n }\n\n function openWithDelay() {\n cancelDelay()\n if (delayDuration <= 0) {\n setOpen(true)\n return\n }\n delayTimer = setTimeout(() => {\n setOpen(true)\n delayTimer = null\n }, delayDuration)\n }\n\n const triggerProps = {\n 'aria-describedby': contentId,\n }\n\n const contentProps = {\n role: 'tooltip' as const,\n id: contentId,\n }\n\n return {\n state,\n triggerProps,\n contentProps,\n placement,\n open,\n close,\n openWithDelay,\n delayDuration,\n cancelDelay,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tooltipContentVariants = cva({\n base: 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground shadow-md',\n variants: {\n side: {\n top: 'animate-slide-down-fade',\n right: 'animate-slide-left-fade',\n bottom: 'animate-slide-up-fade',\n left: 'animate-slide-right-fade',\n },\n },\n defaultVariants: {\n side: 'top',\n },\n})\n", "import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport {\n createTooltip,\n tooltipContentVariants,\n type TooltipAPI,\n} from '@refraction-ui/tooltip'\nimport type { Side } from '@refraction-ui/shared'\nimport { cn, devWarn } from '@refraction-ui/shared'\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface TooltipContextValue {\n api: TooltipAPI\n open: boolean\n setOpen: (value: boolean) => void\n openWithDelay: () => void\n cancelDelay: () => void\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext(): TooltipContextValue {\n const ctx = React.useContext(TooltipContext)\n if (!ctx) {\n devWarn(\n 'react-tooltip/context-outside-provider',\n 'Tooltip compound components (TooltipTrigger/TooltipContent/etc.) must be rendered inside a <Tooltip>. The missing TooltipContext makes this throw.',\n )\n throw new Error('Tooltip compound components must be used within <Tooltip>')\n }\n return ctx\n}\n\n/* ------------------------------------------------------------------ */\n/* Tooltip (root provider) */\n/* ------------------------------------------------------------------ */\n\nexport interface TooltipProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: Side\n delayDuration?: number\n children: React.ReactNode\n}\n\nexport function Tooltip({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n placement,\n delayDuration = 300,\n children,\n}: TooltipProps) {\n const [internalOpen, setInternalOpen] = React.useState(controlledOpen ?? defaultOpen)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleOpenChange = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setInternalOpen(value)\n }\n onOpenChange?.(value)\n },\n [isControlled, onOpenChange],\n )\n\n const api = React.useMemo(\n () => createTooltip({ open: isOpen, onOpenChange: handleOpenChange, placement, delayDuration }),\n [isOpen, handleOpenChange, placement, delayDuration],\n )\n\n const cancelDelay = React.useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n const openWithDelay = React.useCallback(() => {\n cancelDelay()\n if (delayDuration <= 0) {\n handleOpenChange(true)\n return\n }\n timerRef.current = setTimeout(() => {\n handleOpenChange(true)\n timerRef.current = null\n }, delayDuration)\n }, [cancelDelay, delayDuration, handleOpenChange])\n\n // Clean up timer on unmount\n React.useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n }\n }\n }, [])\n\n const ctx = React.useMemo<TooltipContextValue>(\n () => ({ api, open: isOpen, setOpen: handleOpenChange, openWithDelay, cancelDelay }),\n [api, isOpen, handleOpenChange, openWithDelay, cancelDelay],\n )\n\n return React.createElement(TooltipContext.Provider, { value: ctx }, children)\n}\n\n/* ------------------------------------------------------------------ */\n/* TooltipTrigger */\n/* ------------------------------------------------------------------ */\n\nexport interface TooltipTriggerProps extends React.HTMLAttributes<HTMLSpanElement> {}\n\nexport const TooltipTrigger = React.forwardRef<HTMLSpanElement, TooltipTriggerProps>(\n function TooltipTrigger({ onMouseEnter, onMouseLeave, onFocus, onBlur, children, ...props }, ref) {\n const { api, setOpen, openWithDelay, cancelDelay } = useTooltipContext()\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLSpanElement>) => {\n openWithDelay()\n onMouseEnter?.(e)\n }\n\n const handleMouseLeave = (e: React.MouseEvent<HTMLSpanElement>) => {\n cancelDelay()\n setOpen(false)\n onMouseLeave?.(e)\n }\n\n const handleFocus = (e: React.FocusEvent<HTMLSpanElement>) => {\n openWithDelay()\n onFocus?.(e)\n }\n\n const handleBlur = (e: React.FocusEvent<HTMLSpanElement>) => {\n cancelDelay()\n setOpen(false)\n onBlur?.(e)\n }\n\n return (\n <span\n ref={ref}\n aria-describedby={api.triggerProps['aria-describedby']}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n >\n {children}\n </span>\n )\n },\n)\n\n/* ------------------------------------------------------------------ */\n/* TooltipContent */\n/* ------------------------------------------------------------------ */\n\nexport interface TooltipContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: Side\n}\n\nexport const TooltipContent = React.forwardRef<HTMLDivElement, TooltipContentProps>(\n function TooltipContent({ side, className, children, ...props }, ref) {\n const { api, open } = useTooltipContext()\n\n if (!open) return null\n\n const content = (\n <div\n ref={ref}\n role={api.contentProps.role}\n id={api.contentProps.id}\n className={cn(tooltipContentVariants({ side: side ?? api.placement }), className)}\n {...props}\n >\n {children}\n </div>\n )\n\n if (typeof document !== 'undefined') {\n return createPortal(content, document.body)\n }\n\n return content\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["TooltipTrigger", "TooltipContent"]
7
+ }
@@ -0,0 +1,270 @@
1
+ import {
2
+ Keys,
3
+ cn,
4
+ createKeyboardHandler,
5
+ cva,
6
+ generateId
7
+ } from "./chunk-ZF3OHCGV.js";
8
+
9
+ // ../react-version-selector/dist/index.js
10
+ import * as React from "react";
11
+
12
+ // ../version-selector/dist/index.js
13
+ function createVersionSelector(props) {
14
+ const {
15
+ value: initialValue = "",
16
+ onValueChange,
17
+ versions
18
+ } = props;
19
+ const contentId = generateId("rfr-ver-sel");
20
+ let selectedVersion = initialValue;
21
+ let isOpen = false;
22
+ const state = { selectedVersion, isOpen };
23
+ function setOpen(value) {
24
+ isOpen = value;
25
+ state.isOpen = value;
26
+ }
27
+ function select(value) {
28
+ selectedVersion = value;
29
+ state.selectedVersion = value;
30
+ onValueChange?.(value);
31
+ setOpen(false);
32
+ }
33
+ const triggerProps = {
34
+ "aria-expanded": isOpen,
35
+ "aria-controls": contentId,
36
+ "aria-haspopup": "listbox",
37
+ role: "combobox"
38
+ };
39
+ const contentProps = {
40
+ role: "listbox",
41
+ id: contentId
42
+ };
43
+ function getOptionProps(value) {
44
+ const version = versions.find((v) => v.value === value);
45
+ const base = {
46
+ role: "option",
47
+ "aria-selected": selectedVersion === value,
48
+ "data-value": value
49
+ };
50
+ if (version?.isLatest) {
51
+ return { ...base, "data-latest": "true" };
52
+ }
53
+ return base;
54
+ }
55
+ const keyboardHandlers = {
56
+ [Keys.Escape]: () => {
57
+ setOpen(false);
58
+ },
59
+ [Keys.Enter]: () => {
60
+ setOpen(!isOpen);
61
+ },
62
+ [Keys.Space]: () => {
63
+ setOpen(!isOpen);
64
+ },
65
+ [Keys.ArrowDown]: () => {
66
+ if (!isOpen) {
67
+ setOpen(true);
68
+ }
69
+ },
70
+ [Keys.ArrowUp]: () => {
71
+ if (!isOpen) {
72
+ setOpen(true);
73
+ }
74
+ }
75
+ };
76
+ const handleKeyDown = createKeyboardHandler(keyboardHandlers);
77
+ return {
78
+ state,
79
+ triggerProps,
80
+ contentProps,
81
+ getOptionProps,
82
+ select,
83
+ open: () => setOpen(true),
84
+ close: () => setOpen(false),
85
+ keyboardHandlers,
86
+ handleKeyDown
87
+ };
88
+ }
89
+ var versionSelectorVariants = cva({
90
+ base: "relative inline-flex items-center justify-between rounded-md border bg-background text-foreground cursor-pointer",
91
+ variants: {
92
+ size: {
93
+ sm: "h-8 text-sm px-2 min-w-[100px]",
94
+ md: "h-10 text-base px-3 min-w-[140px]",
95
+ lg: "h-12 text-lg px-4 min-w-[180px]"
96
+ }
97
+ },
98
+ defaultVariants: {
99
+ size: "md"
100
+ }
101
+ });
102
+ var versionSelectorOptionVariants = cva({
103
+ base: "flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-accent",
104
+ variants: {
105
+ selected: {
106
+ true: "bg-accent/50 font-medium",
107
+ false: ""
108
+ }
109
+ },
110
+ defaultVariants: {
111
+ selected: "false"
112
+ }
113
+ });
114
+ var latestBadgeVariants = cva({
115
+ base: "inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5",
116
+ variants: {
117
+ variant: {
118
+ default: "bg-primary/10 text-primary",
119
+ accent: "bg-accent text-accent-foreground"
120
+ }
121
+ },
122
+ defaultVariants: {
123
+ variant: "default"
124
+ }
125
+ });
126
+
127
+ // ../react-version-selector/dist/index.js
128
+ var VersionSelectorContext = React.createContext(null);
129
+ var VersionSelector = React.forwardRef(
130
+ function VersionSelector2({ value: controlledValue, onValueChange, versions, placeholder = "Select version...", className }, ref) {
131
+ const [selectedVersion, setSelectedVersion] = React.useState(controlledValue ?? "");
132
+ const [isOpen, setIsOpen] = React.useState(false);
133
+ const containerRef = React.useRef(null);
134
+ const mergedRef = React.useCallback(
135
+ (node) => {
136
+ containerRef.current = node;
137
+ if (typeof ref === "function") ref(node);
138
+ else if (ref) ref.current = node;
139
+ },
140
+ [ref]
141
+ );
142
+ const handleValueChange = React.useCallback(
143
+ (val) => {
144
+ setSelectedVersion(val);
145
+ onValueChange?.(val);
146
+ },
147
+ [onValueChange]
148
+ );
149
+ const api = React.useMemo(
150
+ () => createVersionSelector({
151
+ value: selectedVersion,
152
+ onValueChange: handleValueChange,
153
+ versions
154
+ }),
155
+ [selectedVersion, handleValueChange, versions]
156
+ );
157
+ const handleSelect = React.useCallback(
158
+ (val) => {
159
+ setSelectedVersion(val);
160
+ onValueChange?.(val);
161
+ setIsOpen(false);
162
+ },
163
+ [onValueChange]
164
+ );
165
+ const handleTriggerClick = React.useCallback(() => {
166
+ setIsOpen((prev) => !prev);
167
+ }, []);
168
+ const handleKeyDown = React.useCallback(
169
+ (e) => {
170
+ if (e.key === "Escape") {
171
+ setIsOpen(false);
172
+ } else if (e.key === "Enter" || e.key === " ") {
173
+ e.preventDefault();
174
+ setIsOpen((prev) => !prev);
175
+ } else if (e.key === "ArrowDown" || e.key === "ArrowUp") {
176
+ if (!isOpen) {
177
+ setIsOpen(true);
178
+ }
179
+ }
180
+ },
181
+ [isOpen]
182
+ );
183
+ React.useEffect(() => {
184
+ if (!isOpen) return;
185
+ function handleClickOutside(e) {
186
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
187
+ setIsOpen(false);
188
+ }
189
+ }
190
+ document.addEventListener("mousedown", handleClickOutside);
191
+ return () => document.removeEventListener("mousedown", handleClickOutside);
192
+ }, [isOpen]);
193
+ const ctx = React.useMemo(
194
+ () => ({
195
+ api,
196
+ isOpen,
197
+ setOpen: setIsOpen,
198
+ select: handleSelect,
199
+ versions
200
+ }),
201
+ [api, isOpen, handleSelect, versions]
202
+ );
203
+ const selectedOpt = versions.find((v) => v.value === selectedVersion);
204
+ const displayLabel = selectedOpt ? selectedOpt.label : placeholder;
205
+ return React.createElement(
206
+ VersionSelectorContext.Provider,
207
+ { value: ctx },
208
+ React.createElement(
209
+ "div",
210
+ { ref: mergedRef, className: cn("rfr-version-selector relative inline-block", className) },
211
+ // Trigger
212
+ React.createElement(
213
+ "button",
214
+ {
215
+ type: "button",
216
+ role: api.triggerProps.role,
217
+ "aria-expanded": isOpen,
218
+ "aria-controls": api.triggerProps["aria-controls"],
219
+ "aria-haspopup": api.triggerProps["aria-haspopup"],
220
+ className: versionSelectorVariants(),
221
+ onClick: handleTriggerClick,
222
+ onKeyDown: handleKeyDown
223
+ },
224
+ React.createElement("span", null, displayLabel),
225
+ selectedOpt?.isLatest && React.createElement(
226
+ "span",
227
+ { className: cn(latestBadgeVariants(), "ml-2") },
228
+ "Latest"
229
+ ),
230
+ React.createElement("span", { "aria-hidden": "true", className: "ml-2" }, "\u25BE")
231
+ ),
232
+ // Dropdown
233
+ isOpen && React.createElement(
234
+ "ul",
235
+ {
236
+ role: api.contentProps.role,
237
+ id: api.contentProps.id,
238
+ className: "absolute top-full left-0 w-full mt-1 rounded-md border bg-popover text-popover-foreground shadow-md z-50 overflow-auto max-h-60"
239
+ },
240
+ ...versions.map((ver) => {
241
+ const optProps = api.getOptionProps(ver.value);
242
+ const isSelected = selectedVersion === ver.value;
243
+ return React.createElement(
244
+ "li",
245
+ {
246
+ key: ver.value,
247
+ ...optProps,
248
+ className: versionSelectorOptionVariants({ selected: isSelected ? "true" : "false" }),
249
+ onClick: () => handleSelect(ver.value)
250
+ },
251
+ React.createElement("span", null, ver.label),
252
+ ver.isLatest && React.createElement(
253
+ "span",
254
+ { className: latestBadgeVariants() },
255
+ "Latest"
256
+ )
257
+ );
258
+ })
259
+ )
260
+ )
261
+ );
262
+ }
263
+ );
264
+ export {
265
+ VersionSelector,
266
+ latestBadgeVariants,
267
+ versionSelectorOptionVariants as optionVariants,
268
+ versionSelectorVariants
269
+ };
270
+ //# sourceMappingURL=react-version-selector.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../version-selector/src/version-selector.ts", "../../version-selector/src/version-selector.styles.ts", "../../react-version-selector/src/version-selector.tsx"],
4
+ "sourcesContent": ["import type { KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { generateId, Keys, createKeyboardHandler } from '@refraction-ui/shared'\n\nexport interface VersionOption {\n value: string\n label: string\n isLatest?: boolean\n}\n\nexport interface VersionSelectorProps {\n value?: string\n onValueChange?: (value: string) => void\n versions: VersionOption[]\n}\n\nexport interface VersionSelectorAPI {\n /** Current state */\n state: { selectedVersion: string; isOpen: boolean }\n /** Props to spread on the trigger element */\n triggerProps: {\n 'aria-expanded': boolean\n 'aria-controls': string\n 'aria-haspopup': 'listbox'\n role: 'combobox'\n }\n /** Props to spread on the content/dropdown element */\n contentProps: {\n role: 'listbox'\n id: string\n }\n /** Get props for an individual option */\n getOptionProps: (value: string) => {\n role: 'option'\n 'aria-selected': boolean\n 'data-value': string\n 'data-latest'?: string\n }\n /** Select a version */\n select: (value: string) => void\n /** Open the dropdown */\n open: () => void\n /** Close the dropdown */\n close: () => void\n /** Keyboard handler map */\n keyboardHandlers: KeyboardHandlerMap\n /** Pre-built keyboard event handler */\n handleKeyDown: (event: KeyboardEvent) => void\n}\n\nexport function createVersionSelector(props: VersionSelectorProps): VersionSelectorAPI {\n const {\n value: initialValue = '',\n onValueChange,\n versions,\n } = props\n\n const contentId = generateId('rfr-ver-sel')\n\n let selectedVersion = initialValue\n let isOpen = false\n\n const state = { selectedVersion, isOpen }\n\n function setOpen(value: boolean) {\n isOpen = value\n state.isOpen = value\n }\n\n function select(value: string) {\n selectedVersion = value\n state.selectedVersion = value\n onValueChange?.(value)\n setOpen(false)\n }\n\n const triggerProps = {\n 'aria-expanded': isOpen,\n 'aria-controls': contentId,\n 'aria-haspopup': 'listbox' as const,\n role: 'combobox' as const,\n }\n\n const contentProps = {\n role: 'listbox' as const,\n id: contentId,\n }\n\n function getOptionProps(value: string) {\n const version = versions.find((v) => v.value === value)\n const base = {\n role: 'option' as const,\n 'aria-selected': selectedVersion === value,\n 'data-value': value,\n }\n if (version?.isLatest) {\n return { ...base, 'data-latest': 'true' }\n }\n return base\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.Escape]: () => {\n setOpen(false)\n },\n [Keys.Enter]: () => {\n setOpen(!isOpen)\n },\n [Keys.Space]: () => {\n setOpen(!isOpen)\n },\n [Keys.ArrowDown]: () => {\n if (!isOpen) {\n setOpen(true)\n }\n },\n [Keys.ArrowUp]: () => {\n if (!isOpen) {\n setOpen(true)\n }\n },\n }\n\n const handleKeyDown = createKeyboardHandler(keyboardHandlers)\n\n return {\n state,\n triggerProps,\n contentProps,\n getOptionProps,\n select,\n open: () => setOpen(true),\n close: () => setOpen(false),\n keyboardHandlers,\n handleKeyDown,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const versionSelectorVariants = cva({\n base: 'relative inline-flex items-center justify-between rounded-md border bg-background text-foreground cursor-pointer',\n variants: {\n size: {\n sm: 'h-8 text-sm px-2 min-w-[100px]',\n md: 'h-10 text-base px-3 min-w-[140px]',\n lg: 'h-12 text-lg px-4 min-w-[180px]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nconst versionSelectorOptionVariants = cva({\n base: 'flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-accent',\n variants: {\n selected: {\n true: 'bg-accent/50 font-medium',\n false: '',\n },\n },\n defaultVariants: {\n selected: 'false',\n },\n})\n\nexport { versionSelectorOptionVariants as optionVariants }\n\nexport const latestBadgeVariants = cva({\n base: 'inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5',\n variants: {\n variant: {\n default: 'bg-primary/10 text-primary',\n accent: 'bg-accent text-accent-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n", "import * as React from 'react'\nimport {\n createVersionSelector,\n versionSelectorVariants,\n optionVariants,\n latestBadgeVariants,\n type VersionSelectorAPI,\n type VersionOption,\n} from '@refraction-ui/version-selector'\nimport { cn, devWarn } from '@refraction-ui/shared'\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface VersionSelectorContextValue {\n api: VersionSelectorAPI\n isOpen: boolean\n setOpen: (value: boolean) => void\n select: (value: string) => void\n versions: VersionOption[]\n}\n\nconst VersionSelectorContext = React.createContext<VersionSelectorContextValue | null>(null)\n\nfunction useVersionSelectorContext(): VersionSelectorContextValue {\n const ctx = React.useContext(VersionSelectorContext)\n if (!ctx) {\n devWarn(\n 'react-version-selector/compound-outside-provider',\n 'A VersionSelector compound component was rendered outside of <VersionSelector>. Wrap it in <VersionSelector>.',\n )\n throw new Error('VersionSelector compound components must be used within <VersionSelector>')\n }\n return ctx\n}\n\n/* ------------------------------------------------------------------ */\n/* VersionSelector (root component) */\n/* ------------------------------------------------------------------ */\n\nexport interface VersionSelectorProps {\n value?: string\n onValueChange?: (value: string) => void\n versions: VersionOption[]\n placeholder?: string\n className?: string\n}\n\nexport const VersionSelector = React.forwardRef<HTMLDivElement, VersionSelectorProps>(\n function VersionSelector({ value: controlledValue, onValueChange, versions, placeholder = 'Select version...', className }: VersionSelectorProps, ref) {\n const [selectedVersion, setSelectedVersion] = React.useState(controlledValue ?? '')\n const [isOpen, setIsOpen] = React.useState(false)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const mergedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n containerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n },\n [ref],\n )\n\n const handleValueChange = React.useCallback(\n (val: string) => {\n setSelectedVersion(val)\n onValueChange?.(val)\n },\n [onValueChange],\n )\n\n const api = React.useMemo(\n () =>\n createVersionSelector({\n value: selectedVersion,\n onValueChange: handleValueChange,\n versions,\n }),\n [selectedVersion, handleValueChange, versions],\n )\n\n const handleSelect = React.useCallback(\n (val: string) => {\n setSelectedVersion(val)\n onValueChange?.(val)\n setIsOpen(false)\n },\n [onValueChange],\n )\n\n const handleTriggerClick = React.useCallback(() => {\n setIsOpen((prev) => !prev)\n }, [])\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setIsOpen((prev) => !prev)\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n if (!isOpen) {\n setIsOpen(true)\n }\n }\n },\n [isOpen],\n )\n\n // Click outside to close\n React.useEffect(() => {\n if (!isOpen) return\n function handleClickOutside(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [isOpen])\n\n const ctx = React.useMemo<VersionSelectorContextValue>(\n () => ({\n api,\n isOpen,\n setOpen: setIsOpen,\n select: handleSelect,\n versions,\n }),\n [api, isOpen, handleSelect, versions],\n )\n\n const selectedOpt = versions.find((v) => v.value === selectedVersion)\n const displayLabel = selectedOpt ? selectedOpt.label : placeholder\n\n return React.createElement(\n VersionSelectorContext.Provider,\n { value: ctx },\n React.createElement(\n 'div',\n { ref: mergedRef, className: cn('rfr-version-selector relative inline-block', className) },\n // Trigger\n React.createElement(\n 'button',\n {\n type: 'button',\n role: api.triggerProps.role,\n 'aria-expanded': isOpen,\n 'aria-controls': api.triggerProps['aria-controls'],\n 'aria-haspopup': api.triggerProps['aria-haspopup'],\n className: versionSelectorVariants(),\n onClick: handleTriggerClick,\n onKeyDown: handleKeyDown,\n },\n React.createElement('span', null, displayLabel),\n selectedOpt?.isLatest &&\n React.createElement(\n 'span',\n { className: cn(latestBadgeVariants(), 'ml-2') },\n 'Latest',\n ),\n React.createElement('span', { 'aria-hidden': 'true', className: 'ml-2' }, '\\u25BE'),\n ),\n // Dropdown\n isOpen &&\n React.createElement(\n 'ul',\n {\n role: api.contentProps.role,\n id: api.contentProps.id,\n className:\n 'absolute top-full left-0 w-full mt-1 rounded-md border bg-popover text-popover-foreground shadow-md z-50 overflow-auto max-h-60',\n },\n ...versions.map((ver) => {\n const optProps = api.getOptionProps(ver.value)\n const isSelected = selectedVersion === ver.value\n return React.createElement(\n 'li',\n {\n key: ver.value,\n ...optProps,\n className: optionVariants({ selected: isSelected ? 'true' : 'false' }),\n onClick: () => handleSelect(ver.value),\n },\n React.createElement('span', null, ver.label),\n ver.isLatest &&\n React.createElement(\n 'span',\n { className: latestBadgeVariants() },\n 'Latest',\n ),\n )\n }),\n ),\n ),\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["VersionSelector"]
7
+ }
@@ -0,0 +1,129 @@
1
+ import {
2
+ VideoTile
3
+ } from "./chunk-H54FLNAF.js";
4
+ import {
5
+ cn,
6
+ cva
7
+ } from "./chunk-ZF3OHCGV.js";
8
+
9
+ // ../react-video-grid/dist/index.js
10
+ import * as React from "react";
11
+
12
+ // ../video-grid/dist/index.js
13
+ function computeGridColumns(count) {
14
+ if (count <= 1) return 1;
15
+ if (count <= 4) return 2;
16
+ if (count <= 9) return 3;
17
+ if (count <= 16) return 4;
18
+ if (count <= 25) return 5;
19
+ return 6;
20
+ }
21
+ function createVideoGrid(props = {}) {
22
+ const { layout = "auto" } = props;
23
+ return {
24
+ ariaProps: {
25
+ role: "group"
26
+ },
27
+ dataAttributes: {
28
+ "data-layout": layout
29
+ }
30
+ };
31
+ }
32
+ var videoGridVariants = cva({
33
+ base: "w-full h-full gap-2",
34
+ variants: {
35
+ layout: {
36
+ grid: "grid",
37
+ speaker: "flex flex-col",
38
+ auto: "grid"
39
+ }
40
+ },
41
+ defaultVariants: {
42
+ layout: "auto"
43
+ }
44
+ });
45
+ var videoGridSpotlightClass = "relative flex-1 min-h-0 rounded-xl overflow-hidden bg-muted";
46
+ var videoGridFilmstripClass = "flex flex-row gap-2 overflow-x-auto py-1 shrink-0";
47
+ var videoGridFilmstripTileClass = "w-36 shrink-0";
48
+
49
+ // ../react-video-grid/dist/index.js
50
+ import { jsxs, jsx } from "react/jsx-runtime";
51
+ var VideoGrid = React.forwardRef(
52
+ function VideoGrid2({
53
+ participants,
54
+ layout = "auto",
55
+ spotlightId,
56
+ className,
57
+ style,
58
+ ...props
59
+ }, ref) {
60
+ const count = participants.length;
61
+ const effectiveLayout = layout === "auto" ? count <= 1 ? "speaker" : "grid" : layout;
62
+ const api = createVideoGrid({ layout: effectiveLayout });
63
+ const columns = computeGridColumns(count);
64
+ const gridStyle = effectiveLayout !== "speaker" ? { gridTemplateColumns: `repeat(${columns}, 1fr)`, ...style } : { ...style };
65
+ if (effectiveLayout === "speaker") {
66
+ const spotlightParticipant = participants.find((p) => p.id === spotlightId) ?? participants[0];
67
+ const filmstrip = participants.filter(
68
+ (p) => p.id !== spotlightParticipant?.id
69
+ );
70
+ return /* @__PURE__ */ jsxs(
71
+ "div",
72
+ {
73
+ ref,
74
+ className: cn(videoGridVariants({ layout: "speaker" }), className),
75
+ style,
76
+ ...api.ariaProps,
77
+ ...api.dataAttributes,
78
+ ...props,
79
+ children: [
80
+ /* @__PURE__ */ jsx("div", { className: videoGridSpotlightClass, children: spotlightParticipant && /* @__PURE__ */ jsx(
81
+ VideoTile,
82
+ {
83
+ name: spotlightParticipant.name,
84
+ micState: spotlightParticipant.micState ?? "on",
85
+ speaking: spotlightParticipant.speaking,
86
+ pinned: spotlightParticipant.pinned
87
+ },
88
+ spotlightParticipant.id
89
+ ) }),
90
+ filmstrip.length > 0 && /* @__PURE__ */ jsx("div", { className: videoGridFilmstripClass, children: filmstrip.map((p) => /* @__PURE__ */ jsx("div", { className: videoGridFilmstripTileClass, children: /* @__PURE__ */ jsx(
91
+ VideoTile,
92
+ {
93
+ name: p.name,
94
+ micState: p.micState ?? "on",
95
+ speaking: p.speaking,
96
+ pinned: p.pinned
97
+ }
98
+ ) }, p.id)) })
99
+ ]
100
+ }
101
+ );
102
+ }
103
+ return /* @__PURE__ */ jsx(
104
+ "div",
105
+ {
106
+ ref,
107
+ className: cn(videoGridVariants({ layout: effectiveLayout }), className),
108
+ style: gridStyle,
109
+ ...api.ariaProps,
110
+ ...api.dataAttributes,
111
+ ...props,
112
+ children: participants.map((p) => /* @__PURE__ */ jsx(
113
+ VideoTile,
114
+ {
115
+ name: p.name,
116
+ micState: p.micState ?? "on",
117
+ speaking: p.speaking,
118
+ pinned: p.pinned
119
+ },
120
+ p.id
121
+ ))
122
+ }
123
+ );
124
+ }
125
+ );
126
+ export {
127
+ VideoGrid
128
+ };
129
+ //# sourceMappingURL=react-video-grid.js.map