@refraction-ui/react 0.19.1 → 0.19.2

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 (323) 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-GFXGXZDB.js +23543 -0
  12. package/dist/chunk-GFXGXZDB.js.map +7 -0
  13. package/dist/chunk-H54FLNAF.js +132 -0
  14. package/dist/chunk-H54FLNAF.js.map +7 -0
  15. package/dist/chunk-INP46354.js +664 -0
  16. package/dist/chunk-INP46354.js.map +7 -0
  17. package/dist/chunk-O4R4W2KY.js +6460 -0
  18. package/dist/chunk-O4R4W2KY.js.map +7 -0
  19. package/dist/chunk-ONACRMG4.js +116 -0
  20. package/dist/chunk-ONACRMG4.js.map +7 -0
  21. package/dist/chunk-SDZ3LROZ.js +7 -0
  22. package/dist/chunk-SDZ3LROZ.js.map +7 -0
  23. package/dist/chunk-UJ6BBWQM.js +154 -0
  24. package/dist/chunk-UJ6BBWQM.js.map +7 -0
  25. package/dist/chunk-UNEM2TRI.js +225 -0
  26. package/dist/chunk-UNEM2TRI.js.map +7 -0
  27. package/dist/chunk-VK3EQ34F.js +92 -0
  28. package/dist/chunk-VK3EQ34F.js.map +7 -0
  29. package/dist/chunk-WK2IIUFO.js +316 -0
  30. package/dist/chunk-WK2IIUFO.js.map +7 -0
  31. package/dist/chunk-XWP763SH.js +3 -2
  32. package/dist/chunk-XWP763SH.js.map +7 -1
  33. package/dist/chunk-Y2FNNAIL.js +80 -0
  34. package/dist/chunk-Y2FNNAIL.js.map +1 -0
  35. package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
  36. package/dist/chunk-ZF3OHCGV.js.map +7 -0
  37. package/dist/form.cjs +5 -11
  38. package/dist/form.cjs.map +1 -1
  39. package/dist/form.js +6 -12
  40. package/dist/form.js.map +1 -1
  41. package/dist/index.cjs +320 -538
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.js +125 -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-collapsible/index.d.cts +0 -3
  47. package/dist/internal/react-collapsible/index.d.ts +0 -3
  48. package/dist/internal/react-combobox/index.d.cts +0 -3
  49. package/dist/internal/react-combobox/index.d.ts +0 -3
  50. package/dist/internal/react-command/index.d.cts +0 -3
  51. package/dist/internal/react-command/index.d.ts +0 -3
  52. package/dist/internal/react-data-table/index.d.cts +0 -3
  53. package/dist/internal/react-data-table/index.d.ts +0 -3
  54. package/dist/internal/react-dialog/index.d.cts +0 -3
  55. package/dist/internal/react-dialog/index.d.ts +0 -3
  56. package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
  57. package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
  58. package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
  59. package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
  60. package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
  61. package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
  62. package/dist/internal/react-popover/index.d.cts +0 -3
  63. package/dist/internal/react-popover/index.d.ts +0 -3
  64. package/dist/internal/react-sheet/index.d.cts +0 -3
  65. package/dist/internal/react-sheet/index.d.ts +0 -3
  66. package/dist/internal/react-toast/index.d.cts +0 -3
  67. package/dist/internal/react-toast/index.d.ts +0 -3
  68. package/dist/internal/react-tooltip/index.d.cts +0 -3
  69. package/dist/internal/react-tooltip/index.d.ts +0 -3
  70. package/dist/react-accordion.js +125 -0
  71. package/dist/react-accordion.js.map +7 -0
  72. package/dist/react-ai.js +257 -0
  73. package/dist/react-ai.js.map +7 -0
  74. package/dist/react-analytics.js +1698 -0
  75. package/dist/react-analytics.js.map +7 -0
  76. package/dist/react-animated-text.js +164 -0
  77. package/dist/react-animated-text.js.map +7 -0
  78. package/dist/react-app-shell.js +631 -0
  79. package/dist/react-app-shell.js.map +7 -0
  80. package/dist/react-audience-feature-card.js +53 -0
  81. package/dist/react-audience-feature-card.js.map +7 -0
  82. package/dist/react-audio-room.js +166 -0
  83. package/dist/react-audio-room.js.map +7 -0
  84. package/dist/react-auth.js +211 -0
  85. package/dist/react-auth.js.map +7 -0
  86. package/dist/react-avatar-group.js +154 -0
  87. package/dist/react-avatar-group.js.map +7 -0
  88. package/dist/react-avatar.js +168 -0
  89. package/dist/react-avatar.js.map +7 -0
  90. package/dist/react-badge.js +70 -0
  91. package/dist/react-badge.js.map +7 -0
  92. package/dist/react-bottom-nav.js +67 -0
  93. package/dist/react-bottom-nav.js.map +7 -0
  94. package/dist/react-brand-network-cell.js +92 -0
  95. package/dist/react-brand-network-cell.js.map +7 -0
  96. package/dist/react-breadcrumbs.js +104 -0
  97. package/dist/react-breadcrumbs.js.map +7 -0
  98. package/dist/react-browser-chrome-mock.js +89 -0
  99. package/dist/react-browser-chrome-mock.js.map +7 -0
  100. package/dist/react-button.js +13 -0
  101. package/dist/react-button.js.map +7 -0
  102. package/dist/react-calendar.js +301 -0
  103. package/dist/react-calendar.js.map +7 -0
  104. package/dist/react-call-controls.js +113 -0
  105. package/dist/react-call-controls.js.map +7 -0
  106. package/dist/react-callout.js +136 -0
  107. package/dist/react-callout.js.map +7 -0
  108. package/dist/react-card-grid.js +34 -0
  109. package/dist/react-card-grid.js.map +7 -0
  110. package/dist/react-card.js +184 -0
  111. package/dist/react-card.js.map +7 -0
  112. package/dist/react-carousel.js +132 -0
  113. package/dist/react-carousel.js.map +7 -0
  114. package/dist/react-charts.js +509 -0
  115. package/dist/react-charts.js.map +7 -0
  116. package/dist/react-checkbox.js +156 -0
  117. package/dist/react-checkbox.js.map +7 -0
  118. package/dist/react-checklist.js +168 -0
  119. package/dist/react-checklist.js.map +7 -0
  120. package/dist/react-code-block.js +78 -0
  121. package/dist/react-code-block.js.map +7 -0
  122. package/dist/react-code-editor.js +184 -0
  123. package/dist/react-code-editor.js.map +7 -0
  124. package/dist/react-collapsible.js +192 -0
  125. package/dist/react-collapsible.js.map +7 -0
  126. package/dist/react-combobox.js +609 -0
  127. package/dist/react-combobox.js.map +7 -0
  128. package/dist/react-command-input.js +202 -0
  129. package/dist/react-command-input.js.map +7 -0
  130. package/dist/react-command.js +364 -0
  131. package/dist/react-command.js.map +7 -0
  132. package/dist/react-composer.js +2036 -0
  133. package/dist/react-composer.js.map +7 -0
  134. package/dist/react-content-protection.js +133 -0
  135. package/dist/react-content-protection.js.map +7 -0
  136. package/dist/react-conversation.js +1226 -0
  137. package/dist/react-conversation.js.map +7 -0
  138. package/dist/react-cookie-consent.js +291 -0
  139. package/dist/react-cookie-consent.js.map +7 -0
  140. package/dist/react-data-table.js +310 -0
  141. package/dist/react-data-table.js.map +7 -0
  142. package/dist/react-date-picker.js +95 -0
  143. package/dist/react-date-picker.js.map +7 -0
  144. package/dist/react-device-frame.js +137 -0
  145. package/dist/react-device-frame.js.map +7 -0
  146. package/dist/react-dialog.js +218 -0
  147. package/dist/react-dialog.js.map +7 -0
  148. package/dist/react-diff-viewer.js +460 -0
  149. package/dist/react-diff-viewer.js.map +7 -0
  150. package/dist/react-dropdown-menu.js +292 -0
  151. package/dist/react-dropdown-menu.js.map +7 -0
  152. package/dist/react-editor-status-bar.js +148 -0
  153. package/dist/react-editor-status-bar.js.map +7 -0
  154. package/dist/react-editor-tabs.js +159 -0
  155. package/dist/react-editor-tabs.js.map +7 -0
  156. package/dist/react-emoji-picker.js +238 -0
  157. package/dist/react-emoji-picker.js.map +7 -0
  158. package/dist/react-empty-state.js +90 -0
  159. package/dist/react-empty-state.js.map +7 -0
  160. package/dist/react-feedback-dialog.js +275 -0
  161. package/dist/react-feedback-dialog.js.map +7 -0
  162. package/dist/react-file-tree.js +376 -0
  163. package/dist/react-file-tree.js.map +7 -0
  164. package/dist/react-file-upload.js +360 -0
  165. package/dist/react-file-upload.js.map +7 -0
  166. package/dist/react-floating-reactions.js +124 -0
  167. package/dist/react-floating-reactions.js.map +7 -0
  168. package/dist/react-flow-editor.js +198 -0
  169. package/dist/react-flow-editor.js.map +7 -0
  170. package/dist/react-footer.js +67 -0
  171. package/dist/react-footer.js.map +7 -0
  172. package/dist/react-graph-view.js +197 -0
  173. package/dist/react-graph-view.js.map +7 -0
  174. package/dist/react-icon-system.js +9 -0
  175. package/dist/react-icon-system.js.map +7 -0
  176. package/dist/react-infinite-canvas.js +8 -0
  177. package/dist/react-infinite-canvas.js.map +7 -0
  178. package/dist/react-inline-editor.js +216 -0
  179. package/dist/react-inline-editor.js.map +7 -0
  180. package/dist/react-input-group.js +150 -0
  181. package/dist/react-input-group.js.map +7 -0
  182. package/dist/react-input.js +10 -0
  183. package/dist/react-input.js.map +7 -0
  184. package/dist/react-install-prompt.js +132 -0
  185. package/dist/react-install-prompt.js.map +7 -0
  186. package/dist/react-kanban-board.js +198 -0
  187. package/dist/react-kanban-board.js.map +7 -0
  188. package/dist/react-keyboard-shortcut.js +36 -0
  189. package/dist/react-keyboard-shortcut.js.map +7 -0
  190. package/dist/react-language-selector.js +311 -0
  191. package/dist/react-language-selector.js.map +7 -0
  192. package/dist/react-link-card.js +34 -0
  193. package/dist/react-link-card.js.map +7 -0
  194. package/dist/react-live-captions.js +92 -0
  195. package/dist/react-live-captions.js.map +7 -0
  196. package/dist/react-live-cursors.js +145 -0
  197. package/dist/react-live-cursors.js.map +7 -0
  198. package/dist/react-live-transcript.js +117 -0
  199. package/dist/react-live-transcript.js.map +7 -0
  200. package/dist/react-location-selector.js +252 -0
  201. package/dist/react-location-selector.js.map +7 -0
  202. package/dist/react-logger.js +415 -0
  203. package/dist/react-logger.js.map +7 -0
  204. package/dist/react-markdown-renderer.js +12 -0
  205. package/dist/react-markdown-renderer.js.map +7 -0
  206. package/dist/react-marquee-strip.js +62 -0
  207. package/dist/react-marquee-strip.js.map +7 -0
  208. package/dist/react-mascot.js +367 -0
  209. package/dist/react-mascot.js.map +7 -0
  210. package/dist/react-mastery-bar.js +97 -0
  211. package/dist/react-mastery-bar.js.map +7 -0
  212. package/dist/react-mini-map.js +207 -0
  213. package/dist/react-mini-map.js.map +7 -0
  214. package/dist/react-mobile-nav.js +216 -0
  215. package/dist/react-mobile-nav.js.map +7 -0
  216. package/dist/react-navbar.js +96 -0
  217. package/dist/react-navbar.js.map +7 -0
  218. package/dist/react-numbered-steps.js +67 -0
  219. package/dist/react-numbered-steps.js.map +7 -0
  220. package/dist/react-otp-input.js +318 -0
  221. package/dist/react-otp-input.js.map +7 -0
  222. package/dist/react-pagination.js +199 -0
  223. package/dist/react-pagination.js.map +7 -0
  224. package/dist/react-password-input.js +104 -0
  225. package/dist/react-password-input.js.map +7 -0
  226. package/dist/react-payment.js +81 -0
  227. package/dist/react-payment.js.map +7 -0
  228. package/dist/react-popover.js +176 -0
  229. package/dist/react-popover.js.map +7 -0
  230. package/dist/react-pre-call-lobby.js +309 -0
  231. package/dist/react-pre-call-lobby.js.map +7 -0
  232. package/dist/react-presence-indicator.js +86 -0
  233. package/dist/react-presence-indicator.js.map +7 -0
  234. package/dist/react-pricing-card.js +142 -0
  235. package/dist/react-pricing-card.js.map +7 -0
  236. package/dist/react-progress-display.js +188 -0
  237. package/dist/react-progress-display.js.map +7 -0
  238. package/dist/react-radial-gauge.js +193 -0
  239. package/dist/react-radial-gauge.js.map +7 -0
  240. package/dist/react-radio.js +169 -0
  241. package/dist/react-radio.js.map +7 -0
  242. package/dist/react-rating-scale.js +171 -0
  243. package/dist/react-rating-scale.js.map +7 -0
  244. package/dist/react-reaction-bar.js +111 -0
  245. package/dist/react-reaction-bar.js.map +7 -0
  246. package/dist/react-resizable-layout.js +298 -0
  247. package/dist/react-resizable-layout.js.map +7 -0
  248. package/dist/react-rich-editor.js +1 -0
  249. package/dist/react-rich-editor.js.map +7 -0
  250. package/dist/react-search-bar.js +285 -0
  251. package/dist/react-search-bar.js.map +7 -0
  252. package/dist/react-section-head.js +65 -0
  253. package/dist/react-section-head.js.map +7 -0
  254. package/dist/react-segmented-control.js +215 -0
  255. package/dist/react-segmented-control.js.map +7 -0
  256. package/dist/react-select.js +389 -0
  257. package/dist/react-select.js.map +7 -0
  258. package/dist/react-separator.js +86 -0
  259. package/dist/react-separator.js.map +7 -0
  260. package/dist/react-sheet.js +310 -0
  261. package/dist/react-sheet.js.map +7 -0
  262. package/dist/react-sidebar.js +100 -0
  263. package/dist/react-sidebar.js.map +7 -0
  264. package/dist/react-skeleton.js +91 -0
  265. package/dist/react-skeleton.js.map +7 -0
  266. package/dist/react-skip-to-content.js +38 -0
  267. package/dist/react-skip-to-content.js.map +7 -0
  268. package/dist/react-slide-viewer.js +264 -0
  269. package/dist/react-slide-viewer.js.map +7 -0
  270. package/dist/react-slider.js +105 -0
  271. package/dist/react-slider.js.map +7 -0
  272. package/dist/react-slot-picker.js +184 -0
  273. package/dist/react-slot-picker.js.map +7 -0
  274. package/dist/react-social-auth-button.js +169 -0
  275. package/dist/react-social-auth-button.js.map +7 -0
  276. package/dist/react-sortable-list.js +204 -0
  277. package/dist/react-sortable-list.js.map +7 -0
  278. package/dist/react-stat-grid.js +69 -0
  279. package/dist/react-stat-grid.js.map +7 -0
  280. package/dist/react-status-indicator.js +117 -0
  281. package/dist/react-status-indicator.js.map +7 -0
  282. package/dist/react-steps.js +167 -0
  283. package/dist/react-steps.js.map +7 -0
  284. package/dist/react-sticky-note.js +131 -0
  285. package/dist/react-sticky-note.js.map +7 -0
  286. package/dist/react-switch.js +139 -0
  287. package/dist/react-switch.js.map +7 -0
  288. package/dist/react-table-of-contents.js +80 -0
  289. package/dist/react-table-of-contents.js.map +7 -0
  290. package/dist/react-tabs.js +230 -0
  291. package/dist/react-tabs.js.map +7 -0
  292. package/dist/react-terminal.js +101 -0
  293. package/dist/react-terminal.js.map +7 -0
  294. package/dist/react-test-results.js +158 -0
  295. package/dist/react-test-results.js.map +7 -0
  296. package/dist/react-textarea.js +89 -0
  297. package/dist/react-textarea.js.map +7 -0
  298. package/dist/react-thread-view.js +139 -0
  299. package/dist/react-thread-view.js.map +7 -0
  300. package/dist/react-timeline.js +153 -0
  301. package/dist/react-timeline.js.map +7 -0
  302. package/dist/react-toast.js +253 -0
  303. package/dist/react-toast.js.map +7 -0
  304. package/dist/react-tooltip.js +221 -0
  305. package/dist/react-tooltip.js.map +7 -0
  306. package/dist/react-version-selector.js +270 -0
  307. package/dist/react-version-selector.js.map +7 -0
  308. package/dist/react-video-grid.js +129 -0
  309. package/dist/react-video-grid.js.map +7 -0
  310. package/dist/react-video-player.js +206 -0
  311. package/dist/react-video-player.js.map +7 -0
  312. package/dist/react-video-tile.js +8 -0
  313. package/dist/react-video-tile.js.map +7 -0
  314. package/dist/react-voice-pill.js +314 -0
  315. package/dist/react-voice-pill.js.map +7 -0
  316. package/dist/react-waveform.js +558 -0
  317. package/dist/react-waveform.js.map +7 -0
  318. package/dist/react-wizard.js +337 -0
  319. package/dist/react-wizard.js.map +7 -0
  320. package/dist/theme.js +1 -1
  321. package/package.json +2 -2
  322. package/dist/chunk-4A4BW3GR.js.map +0 -1
  323. package/dist/index.js.map +0 -1
