@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,171 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-rating-scale/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../rating-scale/dist/index.js
10
+ function createRatingScale(props = {}) {
11
+ const { value, size = "md" } = props;
12
+ const ariaProps = {
13
+ role: "radiogroup"
14
+ };
15
+ const dataAttributes = {
16
+ "data-size": size
17
+ };
18
+ if (value !== void 0) {
19
+ dataAttributes["data-value"] = String(value);
20
+ }
21
+ return { ariaProps, dataAttributes };
22
+ }
23
+ function resolveRatingPoints(points, count = 5) {
24
+ if (points && points.length > 0) return points;
25
+ return Array.from({ length: Math.max(0, count) }, (_, i) => ({ value: i + 1 }));
26
+ }
27
+ function getNextRatingIndex(current, key, count) {
28
+ if (count <= 0) return current;
29
+ switch (key) {
30
+ case "ArrowRight":
31
+ case "ArrowUp":
32
+ return Math.min(current + 1, count - 1);
33
+ case "ArrowLeft":
34
+ case "ArrowDown":
35
+ return Math.max(current - 1, 0);
36
+ case "Home":
37
+ return 0;
38
+ case "End":
39
+ return count - 1;
40
+ default:
41
+ return current;
42
+ }
43
+ }
44
+ var ratingScaleVariants = cva({
45
+ base: "inline-flex items-center gap-3",
46
+ variants: {
47
+ size: {
48
+ sm: "",
49
+ md: ""
50
+ }
51
+ },
52
+ defaultVariants: {
53
+ size: "md"
54
+ }
55
+ });
56
+ var ratingScaleTrackClass = "inline-flex items-center gap-1.5";
57
+ var ratingScaleItemVariants = cva({
58
+ base: [
59
+ "inline-flex items-center justify-center rounded-md border font-medium tabular-nums",
60
+ "transition-colors focus-visible:outline-none focus-visible:ring-2",
61
+ "focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
62
+ "disabled:pointer-events-none disabled:opacity-50"
63
+ ].join(" "),
64
+ variants: {
65
+ size: {
66
+ sm: "size-8 text-xs",
67
+ md: "size-10 text-sm"
68
+ },
69
+ state: {
70
+ checked: "border-primary bg-primary text-primary-foreground",
71
+ unchecked: "border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground"
72
+ }
73
+ },
74
+ defaultVariants: {
75
+ size: "md",
76
+ state: "unchecked"
77
+ }
78
+ });
79
+ var ratingScaleLabelClass = "text-xs text-muted-foreground";
80
+
81
+ // ../react-rating-scale/dist/index.js
82
+ import { jsxs, jsx } from "react/jsx-runtime";
83
+ var RatingScale = React.forwardRef(
84
+ function RatingScale2({
85
+ value: valueProp,
86
+ defaultValue,
87
+ onValueChange,
88
+ count = 5,
89
+ points,
90
+ minLabel,
91
+ maxLabel,
92
+ size = "md",
93
+ disabled = false,
94
+ className,
95
+ ...props
96
+ }, ref) {
97
+ const resolved = React.useMemo(
98
+ () => resolveRatingPoints(points, count),
99
+ [points, count]
100
+ );
101
+ const isControlled = valueProp !== void 0;
102
+ const [internal, setInternal] = React.useState(
103
+ defaultValue
104
+ );
105
+ const value = isControlled ? valueProp : internal;
106
+ const btnRefs = React.useRef([]);
107
+ const select = React.useCallback(
108
+ (next) => {
109
+ if (!isControlled) setInternal(next);
110
+ onValueChange?.(next);
111
+ },
112
+ [isControlled, onValueChange]
113
+ );
114
+ const selectedIndex = resolved.findIndex((p) => p.value === value);
115
+ const tabbableIndex = selectedIndex === -1 ? 0 : selectedIndex;
116
+ const handleKeyDown = (event, index) => {
117
+ const target = getNextRatingIndex(index, event.key, resolved.length);
118
+ if (target !== index) {
119
+ event.preventDefault();
120
+ select(resolved[target].value);
121
+ btnRefs.current[target]?.focus();
122
+ }
123
+ };
124
+ const api = createRatingScale({ value, size });
125
+ return /* @__PURE__ */ jsxs(
126
+ "div",
127
+ {
128
+ ref,
129
+ className: cn(ratingScaleVariants({ size }), className),
130
+ "aria-disabled": disabled || void 0,
131
+ ...api.ariaProps,
132
+ ...api.dataAttributes,
133
+ ...props,
134
+ children: [
135
+ minLabel != null && /* @__PURE__ */ jsx("span", { className: ratingScaleLabelClass, children: minLabel }),
136
+ /* @__PURE__ */ jsx("div", { className: ratingScaleTrackClass, children: resolved.map((point, index) => {
137
+ const checked = point.value === value;
138
+ return /* @__PURE__ */ jsx(
139
+ "button",
140
+ {
141
+ ref: (node) => {
142
+ btnRefs.current[index] = node;
143
+ },
144
+ type: "button",
145
+ role: "radio",
146
+ "aria-checked": checked,
147
+ "aria-label": point.label ?? String(point.value),
148
+ tabIndex: index === tabbableIndex ? 0 : -1,
149
+ disabled,
150
+ "data-state": checked ? "checked" : "unchecked",
151
+ className: ratingScaleItemVariants({
152
+ size,
153
+ state: checked ? "checked" : "unchecked"
154
+ }),
155
+ onClick: () => select(point.value),
156
+ onKeyDown: (e) => handleKeyDown(e, index),
157
+ children: point.label ?? point.value
158
+ },
159
+ point.value
160
+ );
161
+ }) }),
162
+ maxLabel != null && /* @__PURE__ */ jsx("span", { className: ratingScaleLabelClass, children: maxLabel })
163
+ ]
164
+ }
165
+ );
166
+ }
167
+ );
168
+ export {
169
+ RatingScale
170
+ };
171
+ //# sourceMappingURL=react-rating-scale.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../rating-scale/src/rating-scale.ts", "../../rating-scale/src/rating-scale.styles.ts", "../../react-rating-scale/src/rating-scale.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\n/** Visual size of a rating scale. */\nexport type RatingScaleSize = 'sm' | 'md'\n\n/** A single selectable point on the scale (1-indexed value + accessible label). */\nexport interface RatingScalePoint {\n /** The value this point represents. */\n value: number\n /** Accessible label for the point (falls back to the value). */\n label?: string\n}\n\nexport interface RatingScaleProps {\n /** Currently selected value (controlled). */\n value?: number\n /** Number of points on the scale. Ignored when {@link points} is given. */\n count?: number\n /** Visual size. */\n size?: RatingScaleSize\n}\n\nexport interface RatingScaleAPI {\n /** ARIA attributes to spread on the group element (`role=\"radiogroup\"`). */\n ariaProps: Partial<AccessibilityProps>\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Build the framework-agnostic group props for a rating / Likert scale.\n *\n * Returns `role=\"radiogroup\"` plus data attributes; adapters spread these onto\n * their container and render the points themselves. A rating scale is a\n * single-select control with radio semantics, like a segmented control, but\n * tuned for ordinal self-rating (e.g. a 1–5 Likert prompt with end labels).\n */\nexport function createRatingScale(props: RatingScaleProps = {}): RatingScaleAPI {\n const { value, size = 'md' } = props\n\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'radiogroup',\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-size': size,\n }\n if (value !== undefined) {\n dataAttributes['data-value'] = String(value)\n }\n\n return { ariaProps, dataAttributes }\n}\n\n/**\n * Resolve the list of points for a scale from either an explicit list or a\n * `count` (producing `1..count`). The single source of truth shared by every\n * adapter so a `count={5}` scale renders identical points everywhere.\n */\nexport function resolveRatingPoints(\n points: RatingScalePoint[] | undefined,\n count = 5,\n): RatingScalePoint[] {\n if (points && points.length > 0) return points\n return Array.from({ length: Math.max(0, count) }, (_, i) => ({ value: i + 1 }))\n}\n\n/**\n * Pure keyboard-navigation rule shared by every adapter.\n *\n * Unlike a wrapping segmented control, an ordinal rating scale **clamps** at\n * the ends (you can't wrap from \"5 — strongly agree\" back to \"1\"). Home/End\n * jump to the extremes; unhandled keys return `current` unchanged.\n *\n * - ArrowRight / ArrowUp → next (clamped to last)\n * - ArrowLeft / ArrowDown → previous (clamped to first)\n * - Home → first\n * - End → last\n */\nexport function getNextRatingIndex(\n current: number,\n key: string,\n count: number,\n): number {\n if (count <= 0) return current\n\n switch (key) {\n case 'ArrowRight':\n case 'ArrowUp':\n return Math.min(current + 1, count - 1)\n case 'ArrowLeft':\n case 'ArrowDown':\n return Math.max(current - 1, 0)\n case 'Home':\n return 0\n case 'End':\n return count - 1\n default:\n return current\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/** Container row that holds the points plus optional end labels. */\nexport const ratingScaleVariants = cva({\n base: 'inline-flex items-center gap-3',\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\n/** Row of point buttons (the scale itself, between the end labels). */\nexport const ratingScaleTrackClass = 'inline-flex items-center gap-1.5'\n\n/**\n * A single point button. The `state` variant carries the selected vs unselected\n * treatment so adapters never inline these classes.\n */\nexport const ratingScaleItemVariants = cva({\n base: [\n 'inline-flex items-center justify-center rounded-md border font-medium tabular-nums',\n 'transition-colors focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:pointer-events-none disabled:opacity-50',\n ].join(' '),\n variants: {\n size: {\n sm: 'size-8 text-xs',\n md: 'size-10 text-sm',\n },\n state: {\n checked: 'border-primary bg-primary text-primary-foreground',\n unchecked: 'border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n state: 'unchecked',\n },\n})\n\n/** End-label text flanking the scale (e.g. \"Never seen this\" / \"Could write it\"). */\nexport const ratingScaleLabelClass = 'text-xs text-muted-foreground'\n", "import * as React from 'react'\nimport {\n createRatingScale,\n resolveRatingPoints,\n getNextRatingIndex,\n ratingScaleVariants,\n ratingScaleTrackClass,\n ratingScaleItemVariants,\n ratingScaleLabelClass,\n type RatingScaleSize,\n type RatingScalePoint,\n} from '@refraction-ui/rating-scale'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { RatingScaleSize, RatingScalePoint }\n\nexport interface RatingScaleProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Controlled selected value. */\n value?: number\n /** Initial value for uncontrolled usage. */\n defaultValue?: number\n /** Called with the newly selected value. */\n onValueChange?: (value: number) => void\n /** Number of points (1..count). Ignored when `points` is provided. */\n count?: number\n /** Explicit points with accessible labels. */\n points?: RatingScalePoint[]\n /** Label shown before the scale (the low end). */\n minLabel?: React.ReactNode\n /** Label shown after the scale (the high end). */\n maxLabel?: React.ReactNode\n /** Visual size. */\n size?: RatingScaleSize\n /** Disables the whole scale. */\n disabled?: boolean\n /** Accessible name for the group. */\n 'aria-label'?: string\n}\n\n/**\n * RatingScale — a single-select ordinal rating / Likert control.\n *\n * Renders `role=\"radiogroup\"`; each point is a `role=\"radio\"` button with\n * roving tabindex and arrow/Home/End keyboard navigation (clamped at the\n * ends — ordinal scales don't wrap). Supports controlled (`value`) and\n * uncontrolled (`defaultValue`) usage. Logic, point resolution, and styles\n * come from the headless `@refraction-ui/rating-scale` core.\n */\nexport const RatingScale = React.forwardRef<HTMLDivElement, RatingScaleProps>(\n function RatingScale(\n {\n value: valueProp,\n defaultValue,\n onValueChange,\n count = 5,\n points,\n minLabel,\n maxLabel,\n size = 'md',\n disabled = false,\n className,\n ...props\n },\n ref,\n ) {\n const resolved = React.useMemo(\n () => resolveRatingPoints(points, count),\n [points, count],\n )\n const isControlled = valueProp !== undefined\n const [internal, setInternal] = React.useState<number | undefined>(\n defaultValue,\n )\n const value = isControlled ? valueProp : internal\n\n const btnRefs = React.useRef<(HTMLButtonElement | null)[]>([])\n\n const select = React.useCallback(\n (next: number) => {\n if (!isControlled) setInternal(next)\n onValueChange?.(next)\n },\n [isControlled, onValueChange],\n )\n\n const selectedIndex = resolved.findIndex((p) => p.value === value)\n // First point is tabbable when nothing is selected (roving tabindex).\n const tabbableIndex = selectedIndex === -1 ? 0 : selectedIndex\n\n const handleKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n index: number,\n ) => {\n const target = getNextRatingIndex(index, event.key, resolved.length)\n if (target !== index) {\n event.preventDefault()\n select(resolved[target].value)\n btnRefs.current[target]?.focus()\n }\n }\n\n const api = createRatingScale({ value, size })\n\n return (\n <div\n ref={ref}\n className={cn(ratingScaleVariants({ size }), className)}\n aria-disabled={disabled || undefined}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n {minLabel != null && (\n <span className={ratingScaleLabelClass}>{minLabel}</span>\n )}\n <div className={ratingScaleTrackClass}>\n {resolved.map((point, index) => {\n const checked = point.value === value\n return (\n <button\n key={point.value}\n ref={(node) => {\n btnRefs.current[index] = node\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n aria-label={point.label ?? String(point.value)}\n tabIndex={index === tabbableIndex ? 0 : -1}\n disabled={disabled}\n data-state={checked ? 'checked' : 'unchecked'}\n className={ratingScaleItemVariants({\n size,\n state: checked ? 'checked' : 'unchecked',\n })}\n onClick={() => select(point.value)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n >\n {point.label ?? point.value}\n </button>\n )\n })}\n </div>\n {maxLabel != null && (\n <span className={ratingScaleLabelClass}>{maxLabel}</span>\n )}\n </div>\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["RatingScale"]
7
+ }
@@ -0,0 +1,111 @@
1
+ import {
2
+ cn,
3
+ cva,
4
+ generateId
5
+ } from "./chunk-ZF3OHCGV.js";
6
+
7
+ // ../react-reaction-bar/dist/index.js
8
+ import * as React from "react";
9
+
10
+ // ../reaction-bar/dist/index.js
11
+ function createReactionBar(props) {
12
+ const { reactions, onToggle, onAdd } = props;
13
+ const containerId = generateId("rfr-reactions");
14
+ const labelId = generateId("rfr-reactions-label");
15
+ function toggle(emoji) {
16
+ onToggle?.(emoji);
17
+ }
18
+ function add(emoji) {
19
+ onAdd?.(emoji);
20
+ }
21
+ const ariaProps = {
22
+ role: "group",
23
+ "aria-label": "Reactions",
24
+ id: containerId
25
+ };
26
+ function getReactionAriaProps(reaction) {
27
+ return {
28
+ role: "button",
29
+ "aria-pressed": reaction.userReacted,
30
+ "aria-label": `${reaction.emoji} ${reaction.count} reaction${reaction.count === 1 ? "" : "s"}${reaction.userReacted ? ", you reacted" : ""}`
31
+ };
32
+ }
33
+ const addButtonAriaProps = {
34
+ role: "button",
35
+ "aria-label": "Add reaction"
36
+ };
37
+ return {
38
+ reactions,
39
+ toggle,
40
+ add,
41
+ ariaProps,
42
+ getReactionAriaProps,
43
+ addButtonAriaProps,
44
+ ids: {
45
+ container: containerId,
46
+ label: labelId
47
+ }
48
+ };
49
+ }
50
+ var reactionBarStyles = "flex flex-wrap items-center gap-1";
51
+ var reactionPillVariants = cva({
52
+ base: "inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs cursor-pointer transition-colors hover:bg-accent",
53
+ variants: {
54
+ state: {
55
+ active: "border-primary bg-primary/10 text-primary",
56
+ inactive: "border-border bg-background text-foreground"
57
+ }
58
+ },
59
+ defaultVariants: {
60
+ state: "inactive"
61
+ }
62
+ });
63
+ var reactionAddButtonStyles = "inline-flex items-center justify-center h-6 w-6 rounded-full border border-dashed border-muted-foreground/30 text-muted-foreground hover:border-muted-foreground hover:text-foreground cursor-pointer transition-colors text-xs";
64
+ var reactionEmojiStyles = "text-sm";
65
+ var reactionCountStyles = "text-xs font-medium tabular-nums";
66
+
67
+ // ../react-reaction-bar/dist/index.js
68
+ var ReactionBar = React.forwardRef(
69
+ function ReactionBar2({ reactions, onToggle, onAdd, showAddButton = true, className }, ref) {
70
+ const api = createReactionBar({ reactions, onToggle, onAdd });
71
+ return React.createElement(
72
+ "div",
73
+ { ref, ...api.ariaProps, className: cn(reactionBarStyles, className) },
74
+ api.reactions.map(
75
+ (reaction, i) => React.createElement(
76
+ "button",
77
+ {
78
+ key: `${reaction.emoji}-${i}`,
79
+ type: "button",
80
+ className: reactionPillVariants({
81
+ state: reaction.userReacted ? "active" : "inactive"
82
+ }),
83
+ onClick: () => api.toggle(reaction.emoji),
84
+ ...api.getReactionAriaProps(reaction)
85
+ },
86
+ React.createElement("span", { className: reactionEmojiStyles }, reaction.emoji),
87
+ React.createElement("span", { className: reactionCountStyles }, reaction.count)
88
+ )
89
+ ),
90
+ showAddButton && React.createElement(
91
+ "button",
92
+ {
93
+ type: "button",
94
+ className: reactionAddButtonStyles,
95
+ onClick: () => onAdd?.("\u{1F44D}"),
96
+ ...api.addButtonAriaProps
97
+ },
98
+ "+"
99
+ )
100
+ );
101
+ }
102
+ );
103
+ export {
104
+ ReactionBar,
105
+ reactionAddButtonStyles,
106
+ reactionBarStyles,
107
+ reactionCountStyles,
108
+ reactionEmojiStyles,
109
+ reactionPillVariants
110
+ };
111
+ //# sourceMappingURL=react-reaction-bar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../reaction-bar/src/reaction-bar.ts", "../../reaction-bar/src/reaction-bar.styles.ts", "../../react-reaction-bar/src/reaction-bar.tsx"],
4
+ "sourcesContent": ["import { generateId } from '@refraction-ui/shared'\n\nexport interface Reaction {\n /** The emoji character */\n emoji: string\n /** Number of users who reacted with this emoji */\n count: number\n /** Whether the current user has reacted */\n userReacted: boolean\n}\n\nexport interface ReactionBarProps {\n /** Current reactions */\n reactions: Reaction[]\n /** Callback when a reaction is toggled */\n onToggle?: (emoji: string) => void\n /** Callback when a new reaction is added */\n onAdd?: (emoji: string) => void\n}\n\nexport interface ReactionBarAPI {\n /** Current reactions */\n reactions: Reaction[]\n /** Toggle a reaction */\n toggle(emoji: string): void\n /** Add a new reaction */\n add(emoji: string): void\n /** ARIA props for the reaction bar container */\n ariaProps: Record<string, string | number | boolean>\n /** Get ARIA props for an individual reaction pill */\n getReactionAriaProps(reaction: Reaction): Record<string, unknown>\n /** ARIA props for the \"add reaction\" button */\n addButtonAriaProps: Record<string, unknown>\n /** Generated IDs */\n ids: {\n container: string\n label: string\n }\n}\n\nexport function createReactionBar(props: ReactionBarProps): ReactionBarAPI {\n const { reactions, onToggle, onAdd } = props\n\n const containerId = generateId('rfr-reactions')\n const labelId = generateId('rfr-reactions-label')\n\n function toggle(emoji: string): void {\n onToggle?.(emoji)\n }\n\n function add(emoji: string): void {\n onAdd?.(emoji)\n }\n\n const ariaProps: Record<string, string | number | boolean> = {\n role: 'group',\n 'aria-label': 'Reactions',\n id: containerId,\n }\n\n function getReactionAriaProps(reaction: Reaction): Record<string, unknown> {\n return {\n role: 'button',\n 'aria-pressed': reaction.userReacted,\n 'aria-label': `${reaction.emoji} ${reaction.count} reaction${reaction.count === 1 ? '' : 's'}${reaction.userReacted ? ', you reacted' : ''}`,\n }\n }\n\n const addButtonAriaProps: Record<string, unknown> = {\n role: 'button',\n 'aria-label': 'Add reaction',\n }\n\n return {\n reactions,\n toggle,\n add,\n ariaProps,\n getReactionAriaProps,\n addButtonAriaProps,\n ids: {\n container: containerId,\n label: labelId,\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const reactionBarStyles =\n 'flex flex-wrap items-center gap-1'\n\nexport const reactionPillVariants = cva({\n base: 'inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs cursor-pointer transition-colors hover:bg-accent',\n variants: {\n state: {\n active: 'border-primary bg-primary/10 text-primary',\n inactive: 'border-border bg-background text-foreground',\n },\n },\n defaultVariants: {\n state: 'inactive',\n },\n})\n\nexport const reactionAddButtonStyles =\n 'inline-flex items-center justify-center h-6 w-6 rounded-full border border-dashed border-muted-foreground/30 text-muted-foreground hover:border-muted-foreground hover:text-foreground cursor-pointer transition-colors text-xs'\n\nexport const reactionEmojiStyles = 'text-sm'\nexport const reactionCountStyles = 'text-xs font-medium tabular-nums'\n", "import * as React from 'react'\nimport {\n createReactionBar,\n reactionBarStyles,\n reactionPillVariants,\n reactionAddButtonStyles,\n reactionEmojiStyles,\n reactionCountStyles,\n type Reaction,\n} from '@refraction-ui/reaction-bar'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface ReactionBarProps {\n reactions: Reaction[]\n onToggle?: (emoji: string) => void\n onAdd?: (emoji: string) => void\n showAddButton?: boolean\n className?: string\n}\n\nexport const ReactionBar = React.forwardRef<HTMLDivElement, ReactionBarProps>(\n function ReactionBar({ reactions, onToggle, onAdd, showAddButton = true, className }, ref) {\n const api = createReactionBar({ reactions, onToggle, onAdd })\n\n return React.createElement(\n 'div',\n { ref, ...api.ariaProps, className: cn(reactionBarStyles, className) },\n api.reactions.map((reaction, i) =>\n React.createElement(\n 'button',\n {\n key: `${reaction.emoji}-${i}`,\n type: 'button',\n className: reactionPillVariants({\n state: reaction.userReacted ? 'active' : 'inactive',\n }),\n onClick: () => api.toggle(reaction.emoji),\n ...api.getReactionAriaProps(reaction),\n },\n React.createElement('span', { className: reactionEmojiStyles }, reaction.emoji),\n React.createElement('span', { className: reactionCountStyles }, reaction.count),\n ),\n ),\n showAddButton &&\n React.createElement(\n 'button',\n {\n type: 'button',\n className: reactionAddButtonStyles,\n onClick: () => onAdd?.('\\u{1F44D}'),\n ...api.addButtonAriaProps,\n },\n '+',\n ),\n )\n },\n)\n"],
5
+ "mappings": ";;;;;;;;;;AAwCO,SAAS,kBAAkB,OAAyC;AACzE,QAAM,EAAE,WAAW,UAAU,MAAA,IAAU;AAEvC,QAAM,cAAc,WAAW,eAAe;AAC9C,QAAM,UAAU,WAAW,qBAAqB;AAEhD,WAAS,OAAO,OAAqB;AACnC,eAAW,KAAK;EAClB;AAEA,WAAS,IAAI,OAAqB;AAChC,YAAQ,KAAK;EACf;AAEA,QAAM,YAAuD;IAC3D,MAAM;IACN,cAAc;IACd,IAAI;EAAA;AAGN,WAAS,qBAAqB,UAA6C;AACzE,WAAO;MACL,MAAM;MACN,gBAAgB,SAAS;MACzB,cAAc,GAAG,SAAS,KAAK,IAAI,SAAS,KAAK,YAAY,SAAS,UAAU,IAAI,KAAK,GAAG,GAAG,SAAS,cAAc,kBAAkB,EAAE;IAAA;EAE9I;AAEA,QAAM,qBAA8C;IAClD,MAAM;IACN,cAAc;EAAA;AAGhB,SAAO;IACL;IACA;IACA;IACA;IACA;IACA;IACA,KAAK;MACH,WAAW;MACX,OAAO;IAAA;EACT;AAEJ;ACnFO,IAAM,oBACX;AAEK,IAAM,uBAAuB,IAAI;EACtC,MAAM;EACN,UAAU;IACR,OAAO;MACL,QAAQ;MACR,UAAU;IAAA;EACZ;EAEF,iBAAiB;IACf,OAAO;EAAA;AAEX,CAAC;AAEM,IAAM,0BACX;AAEK,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;;;ACF5B,IAAM,cAAoB;EAC/B,SAASA,aAAY,EAAE,WAAW,UAAU,OAAO,gBAAgB,MAAM,UAAA,GAAa,KAAK;AAC3F,UAAM,MAAM,kBAAkB,EAAE,WAAW,UAAU,MAAA,CAAO;AAE5D,WAAa;MACX;MACA,EAAE,KAAK,GAAG,IAAI,WAAW,WAAW,GAAG,mBAAmB,SAAS,EAAA;MACnE,IAAI,UAAU;QAAI,CAAC,UAAU,MACrB;UACJ;UACA;YACE,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC;YAC3B,MAAM;YACN,WAAW,qBAAqB;cAC9B,OAAO,SAAS,cAAc,WAAW;YAAA,CAC1C;YACD,SAAS,MAAM,IAAI,OAAO,SAAS,KAAK;YACxC,GAAG,IAAI,qBAAqB,QAAQ;UAAA;UAEhC,oBAAc,QAAQ,EAAE,WAAW,oBAAA,GAAuB,SAAS,KAAK;UACxE,oBAAc,QAAQ,EAAE,WAAW,oBAAA,GAAuB,SAAS,KAAK;QAAA;MAChF;MAEF,iBACQ;QACJ;QACA;UACE,MAAM;UACN,WAAW;UACX,SAAS,MAAM,QAAQ,WAAW;UAClC,GAAG,IAAI;QAAA;QAET;MAAA;IACF;EAEJ;AACF;",
6
+ "names": ["ReactionBar"]
7
+ }
@@ -0,0 +1,298 @@
1
+ import {
2
+ cn,
3
+ cva,
4
+ devWarn
5
+ } from "./chunk-ZF3OHCGV.js";
6
+
7
+ // ../react-resizable-layout/dist/index.js
8
+ import * as React from "react";
9
+
10
+ // ../resizable-layout/dist/index.js
11
+ function clamp(value, min, max) {
12
+ return Math.min(Math.max(value, min), max);
13
+ }
14
+ function createResizableLayout(props = {}) {
15
+ const {
16
+ orientation = "horizontal",
17
+ defaultSizes = [50, 50],
18
+ minSizes = [],
19
+ maxSizes = [],
20
+ persistKey
21
+ } = props;
22
+ const sizes = loadSizes(persistKey) ?? [...defaultSizes];
23
+ let resizingIndex = null;
24
+ let sizesBeforeResize = [];
25
+ function loadSizes(key) {
26
+ if (!key) return null;
27
+ try {
28
+ if (typeof globalThis.localStorage !== "undefined") {
29
+ const stored = globalThis.localStorage.getItem(key);
30
+ if (stored) {
31
+ const parsed = JSON.parse(stored);
32
+ if (Array.isArray(parsed) && parsed.length === defaultSizes.length) {
33
+ return parsed;
34
+ }
35
+ }
36
+ }
37
+ } catch {
38
+ }
39
+ return null;
40
+ }
41
+ function saveSizes(key, values) {
42
+ try {
43
+ if (typeof globalThis.localStorage !== "undefined") {
44
+ globalThis.localStorage.setItem(key, JSON.stringify(values));
45
+ }
46
+ } catch {
47
+ }
48
+ }
49
+ function getMinSize(index) {
50
+ return minSizes[index] ?? 0;
51
+ }
52
+ function getMaxSize(index) {
53
+ return maxSizes[index] ?? 100;
54
+ }
55
+ function startResize(index) {
56
+ resizingIndex = index;
57
+ sizesBeforeResize = [...sizes];
58
+ }
59
+ function onResize(delta) {
60
+ if (resizingIndex === null) return;
61
+ const i = resizingIndex;
62
+ const j = i + 1;
63
+ if (j >= sizes.length) return;
64
+ const totalAvailable = sizesBeforeResize[i] + sizesBeforeResize[j];
65
+ let newSizeI = sizesBeforeResize[i] + delta;
66
+ newSizeI = clamp(newSizeI, getMinSize(i), getMaxSize(i));
67
+ let newSizeJ = totalAvailable - newSizeI;
68
+ newSizeJ = clamp(newSizeJ, getMinSize(j), getMaxSize(j));
69
+ newSizeI = totalAvailable - newSizeJ;
70
+ sizes[i] = newSizeI;
71
+ sizes[j] = newSizeJ;
72
+ }
73
+ function endResize() {
74
+ resizingIndex = null;
75
+ sizesBeforeResize = [];
76
+ if (persistKey) {
77
+ saveSizes(persistKey, sizes);
78
+ }
79
+ }
80
+ function getCSSVariables() {
81
+ const vars = {};
82
+ for (let i = 0; i < sizes.length; i++) {
83
+ vars[`--rfr-pane-${i}-size`] = `${sizes[i]}%`;
84
+ }
85
+ return vars;
86
+ }
87
+ return {
88
+ sizes,
89
+ startResize,
90
+ onResize,
91
+ endResize,
92
+ getCSSVariables,
93
+ orientation
94
+ };
95
+ }
96
+ var resizableLayoutTokens = {
97
+ name: "resizable-layout",
98
+ tokens: {
99
+ dividerColor: { variable: "--rfr-resizable-divider-color", fallback: "hsl(var(--border))" },
100
+ dividerHover: { variable: "--rfr-resizable-divider-hover", fallback: "hsl(var(--primary))" },
101
+ dividerSize: { variable: "--rfr-resizable-divider-size", fallback: "4px" }
102
+ }
103
+ };
104
+ var resizableLayoutVariants = cva({
105
+ base: "flex h-full w-full",
106
+ variants: {
107
+ orientation: {
108
+ horizontal: "flex-row",
109
+ vertical: "flex-col"
110
+ }
111
+ },
112
+ defaultVariants: {
113
+ orientation: "horizontal"
114
+ }
115
+ });
116
+ var resizableDividerVariants = cva({
117
+ base: "relative flex items-center justify-center bg-border transition-colors hover:bg-primary/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 active:bg-primary/70",
118
+ variants: {
119
+ orientation: {
120
+ horizontal: "w-1 cursor-col-resize",
121
+ vertical: "h-1 cursor-row-resize"
122
+ }
123
+ },
124
+ defaultVariants: {
125
+ orientation: "horizontal"
126
+ }
127
+ });
128
+ var resizablePaneVariants = cva({
129
+ base: "overflow-auto",
130
+ variants: {
131
+ orientation: {
132
+ horizontal: "h-full",
133
+ vertical: "w-full"
134
+ }
135
+ },
136
+ defaultVariants: {
137
+ orientation: "horizontal"
138
+ }
139
+ });
140
+
141
+ // ../react-resizable-layout/dist/index.js
142
+ import { jsx } from "react/jsx-runtime";
143
+ var ResizableLayoutContext = React.createContext(null);
144
+ function useResizableLayoutContext() {
145
+ const ctx = React.useContext(ResizableLayoutContext);
146
+ if (!ctx) {
147
+ devWarn(
148
+ "react-resizable-layout/compound-outside-provider",
149
+ "A Resizable compound component was rendered outside of <ResizableLayout>. Wrap it in <ResizableLayout>."
150
+ );
151
+ throw new Error("Resizable compound components must be used within <ResizableLayout>");
152
+ }
153
+ return ctx;
154
+ }
155
+ var ResizableLayout = React.forwardRef(
156
+ function ResizableLayout2({
157
+ orientation = "horizontal",
158
+ defaultSizes = [50, 50],
159
+ minSizes,
160
+ maxSizes,
161
+ persistKey,
162
+ onSizesChange,
163
+ className,
164
+ style,
165
+ children,
166
+ ...props
167
+ }, ref) {
168
+ const apiRef = React.useRef(null);
169
+ if (!apiRef.current) {
170
+ apiRef.current = createResizableLayout({
171
+ orientation,
172
+ defaultSizes,
173
+ minSizes,
174
+ maxSizes,
175
+ persistKey
176
+ });
177
+ }
178
+ const api = apiRef.current;
179
+ const [sizes, setSizesState] = React.useState(api.sizes);
180
+ const setSizes = React.useCallback(
181
+ (newSizes) => {
182
+ setSizesState([...newSizes]);
183
+ onSizesChange?.(newSizes);
184
+ },
185
+ [onSizesChange]
186
+ );
187
+ const cssVars = React.useMemo(() => {
188
+ const vars = {};
189
+ for (let i = 0; i < sizes.length; i++) {
190
+ vars[`--rfr-pane-${i}-size`] = `${sizes[i]}%`;
191
+ }
192
+ return vars;
193
+ }, [sizes]);
194
+ const contextValue = React.useMemo(
195
+ () => ({ api, orientation, sizes, setSizes }),
196
+ [api, orientation, sizes, setSizes]
197
+ );
198
+ return /* @__PURE__ */ jsx(ResizableLayoutContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
199
+ "div",
200
+ {
201
+ ref,
202
+ className: cn(resizableLayoutVariants({ orientation }), className),
203
+ style: { ...cssVars, ...style },
204
+ "data-orientation": orientation,
205
+ ...props,
206
+ children
207
+ }
208
+ ) });
209
+ }
210
+ );
211
+ var ResizablePane = React.forwardRef(
212
+ function ResizablePane2({ index, className, style, children, ...props }, ref) {
213
+ const { orientation, sizes } = useResizableLayoutContext();
214
+ const size = sizes[index] ?? 50;
215
+ const paneStyle = {
216
+ flexBasis: `${size}%`,
217
+ flexGrow: 0,
218
+ flexShrink: 0,
219
+ ...style
220
+ };
221
+ return /* @__PURE__ */ jsx(
222
+ "div",
223
+ {
224
+ ref,
225
+ className: cn(resizablePaneVariants({ orientation }), className),
226
+ style: paneStyle,
227
+ "data-pane-index": index,
228
+ ...props,
229
+ children
230
+ }
231
+ );
232
+ }
233
+ );
234
+ var ResizableDivider = React.forwardRef(
235
+ function ResizableDivider2({ index, className, ...props }, ref) {
236
+ const { api, orientation, setSizes } = useResizableLayoutContext();
237
+ const startPosRef = React.useRef(0);
238
+ const containerSizeRef = React.useRef(0);
239
+ const onPointerDown = React.useCallback(
240
+ (e) => {
241
+ e.preventDefault();
242
+ const target = e.currentTarget;
243
+ target.setPointerCapture(e.pointerId);
244
+ const container = target.parentElement;
245
+ if (!container) return;
246
+ const rect = container.getBoundingClientRect();
247
+ containerSizeRef.current = orientation === "horizontal" ? rect.width : rect.height;
248
+ startPosRef.current = orientation === "horizontal" ? e.clientX : e.clientY;
249
+ api.startResize(index);
250
+ },
251
+ [api, index, orientation]
252
+ );
253
+ const onPointerMove = React.useCallback(
254
+ (e) => {
255
+ if (containerSizeRef.current === 0) return;
256
+ const currentPos = orientation === "horizontal" ? e.clientX : e.clientY;
257
+ const pxDelta = currentPos - startPosRef.current;
258
+ const pctDelta = pxDelta / containerSizeRef.current * 100;
259
+ api.onResize(pctDelta);
260
+ setSizes([...api.sizes]);
261
+ },
262
+ [api, orientation, setSizes]
263
+ );
264
+ const onPointerUp = React.useCallback(
265
+ (e) => {
266
+ e.currentTarget.releasePointerCapture(e.pointerId);
267
+ containerSizeRef.current = 0;
268
+ api.endResize();
269
+ },
270
+ [api]
271
+ );
272
+ return /* @__PURE__ */ jsx(
273
+ "div",
274
+ {
275
+ ref,
276
+ role: "separator",
277
+ "aria-orientation": orientation,
278
+ tabIndex: 0,
279
+ className: cn(resizableDividerVariants({ orientation }), className),
280
+ "data-divider-index": index,
281
+ onPointerDown,
282
+ onPointerMove,
283
+ onPointerUp,
284
+ ...props
285
+ }
286
+ );
287
+ }
288
+ );
289
+ export {
290
+ ResizableDivider,
291
+ ResizableLayout,
292
+ ResizablePane,
293
+ resizableDividerVariants,
294
+ resizableLayoutTokens,
295
+ resizableLayoutVariants,
296
+ resizablePaneVariants
297
+ };
298
+ //# sourceMappingURL=react-resizable-layout.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../resizable-layout/src/resizable-layout.ts", "../../resizable-layout/src/resizable-layout.styles.ts", "../../react-resizable-layout/src/resizable-layout.tsx"],
4
+ "sourcesContent": ["import type { Orientation } from '@refraction-ui/shared'\n\nexport interface ResizableLayoutProps {\n orientation?: Orientation\n /** Initial sizes as percentages (must sum to 100) */\n defaultSizes?: number[]\n /** Minimum size for each pane (percentage) */\n minSizes?: number[]\n /** Maximum size for each pane (percentage) */\n maxSizes?: number[]\n /** localStorage key for persisting sizes */\n persistKey?: string\n}\n\nexport interface ResizableLayoutAPI {\n /** Current pane sizes as percentages */\n sizes: number[]\n /** Begin a resize operation at divider index */\n startResize: (index: number) => void\n /** Apply a delta (percentage) during resize */\n onResize: (delta: number) => void\n /** End the current resize operation */\n endResize: () => void\n /** Generate CSS custom properties for pane sizes */\n getCSSVariables: () => Record<string, string>\n /** Current orientation */\n orientation: Orientation\n}\n\n/**\n * Clamp a value between min and max.\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\nexport function createResizableLayout(props: ResizableLayoutProps = {}): ResizableLayoutAPI {\n const {\n orientation = 'horizontal',\n defaultSizes = [50, 50],\n minSizes = [],\n maxSizes = [],\n persistKey,\n } = props\n\n const sizes = loadSizes(persistKey) ?? [...defaultSizes]\n let resizingIndex: number | null = null\n let sizesBeforeResize: number[] = []\n\n function loadSizes(key?: string): number[] | null {\n if (!key) return null\n try {\n if (typeof globalThis.localStorage !== 'undefined') {\n const stored = globalThis.localStorage.getItem(key)\n if (stored) {\n const parsed = JSON.parse(stored) as number[]\n if (Array.isArray(parsed) && parsed.length === defaultSizes.length) {\n return parsed\n }\n }\n }\n } catch {\n // localStorage not available or invalid data\n }\n return null\n }\n\n function saveSizes(key: string, values: number[]): void {\n try {\n if (typeof globalThis.localStorage !== 'undefined') {\n globalThis.localStorage.setItem(key, JSON.stringify(values))\n }\n } catch {\n // localStorage not available\n }\n }\n\n function getMinSize(index: number): number {\n return minSizes[index] ?? 0\n }\n\n function getMaxSize(index: number): number {\n return maxSizes[index] ?? 100\n }\n\n function startResize(index: number): void {\n resizingIndex = index\n sizesBeforeResize = [...sizes]\n }\n\n function onResize(delta: number): void {\n if (resizingIndex === null) return\n\n const i = resizingIndex\n const j = i + 1\n if (j >= sizes.length) return\n\n const totalAvailable = sizesBeforeResize[i] + sizesBeforeResize[j]\n\n // Compute new size for pane i\n let newSizeI = sizesBeforeResize[i] + delta\n newSizeI = clamp(newSizeI, getMinSize(i), getMaxSize(i))\n\n // Compute new size for pane j from remaining\n let newSizeJ = totalAvailable - newSizeI\n newSizeJ = clamp(newSizeJ, getMinSize(j), getMaxSize(j))\n\n // Re-adjust pane i if pane j was constrained\n newSizeI = totalAvailable - newSizeJ\n\n sizes[i] = newSizeI\n sizes[j] = newSizeJ\n }\n\n function endResize(): void {\n resizingIndex = null\n sizesBeforeResize = []\n if (persistKey) {\n saveSizes(persistKey, sizes)\n }\n }\n\n function getCSSVariables(): Record<string, string> {\n const vars: Record<string, string> = {}\n for (let i = 0; i < sizes.length; i++) {\n vars[`--rfr-pane-${i}-size`] = `${sizes[i]}%`\n }\n return vars\n }\n\n return {\n sizes,\n startResize,\n onResize,\n endResize,\n getCSSVariables,\n orientation,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\nimport type { TokenContract } from '@refraction-ui/shared'\n\nexport const resizableLayoutTokens: TokenContract = {\n name: 'resizable-layout',\n tokens: {\n dividerColor: { variable: '--rfr-resizable-divider-color', fallback: 'hsl(var(--border))' },\n dividerHover: { variable: '--rfr-resizable-divider-hover', fallback: 'hsl(var(--primary))' },\n dividerSize: { variable: '--rfr-resizable-divider-size', fallback: '4px' },\n },\n}\n\nexport const resizableLayoutVariants = cva({\n base: 'flex h-full w-full',\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n})\n\nexport const resizableDividerVariants = cva({\n base: 'relative flex items-center justify-center bg-border transition-colors hover:bg-primary/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 active:bg-primary/70',\n variants: {\n orientation: {\n horizontal: 'w-1 cursor-col-resize',\n vertical: 'h-1 cursor-row-resize',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n})\n\nexport const resizablePaneVariants = cva({\n base: 'overflow-auto',\n variants: {\n orientation: {\n horizontal: 'h-full',\n vertical: 'w-full',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n})\n", "import * as React from 'react'\nimport {\n createResizableLayout,\n resizableLayoutVariants,\n resizableDividerVariants,\n resizablePaneVariants,\n type ResizableLayoutProps as CoreProps,\n type ResizableLayoutAPI,\n} from '@refraction-ui/resizable-layout'\nimport { cn, devWarn } from '@refraction-ui/shared'\nimport type { Orientation } from '@refraction-ui/shared'\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface ResizableLayoutContextValue {\n api: ResizableLayoutAPI\n orientation: Orientation\n sizes: number[]\n setSizes: (sizes: number[]) => void\n}\n\nconst ResizableLayoutContext = React.createContext<ResizableLayoutContextValue | null>(null)\n\nfunction useResizableLayoutContext(): ResizableLayoutContextValue {\n const ctx = React.useContext(ResizableLayoutContext)\n if (!ctx) {\n devWarn(\n 'react-resizable-layout/compound-outside-provider',\n 'A Resizable compound component was rendered outside of <ResizableLayout>. Wrap it in <ResizableLayout>.',\n )\n throw new Error('Resizable compound components must be used within <ResizableLayout>')\n }\n return ctx\n}\n\n/* ------------------------------------------------------------------ */\n/* ResizableLayout (root) */\n/* ------------------------------------------------------------------ */\n\nexport interface ResizableLayoutProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'defaultValue'> {\n orientation?: Orientation\n defaultSizes?: number[]\n minSizes?: number[]\n maxSizes?: number[]\n persistKey?: string\n onSizesChange?: (sizes: number[]) => void\n}\n\n/**\n * ResizableLayout — flex container with resizable panes separated by draggable dividers.\n * Uses pointer events for cross-platform drag support.\n */\nexport const ResizableLayout = React.forwardRef<HTMLDivElement, ResizableLayoutProps>(\n function ResizableLayout(\n {\n orientation = 'horizontal',\n defaultSizes = [50, 50],\n minSizes,\n maxSizes,\n persistKey,\n onSizesChange,\n className,\n style,\n children,\n ...props\n },\n ref,\n ) {\n const apiRef = React.useRef<ResizableLayoutAPI | null>(null)\n\n if (!apiRef.current) {\n apiRef.current = createResizableLayout({\n orientation,\n defaultSizes,\n minSizes,\n maxSizes,\n persistKey,\n })\n }\n\n const api = apiRef.current\n const [sizes, setSizesState] = React.useState<number[]>(api.sizes)\n\n const setSizes = React.useCallback(\n (newSizes: number[]) => {\n setSizesState([...newSizes])\n onSizesChange?.(newSizes)\n },\n [onSizesChange],\n )\n\n const cssVars = React.useMemo(() => {\n const vars: Record<string, string> = {}\n for (let i = 0; i < sizes.length; i++) {\n vars[`--rfr-pane-${i}-size`] = `${sizes[i]}%`\n }\n return vars\n }, [sizes])\n\n const contextValue = React.useMemo<ResizableLayoutContextValue>(\n () => ({ api, orientation, sizes, setSizes }),\n [api, orientation, sizes, setSizes],\n )\n\n return (\n <ResizableLayoutContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cn(resizableLayoutVariants({ orientation }), className)}\n style={{ ...cssVars, ...style }}\n data-orientation={orientation}\n {...props}\n >\n {children}\n </div>\n </ResizableLayoutContext.Provider>\n )\n },\n)\n\n/* ------------------------------------------------------------------ */\n/* ResizablePane */\n/* ------------------------------------------------------------------ */\n\nexport interface ResizablePaneProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Zero-based index of this pane (order in the layout) */\n index: number\n}\n\n/**\n * ResizablePane — a single pane whose size is driven by CSS custom properties.\n */\nexport const ResizablePane = React.forwardRef<HTMLDivElement, ResizablePaneProps>(\n function ResizablePane({ index, className, style, children, ...props }, ref) {\n const { orientation, sizes } = useResizableLayoutContext()\n const size = sizes[index] ?? 50\n\n const paneStyle: React.CSSProperties = {\n flexBasis: `${size}%`,\n flexGrow: 0,\n flexShrink: 0,\n ...style,\n }\n\n return (\n <div\n ref={ref}\n className={cn(resizablePaneVariants({ orientation }), className)}\n style={paneStyle}\n data-pane-index={index}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\n/* ------------------------------------------------------------------ */\n/* ResizableDivider */\n/* ------------------------------------------------------------------ */\n\nexport interface ResizableDividerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Index of the divider (between pane[index] and pane[index+1]) */\n index: number\n}\n\n/**\n * ResizableDivider — draggable handle between two panes.\n * Uses pointer events for cross-platform drag support (mouse + touch).\n */\nexport const ResizableDivider = React.forwardRef<HTMLDivElement, ResizableDividerProps>(\n function ResizableDivider({ index, className, ...props }, ref) {\n const { api, orientation, setSizes } = useResizableLayoutContext()\n const startPosRef = React.useRef<number>(0)\n const containerSizeRef = React.useRef<number>(0)\n\n const onPointerDown = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n const target = e.currentTarget\n target.setPointerCapture(e.pointerId)\n\n // Get the container size to convert px delta to percentage\n const container = target.parentElement\n if (!container) return\n\n const rect = container.getBoundingClientRect()\n containerSizeRef.current =\n orientation === 'horizontal' ? rect.width : rect.height\n startPosRef.current =\n orientation === 'horizontal' ? e.clientX : e.clientY\n\n api.startResize(index)\n },\n [api, index, orientation],\n )\n\n const onPointerMove = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (containerSizeRef.current === 0) return\n\n const currentPos =\n orientation === 'horizontal' ? e.clientX : e.clientY\n const pxDelta = currentPos - startPosRef.current\n const pctDelta = (pxDelta / containerSizeRef.current) * 100\n\n api.onResize(pctDelta)\n setSizes([...api.sizes])\n },\n [api, orientation, setSizes],\n )\n\n const onPointerUp = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.currentTarget.releasePointerCapture(e.pointerId)\n containerSizeRef.current = 0\n api.endResize()\n },\n [api],\n )\n\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n tabIndex={0}\n className={cn(resizableDividerVariants({ orientation }), className)}\n data-divider-index={index}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n {...props}\n />\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["ResizableLayout", "ResizablePane", "ResizableDivider"]
7
+ }