@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,292 @@
1
+ import {
2
+ Keys,
3
+ cn,
4
+ createKeyboardHandler,
5
+ createMachine,
6
+ cva,
7
+ devWarn,
8
+ generateId
9
+ } from "./chunk-ZF3OHCGV.js";
10
+
11
+ // ../react-dropdown-menu/dist/index.js
12
+ import * as React from "react";
13
+ import * as ReactDOM from "react-dom";
14
+
15
+ // ../dropdown-menu/dist/index.js
16
+ function createDropdownMenu(props = {}) {
17
+ const { open: controlledOpen, defaultOpen = false, onOpenChange } = props;
18
+ const machine = createMachine({
19
+ initial: controlledOpen ?? defaultOpen ? "open" : "closed",
20
+ states: {
21
+ closed: { on: { OPEN: "open" } },
22
+ open: { on: { CLOSE: "closed" } }
23
+ }
24
+ });
25
+ const contentId = generateId("rfr-dropdown-menu");
26
+ function isOpen() {
27
+ if (controlledOpen !== void 0) return controlledOpen;
28
+ return machine.matches("open");
29
+ }
30
+ function openMenu() {
31
+ machine.send("OPEN");
32
+ onOpenChange?.(true);
33
+ }
34
+ function closeMenu() {
35
+ machine.send("CLOSE");
36
+ onOpenChange?.(false);
37
+ }
38
+ function toggleMenu() {
39
+ if (isOpen()) {
40
+ closeMenu();
41
+ } else {
42
+ openMenu();
43
+ }
44
+ }
45
+ function getItemProps(item) {
46
+ return {
47
+ role: "menuitem",
48
+ tabIndex: item.disabled ? -1 : 0,
49
+ "data-disabled": item.disabled ? "" : void 0,
50
+ "aria-disabled": item.disabled || void 0
51
+ };
52
+ }
53
+ const keyboardHandlers = {
54
+ [Keys.Escape]: (e) => {
55
+ e.preventDefault();
56
+ closeMenu();
57
+ },
58
+ [Keys.ArrowDown]: (e) => {
59
+ e.preventDefault();
60
+ },
61
+ [Keys.ArrowUp]: (e) => {
62
+ e.preventDefault();
63
+ },
64
+ [Keys.Enter]: (e) => {
65
+ e.preventDefault();
66
+ },
67
+ [Keys.Home]: (e) => {
68
+ e.preventDefault();
69
+ },
70
+ [Keys.End]: (e) => {
71
+ e.preventDefault();
72
+ }
73
+ };
74
+ const triggerProps = {
75
+ "aria-expanded": isOpen(),
76
+ "aria-controls": contentId,
77
+ "aria-haspopup": "menu"
78
+ };
79
+ const contentProps = {
80
+ role: "menu",
81
+ id: contentId,
82
+ "data-state": isOpen() ? "open" : "closed"
83
+ };
84
+ return {
85
+ state: { open: isOpen() },
86
+ triggerProps,
87
+ contentProps,
88
+ getItemProps,
89
+ open: openMenu,
90
+ close: closeMenu,
91
+ toggle: toggleMenu,
92
+ keyboardHandlers,
93
+ ids: {
94
+ content: contentId
95
+ }
96
+ };
97
+ }
98
+ var menuContentVariants = cva({
99
+ base: "z-50 rounded-md border bg-popover shadow-md"
100
+ });
101
+ var menuItemVariants = cva({
102
+ base: "relative flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
103
+ });
104
+
105
+ // ../react-dropdown-menu/dist/index.js
106
+ var DropdownMenuContext = React.createContext(null);
107
+ function useDropdownMenuContext() {
108
+ const ctx = React.useContext(DropdownMenuContext);
109
+ if (!ctx) {
110
+ devWarn(
111
+ "react-dropdown-menu/context-outside-provider",
112
+ "DropdownMenu compound components (DropdownMenuTrigger/DropdownMenuContent/DropdownMenuItem/etc.) must be rendered inside a <DropdownMenu>. The missing DropdownMenuContext makes this throw."
113
+ );
114
+ throw new Error("DropdownMenu compound components must be used within <DropdownMenu>");
115
+ }
116
+ return ctx;
117
+ }
118
+ function DropdownMenu({
119
+ open: controlledOpen,
120
+ defaultOpen = false,
121
+ onOpenChange,
122
+ children
123
+ }) {
124
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);
125
+ const isControlled = controlledOpen !== void 0;
126
+ const open = isControlled ? controlledOpen : uncontrolledOpen;
127
+ const handleOpenChange = React.useCallback(
128
+ (next) => {
129
+ if (!isControlled) {
130
+ setUncontrolledOpen(next);
131
+ }
132
+ onOpenChange?.(next);
133
+ },
134
+ [isControlled, onOpenChange]
135
+ );
136
+ const apiRef = React.useRef(null);
137
+ if (apiRef.current === null) {
138
+ apiRef.current = createDropdownMenu({ open });
139
+ }
140
+ const api = apiRef.current;
141
+ const ctx = React.useMemo(
142
+ () => ({
143
+ open,
144
+ onOpenChange: handleOpenChange,
145
+ contentId: api.ids.content
146
+ }),
147
+ [open, handleOpenChange, api.ids.content]
148
+ );
149
+ return React.createElement(DropdownMenuContext.Provider, { value: ctx }, children);
150
+ }
151
+ var DropdownMenuTrigger = React.forwardRef(
152
+ function DropdownMenuTrigger2({ asChild = false, onClick, children, ...props }, ref) {
153
+ const { open, onOpenChange, contentId } = useDropdownMenuContext();
154
+ const handleClick = (e) => {
155
+ onOpenChange(!open);
156
+ onClick?.(e);
157
+ };
158
+ const triggerProps = {
159
+ type: "button",
160
+ "aria-expanded": open,
161
+ "aria-controls": contentId,
162
+ "aria-haspopup": "menu",
163
+ onClick: handleClick,
164
+ ...props
165
+ };
166
+ if (asChild) {
167
+ if (!React.isValidElement(children)) {
168
+ devWarn(
169
+ "dropdown-menu-trigger-asChild-child",
170
+ "DropdownMenuTrigger: `asChild` expects a single React element child; rendering nothing."
171
+ );
172
+ return null;
173
+ }
174
+ const child = children;
175
+ const childOnClick = child.props.onClick;
176
+ const childRef = child.ref;
177
+ const mergedProps = {
178
+ ...triggerProps,
179
+ onClick: (e) => {
180
+ childOnClick?.(e);
181
+ if (!e.defaultPrevented) handleClick(e);
182
+ },
183
+ ref: (node) => {
184
+ if (typeof ref === "function") ref(node);
185
+ else if (ref) ref.current = node;
186
+ if (typeof childRef === "function") childRef(node);
187
+ else if (childRef) childRef.current = node;
188
+ }
189
+ };
190
+ return React.cloneElement(child, mergedProps);
191
+ }
192
+ return React.createElement("button", { ref, ...triggerProps }, children);
193
+ }
194
+ );
195
+ var DropdownMenuContent = React.forwardRef(
196
+ function DropdownMenuContent2({ className, children, onKeyDown, ...props }, ref) {
197
+ const { open, onOpenChange, contentId } = useDropdownMenuContext();
198
+ const handleKeyDown = (e) => {
199
+ const handler = createKeyboardHandler({
200
+ Escape: (ev) => {
201
+ ev.preventDefault();
202
+ onOpenChange(false);
203
+ }
204
+ });
205
+ handler(e.nativeEvent);
206
+ onKeyDown?.(e);
207
+ };
208
+ if (!open) return null;
209
+ const content = React.createElement(
210
+ "div",
211
+ {
212
+ ref,
213
+ role: "menu",
214
+ id: contentId,
215
+ "data-state": open ? "open" : "closed",
216
+ className: cn(menuContentVariants(), className),
217
+ onKeyDown: handleKeyDown,
218
+ tabIndex: -1,
219
+ ...props
220
+ },
221
+ children
222
+ );
223
+ if (typeof document !== "undefined") {
224
+ return ReactDOM.createPortal(content, document.body);
225
+ }
226
+ return content;
227
+ }
228
+ );
229
+ var DropdownMenuItem = React.forwardRef(
230
+ function DropdownMenuItem2({ className, disabled, onSelect, onClick, children, ...props }, ref) {
231
+ const { onOpenChange } = useDropdownMenuContext();
232
+ const handleClick = (e) => {
233
+ if (disabled) return;
234
+ onSelect?.();
235
+ onOpenChange(false);
236
+ onClick?.(e);
237
+ };
238
+ const handleKeyDown = (e) => {
239
+ if (disabled) return;
240
+ if (e.key === "Enter" || e.key === " ") {
241
+ e.preventDefault();
242
+ onSelect?.();
243
+ onOpenChange(false);
244
+ }
245
+ };
246
+ return React.createElement(
247
+ "div",
248
+ {
249
+ ref,
250
+ role: "menuitem",
251
+ tabIndex: disabled ? -1 : 0,
252
+ "data-disabled": disabled ? "" : void 0,
253
+ "aria-disabled": disabled || void 0,
254
+ className: cn(menuItemVariants(), className),
255
+ onClick: handleClick,
256
+ onKeyDown: handleKeyDown,
257
+ ...props
258
+ },
259
+ children
260
+ );
261
+ }
262
+ );
263
+ var DropdownMenuSeparator = React.forwardRef(
264
+ function DropdownMenuSeparator2({ className, ...props }, ref) {
265
+ return React.createElement("div", {
266
+ ref,
267
+ role: "separator",
268
+ className: cn("-mx-1 my-1 h-px bg-muted", className),
269
+ ...props
270
+ });
271
+ }
272
+ );
273
+ var DropdownMenuLabel = React.forwardRef(
274
+ function DropdownMenuLabel2({ className, ...props }, ref) {
275
+ return React.createElement("div", {
276
+ ref,
277
+ className: cn("px-2 py-1.5 text-sm font-semibold", className),
278
+ ...props
279
+ });
280
+ }
281
+ );
282
+ export {
283
+ DropdownMenu,
284
+ DropdownMenuContent,
285
+ DropdownMenuItem,
286
+ DropdownMenuLabel,
287
+ DropdownMenuSeparator,
288
+ DropdownMenuTrigger,
289
+ menuContentVariants,
290
+ menuItemVariants
291
+ };
292
+ //# sourceMappingURL=react-dropdown-menu.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../dropdown-menu/src/dropdown-menu.ts", "../../dropdown-menu/src/dropdown-menu.styles.ts", "../../react-dropdown-menu/src/dropdown-menu.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { createMachine, Keys, generateId } from '@refraction-ui/shared'\n\nexport interface DropdownMenuProps {\n /** Whether the menu is open (controlled) */\n open?: boolean\n /** Whether the menu starts open (uncontrolled) */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n}\n\nexport interface MenuItemProps {\n /** Whether the item is disabled */\n disabled?: boolean\n /** Callback when the item is selected */\n onSelect?: () => void\n}\n\nexport interface DropdownMenuState {\n open: boolean\n}\n\nexport interface DropdownMenuAPI {\n /** Current menu state */\n state: DropdownMenuState\n /** ARIA attributes for the trigger button */\n triggerProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** ARIA attributes for the menu content */\n contentProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for menu item props */\n getItemProps(item: MenuItemProps): Partial<AccessibilityProps> & Record<string, unknown>\n /** Open the menu */\n open(): void\n /** Close the menu */\n close(): void\n /** Toggle the menu */\n toggle(): void\n /** Keyboard handlers for the menu */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated IDs for aria linking */\n ids: {\n content: string\n }\n}\n\nexport function createDropdownMenu(props: DropdownMenuProps = {}): DropdownMenuAPI {\n const { open: controlledOpen, defaultOpen = false, onOpenChange } = props\n\n const machine = createMachine<'open' | 'closed', 'OPEN' | 'CLOSE'>({\n initial: controlledOpen ?? defaultOpen ? 'open' : 'closed',\n states: {\n closed: { on: { OPEN: 'open' } },\n open: { on: { CLOSE: 'closed' } },\n },\n })\n\n const contentId = generateId('rfr-dropdown-menu')\n\n function isOpen(): boolean {\n if (controlledOpen !== undefined) return controlledOpen\n return machine.matches('open')\n }\n\n function openMenu(): void {\n machine.send('OPEN')\n onOpenChange?.(true)\n }\n\n function closeMenu(): void {\n machine.send('CLOSE')\n onOpenChange?.(false)\n }\n\n function toggleMenu(): void {\n if (isOpen()) {\n closeMenu()\n } else {\n openMenu()\n }\n }\n\n function getItemProps(item: MenuItemProps): Partial<AccessibilityProps> & Record<string, unknown> {\n return {\n role: 'menuitem',\n tabIndex: item.disabled ? -1 : 0,\n 'data-disabled': item.disabled ? '' : undefined,\n 'aria-disabled': item.disabled || undefined,\n }\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.Escape]: (e: KeyboardEvent) => {\n e.preventDefault()\n closeMenu()\n },\n [Keys.ArrowDown]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.ArrowUp]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.Enter]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.Home]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.End]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n }\n\n const triggerProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n 'aria-expanded': isOpen(),\n 'aria-controls': contentId,\n 'aria-haspopup': 'menu',\n }\n\n const contentProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'menu',\n id: contentId,\n 'data-state': isOpen() ? 'open' : 'closed',\n }\n\n return {\n state: { open: isOpen() },\n triggerProps,\n contentProps,\n getItemProps,\n open: openMenu,\n close: closeMenu,\n toggle: toggleMenu,\n keyboardHandlers,\n ids: {\n content: contentId,\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const menuContentVariants = cva({\n base: 'z-50 rounded-md border bg-popover shadow-md',\n})\n\nexport const menuItemVariants = cva({\n base: 'relative flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n})\n", "import * as React from 'react'\nimport * as ReactDOM from 'react-dom'\nimport {\n createDropdownMenu,\n menuContentVariants,\n menuItemVariants,\n type DropdownMenuProps as CoreDropdownMenuProps,\n type MenuItemProps as CoreMenuItemProps,\n} from '@refraction-ui/dropdown-menu'\nimport { cn, createKeyboardHandler, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface DropdownMenuContextValue {\n open: boolean\n onOpenChange: (open: boolean) => void\n contentId: string\n}\n\nconst DropdownMenuContext = React.createContext<DropdownMenuContextValue | null>(null)\n\nfunction useDropdownMenuContext(): DropdownMenuContextValue {\n const ctx = React.useContext(DropdownMenuContext)\n if (!ctx) {\n devWarn(\n 'react-dropdown-menu/context-outside-provider',\n 'DropdownMenu compound components (DropdownMenuTrigger/DropdownMenuContent/DropdownMenuItem/etc.) must be rendered inside a <DropdownMenu>. The missing DropdownMenuContext makes this throw.',\n )\n throw new Error('DropdownMenu compound components must be used within <DropdownMenu>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenu (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children?: React.ReactNode\n}\n\nexport function DropdownMenu({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n children,\n}: DropdownMenuProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : uncontrolledOpen\n\n const handleOpenChange = React.useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next)\n }\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createDropdownMenu> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createDropdownMenu({ open })\n }\n const api = apiRef.current\n\n const ctx = React.useMemo<DropdownMenuContextValue>(\n () => ({\n open,\n onOpenChange: handleOpenChange,\n contentId: api.ids.content,\n }),\n [open, handleOpenChange, api.ids.content],\n )\n\n return React.createElement(DropdownMenuContext.Provider, { value: ctx }, children)\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenuTrigger\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Merge the trigger's props/behavior onto the child element instead of\n * rendering a `<button>` around it (Radix-style `asChild`). Use it with\n * styled triggers like `<Button>` — otherwise you'd nest a button in a\n * button (invalid HTML and a hydration error). */\n asChild?: boolean\n}\n\nexport const DropdownMenuTrigger = React.forwardRef<HTMLButtonElement, DropdownMenuTriggerProps>(\n function DropdownMenuTrigger({ asChild = false, onClick, children, ...props }, ref) {\n const { open, onOpenChange, contentId } = useDropdownMenuContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onOpenChange(!open)\n onClick?.(e)\n }\n\n const triggerProps = {\n type: 'button' as const,\n 'aria-expanded': open,\n 'aria-controls': contentId,\n 'aria-haspopup': 'menu' as const,\n onClick: handleClick,\n ...props,\n }\n\n if (asChild) {\n if (!React.isValidElement(children)) {\n devWarn(\n 'dropdown-menu-trigger-asChild-child',\n 'DropdownMenuTrigger: `asChild` expects a single React element child; rendering nothing.',\n )\n return null\n }\n const child = children as React.ReactElement<\n Record<string, unknown>\n > & { ref?: React.Ref<HTMLButtonElement> }\n const childOnClick = child.props.onClick as\n | ((e: React.MouseEvent<HTMLButtonElement>) => void)\n | undefined\n const childRef = child.ref\n const mergedProps = {\n ...triggerProps,\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n childOnClick?.(e)\n if (!e.defaultPrevented) handleClick(e)\n },\n ref: (node: HTMLButtonElement | null) => {\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n if (typeof childRef === 'function') childRef(node)\n else if (childRef) childRef.current = node\n },\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return React.cloneElement(child, mergedProps as any)\n }\n\n return React.createElement('button', { ref, ...triggerProps }, children)\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuContent\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DropdownMenuContent = React.forwardRef<HTMLDivElement, DropdownMenuContentProps>(\n function DropdownMenuContent({ className, children, onKeyDown, ...props }, ref) {\n const { open, onOpenChange, contentId } = useDropdownMenuContext()\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const handler = createKeyboardHandler({\n Escape: (ev) => {\n ev.preventDefault()\n onOpenChange(false)\n },\n })\n handler(e.nativeEvent)\n onKeyDown?.(e)\n }\n\n if (!open) return null\n\n const content = React.createElement(\n 'div',\n {\n ref,\n role: 'menu',\n id: contentId,\n 'data-state': open ? 'open' : 'closed',\n className: cn(menuContentVariants(), className),\n onKeyDown: handleKeyDown,\n tabIndex: -1,\n ...props,\n },\n children,\n )\n\n // Render via portal if document is available (client-side)\n if (typeof document !== 'undefined') {\n return ReactDOM.createPortal(content, document.body)\n }\n\n // SSR fallback: render inline\n return content\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuItem\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n disabled?: boolean\n onSelect?: () => void\n}\n\nexport const DropdownMenuItem = React.forwardRef<HTMLDivElement, DropdownMenuItemProps>(\n function DropdownMenuItem({ className, disabled, onSelect, onClick, children, ...props }, ref) {\n const { onOpenChange } = useDropdownMenuContext()\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n onSelect?.()\n onOpenChange(false)\n onClick?.(e)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect?.()\n onOpenChange(false)\n }\n }\n\n return React.createElement(\n 'div',\n {\n ref,\n role: 'menuitem',\n tabIndex: disabled ? -1 : 0,\n 'data-disabled': disabled ? '' : undefined,\n 'aria-disabled': disabled || undefined,\n className: cn(menuItemVariants(), className),\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuSeparator\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DropdownMenuSeparator = React.forwardRef<HTMLDivElement, DropdownMenuSeparatorProps>(\n function DropdownMenuSeparator({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n role: 'separator',\n className: cn('-mx-1 my-1 h-px bg-muted', className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuLabel\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DropdownMenuLabel = React.forwardRef<HTMLDivElement, DropdownMenuLabelProps>(\n function DropdownMenuLabel({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n className: cn('px-2 py-1.5 text-sm font-semibold', className),\n ...props,\n })\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["DropdownMenuTrigger", "DropdownMenuContent", "DropdownMenuItem", "DropdownMenuSeparator", "DropdownMenuLabel"]
7
+ }
@@ -0,0 +1,148 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-editor-status-bar/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../editor-status-bar/dist/index.js
10
+ function formatCursorPosition(line, col) {
11
+ return `Ln ${line}, Col ${col}`;
12
+ }
13
+ function partitionSegments(segments) {
14
+ const left = [];
15
+ const right = [];
16
+ for (const seg of segments) {
17
+ if (seg.align === "right") {
18
+ right.push(seg);
19
+ } else {
20
+ left.push(seg);
21
+ }
22
+ }
23
+ return { left, right };
24
+ }
25
+ function createEditorStatusBar() {
26
+ const ariaProps = {
27
+ role: "status",
28
+ "aria-live": "polite"
29
+ };
30
+ const dataAttributes = {
31
+ "data-component": "editor-status-bar"
32
+ };
33
+ return { ariaProps, dataAttributes };
34
+ }
35
+ var editorStatusBarVariants = cva({
36
+ base: [
37
+ "flex items-center justify-between",
38
+ "w-full h-6 px-2 gap-4",
39
+ "text-xs font-mono",
40
+ "bg-muted text-muted-foreground",
41
+ "border-t border-border",
42
+ "select-none"
43
+ ].join(" "),
44
+ variants: {},
45
+ defaultVariants: {}
46
+ });
47
+ var statusBarGroupClass = "flex items-center gap-3 overflow-hidden";
48
+ var statusBarSegmentVariants = cva({
49
+ base: "inline-flex items-center whitespace-nowrap truncate leading-none",
50
+ variants: {
51
+ tone: {
52
+ default: "text-muted-foreground",
53
+ muted: "text-muted-foreground/60",
54
+ accent: "text-primary"
55
+ }
56
+ },
57
+ defaultVariants: {
58
+ tone: "default"
59
+ }
60
+ });
61
+
62
+ // ../react-editor-status-bar/dist/index.js
63
+ import { jsxs, jsx } from "react/jsx-runtime";
64
+ function buildSegmentsFromConvenienceProps(props) {
65
+ const segs = [];
66
+ if (props.line !== void 0 && props.col !== void 0) {
67
+ segs.push({
68
+ id: "cursor",
69
+ label: formatCursorPosition(props.line, props.col),
70
+ align: "left",
71
+ tone: "default"
72
+ });
73
+ }
74
+ if (props.indentation) {
75
+ segs.push({ id: "indentation", label: props.indentation, align: "left", tone: "muted" });
76
+ }
77
+ if (props.language) {
78
+ segs.push({ id: "language", label: props.language, align: "right", tone: "accent" });
79
+ }
80
+ if (props.encoding) {
81
+ segs.push({ id: "encoding", label: props.encoding, align: "right", tone: "muted" });
82
+ }
83
+ if (props.eol) {
84
+ segs.push({ id: "eol", label: props.eol, align: "right", tone: "muted" });
85
+ }
86
+ if (props.status) {
87
+ segs.push({ id: "status", label: props.status, align: "right", tone: "muted" });
88
+ }
89
+ return segs;
90
+ }
91
+ var EditorStatusBar = React.forwardRef(
92
+ function EditorStatusBar2({
93
+ segments: segmentsProp,
94
+ line,
95
+ col,
96
+ indentation,
97
+ language,
98
+ encoding,
99
+ eol,
100
+ status,
101
+ className,
102
+ ...props
103
+ }, ref) {
104
+ const segments = segmentsProp ?? buildSegmentsFromConvenienceProps({
105
+ line,
106
+ col,
107
+ indentation,
108
+ language,
109
+ encoding,
110
+ eol,
111
+ status
112
+ });
113
+ const { left, right } = partitionSegments(segments);
114
+ const api = createEditorStatusBar();
115
+ return /* @__PURE__ */ jsxs(
116
+ "div",
117
+ {
118
+ ref,
119
+ className: cn(editorStatusBarVariants(), className),
120
+ ...api.ariaProps,
121
+ ...api.dataAttributes,
122
+ ...props,
123
+ children: [
124
+ /* @__PURE__ */ jsx("div", { className: statusBarGroupClass, children: left.map((seg) => /* @__PURE__ */ jsx(
125
+ "span",
126
+ {
127
+ className: statusBarSegmentVariants({ tone: seg.tone ?? "default" }),
128
+ children: seg.label
129
+ },
130
+ seg.id
131
+ )) }),
132
+ /* @__PURE__ */ jsx("div", { className: statusBarGroupClass, children: right.map((seg) => /* @__PURE__ */ jsx(
133
+ "span",
134
+ {
135
+ className: statusBarSegmentVariants({ tone: seg.tone ?? "default" }),
136
+ children: seg.label
137
+ },
138
+ seg.id
139
+ )) })
140
+ ]
141
+ }
142
+ );
143
+ }
144
+ );
145
+ export {
146
+ EditorStatusBar
147
+ };
148
+ //# sourceMappingURL=react-editor-status-bar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../editor-status-bar/src/editor-status-bar.ts", "../../editor-status-bar/src/editor-status-bar.styles.ts", "../../react-editor-status-bar/src/editor-status-bar.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\n/** Horizontal alignment of a segment within the bar. */\nexport type StatusSegmentAlign = 'left' | 'right'\n\n/** Visual tone / emphasis of a segment. */\nexport type StatusSegmentTone = 'default' | 'muted' | 'accent'\n\n/** A single labelled item rendered in the status bar. */\nexport interface StatusSegment {\n /** Unique identifier for the segment. */\n id: string\n /** Text displayed in the segment. */\n label: string\n /** Which side of the bar this segment lives on. Defaults to `'left'`. */\n align?: StatusSegmentAlign\n /** Visual tone. Defaults to `'default'`. */\n tone?: StatusSegmentTone\n}\n\n/** Return value of {@link createEditorStatusBar}. */\nexport interface EditorStatusBarAPI {\n /** ARIA attributes to spread on the bar element. */\n ariaProps: Partial<AccessibilityProps>\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Format a cursor position as the canonical IDE string \"Ln {line}, Col {col}\".\n *\n * @example\n * formatCursorPosition(17, 1) // → 'Ln 17, Col 1'\n */\nexport function formatCursorPosition(line: number, col: number): string {\n return `Ln ${line}, Col ${col}`\n}\n\n/**\n * Partition a flat list of segments into left- and right-aligned groups,\n * preserving insertion order within each group.\n */\nexport function partitionSegments(segments: StatusSegment[]): {\n left: StatusSegment[]\n right: StatusSegment[]\n} {\n const left: StatusSegment[] = []\n const right: StatusSegment[] = []\n for (const seg of segments) {\n if (seg.align === 'right') {\n right.push(seg)\n } else {\n left.push(seg)\n }\n }\n return { left, right }\n}\n\n/**\n * Build the framework-agnostic ARIA and data attributes for the status bar\n * container.\n *\n * The bar uses `role=\"status\"` with `aria-live=\"polite\"` so screen readers\n * announce updates (e.g. cursor position changes) without interrupting the\n * user's current focus.\n */\nexport function createEditorStatusBar(): EditorStatusBarAPI {\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'status',\n 'aria-live': 'polite',\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-component': 'editor-status-bar',\n }\n\n return { ariaProps, dataAttributes }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * The outer bar — a thin, full-width strip that sits at the bottom of an IDE\n * pane. Uses a monospace font stack so numeric values (line, col) don't shift\n * width as they update.\n */\nexport const editorStatusBarVariants = cva({\n base: [\n 'flex items-center justify-between',\n 'w-full h-6 px-2 gap-4',\n 'text-xs font-mono',\n 'bg-muted text-muted-foreground',\n 'border-t border-border',\n 'select-none',\n ].join(' '),\n variants: {},\n defaultVariants: {},\n})\n\n/** The left or right group that holds a cluster of segments. */\nexport const statusBarGroupClass = 'flex items-center gap-3 overflow-hidden'\n\n/**\n * A single segment pill. The `tone` variant maps to semantic token classes so\n * adapters never inline colour values.\n */\nexport const statusBarSegmentVariants = cva({\n base: 'inline-flex items-center whitespace-nowrap truncate leading-none',\n variants: {\n tone: {\n default: 'text-muted-foreground',\n muted: 'text-muted-foreground/60',\n accent: 'text-primary',\n },\n },\n defaultVariants: {\n tone: 'default',\n },\n})\n", "import * as React from 'react'\nimport {\n createEditorStatusBar,\n formatCursorPosition,\n partitionSegments,\n editorStatusBarVariants,\n statusBarGroupClass,\n statusBarSegmentVariants,\n type StatusSegment,\n type StatusSegmentTone,\n} from '@refraction-ui/editor-status-bar'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { StatusSegment, StatusSegmentTone }\n\n/** Convenience props that map to common IDE status-bar segments. */\nexport interface EditorStatusBarConvenienceProps {\n /** Current line number (1-indexed). */\n line?: number\n /** Current column number (1-indexed). */\n col?: number\n /** Indentation descriptor, e.g. `'Spaces: 4'` or `'Tab Size: 2'`. */\n indentation?: string\n /** Language / runtime label, e.g. `'Python 3.11.4'`. */\n language?: string\n /** File encoding, e.g. `'UTF-8'`. */\n encoding?: string\n /** End-of-line sequence, e.g. `'LF'` or `'CRLF'`. */\n eol?: string\n /** Persistence status label, e.g. `'Auto-saved'` or `'Unsaved changes'`. */\n status?: string\n}\n\nexport interface EditorStatusBarProps\n extends React.HTMLAttributes<HTMLDivElement>,\n EditorStatusBarConvenienceProps {\n /**\n * Explicit list of segments. When provided, the convenience props (`line`,\n * `col`, `language`, etc.) are ignored and you have full control over which\n * segments appear and where.\n */\n segments?: StatusSegment[]\n}\n\n/**\n * Build the default segment list from convenience props.\n *\n * Left group: cursor position (if line/col given), indentation.\n * Right group: language, encoding, eol, status.\n */\nfunction buildSegmentsFromConvenienceProps(\n props: EditorStatusBarConvenienceProps,\n): StatusSegment[] {\n const segs: StatusSegment[] = []\n\n if (props.line !== undefined && props.col !== undefined) {\n segs.push({\n id: 'cursor',\n label: formatCursorPosition(props.line, props.col),\n align: 'left',\n tone: 'default',\n })\n }\n\n if (props.indentation) {\n segs.push({ id: 'indentation', label: props.indentation, align: 'left', tone: 'muted' })\n }\n\n if (props.language) {\n segs.push({ id: 'language', label: props.language, align: 'right', tone: 'accent' })\n }\n\n if (props.encoding) {\n segs.push({ id: 'encoding', label: props.encoding, align: 'right', tone: 'muted' })\n }\n\n if (props.eol) {\n segs.push({ id: 'eol', label: props.eol, align: 'right', tone: 'muted' })\n }\n\n if (props.status) {\n segs.push({ id: 'status', label: props.status, align: 'right', tone: 'muted' })\n }\n\n return segs\n}\n\n/**\n * EditorStatusBar — an IDE-style bottom bar.\n *\n * Accepts either an explicit `segments` array for full control, or the\n * convenience props (`line`, `col`, `language`, `encoding`, `indentation`,\n * `eol`, `status`) which are assembled into a standard left/right layout\n * automatically.\n *\n * Uses `role=\"status\"` with `aria-live=\"polite\"` so cursor-position updates\n * are announced to screen readers without interrupting flow.\n */\nexport const EditorStatusBar = React.forwardRef<\n HTMLDivElement,\n EditorStatusBarProps\n>(\n function EditorStatusBar(\n {\n segments: segmentsProp,\n line,\n col,\n indentation,\n language,\n encoding,\n eol,\n status,\n className,\n ...props\n },\n ref,\n ) {\n const segments = segmentsProp ?? buildSegmentsFromConvenienceProps({\n line,\n col,\n indentation,\n language,\n encoding,\n eol,\n status,\n })\n\n const { left, right } = partitionSegments(segments)\n const api = createEditorStatusBar()\n\n return (\n <div\n ref={ref}\n className={cn(editorStatusBarVariants(), className)}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n <div className={statusBarGroupClass}>\n {left.map((seg) => (\n <span\n key={seg.id}\n className={statusBarSegmentVariants({ tone: seg.tone ?? 'default' })}\n >\n {seg.label}\n </span>\n ))}\n </div>\n <div className={statusBarGroupClass}>\n {right.map((seg) => (\n <span\n key={seg.id}\n className={statusBarSegmentVariants({ tone: seg.tone ?? 'default' })}\n >\n {seg.label}\n </span>\n ))}\n </div>\n </div>\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["EditorStatusBar"]
7
+ }
@@ -0,0 +1,159 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-editor-tabs/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../editor-tabs/dist/index.js
10
+ function createEditorTabs(props = {}) {
11
+ const { activeId } = props;
12
+ const ariaProps = {
13
+ role: "tablist"
14
+ };
15
+ const dataAttributes = {};
16
+ if (activeId !== void 0) {
17
+ dataAttributes["data-active-id"] = activeId;
18
+ }
19
+ return { ariaProps, dataAttributes };
20
+ }
21
+ function getNextTabIndex(currentIndex, key, count) {
22
+ if (count <= 0) return currentIndex;
23
+ switch (key) {
24
+ case "ArrowRight":
25
+ return (currentIndex + 1) % count;
26
+ case "ArrowLeft":
27
+ return (currentIndex - 1 + count) % count;
28
+ case "Home":
29
+ return 0;
30
+ case "End":
31
+ return count - 1;
32
+ default:
33
+ return currentIndex;
34
+ }
35
+ }
36
+ var editorTabsVariants = cva({
37
+ base: "inline-flex items-end gap-0 border-b border-border bg-muted/40 overflow-x-auto",
38
+ variants: {},
39
+ defaultVariants: {}
40
+ });
41
+ var editorTabVariants = cva({
42
+ base: [
43
+ "group inline-flex items-center gap-1.5 px-3 py-2 text-sm font-medium",
44
+ "border-b-2 transition-colors select-none whitespace-nowrap",
45
+ "focus-visible:outline-none focus-visible:ring-2",
46
+ "focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background"
47
+ ].join(" "),
48
+ variants: {
49
+ state: {
50
+ active: [
51
+ "border-primary text-foreground bg-background",
52
+ "border-t border-l border-r border-border border-b-background -mb-px"
53
+ ].join(" "),
54
+ inactive: [
55
+ "border-transparent text-muted-foreground",
56
+ "hover:text-foreground hover:bg-background/60"
57
+ ].join(" ")
58
+ }
59
+ },
60
+ defaultVariants: {
61
+ state: "inactive"
62
+ }
63
+ });
64
+ var editorTabDirtyDotClass = "size-1.5 rounded-full bg-amber-400 shrink-0";
65
+ var editorTabCloseButtonClass = [
66
+ "ml-1 inline-flex items-center justify-center rounded-sm size-4 shrink-0",
67
+ "text-muted-foreground opacity-0 transition-opacity",
68
+ "group-hover:opacity-100 focus-visible:opacity-100",
69
+ "hover:bg-accent hover:text-foreground",
70
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
71
+ ].join(" ");
72
+ var editorTabIconClass = "shrink-0 text-[0.85em] leading-none";
73
+
74
+ // ../react-editor-tabs/dist/index.js
75
+ import { jsx, jsxs } from "react/jsx-runtime";
76
+ var EditorTabs = React.forwardRef(
77
+ function EditorTabs2({ tabs, activeId, onSelect, onClose, className, ...props }, ref) {
78
+ const tabRefs = React.useRef([]);
79
+ const activeIndex = tabs.findIndex((t) => t.id === activeId);
80
+ const tabbableIndex = activeIndex === -1 ? 0 : activeIndex;
81
+ const handleKeyDown = (event, index) => {
82
+ const next = getNextTabIndex(index, event.key, tabs.length);
83
+ if (next !== index) {
84
+ event.preventDefault();
85
+ onSelect(tabs[next].id);
86
+ tabRefs.current[next]?.focus();
87
+ }
88
+ };
89
+ const api = createEditorTabs({ activeId });
90
+ return /* @__PURE__ */ jsx(
91
+ "div",
92
+ {
93
+ ref,
94
+ className: cn(editorTabsVariants(), className),
95
+ ...api.ariaProps,
96
+ ...api.dataAttributes,
97
+ ...props,
98
+ children: tabs.map((tab, index) => {
99
+ const isActive = tab.id === activeId;
100
+ return /* @__PURE__ */ jsxs(
101
+ "button",
102
+ {
103
+ ref: (node) => {
104
+ tabRefs.current[index] = node;
105
+ },
106
+ type: "button",
107
+ role: "tab",
108
+ "aria-selected": isActive,
109
+ "aria-controls": `tabpanel-${tab.id}`,
110
+ id: `tab-${tab.id}`,
111
+ tabIndex: index === tabbableIndex ? 0 : -1,
112
+ "data-state": isActive ? "active" : "inactive",
113
+ className: editorTabVariants({ state: isActive ? "active" : "inactive" }),
114
+ onClick: () => onSelect(tab.id),
115
+ onKeyDown: (e) => handleKeyDown(e, index),
116
+ children: [
117
+ tab.icon && /* @__PURE__ */ jsx("span", { className: editorTabIconClass, "aria-hidden": "true", children: tab.icon }),
118
+ /* @__PURE__ */ jsx("span", { children: tab.label }),
119
+ tab.dirty && /* @__PURE__ */ jsx(
120
+ "span",
121
+ {
122
+ className: editorTabDirtyDotClass,
123
+ "aria-label": "unsaved changes",
124
+ role: "status"
125
+ }
126
+ ),
127
+ tab.closable && /* @__PURE__ */ jsx(
128
+ "span",
129
+ {
130
+ role: "button",
131
+ "aria-label": `Close ${tab.label}`,
132
+ tabIndex: -1,
133
+ className: editorTabCloseButtonClass,
134
+ onClick: (e) => {
135
+ e.stopPropagation();
136
+ onClose?.(tab.id);
137
+ },
138
+ onKeyDown: (e) => {
139
+ if (e.key === "Enter" || e.key === " ") {
140
+ e.stopPropagation();
141
+ onClose?.(tab.id);
142
+ }
143
+ },
144
+ children: "\xD7"
145
+ }
146
+ )
147
+ ]
148
+ },
149
+ tab.id
150
+ );
151
+ })
152
+ }
153
+ );
154
+ }
155
+ );
156
+ export {
157
+ EditorTabs
158
+ };
159
+ //# sourceMappingURL=react-editor-tabs.js.map