@@ -0,0 +1,337 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-wizard/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../wizard/dist/index.js
10
+ function getStepState(steps, currentIndex) {
11
+ return steps.map((step, index) => {
12
+ let status;
13
+ if (index < currentIndex) {
14
+ status = "complete";
15
+ } else if (index === currentIndex) {
16
+ status = "current";
17
+ } else {
18
+ status = "upcoming";
19
+ }
20
+ return { step, status, index };
21
+ });
22
+ }
23
+ function getNextIndex(currentIndex, count) {
24
+ if (count <= 0) return currentIndex;
25
+ return Math.min(currentIndex + 1, count - 1);
26
+ }
27
+ function getPrevIndex(currentIndex) {
28
+ return Math.max(currentIndex - 1, 0);
29
+ }
30
+ function canAdvance(currentIndex, count) {
31
+ if (count <= 0) return false;
32
+ return currentIndex < count - 1;
33
+ }
34
+ function createWizard(props = {}) {
35
+ const { currentIndex = 0, count = 0, orientation = "vertical" } = props;
36
+ const ariaProps = {
37
+ role: "group"
38
+ };
39
+ const dataAttributes = {
40
+ "data-step": String(currentIndex),
41
+ "data-orientation": orientation
42
+ };
43
+ if (count > 0) {
44
+ dataAttributes["data-count"] = String(count);
45
+ }
46
+ return { ariaProps, dataAttributes };
47
+ }
48
+ var wizardVariants = cva({
49
+ base: "flex gap-8",
50
+ variants: {
51
+ orientation: {
52
+ vertical: "flex-row",
53
+ horizontal: "flex-col"
54
+ }
55
+ },
56
+ defaultVariants: {
57
+ orientation: "vertical"
58
+ }
59
+ });
60
+ var wizardRailVariants = cva({
61
+ base: "flex shrink-0",
62
+ variants: {
63
+ orientation: {
64
+ vertical: "flex-col gap-0",
65
+ horizontal: "flex-row items-center gap-0"
66
+ }
67
+ },
68
+ defaultVariants: {
69
+ orientation: "vertical"
70
+ }
71
+ });
72
+ var wizardStepItemVariants = cva({
73
+ base: "flex items-center gap-3 relative",
74
+ variants: {
75
+ orientation: {
76
+ vertical: "flex-row",
77
+ horizontal: "flex-col"
78
+ },
79
+ status: {
80
+ complete: "",
81
+ current: "",
82
+ upcoming: ""
83
+ }
84
+ },
85
+ defaultVariants: {
86
+ orientation: "vertical",
87
+ status: "upcoming"
88
+ }
89
+ });
90
+ var wizardStepIndicatorVariants = cva({
91
+ base: [
92
+ "relative z-10 flex size-8 shrink-0 items-center justify-center",
93
+ "rounded-full border-2 text-xs font-semibold transition-colors"
94
+ ].join(" "),
95
+ variants: {
96
+ status: {
97
+ complete: "border-primary bg-primary text-primary-foreground",
98
+ current: "border-primary bg-background text-primary",
99
+ upcoming: "border-border bg-background text-muted-foreground"
100
+ }
101
+ },
102
+ defaultVariants: {
103
+ status: "upcoming"
104
+ }
105
+ });
106
+ var wizardStepLabelVariants = cva({
107
+ base: "text-sm font-medium transition-colors",
108
+ variants: {
109
+ status: {
110
+ complete: "text-foreground",
111
+ current: "text-foreground",
112
+ upcoming: "text-muted-foreground"
113
+ }
114
+ },
115
+ defaultVariants: {
116
+ status: "upcoming"
117
+ }
118
+ });
119
+ var wizardStepOptionalClass = "text-xs text-muted-foreground";
120
+ var wizardConnectorVariants = cva({
121
+ base: "shrink-0 transition-colors",
122
+ variants: {
123
+ orientation: {
124
+ vertical: "mx-4 w-0.5 flex-1 min-h-[1.5rem]",
125
+ horizontal: "my-4 h-0.5 flex-1 min-w-[1.5rem]"
126
+ },
127
+ complete: {
128
+ true: "bg-primary",
129
+ false: "bg-border"
130
+ }
131
+ },
132
+ defaultVariants: {
133
+ orientation: "vertical",
134
+ complete: "false"
135
+ }
136
+ });
137
+ var wizardContentClass = "flex min-w-0 flex-1 flex-col";
138
+ var wizardFooterClass = "mt-6 flex items-center gap-3";
139
+ var wizardPrimaryButtonVariants = cva({
140
+ base: [
141
+ "inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium",
142
+ "bg-primary text-primary-foreground transition-colors",
143
+ "hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-2",
144
+ "focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
145
+ "disabled:pointer-events-none disabled:opacity-50"
146
+ ].join(" ")
147
+ });
148
+ var wizardSecondaryButtonVariants = cva({
149
+ base: [
150
+ "inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium",
151
+ "border border-input bg-background text-foreground transition-colors",
152
+ "hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2",
153
+ "focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
154
+ "disabled:pointer-events-none disabled:opacity-50"
155
+ ].join(" ")
156
+ });
157
+
158
+ // ../react-wizard/dist/index.js
159
+ import { jsx, jsxs } from "react/jsx-runtime";
160
+ var WizardContext = React.createContext(null);
161
+ function useWizardContext() {
162
+ const ctx = React.useContext(WizardContext);
163
+ if (!ctx) throw new Error("useWizardContext must be used inside <Wizard>");
164
+ return ctx;
165
+ }
166
+ var Wizard = React.forwardRef(
167
+ function Wizard2({
168
+ steps,
169
+ step: stepProp,
170
+ defaultStep = 0,
171
+ onStepChange,
172
+ onComplete,
173
+ orientation = "vertical",
174
+ nextLabel = "Next",
175
+ backLabel = "Back",
176
+ completeLabel = "Complete",
177
+ skipLabel = "Skip",
178
+ children,
179
+ className,
180
+ ...props
181
+ }, ref) {
182
+ const isControlled = stepProp !== void 0;
183
+ const [internal, setInternal] = React.useState(defaultStep);
184
+ const currentIndex = isControlled ? stepProp : internal;
185
+ const advance = React.useCallback(() => {
186
+ if (!canAdvance(currentIndex, steps.length)) {
187
+ onComplete?.();
188
+ return;
189
+ }
190
+ const next = getNextIndex(currentIndex, steps.length);
191
+ if (!isControlled) setInternal(next);
192
+ onStepChange?.(next);
193
+ }, [currentIndex, steps.length, isControlled, onStepChange, onComplete]);
194
+ const back = React.useCallback(() => {
195
+ if (currentIndex === 0) return;
196
+ const prev = getPrevIndex(currentIndex);
197
+ if (!isControlled) setInternal(prev);
198
+ onStepChange?.(prev);
199
+ }, [currentIndex, isControlled, onStepChange]);
200
+ const skip = React.useCallback(() => {
201
+ advance();
202
+ }, [advance]);
203
+ const stepStates = React.useMemo(
204
+ () => getStepState(steps, currentIndex),
205
+ [steps, currentIndex]
206
+ );
207
+ const isLastStep = currentIndex === steps.length - 1;
208
+ const currentStep = steps[currentIndex];
209
+ const isOptional = currentStep?.optional ?? false;
210
+ const api = createWizard({
211
+ currentIndex,
212
+ count: steps.length,
213
+ orientation
214
+ });
215
+ return /* @__PURE__ */ jsx(WizardContext.Provider, { value: { currentIndex, steps, orientation }, children: /* @__PURE__ */ jsxs(
216
+ "div",
217
+ {
218
+ ref,
219
+ className: cn(wizardVariants({ orientation }), className),
220
+ ...api.ariaProps,
221
+ ...api.dataAttributes,
222
+ ...props,
223
+ children: [
224
+ /* @__PURE__ */ jsx(
225
+ "nav",
226
+ {
227
+ "aria-label": "Progress",
228
+ className: wizardRailVariants({ orientation }),
229
+ children: stepStates.map((state, i) => {
230
+ const isLast = i === stepStates.length - 1;
231
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
232
+ /* @__PURE__ */ jsxs(
233
+ "div",
234
+ {
235
+ className: wizardStepItemVariants({
236
+ orientation,
237
+ status: state.status
238
+ }),
239
+ children: [
240
+ /* @__PURE__ */ jsx(
241
+ "span",
242
+ {
243
+ "aria-current": state.status === "current" ? "step" : void 0,
244
+ className: wizardStepIndicatorVariants({ status: state.status }),
245
+ children: state.status === "complete" ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx("span", { children: state.index + 1 })
246
+ }
247
+ ),
248
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
249
+ /* @__PURE__ */ jsx(
250
+ "span",
251
+ {
252
+ className: wizardStepLabelVariants({ status: state.status }),
253
+ children: state.step.label
254
+ }
255
+ ),
256
+ state.step.optional && /* @__PURE__ */ jsx("span", { className: wizardStepOptionalClass, children: "(Optional)" })
257
+ ] })
258
+ ]
259
+ }
260
+ ),
261
+ !isLast && /* @__PURE__ */ jsx(
262
+ "div",
263
+ {
264
+ "aria-hidden": "true",
265
+ className: wizardConnectorVariants({
266
+ orientation,
267
+ complete: state.status === "complete" ? "true" : "false"
268
+ })
269
+ }
270
+ )
271
+ ] }, state.step.id);
272
+ })
273
+ }
274
+ ),
275
+ /* @__PURE__ */ jsxs("div", { className: wizardContentClass, children: [
276
+ /* @__PURE__ */ jsx("div", { className: "flex-1", children: typeof children === "function" ? children(currentIndex) : children }),
277
+ /* @__PURE__ */ jsxs("div", { className: wizardFooterClass, children: [
278
+ /* @__PURE__ */ jsx(
279
+ "button",
280
+ {
281
+ type: "button",
282
+ disabled: currentIndex === 0,
283
+ className: wizardSecondaryButtonVariants(),
284
+ onClick: back,
285
+ children: backLabel
286
+ }
287
+ ),
288
+ isOptional && /* @__PURE__ */ jsx(
289
+ "button",
290
+ {
291
+ type: "button",
292
+ className: wizardSecondaryButtonVariants(),
293
+ onClick: skip,
294
+ children: skipLabel
295
+ }
296
+ ),
297
+ /* @__PURE__ */ jsx(
298
+ "button",
299
+ {
300
+ type: "button",
301
+ className: wizardPrimaryButtonVariants(),
302
+ onClick: advance,
303
+ children: isLastStep ? completeLabel : nextLabel
304
+ }
305
+ )
306
+ ] })
307
+ ] })
308
+ ]
309
+ }
310
+ ) });
311
+ }
312
+ );
313
+ function useWizard() {
314
+ return useWizardContext();
315
+ }
316
+ function CheckIcon() {
317
+ return /* @__PURE__ */ jsx(
318
+ "svg",
319
+ {
320
+ "aria-hidden": "true",
321
+ xmlns: "http://www.w3.org/2000/svg",
322
+ viewBox: "0 0 24 24",
323
+ fill: "none",
324
+ stroke: "currentColor",
325
+ strokeWidth: 2.5,
326
+ strokeLinecap: "round",
327
+ strokeLinejoin: "round",
328
+ className: "size-4",
329
+ children: /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" })
330
+ }
331
+ );
332
+ }
333
+ export {
334
+ Wizard,
335
+ useWizard
336
+ };
337
+ //# sourceMappingURL=react-wizard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../wizard/src/wizard.ts", "../../wizard/src/wizard.styles.ts", "../../react-wizard/src/wizard.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\n/** A single step in a wizard flow. */\nexport interface WizardStep {\n /** Unique identifier for the step. */\n id: string\n /** Human-readable label shown in the step rail. */\n label: string\n /** When true the user may skip this step. */\n optional?: boolean\n}\n\n/** The resolved status of a step relative to the current position. */\nexport type WizardStepStatus = 'complete' | 'current' | 'upcoming'\n\n/** A step enriched with its resolved status and position. */\nexport interface WizardStepState {\n step: WizardStep\n status: WizardStepStatus\n index: number\n}\n\n/** Orientation of the step rail. */\nexport type WizardOrientation = 'vertical' | 'horizontal'\n\nexport interface WizardProps {\n /** Controlled current step index (0-based). */\n currentIndex?: number\n /** Total number of steps. */\n count?: number\n /** Orientation of the step rail. */\n orientation?: WizardOrientation\n}\n\nexport interface WizardAPI {\n /** ARIA attributes to spread on the root element. */\n ariaProps: Partial<AccessibilityProps>\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Derive the status of every step from the current position.\n *\n * Steps before `currentIndex` are `'complete'`, the step at `currentIndex` is\n * `'current'`, and every step after is `'upcoming'`.\n */\nexport function getStepState(\n steps: WizardStep[],\n currentIndex: number,\n): WizardStepState[] {\n return steps.map((step, index) => {\n let status: WizardStepStatus\n if (index < currentIndex) {\n status = 'complete'\n } else if (index === currentIndex) {\n status = 'current'\n } else {\n status = 'upcoming'\n }\n return { step, status, index }\n })\n}\n\n/**\n * Returns the next step index, clamped to the last step so the wizard never\n * advances past the final step.\n */\nexport function getNextIndex(currentIndex: number, count: number): number {\n if (count <= 0) return currentIndex\n return Math.min(currentIndex + 1, count - 1)\n}\n\n/**\n * Returns the previous step index, clamped to 0 so the wizard never goes\n * behind the first step.\n */\nexport function getPrevIndex(currentIndex: number): number {\n return Math.max(currentIndex - 1, 0)\n}\n\n/**\n * Whether the wizard can advance from `currentIndex`.\n *\n * Returns `false` when already on the last step.\n */\nexport function canAdvance(currentIndex: number, count: number): boolean {\n if (count <= 0) return false\n return currentIndex < count - 1\n}\n\n/**\n * Fractional progress through the wizard (0 when on step 0, 1 when the final\n * step is complete). Returns 0 for empty wizards.\n *\n * `wizardProgress(0, 4)` → 0 (just started)\n * `wizardProgress(3, 4)` → 0.75\n * `wizardProgress(4, 4)` → 1 (done)\n */\nexport function wizardProgress(currentIndex: number, count: number): number {\n if (count <= 0) return 0\n return Math.min(currentIndex / count, 1)\n}\n\n/**\n * Build the framework-agnostic root props for a wizard component.\n *\n * Returns `role=\"group\"` plus `data-step` / `data-orientation` attributes so\n * adapters can spread them onto their container without duplicating logic.\n */\nexport function createWizard(props: WizardProps = {}): WizardAPI {\n const { currentIndex = 0, count = 0, orientation = 'vertical' } = props\n\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'group',\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-step': String(currentIndex),\n 'data-orientation': orientation,\n }\n\n if (count > 0) {\n dataAttributes['data-count'] = String(count)\n }\n\n return { ariaProps, dataAttributes }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * Root container that holds the step rail and the content/footer area\n * side-by-side (vertical) or stacked (horizontal).\n */\nexport const wizardVariants = cva({\n base: 'flex gap-8',\n variants: {\n orientation: {\n vertical: 'flex-row',\n horizontal: 'flex-col',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\n/**\n * The step rail — the ordered list of step indicators.\n * Vertical: a narrow column on the left. Horizontal: a row across the top.\n */\nexport const wizardRailVariants = cva({\n base: 'flex shrink-0',\n variants: {\n orientation: {\n vertical: 'flex-col gap-0',\n horizontal: 'flex-row items-center gap-0',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\n/**\n * A single step item in the rail. The `status` variant drives colour so\n * adapters never inline these classes.\n */\nexport const wizardStepItemVariants = cva({\n base: 'flex items-center gap-3 relative',\n variants: {\n orientation: {\n vertical: 'flex-row',\n horizontal: 'flex-col',\n },\n status: {\n complete: '',\n current: '',\n upcoming: '',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n status: 'upcoming',\n },\n})\n\n/**\n * The circular step indicator (the number/check badge on the rail).\n * `status` variant applies the appropriate background and text treatment.\n */\nexport const wizardStepIndicatorVariants = cva({\n base: [\n 'relative z-10 flex size-8 shrink-0 items-center justify-center',\n 'rounded-full border-2 text-xs font-semibold transition-colors',\n ].join(' '),\n variants: {\n status: {\n complete: 'border-primary bg-primary text-primary-foreground',\n current: 'border-primary bg-background text-primary',\n upcoming: 'border-border bg-background text-muted-foreground',\n },\n },\n defaultVariants: {\n status: 'upcoming',\n },\n})\n\n/** The label text next to / below the step indicator. */\nexport const wizardStepLabelVariants = cva({\n base: 'text-sm font-medium transition-colors',\n variants: {\n status: {\n complete: 'text-foreground',\n current: 'text-foreground',\n upcoming: 'text-muted-foreground',\n },\n },\n defaultVariants: {\n status: 'upcoming',\n },\n})\n\n/** \"(Optional)\" sub-label shown beneath the step label. */\nexport const wizardStepOptionalClass = 'text-xs text-muted-foreground'\n\n/**\n * The connector line drawn between two adjacent step indicators.\n * Positioned absolutely so the indicator sits on top of it.\n */\nexport const wizardConnectorVariants = cva({\n base: 'shrink-0 transition-colors',\n variants: {\n orientation: {\n vertical: 'mx-4 w-0.5 flex-1 min-h-[1.5rem]',\n horizontal: 'my-4 h-0.5 flex-1 min-w-[1.5rem]',\n },\n complete: {\n true: 'bg-primary',\n false: 'bg-border',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n complete: 'false',\n },\n})\n\n/** The main content area to the right (vertical) or below (horizontal) the rail. */\nexport const wizardContentClass = 'flex min-w-0 flex-1 flex-col'\n\n/** Footer row that holds the Back / Skip / Next-or-Complete buttons. */\nexport const wizardFooterClass = 'mt-6 flex items-center gap-3'\n\n/** The primary action button (Next / Complete). */\nexport const wizardPrimaryButtonVariants = cva({\n base: [\n 'inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium',\n 'bg-primary text-primary-foreground transition-colors',\n 'hover:bg-primary/90 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})\n\n/** The secondary action button (Back / Skip). */\nexport const wizardSecondaryButtonVariants = cva({\n base: [\n 'inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium',\n 'border border-input bg-background text-foreground transition-colors',\n 'hover:bg-accent hover:text-accent-foreground 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})\n", "import * as React from 'react'\nimport {\n createWizard,\n getStepState,\n getNextIndex,\n getPrevIndex,\n canAdvance,\n wizardVariants,\n wizardRailVariants,\n wizardStepItemVariants,\n wizardStepIndicatorVariants,\n wizardStepLabelVariants,\n wizardStepOptionalClass,\n wizardConnectorVariants,\n wizardContentClass,\n wizardFooterClass,\n wizardPrimaryButtonVariants,\n wizardSecondaryButtonVariants,\n type WizardStep,\n type WizardOrientation,\n} from '@refraction-ui/wizard'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { WizardStep, WizardOrientation }\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface WizardContextValue {\n currentIndex: number\n steps: WizardStep[]\n orientation: WizardOrientation\n}\n\nconst WizardContext = React.createContext<WizardContextValue | null>(null)\n\nfunction useWizardContext(): WizardContextValue {\n const ctx = React.useContext(WizardContext)\n if (!ctx) throw new Error('useWizardContext must be used inside <Wizard>')\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface WizardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'children'> {\n /** Step definitions for the rail. */\n steps: WizardStep[]\n /** Controlled current step index (0-based). */\n step?: number\n /** Initial step index for uncontrolled usage. */\n defaultStep?: number\n /** Called when the current step changes (Back/Next). */\n onStepChange?: (index: number) => void\n /** Called when the user completes the final step. */\n onComplete?: () => void\n /** Orientation of the step rail. Default `'vertical'`. */\n orientation?: WizardOrientation\n /** Label for the Next button. */\n nextLabel?: React.ReactNode\n /** Label for the Back button. */\n backLabel?: React.ReactNode\n /** Label for the button on the final step. */\n completeLabel?: React.ReactNode\n /** Label for the Skip button (shown on optional steps only). */\n skipLabel?: React.ReactNode\n /**\n * Content for the active step. Either pass a render prop that receives the\n * current step index, or plain children shown for every step.\n */\n children?: React.ReactNode | ((currentIndex: number) => React.ReactNode)\n}\n\n// ---------------------------------------------------------------------------\n// Wizard\n// ---------------------------------------------------------------------------\n\n/**\n * Wizard — a multi-step flow orchestration component.\n *\n * Renders a step rail (vertical by default) alongside the active step content\n * and a footer with Back / Skip (optional steps) / Next-or-Complete actions.\n * Supports controlled (`step` / `onStepChange`) and uncontrolled\n * (`defaultStep`) usage. Logic and styles come from the headless\n * `@refraction-ui/wizard` core.\n *\n * @example\n * ```tsx\n * <Wizard steps={steps} onComplete={handleComplete}>\n * {(index) => <StepContent stepIndex={index} />}\n * </Wizard>\n * ```\n */\nexport const Wizard = React.forwardRef<HTMLDivElement, WizardProps>(\n function Wizard(\n {\n steps,\n step: stepProp,\n defaultStep = 0,\n onStepChange,\n onComplete,\n orientation = 'vertical',\n nextLabel = 'Next',\n backLabel = 'Back',\n completeLabel = 'Complete',\n skipLabel = 'Skip',\n children,\n className,\n ...props\n },\n ref,\n ) {\n const isControlled = stepProp !== undefined\n const [internal, setInternal] = React.useState(defaultStep)\n const currentIndex = isControlled ? stepProp : internal\n\n const advance = React.useCallback(() => {\n if (!canAdvance(currentIndex, steps.length)) {\n onComplete?.()\n return\n }\n const next = getNextIndex(currentIndex, steps.length)\n if (!isControlled) setInternal(next)\n onStepChange?.(next)\n }, [currentIndex, steps.length, isControlled, onStepChange, onComplete])\n\n const back = React.useCallback(() => {\n if (currentIndex === 0) return\n const prev = getPrevIndex(currentIndex)\n if (!isControlled) setInternal(prev)\n onStepChange?.(prev)\n }, [currentIndex, isControlled, onStepChange])\n\n const skip = React.useCallback(() => {\n advance()\n }, [advance])\n\n const stepStates = React.useMemo(\n () => getStepState(steps, currentIndex),\n [steps, currentIndex],\n )\n\n const isLastStep = currentIndex === steps.length - 1\n const currentStep = steps[currentIndex]\n const isOptional = currentStep?.optional ?? false\n\n const api = createWizard({\n currentIndex,\n count: steps.length,\n orientation,\n })\n\n return (\n <WizardContext.Provider value={{ currentIndex, steps, orientation }}>\n <div\n ref={ref}\n className={cn(wizardVariants({ orientation }), className)}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n {/* Step Rail */}\n <nav\n aria-label=\"Progress\"\n className={wizardRailVariants({ orientation })}\n >\n {stepStates.map((state, i) => {\n const isLast = i === stepStates.length - 1\n return (\n <React.Fragment key={state.step.id}>\n <div\n className={wizardStepItemVariants({\n orientation,\n status: state.status,\n })}\n >\n <span\n aria-current={state.status === 'current' ? 'step' : undefined}\n className={wizardStepIndicatorVariants({ status: state.status })}\n >\n {state.status === 'complete' ? (\n <CheckIcon />\n ) : (\n <span>{state.index + 1}</span>\n )}\n </span>\n <div className=\"flex flex-col\">\n <span\n className={wizardStepLabelVariants({ status: state.status })}\n >\n {state.step.label}\n </span>\n {state.step.optional && (\n <span className={wizardStepOptionalClass}>(Optional)</span>\n )}\n </div>\n </div>\n {!isLast && (\n <div\n aria-hidden=\"true\"\n className={wizardConnectorVariants({\n orientation,\n complete: state.status === 'complete' ? 'true' : 'false',\n })}\n />\n )}\n </React.Fragment>\n )\n })}\n </nav>\n\n {/* Content + Footer */}\n <div className={wizardContentClass}>\n <div className=\"flex-1\">\n {typeof children === 'function' ? children(currentIndex) : children}\n </div>\n\n <div className={wizardFooterClass}>\n <button\n type=\"button\"\n disabled={currentIndex === 0}\n className={wizardSecondaryButtonVariants()}\n onClick={back}\n >\n {backLabel}\n </button>\n\n {isOptional && (\n <button\n type=\"button\"\n className={wizardSecondaryButtonVariants()}\n onClick={skip}\n >\n {skipLabel}\n </button>\n )}\n\n <button\n type=\"button\"\n className={wizardPrimaryButtonVariants()}\n onClick={advance}\n >\n {isLastStep ? completeLabel : nextLabel}\n </button>\n </div>\n </div>\n </div>\n </WizardContext.Provider>\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// useWizard hook (for children that need context access)\n// ---------------------------------------------------------------------------\n\n/**\n * Access wizard state from within a child component rendered inside `<Wizard>`.\n */\nexport function useWizard(): WizardContextValue {\n return useWizardContext()\n}\n\n// ---------------------------------------------------------------------------\n// Internal icons (no external dep — SVG inline)\n// ---------------------------------------------------------------------------\n\nfunction CheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"size-4\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Wizard"]
7
+ }
package/dist/theme.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { devWarn } from './chunk-4A4BW3GR.js';
2
+ import { devWarn } from './chunk-Y2FNNAIL.js';
3
3
  import * as React2 from 'react';
4
4
 
5
5
  // ../theme/dist/index.js
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@refraction-ui/react",
3
- "version": "0.19.1",
3
+ "version": "0.19.2",
4
4
  "description": "All Refraction UI React components in one package — headless, accessible, zero-dependency",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -28,7 +28,7 @@
28
28
  "dist"
29
29
  ],
30
30
  "scripts": {
31
- "build": "tsup && cp src/styles.css dist/styles.css && node ./scripts/embed-internal-types.mjs && node ./scripts/ensure-use-client.mjs",
31
+ "build": "tsup && node ./scripts/build-esm-split.mjs && cp src/styles.css dist/styles.css && node ./scripts/embed-internal-types.mjs && node ./scripts/ensure-use-client.mjs",
32
32
  "dev": "tsup --watch",
33
33
  "test": "vitest run --passWithNoTests",
34
34
  "test:watch": "vitest",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../shared/src/aria.ts","../../shared/src/keyboard.ts","../../shared/src/state-machine.ts","../../shared/src/cn.ts","../../shared/src/cva.ts","../../shared/src/motion.ts","../../shared/src/dev-feedback.ts"],"names":[],"mappings":"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","file":"chunk-4A4BW3GR.js","sourcesContent":["/** Merge multiple ARIA prop objects, later values override earlier ones */\nexport function mergeAriaProps(\n ...propSets: Array<Record<string, unknown>>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const props of propSets) {\n for (const [key, value] of Object.entries(props)) {\n if (value !== undefined) {\n result[key] = value\n }\n }\n }\n return result\n}\n\nlet idCounter = 0\n\n/**\n * Generate a unique ID, safe for SSR (deterministic within a render pass).\n * In browsers, uses crypto.randomUUID when available.\n */\nexport function generateId(prefix = 'rfr'): string {\n idCounter++\n return `${prefix}-${idCounter}`\n}\n\n/** Reset the ID counter (useful for tests) */\nexport function resetIdCounter(): void {\n idCounter = 0\n}\n","/** Standard keyboard key constants */\nexport const Keys = {\n Enter: 'Enter',\n Space: ' ',\n Escape: 'Escape',\n Tab: 'Tab',\n ArrowUp: 'ArrowUp',\n ArrowDown: 'ArrowDown',\n ArrowLeft: 'ArrowLeft',\n ArrowRight: 'ArrowRight',\n Home: 'Home',\n End: 'End',\n PageUp: 'PageUp',\n PageDown: 'PageDown',\n Backspace: 'Backspace',\n Delete: 'Delete',\n} as const\n\nexport type KeyboardKey = (typeof Keys)[keyof typeof Keys]\n\n/** Map of key → handler function */\nexport type KeyboardHandlerMap = Partial<\n Record<string, (event: KeyboardEvent) => void>\n>\n\n/** Create a keyboard event handler from a handler map */\nexport function createKeyboardHandler(\n handlers: KeyboardHandlerMap,\n): (event: KeyboardEvent) => void {\n return (event: KeyboardEvent) => {\n const handler = handlers[event.key]\n if (handler) {\n handler(event)\n }\n }\n}\n","/**\n * Minimal state machine — zero dependencies, < 1KB.\n * Inspired by XState concepts but dramatically simpler.\n */\n\nexport interface MachineConfig<TState extends string, TEvent extends string> {\n initial: TState\n states: Record<TState, {\n on?: Partial<Record<TEvent, TState>>\n }>\n}\n\nexport interface Machine<TState extends string, TEvent extends string> {\n /** Current state */\n state: TState\n /** Send an event to transition */\n send(event: TEvent): void\n /** Subscribe to state changes. Returns unsubscribe function. */\n subscribe(fn: (state: TState) => void): () => void\n /** Check if machine is in a given state */\n matches(state: TState): boolean\n}\n\nexport function createMachine<TState extends string, TEvent extends string>(\n config: MachineConfig<TState, TEvent>,\n): Machine<TState, TEvent> {\n let current = config.initial\n const listeners = new Set<(state: TState) => void>()\n\n return {\n get state() {\n return current\n },\n\n send(event: TEvent) {\n const stateConfig = config.states[current]\n const next = stateConfig?.on?.[event]\n if (next && next !== current) {\n current = next\n for (const fn of listeners) {\n fn(current)\n }\n }\n },\n\n subscribe(fn: (state: TState) => void) {\n listeners.add(fn)\n return () => {\n listeners.delete(fn)\n }\n },\n\n matches(state: TState) {\n return current === state\n },\n }\n}\n","/**\n * Lightweight class name utility — our own implementation.\n * Handles conditional classes, arrays, and falsy values.\n * No external dependencies (no clsx, no tailwind-merge).\n *\n * For Tailwind class conflict resolution (e.g., 'p-2 p-4' → 'p-4'),\n * consumers can use @refraction-ui/tailwind-config which provides\n * a tw-merge-aware variant of this function.\n */\n\ntype ClassValue = string | number | boolean | undefined | null | ClassValue[]\ntype ClassRecord = Record<string, boolean | undefined | null>\n\nexport function cn(...inputs: Array<ClassValue | ClassRecord>): string {\n const classes: string[] = []\n\n for (const input of inputs) {\n if (!input) continue\n\n if (typeof input === 'string') {\n classes.push(input)\n } else if (typeof input === 'number') {\n classes.push(String(input))\n } else if (Array.isArray(input)) {\n const nested = cn(...input)\n if (nested) classes.push(nested)\n } else if (typeof input === 'object') {\n for (const [key, value] of Object.entries(input)) {\n if (value) classes.push(key)\n }\n }\n }\n\n return classes.join(' ')\n}\n","/**\n * Lightweight class-variance-authority alternative — zero dependencies.\n * Creates variant-driven class name functions for components.\n */\n\ninterface VariantConfig {\n [variant: string]: Record<string, string>\n}\n\ninterface CVAConfig<V extends VariantConfig> {\n base?: string\n variants?: V\n defaultVariants?: {\n [K in keyof V]?: keyof V[K]\n }\n compoundVariants?: Array<\n {\n [K in keyof V]?: keyof V[K]\n } & { class: string }\n >\n}\n\ntype VariantProps<V extends VariantConfig> = {\n [K in keyof V]?: keyof V[K]\n}\n\nexport function cva<V extends VariantConfig>(config: CVAConfig<V>) {\n return (props?: VariantProps<V> & { className?: string }): string => {\n const classes: string[] = []\n\n if (config.base) {\n classes.push(config.base)\n }\n\n if (config.variants) {\n for (const [variantKey, variantOptions] of Object.entries(config.variants)) {\n const selectedValue =\n (props as Record<string, unknown> | undefined)?.[variantKey] ??\n config.defaultVariants?.[variantKey]\n\n if (selectedValue != null) {\n const variantClass = (variantOptions as Record<string, string>)[\n selectedValue as string\n ]\n if (variantClass) {\n classes.push(variantClass)\n }\n }\n }\n }\n\n if (config.compoundVariants) {\n for (const compound of config.compoundVariants) {\n const { class: compoundClass, ...conditions } = compound\n let matches = true\n\n for (const [key, value] of Object.entries(conditions)) {\n const propValue =\n (props as Record<string, unknown>)?.[key] ??\n config.defaultVariants?.[key]\n if (propValue !== value) {\n matches = false\n break\n }\n }\n\n if (matches) {\n classes.push(compoundClass as string)\n }\n }\n }\n\n if (props?.className) {\n classes.push(props.className)\n }\n\n return classes.filter(Boolean).join(' ')\n }\n}\n","/**\n * Reduced motion utilities.\n * Respects user preferences for reduced motion.\n */\n\n/** Check if user prefers reduced motion */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/** Get animation duration — returns '0ms' if reduced motion preferred */\nexport function getAnimationDuration(normalDuration: string): string {\n return prefersReducedMotion() ? '0ms' : normalDuration\n}\n","/**\n * dev-feedback — zero-dependency `devWarn` / `devError` primitives.\n *\n * Design constraints (epic #247, issue #248):\n * - Guarded by `process.env.NODE_ENV !== 'production'` so production bundlers\n * dead-code-strip every call (the guard is a static string compare that\n * minifiers fold to `false` in prod builds).\n * - Warn-once dedupe per `code` — a footgun is reported once, not on every\n * render.\n * - NO import of `@refraction-ui/logger` (no hard dependency on the telemetry\n * lib). Forwarding to a telemetry sink happens ONLY if the consumer\n * explicitly injects one (dependency inversion, never an import).\n */\n\n/**\n * Minimal structural shape of the record a telemetry sink consumes. This is a\n * deliberate structural mirror of `@refraction-ui/logger`'s `LogRecord` — it is\n * NOT imported, so `@refraction-ui/shared` keeps zero dependency on the\n * telemetry lib. A consumer that wires the real logger sink satisfies this\n * shape structurally.\n */\nexport interface DevFeedbackRecord {\n level: 'warn' | 'error'\n message: string\n timestamp: number\n /** Structured detail — the library-origin envelope lives here. */\n context: Record<string, unknown>\n}\n\n/**\n * The narrow contract a consumer-injected telemetry sink must satisfy. Kept\n * intentionally minimal and structural so the real `TelemetrySink` from\n * `@refraction-ui/logger` is assignable WITHOUT shared importing the logger.\n */\nexport interface DevFeedbackSink {\n /** Receive a single dev-feedback record. Must never throw to the caller. */\n log(record: DevFeedbackRecord): void\n}\n\n/**\n * Minimal ambient view of `process.env` so we can read `NODE_ENV` WITHOUT\n * pulling `@types/node` into this zero-dependency package. Accessed defensively\n * (the `typeof process === 'undefined'` guard) so this is safe in browsers too.\n */\ndeclare const process:\n | { env?: { NODE_ENV?: string } }\n | undefined\n\n/** Per-code dedupe set — module-scoped so it survives across calls. */\nconst seen = new Set<string>()\n\n/**\n * Optional, consumer-injected sink. `null` until a consumer explicitly wires\n * one via {@link setDevFeedbackSink}. Nothing phones home implicitly.\n */\nlet injectedSink: DevFeedbackSink | null = null\n\n/**\n * Wire an optional telemetry sink that {@link devWarn} / {@link devError}\n * forward to (in addition to the console). Inversion of control: the consumer\n * owns the sink; this package never imports it. Pass `null` to unwire.\n *\n * Forwarding still only happens in non-production (the calls themselves are\n * stripped in prod), and still respects warn-once dedupe.\n */\nexport function setDevFeedbackSink(sink: DevFeedbackSink | null): void {\n injectedSink = sink\n}\n\n/** Test-only / consumer-only escape hatch to reset warn-once dedupe state. */\nexport function resetDevFeedback(): void {\n seen.clear()\n}\n\nfunction isDev(): boolean {\n // String compare (not a negated truthiness) so bundlers can statically fold\n // `process.env.NODE_ENV` and strip the whole branch in production builds.\n return (\n typeof process === 'undefined' ||\n process.env?.NODE_ENV !== 'production'\n )\n}\n\nfunction emit(\n level: 'warn' | 'error',\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n if (!isDev()) return\n\n // Warn-once dedupe, keyed by (level, code) so an error and a warning sharing\n // a code are not collapsed into one.\n const key = `${level}:${code}`\n if (seen.has(key)) return\n seen.add(key)\n\n const text = `[refraction-ui] ${code}: ${message}`\n\n if (level === 'error') {\n console.error(text, detail ?? '')\n } else {\n console.warn(text, detail ?? '')\n }\n\n // Forward to the consumer-injected sink ONLY if one was explicitly wired.\n if (injectedSink) {\n const record: DevFeedbackRecord = {\n level,\n message: `${code}: ${message}`,\n timestamp: Date.now(),\n context: { code, ...(detail ?? {}) },\n }\n try {\n injectedSink.log(record)\n } catch {\n // A broken sink must never break the consumer app.\n }\n }\n}\n\n/**\n * Emit a development-only warning for a refraction-ui footgun.\n *\n * @param code Stable, greppable identifier (e.g. `'react/no-controlled-prop'`).\n * @param message Human-readable explanation.\n * @param detail Optional structured detail (forwarded to an injected sink).\n *\n * Stripped entirely in production. Warned at most once per `code`.\n */\nexport function devWarn(\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n emit('warn', code, message, detail)\n}\n\n/**\n * Emit a development-only error for a refraction-ui misuse / invariant break.\n *\n * @param code Stable, greppable identifier.\n * @param message Human-readable explanation.\n * @param detail Optional structured detail (forwarded to an injected sink).\n *\n * Stripped entirely in production. Reported at most once per `code`.\n */\nexport function devError(\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n emit('error', code, message, detail)\n}\n"]}