@refraction-ui/react 0.4.2 → 0.6.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 (304) hide show
  1. package/README.md +9 -1
  2. package/dist/chunk-O4453CBF.js +137 -0
  3. package/dist/chunk-O4453CBF.js.map +1 -0
  4. package/dist/chunk-XWP763SH.js +76 -0
  5. package/dist/chunk-XWP763SH.js.map +1 -0
  6. package/dist/faro-engine-47HGRAQH-JKINJPMH.js +3 -0
  7. package/dist/faro-engine-47HGRAQH-JKINJPMH.js.map +1 -0
  8. package/dist/form.cjs +340 -0
  9. package/dist/form.cjs.map +1 -0
  10. package/dist/form.d.cts +1 -0
  11. package/dist/form.d.ts +1 -0
  12. package/dist/form.js +204 -0
  13. package/dist/form.js.map +1 -0
  14. package/dist/index.cjs +1438 -237
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +76 -76
  17. package/dist/index.d.ts +76 -76
  18. package/dist/index.js +1317 -312
  19. package/dist/index.js.map +1 -1
  20. package/dist/internal/analytics/index.d.cts +448 -0
  21. package/dist/internal/analytics/index.d.ts +448 -0
  22. package/dist/internal/animated-text/index.d.cts +47 -0
  23. package/dist/internal/animated-text/index.d.ts +47 -0
  24. package/dist/internal/app-shell/index.d.cts +128 -0
  25. package/dist/internal/app-shell/index.d.ts +128 -0
  26. package/dist/internal/auth/index.d.cts +74 -0
  27. package/dist/internal/auth/index.d.ts +74 -0
  28. package/dist/internal/avatar/index.d.cts +53 -0
  29. package/dist/internal/avatar/index.d.ts +53 -0
  30. package/dist/internal/avatar-group/index.d.cts +70 -0
  31. package/dist/internal/avatar-group/index.d.ts +70 -0
  32. package/dist/internal/badge/index.d.cts +26 -0
  33. package/dist/internal/badge/index.d.ts +26 -0
  34. package/dist/internal/bottom-nav/index.d.cts +29 -0
  35. package/dist/internal/bottom-nav/index.d.ts +29 -0
  36. package/dist/internal/breadcrumbs/index.d.cts +38 -0
  37. package/dist/internal/breadcrumbs/index.d.ts +38 -0
  38. package/dist/internal/button/index.d.cts +34 -0
  39. package/dist/internal/button/index.d.ts +34 -0
  40. package/dist/internal/calendar/index.d.cts +73 -0
  41. package/dist/internal/calendar/index.d.ts +73 -0
  42. package/dist/internal/card/index.d.cts +62 -0
  43. package/dist/internal/card/index.d.ts +62 -0
  44. package/dist/internal/card-grid/index.d.cts +10 -0
  45. package/dist/internal/card-grid/index.d.ts +10 -0
  46. package/dist/internal/checkbox/index.d.cts +40 -0
  47. package/dist/internal/checkbox/index.d.ts +40 -0
  48. package/dist/internal/code-editor/index.d.cts +47 -0
  49. package/dist/internal/code-editor/index.d.ts +47 -0
  50. package/dist/internal/collapsible/index.d.cts +43 -0
  51. package/dist/internal/collapsible/index.d.ts +43 -0
  52. package/dist/internal/command/index.d.cts +80 -0
  53. package/dist/internal/command/index.d.ts +80 -0
  54. package/dist/internal/content-protection/index.d.cts +47 -0
  55. package/dist/internal/content-protection/index.d.ts +47 -0
  56. package/dist/internal/data-table/index.d.cts +73 -0
  57. package/dist/internal/data-table/index.d.ts +73 -0
  58. package/dist/internal/date-picker/index.d.cts +98 -0
  59. package/dist/internal/date-picker/index.d.ts +98 -0
  60. package/dist/internal/device-frame/index.d.cts +40 -0
  61. package/dist/internal/device-frame/index.d.ts +40 -0
  62. package/dist/internal/dialog/index.d.cts +54 -0
  63. package/dist/internal/dialog/index.d.ts +54 -0
  64. package/dist/internal/dropdown-menu/index.d.cts +55 -0
  65. package/dist/internal/dropdown-menu/index.d.ts +55 -0
  66. package/dist/internal/emoji-picker/index.d.cts +77 -0
  67. package/dist/internal/emoji-picker/index.d.ts +77 -0
  68. package/dist/internal/feedback-dialog/index.d.cts +55 -0
  69. package/dist/internal/feedback-dialog/index.d.ts +55 -0
  70. package/dist/internal/file-upload/index.d.cts +91 -0
  71. package/dist/internal/file-upload/index.d.ts +91 -0
  72. package/dist/internal/footer/index.d.cts +30 -0
  73. package/dist/internal/footer/index.d.ts +30 -0
  74. package/dist/internal/inline-editor/index.d.cts +52 -0
  75. package/dist/internal/inline-editor/index.d.ts +52 -0
  76. package/dist/internal/input/index.d.cts +38 -0
  77. package/dist/internal/input/index.d.ts +38 -0
  78. package/dist/internal/input-group/index.d.cts +35 -0
  79. package/dist/internal/input-group/index.d.ts +35 -0
  80. package/dist/internal/install-prompt/index.d.cts +36 -0
  81. package/dist/internal/install-prompt/index.d.ts +36 -0
  82. package/dist/internal/keyboard-shortcut/index.d.cts +49 -0
  83. package/dist/internal/keyboard-shortcut/index.d.ts +49 -0
  84. package/dist/internal/language-selector/index.d.cts +63 -0
  85. package/dist/internal/language-selector/index.d.ts +63 -0
  86. package/dist/internal/logger/index.d.cts +229 -0
  87. package/dist/internal/logger/index.d.ts +229 -0
  88. package/dist/internal/markdown-renderer/index.d.cts +40 -0
  89. package/dist/internal/markdown-renderer/index.d.ts +40 -0
  90. package/dist/internal/mobile-nav/index.d.cts +45 -0
  91. package/dist/internal/mobile-nav/index.d.ts +45 -0
  92. package/dist/internal/navbar/index.d.cts +30 -0
  93. package/dist/internal/navbar/index.d.ts +30 -0
  94. package/dist/internal/otp-input/index.d.cts +66 -0
  95. package/dist/internal/otp-input/index.d.ts +66 -0
  96. package/dist/internal/payment/index.d.cts +9 -0
  97. package/dist/internal/payment/index.d.ts +9 -0
  98. package/dist/internal/popover/index.d.cts +46 -0
  99. package/dist/internal/popover/index.d.ts +46 -0
  100. package/dist/internal/presence-indicator/index.d.cts +38 -0
  101. package/dist/internal/presence-indicator/index.d.ts +38 -0
  102. package/dist/internal/progress-display/index.d.cts +60 -0
  103. package/dist/internal/progress-display/index.d.ts +60 -0
  104. package/dist/internal/radio/index.d.ts +43 -0
  105. package/dist/internal/react-accordion/index.d.ts +22 -0
  106. package/dist/internal/react-analytics/index.d.cts +44 -0
  107. package/dist/internal/react-analytics/index.d.ts +44 -0
  108. package/dist/internal/react-animated-text/index.d.cts +12 -0
  109. package/dist/internal/react-animated-text/index.d.ts +12 -0
  110. package/dist/internal/react-app-shell/index.d.cts +169 -0
  111. package/dist/internal/react-app-shell/index.d.ts +169 -0
  112. package/dist/internal/react-auth/index.d.cts +59 -0
  113. package/dist/internal/react-auth/index.d.ts +59 -0
  114. package/dist/internal/react-avatar/index.d.cts +20 -0
  115. package/dist/internal/react-avatar/index.d.ts +20 -0
  116. package/dist/internal/react-avatar-group/index.d.cts +33 -0
  117. package/dist/internal/react-avatar-group/index.d.ts +33 -0
  118. package/dist/internal/react-badge/index.d.cts +17 -0
  119. package/dist/internal/react-badge/index.d.ts +17 -0
  120. package/dist/internal/react-bottom-nav/index.d.cts +19 -0
  121. package/dist/internal/react-bottom-nav/index.d.ts +19 -0
  122. package/dist/internal/react-breadcrumbs/index.d.cts +24 -0
  123. package/dist/internal/react-breadcrumbs/index.d.ts +24 -0
  124. package/dist/internal/react-button/index.d.cts +21 -0
  125. package/dist/internal/react-button/index.d.ts +21 -0
  126. package/dist/internal/react-calendar/index.d.cts +44 -0
  127. package/dist/internal/react-calendar/index.d.ts +44 -0
  128. package/dist/internal/react-callout/index.d.cts +12 -0
  129. package/dist/internal/react-callout/index.d.ts +12 -0
  130. package/dist/internal/react-card/index.d.cts +29 -0
  131. package/dist/internal/react-card/index.d.ts +29 -0
  132. package/dist/internal/react-card-grid/index.d.cts +8 -0
  133. package/dist/internal/react-card-grid/index.d.ts +8 -0
  134. package/dist/internal/react-carousel/index.d.ts +22 -0
  135. package/dist/internal/react-checkbox/index.d.cts +18 -0
  136. package/dist/internal/react-checkbox/index.d.ts +18 -0
  137. package/dist/internal/react-code-block/index.d.cts +7 -0
  138. package/dist/internal/react-code-block/index.d.ts +7 -0
  139. package/dist/internal/react-code-editor/index.d.cts +28 -0
  140. package/dist/internal/react-code-editor/index.d.ts +28 -0
  141. package/dist/internal/react-collapsible/index.d.cts +29 -0
  142. package/dist/internal/react-collapsible/index.d.ts +29 -0
  143. package/dist/internal/react-combobox/index.d.cts +94 -0
  144. package/dist/internal/react-combobox/index.d.ts +94 -0
  145. package/dist/internal/react-command/index.d.cts +51 -0
  146. package/dist/internal/react-command/index.d.ts +51 -0
  147. package/dist/internal/react-content-protection/index.d.cts +22 -0
  148. package/dist/internal/react-content-protection/index.d.ts +22 -0
  149. package/dist/internal/react-data-table/index.d.cts +22 -0
  150. package/dist/internal/react-data-table/index.d.ts +22 -0
  151. package/dist/internal/react-date-picker/index.d.cts +23 -0
  152. package/dist/internal/react-date-picker/index.d.ts +23 -0
  153. package/dist/internal/react-device-frame/index.d.cts +37 -0
  154. package/dist/internal/react-device-frame/index.d.ts +37 -0
  155. package/dist/internal/react-dialog/index.d.cts +49 -0
  156. package/dist/internal/react-dialog/index.d.ts +49 -0
  157. package/dist/internal/react-dropdown-menu/index.d.cts +37 -0
  158. package/dist/internal/react-dropdown-menu/index.d.ts +37 -0
  159. package/dist/internal/react-emoji-picker/index.d.cts +32 -0
  160. package/dist/internal/react-emoji-picker/index.d.ts +32 -0
  161. package/dist/internal/react-feedback-dialog/index.d.cts +40 -0
  162. package/dist/internal/react-feedback-dialog/index.d.ts +40 -0
  163. package/dist/internal/react-file-tree/index.d.cts +5 -0
  164. package/dist/internal/react-file-tree/index.d.ts +5 -0
  165. package/dist/internal/react-file-upload/index.d.cts +22 -0
  166. package/dist/internal/react-file-upload/index.d.ts +22 -0
  167. package/dist/internal/react-footer/index.d.cts +20 -0
  168. package/dist/internal/react-footer/index.d.ts +20 -0
  169. package/dist/internal/react-form/index.d.cts +85 -0
  170. package/dist/internal/react-form/index.d.ts +85 -0
  171. package/dist/internal/react-icon-system/index.d.cts +5 -0
  172. package/dist/internal/react-icon-system/index.d.ts +5 -0
  173. package/dist/internal/react-inline-editor/index.d.cts +17 -0
  174. package/dist/internal/react-inline-editor/index.d.ts +17 -0
  175. package/dist/internal/react-input/index.d.cts +31 -0
  176. package/dist/internal/react-input/index.d.ts +31 -0
  177. package/dist/internal/react-input-group/index.d.cts +34 -0
  178. package/dist/internal/react-input-group/index.d.ts +34 -0
  179. package/dist/internal/react-install-prompt/index.d.cts +24 -0
  180. package/dist/internal/react-install-prompt/index.d.ts +24 -0
  181. package/dist/internal/react-keyboard-shortcut/index.d.cts +57 -0
  182. package/dist/internal/react-keyboard-shortcut/index.d.ts +57 -0
  183. package/dist/internal/react-language-selector/index.d.cts +26 -0
  184. package/dist/internal/react-language-selector/index.d.ts +26 -0
  185. package/dist/internal/react-link-card/index.d.cts +5 -0
  186. package/dist/internal/react-link-card/index.d.ts +5 -0
  187. package/dist/internal/react-logger/index.d.cts +107 -0
  188. package/dist/internal/react-logger/index.d.ts +107 -0
  189. package/dist/internal/react-markdown-renderer/index.d.cts +20 -0
  190. package/dist/internal/react-markdown-renderer/index.d.ts +20 -0
  191. package/dist/internal/react-mobile-nav/index.d.cts +33 -0
  192. package/dist/internal/react-mobile-nav/index.d.ts +33 -0
  193. package/dist/internal/react-navbar/index.d.cts +25 -0
  194. package/dist/internal/react-navbar/index.d.ts +25 -0
  195. package/dist/internal/react-otp-input/index.d.cts +21 -0
  196. package/dist/internal/react-otp-input/index.d.ts +21 -0
  197. package/dist/internal/react-pagination/index.d.ts +7 -0
  198. package/dist/internal/react-payment/index.d.cts +9 -0
  199. package/dist/internal/react-payment/index.d.ts +9 -0
  200. package/dist/internal/react-popover/index.d.cts +33 -0
  201. package/dist/internal/react-popover/index.d.ts +33 -0
  202. package/dist/internal/react-presence-indicator/index.d.cts +34 -0
  203. package/dist/internal/react-presence-indicator/index.d.ts +34 -0
  204. package/dist/internal/react-progress-display/index.d.cts +21 -0
  205. package/dist/internal/react-progress-display/index.d.ts +21 -0
  206. package/dist/internal/react-radio/index.d.ts +33 -0
  207. package/dist/internal/react-reaction-bar/index.d.cts +34 -0
  208. package/dist/internal/react-reaction-bar/index.d.ts +34 -0
  209. package/dist/internal/react-resizable-layout/index.d.cts +36 -0
  210. package/dist/internal/react-resizable-layout/index.d.ts +36 -0
  211. package/dist/internal/react-rich-editor/index.d.cts +2 -0
  212. package/dist/internal/react-rich-editor/index.d.ts +2 -0
  213. package/dist/internal/react-search-bar/index.d.cts +32 -0
  214. package/dist/internal/react-search-bar/index.d.ts +32 -0
  215. package/dist/internal/react-select/index.d.cts +30 -0
  216. package/dist/internal/react-select/index.d.ts +30 -0
  217. package/dist/internal/react-sheet/index.d.cts +67 -0
  218. package/dist/internal/react-sheet/index.d.ts +67 -0
  219. package/dist/internal/react-sidebar/index.d.cts +23 -0
  220. package/dist/internal/react-sidebar/index.d.ts +23 -0
  221. package/dist/internal/react-skeleton/index.d.cts +31 -0
  222. package/dist/internal/react-skeleton/index.d.ts +31 -0
  223. package/dist/internal/react-skip-to-content/index.d.cts +9 -0
  224. package/dist/internal/react-skip-to-content/index.d.ts +9 -0
  225. package/dist/internal/react-slide-viewer/index.d.cts +23 -0
  226. package/dist/internal/react-slide-viewer/index.d.ts +23 -0
  227. package/dist/internal/react-slider/index.d.cts +1 -0
  228. package/dist/internal/react-slider/index.d.ts +1 -0
  229. package/dist/internal/react-status-indicator/index.d.cts +34 -0
  230. package/dist/internal/react-status-indicator/index.d.ts +34 -0
  231. package/dist/internal/react-steps/index.d.cts +19 -0
  232. package/dist/internal/react-steps/index.d.ts +19 -0
  233. package/dist/internal/react-switch/index.d.cts +17 -0
  234. package/dist/internal/react-switch/index.d.ts +17 -0
  235. package/dist/internal/react-table-of-contents/index.d.ts +10 -0
  236. package/dist/internal/react-tabs/index.d.cts +31 -0
  237. package/dist/internal/react-tabs/index.d.ts +31 -0
  238. package/dist/internal/react-textarea/index.d.cts +16 -0
  239. package/dist/internal/react-textarea/index.d.ts +16 -0
  240. package/dist/internal/react-theme/index.d.cts +44 -0
  241. package/dist/internal/react-theme/index.d.ts +44 -0
  242. package/dist/internal/react-thread-view/index.d.cts +34 -0
  243. package/dist/internal/react-thread-view/index.d.ts +34 -0
  244. package/dist/internal/react-toast/index.d.cts +36 -0
  245. package/dist/internal/react-toast/index.d.ts +36 -0
  246. package/dist/internal/react-tooltip/index.d.cts +33 -0
  247. package/dist/internal/react-tooltip/index.d.ts +33 -0
  248. package/dist/internal/react-version-selector/index.d.cts +24 -0
  249. package/dist/internal/react-version-selector/index.d.ts +24 -0
  250. package/dist/internal/react-video-player/index.d.cts +9 -0
  251. package/dist/internal/react-video-player/index.d.ts +9 -0
  252. package/dist/internal/react-voice-pill/index.d.cts +10 -0
  253. package/dist/internal/react-voice-pill/index.d.ts +10 -0
  254. package/dist/internal/react-waveform/index.d.cts +9 -0
  255. package/dist/internal/react-waveform/index.d.ts +9 -0
  256. package/dist/internal/reaction-bar/index.d.cts +50 -0
  257. package/dist/internal/reaction-bar/index.d.ts +50 -0
  258. package/dist/internal/resizable-layout/index.d.cts +47 -0
  259. package/dist/internal/resizable-layout/index.d.ts +47 -0
  260. package/dist/internal/search-bar/index.d.cts +51 -0
  261. package/dist/internal/search-bar/index.d.ts +51 -0
  262. package/dist/internal/select/index.d.cts +69 -0
  263. package/dist/internal/select/index.d.ts +69 -0
  264. package/dist/internal/shared/index.d.cts +419 -0
  265. package/dist/internal/shared/index.d.ts +419 -0
  266. package/dist/internal/sidebar/index.d.cts +40 -0
  267. package/dist/internal/sidebar/index.d.ts +40 -0
  268. package/dist/internal/skeleton/index.d.cts +27 -0
  269. package/dist/internal/skeleton/index.d.ts +27 -0
  270. package/dist/internal/slide-viewer/index.d.cts +72 -0
  271. package/dist/internal/slide-viewer/index.d.ts +72 -0
  272. package/dist/internal/slider/index.d.cts +4 -0
  273. package/dist/internal/slider/index.d.ts +4 -0
  274. package/dist/internal/status-indicator/index.d.cts +42 -0
  275. package/dist/internal/status-indicator/index.d.ts +42 -0
  276. package/dist/internal/switch/index.d.cts +41 -0
  277. package/dist/internal/switch/index.d.ts +41 -0
  278. package/dist/internal/tabs/index.d.cts +45 -0
  279. package/dist/internal/tabs/index.d.ts +45 -0
  280. package/dist/internal/textarea/index.d.cts +28 -0
  281. package/dist/internal/textarea/index.d.ts +28 -0
  282. package/dist/internal/theme/index.d.cts +60 -0
  283. package/dist/internal/theme/index.d.ts +60 -0
  284. package/dist/internal/thread-view/index.d.cts +95 -0
  285. package/dist/internal/thread-view/index.d.ts +95 -0
  286. package/dist/internal/toast/index.d.cts +64 -0
  287. package/dist/internal/toast/index.d.ts +64 -0
  288. package/dist/internal/tooltip/index.d.cts +45 -0
  289. package/dist/internal/tooltip/index.d.ts +45 -0
  290. package/dist/internal/version-selector/index.d.cts +68 -0
  291. package/dist/internal/version-selector/index.d.ts +68 -0
  292. package/dist/internal/video-player/index.d.cts +50 -0
  293. package/dist/internal/video-player/index.d.ts +50 -0
  294. package/dist/internal/voice-pill/index.d.cts +86 -0
  295. package/dist/internal/voice-pill/index.d.ts +86 -0
  296. package/dist/internal/waveform/index.d.cts +83 -0
  297. package/dist/internal/waveform/index.d.ts +83 -0
  298. package/dist/theme.cjs +23 -0
  299. package/dist/theme.cjs.map +1 -1
  300. package/dist/theme.d.cts +1 -1
  301. package/dist/theme.d.ts +1 -1
  302. package/dist/theme.js +5 -2
  303. package/dist/theme.js.map +1 -1
  304. package/package.json +10 -7
package/README.md CHANGED
@@ -7,7 +7,15 @@ npm install @refraction-ui/react
7
7
  ```
8
8
 
9
9
  ```tsx
10
- import { Button, Card, Dialog, ThemeProvider } from '@refraction-ui/react'
10
+ import { Button, Card, Dialog } from '@refraction-ui/react'
11
+ import { ThemeProvider } from '@refraction-ui/react/theme'
12
+ ```
13
+
14
+ React Hook Form-backed primitives are opt-in so the root package does not force
15
+ every consumer to install `react-hook-form`:
16
+
17
+ ```tsx
18
+ import { Form, FormField, useForm } from '@refraction-ui/react/form'
11
19
  ```
12
20
 
13
21
  ## Default theme stylesheet
@@ -0,0 +1,137 @@
1
+ // ../shared/dist/index.js
2
+ var idCounter = 0;
3
+ function generateId(prefix = "rfr") {
4
+ idCounter++;
5
+ return `${prefix}-${idCounter}`;
6
+ }
7
+ var Keys = {
8
+ Enter: "Enter",
9
+ Space: " ",
10
+ Escape: "Escape",
11
+ Tab: "Tab",
12
+ ArrowUp: "ArrowUp",
13
+ ArrowDown: "ArrowDown",
14
+ ArrowLeft: "ArrowLeft",
15
+ ArrowRight: "ArrowRight",
16
+ Home: "Home",
17
+ End: "End",
18
+ PageUp: "PageUp",
19
+ PageDown: "PageDown",
20
+ Backspace: "Backspace",
21
+ Delete: "Delete"
22
+ };
23
+ function createKeyboardHandler(handlers) {
24
+ return (event) => {
25
+ const handler = handlers[event.key];
26
+ if (handler) {
27
+ handler(event);
28
+ }
29
+ };
30
+ }
31
+ function createMachine(config) {
32
+ let current = config.initial;
33
+ const listeners = /* @__PURE__ */ new Set();
34
+ return {
35
+ get state() {
36
+ return current;
37
+ },
38
+ send(event) {
39
+ const stateConfig = config.states[current];
40
+ const next = stateConfig?.on?.[event];
41
+ if (next && next !== current) {
42
+ current = next;
43
+ for (const fn of listeners) {
44
+ fn(current);
45
+ }
46
+ }
47
+ },
48
+ subscribe(fn) {
49
+ listeners.add(fn);
50
+ return () => {
51
+ listeners.delete(fn);
52
+ };
53
+ },
54
+ matches(state) {
55
+ return current === state;
56
+ }
57
+ };
58
+ }
59
+ function cn(...inputs) {
60
+ const classes = [];
61
+ for (const input of inputs) {
62
+ if (!input) continue;
63
+ if (typeof input === "string") {
64
+ classes.push(input);
65
+ } else if (typeof input === "number") {
66
+ classes.push(String(input));
67
+ } else if (Array.isArray(input)) {
68
+ const nested = cn(...input);
69
+ if (nested) classes.push(nested);
70
+ } else if (typeof input === "object") {
71
+ for (const [key, value] of Object.entries(input)) {
72
+ if (value) classes.push(key);
73
+ }
74
+ }
75
+ }
76
+ return classes.join(" ");
77
+ }
78
+ function cva(config) {
79
+ return (props) => {
80
+ const classes = [];
81
+ if (config.base) {
82
+ classes.push(config.base);
83
+ }
84
+ if (config.variants) {
85
+ for (const [variantKey, variantOptions] of Object.entries(config.variants)) {
86
+ const selectedValue = props?.[variantKey] ?? config.defaultVariants?.[variantKey];
87
+ if (selectedValue != null) {
88
+ const variantClass = variantOptions[selectedValue];
89
+ if (variantClass) {
90
+ classes.push(variantClass);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ if (config.compoundVariants) {
96
+ for (const compound of config.compoundVariants) {
97
+ const { class: compoundClass, ...conditions } = compound;
98
+ let matches = true;
99
+ for (const [key, value] of Object.entries(conditions)) {
100
+ const propValue = props?.[key] ?? config.defaultVariants?.[key];
101
+ if (propValue !== value) {
102
+ matches = false;
103
+ break;
104
+ }
105
+ }
106
+ if (matches) {
107
+ classes.push(compoundClass);
108
+ }
109
+ }
110
+ }
111
+ if (props?.className) {
112
+ classes.push(props.className);
113
+ }
114
+ return classes.filter(Boolean).join(" ");
115
+ };
116
+ }
117
+ var seen = /* @__PURE__ */ new Set();
118
+ function isDev() {
119
+ return typeof process === "undefined" || process.env?.NODE_ENV !== "production";
120
+ }
121
+ function emit(level, code, message, detail) {
122
+ if (!isDev()) return;
123
+ const key = `${level}:${code}`;
124
+ if (seen.has(key)) return;
125
+ seen.add(key);
126
+ const text = `[refraction-ui] ${code}: ${message}`;
127
+ {
128
+ console.warn(text, detail ?? "");
129
+ }
130
+ }
131
+ function devWarn(code, message, detail) {
132
+ emit("warn", code, message, detail);
133
+ }
134
+
135
+ export { Keys, cn, createKeyboardHandler, createMachine, cva, devWarn, generateId };
136
+ //# sourceMappingURL=chunk-O4453CBF.js.map
137
+ //# sourceMappingURL=chunk-O4453CBF.js.map
@@ -0,0 +1 @@
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/dev-feedback.ts"],"names":[],"mappings":"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","file":"chunk-O4453CBF.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 * 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"]}
@@ -0,0 +1,76 @@
1
+ // ../logger/dist/chunk-57LG5ZUS.js
2
+ var FARO_LEVEL = {
3
+ debug: "debug",
4
+ info: "info",
5
+ warn: "warn",
6
+ error: "error",
7
+ fatal: "error"
8
+ };
9
+ async function createFaroSink(opts) {
10
+ const transport = opts.transport ?? await loadFaroTransport(opts);
11
+ if (!transport) return null;
12
+ return {
13
+ name: "faro",
14
+ log(record) {
15
+ transport.push({ kind: "log", record });
16
+ },
17
+ span(record) {
18
+ transport.push({ kind: "span", record });
19
+ },
20
+ async flush() {
21
+ }
22
+ };
23
+ }
24
+ async function loadFaroTransport(opts) {
25
+ try {
26
+ const sdkName = "@grafana/faro-web-sdk";
27
+ const tracingName = "@grafana/faro-web-tracing";
28
+ const sdk = await import(
29
+ /* @vite-ignore */
30
+ sdkName
31
+ );
32
+ const tracing = await import(
33
+ /* @vite-ignore */
34
+ tracingName
35
+ );
36
+ const faro = sdk.initializeFaro({
37
+ url: opts.endpoint,
38
+ app: { name: opts.app },
39
+ instrumentations: [
40
+ ...sdk.getWebInstrumentations(),
41
+ new tracing.TracingInstrumentation()
42
+ ]
43
+ });
44
+ return {
45
+ push({ kind, record }) {
46
+ if (kind === "log") {
47
+ const r = record;
48
+ faro.api.pushLog([r.message], {
49
+ level: FARO_LEVEL[r.level],
50
+ context: flatten(r.context)
51
+ });
52
+ } else {
53
+ const r = record;
54
+ faro.api.pushEvent(`span:${r.name}`, {
55
+ durationMs: String(r.durationMs),
56
+ status: r.status,
57
+ ...flatten(r.context)
58
+ });
59
+ }
60
+ }
61
+ };
62
+ } catch {
63
+ return null;
64
+ }
65
+ }
66
+ function flatten(ctx) {
67
+ const out = {};
68
+ for (const [k, v] of Object.entries(ctx)) {
69
+ out[k] = typeof v === "string" ? v : JSON.stringify(v);
70
+ }
71
+ return out;
72
+ }
73
+
74
+ export { createFaroSink };
75
+ //# sourceMappingURL=chunk-XWP763SH.js.map
76
+ //# sourceMappingURL=chunk-XWP763SH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../logger/src/faro-engine.ts"],"names":[],"mappings":";AA4BA,IAAM,UAAA,GAAuC;EAC3C,KAAA,EAAO,OAAA;EACP,IAAA,EAAM,MAAA;EACN,IAAA,EAAM,MAAA;EACN,KAAA,EAAO,OAAA;EACP,KAAA,EAAO;AACT,CAAA;AAOA,eAAsB,eACpB,IAAA,EAC+B;AAC/B,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,IAAc,MAAM,kBAAkB,IAAI,CAAA;AACjE,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,EAAA,OAAO;IACL,IAAA,EAAM,MAAA;AAEN,IAAA,GAAA,CAAI,MAAA,EAAyB;AAC3B,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AACxC,IAAA,CAAA;AAEA,IAAA,IAAA,CAAK,MAAA,EAA0B;AAC7B,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AACzC,IAAA,CAAA;AAEA,IAAA,MAAM,KAAA,GAAuB;AAG7B,IAAA;AAAA,GAAA;AAEJ;AAMA,eAAe,kBACb,IAAA,EAC+B;AAC/B,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAU,uBAAA;AAChB,IAAA,MAAM,WAAA,GAAc,2BAAA;AACpB,IAAA,MAAM,MAAO,MAAM;;AAA0B,MAAA;;AAI7C,IAAA,MAAM,UAAW,MAAM;;AAA0B,MAAA;;AAIjD,IAAA,MAAM,IAAA,GAAO,IAAI,cAAA,CAAe;AAC9B,MAAA,GAAA,EAAK,IAAA,CAAK,QAAA;MACV,GAAA,EAAK,EAAE,IAAA,EAAM,IAAA,CAAK,GAAA,EAAA;MAClB,gBAAA,EAAkB;AAChB,QAAA,GAAG,IAAI,sBAAA,EAAA;AACP,QAAA,IAAI,QAAQ,sBAAA;AAAuB;KAEtC,CAAA;AAOD,IAAA,OAAO;MACL,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAA,EAAgB;AAC3B,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,MAAM,CAAA,GAAI,MAAA;AACV,UAAA,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAO,CAAA,EAAG;YAC5B,KAAA,EAAO,UAAA,CAAW,EAAE,KAAK,CAAA;YACzB,OAAA,EAAS,OAAA,CAAQ,EAAE,OAAO;WAC3B,CAAA;QACH,CAAA,MAAO;AACL,UAAA,MAAM,CAAA,GAAI,MAAA;AACV,UAAA,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI;YACnC,UAAA,EAAY,MAAA,CAAO,EAAE,UAAU,CAAA;AAC/B,YAAA,MAAA,EAAQ,CAAA,CAAE,MAAA;YACV,GAAG,OAAA,CAAQ,EAAE,OAAO;WACrB,CAAA;AACH,QAAA;AACF,MAAA;AAAA,KAAA;EAEJ,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AACT,EAAA;AACF;AAGA,SAAS,QAAQ,GAAA,EAAsD;AACrE,EAAA,MAAM,MAA8B,EAAA;AACpC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,IAAA,GAAA,CAAI,CAAC,IAAI,OAAO,CAAA,KAAM,WAAW,CAAA,GAAI,IAAA,CAAK,UAAU,CAAC,CAAA;AACvD,EAAA;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-XWP763SH.js","sourcesContent":["import type { LogLevel, LogRecord, SpanRecord, TelemetrySink } from './types.js'\n\n/**\n * Faro-backed engine. `@grafana/faro-web-sdk` + `@grafana/faro-web-tracing`\n * are **optional peerDependencies** — they are loaded dynamically and never\n * referenced in this module's public types. If the peers are absent the\n * factory resolves to `null` so the caller can fall back to console.\n *\n * For tests, a `transport` may be injected: an object with a `push(payload)`\n * method. This bypasses Faro entirely (no network, no peer required).\n */\n\n/** Minimal structural shape of a Faro-ish transport. Not exported. */\ninterface FaroTransport {\n push(payload: { kind: 'log' | 'span'; record: LogRecord | SpanRecord }): void\n}\n\nexport interface FaroEngineOptions {\n app: string\n endpoint: string\n /**\n * Test/override transport. When provided, the Faro peers are NOT loaded\n * and records are forwarded straight to `transport.push`.\n */\n transport?: FaroTransport\n}\n\n/** Map our levels onto Faro's log-level strings. */\nconst FARO_LEVEL: Record<LogLevel, string> = {\n debug: 'debug',\n info: 'info',\n warn: 'warn',\n error: 'error',\n fatal: 'error',\n}\n\n/**\n * Construct the Faro engine. Returns `null` when the optional peers are not\n * installed and no override transport was supplied — callers treat `null` as\n * \"fall back to console\".\n */\nexport async function createFaroSink(\n opts: FaroEngineOptions,\n): Promise<TelemetrySink | null> {\n const transport = opts.transport ?? (await loadFaroTransport(opts))\n if (!transport) return null\n\n return {\n name: 'faro',\n\n log(record: LogRecord): void {\n transport.push({ kind: 'log', record })\n },\n\n span(record: SpanRecord): void {\n transport.push({ kind: 'span', record })\n },\n\n async flush(): Promise<void> {\n // Faro's own transports flush on their schedule / on beacon; the\n // manager drives page-exit beacon flushing. Nothing buffered here.\n },\n }\n}\n\n/**\n * Dynamically import the Faro peers and adapt them to {@link FaroTransport}.\n * Returns `null` if either peer is missing (optional peerDependency absent).\n */\nasync function loadFaroTransport(\n opts: FaroEngineOptions,\n): Promise<FaroTransport | null> {\n try {\n // Indirected so bundlers keep these as runtime-optional dynamic imports.\n const sdkName = '@grafana/faro-web-sdk'\n const tracingName = '@grafana/faro-web-tracing'\n const sdk = (await import(/* @vite-ignore */ sdkName)) as {\n initializeFaro: (cfg: unknown) => unknown\n getWebInstrumentations: () => unknown[]\n }\n const tracing = (await import(/* @vite-ignore */ tracingName)) as {\n TracingInstrumentation: new () => unknown\n }\n\n const faro = sdk.initializeFaro({\n url: opts.endpoint,\n app: { name: opts.app },\n instrumentations: [\n ...sdk.getWebInstrumentations(),\n new tracing.TracingInstrumentation(),\n ],\n }) as {\n api: {\n pushLog: (msgs: unknown[], opts?: unknown) => void\n pushEvent: (name: string, attrs?: Record<string, unknown>) => void\n }\n }\n\n return {\n push({ kind, record }): void {\n if (kind === 'log') {\n const r = record as LogRecord\n faro.api.pushLog([r.message], {\n level: FARO_LEVEL[r.level],\n context: flatten(r.context),\n })\n } else {\n const r = record as SpanRecord\n faro.api.pushEvent(`span:${r.name}`, {\n durationMs: String(r.durationMs),\n status: r.status,\n ...flatten(r.context),\n })\n }\n },\n }\n } catch {\n // Peer not installed (optional) or init failed — caller falls back.\n return null\n }\n}\n\n/** Faro context attributes are flat string maps; coerce ours to match. */\nfunction flatten(ctx: Record<string, unknown>): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(ctx)) {\n out[k] = typeof v === 'string' ? v : JSON.stringify(v)\n }\n return out\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export { createFaroSink } from './chunk-XWP763SH.js';
2
+ //# sourceMappingURL=faro-engine-47HGRAQH-JKINJPMH.js.map
3
+ //# sourceMappingURL=faro-engine-47HGRAQH-JKINJPMH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"faro-engine-47HGRAQH-JKINJPMH.js"}
package/dist/form.cjs ADDED
@@ -0,0 +1,340 @@
1
+ 'use strict';
2
+
3
+ var React2 = require('react');
4
+ var reactHookForm = require('react-hook-form');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
26
+
27
+ // ../react-form/dist/index.js
28
+
29
+ // ../shared/dist/index.js
30
+ function cn(...inputs) {
31
+ const classes = [];
32
+ for (const input of inputs) {
33
+ if (!input) continue;
34
+ if (typeof input === "string") {
35
+ classes.push(input);
36
+ } else if (typeof input === "number") {
37
+ classes.push(String(input));
38
+ } else if (Array.isArray(input)) {
39
+ const nested = cn(...input);
40
+ if (nested) classes.push(nested);
41
+ } else if (typeof input === "object") {
42
+ for (const [key, value] of Object.entries(input)) {
43
+ if (value) classes.push(key);
44
+ }
45
+ }
46
+ }
47
+ return classes.join(" ");
48
+ }
49
+ function cva(config) {
50
+ return (props) => {
51
+ const classes = [];
52
+ if (config.base) {
53
+ classes.push(config.base);
54
+ }
55
+ if (config.variants) {
56
+ for (const [variantKey, variantOptions] of Object.entries(config.variants)) {
57
+ const selectedValue = props?.[variantKey] ?? config.defaultVariants?.[variantKey];
58
+ if (selectedValue != null) {
59
+ const variantClass = variantOptions[selectedValue];
60
+ if (variantClass) {
61
+ classes.push(variantClass);
62
+ }
63
+ }
64
+ }
65
+ }
66
+ if (config.compoundVariants) {
67
+ for (const compound of config.compoundVariants) {
68
+ const { class: compoundClass, ...conditions } = compound;
69
+ let matches = true;
70
+ for (const [key, value] of Object.entries(conditions)) {
71
+ const propValue = props?.[key] ?? config.defaultVariants?.[key];
72
+ if (propValue !== value) {
73
+ matches = false;
74
+ break;
75
+ }
76
+ }
77
+ if (matches) {
78
+ classes.push(compoundClass);
79
+ }
80
+ }
81
+ }
82
+ if (props?.className) {
83
+ classes.push(props.className);
84
+ }
85
+ return classes.filter(Boolean).join(" ");
86
+ };
87
+ }
88
+ var seen = /* @__PURE__ */ new Set();
89
+ function isDev() {
90
+ return typeof process === "undefined" || process.env?.NODE_ENV !== "production";
91
+ }
92
+ function emit(level, code, message, detail) {
93
+ if (!isDev()) return;
94
+ const key = `${level}:${code}`;
95
+ if (seen.has(key)) return;
96
+ seen.add(key);
97
+ const text = `[refraction-ui] ${code}: ${message}`;
98
+ {
99
+ console.warn(text, "");
100
+ }
101
+ }
102
+ function devWarn(code, message, detail) {
103
+ emit("warn", code, message);
104
+ }
105
+ var Slot = React2__namespace.forwardRef(function Slot2(props, forwardedRef) {
106
+ const { children, ...slotProps } = props;
107
+ if (!React2__namespace.isValidElement(children)) {
108
+ return null;
109
+ }
110
+ const childProps = children.props ?? {};
111
+ const mergedProps = mergeProps(slotProps, childProps);
112
+ let childRef = childProps.ref;
113
+ if (childRef === void 0 && !("ref" in childProps)) {
114
+ childRef = children.ref;
115
+ }
116
+ const mergedRef = composeRefs(forwardedRef, childRef);
117
+ return React2__namespace.cloneElement(
118
+ children,
119
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
120
+ { ...mergedProps, ref: mergedRef }
121
+ );
122
+ });
123
+ Slot.displayName = "Slot";
124
+ function mergeProps(slotProps, childProps) {
125
+ const merged = { ...slotProps };
126
+ for (const key of Object.keys(childProps)) {
127
+ const slotValue = slotProps[key];
128
+ const childValue = childProps[key];
129
+ if (/^on[A-Z]/.test(key) && typeof slotValue === "function" && typeof childValue === "function") {
130
+ merged[key] = (...args) => {
131
+ const child = childValue;
132
+ const slot = slotValue;
133
+ child(...args);
134
+ slot(...args);
135
+ };
136
+ } else if (key === "className") {
137
+ merged[key] = [slotValue, childValue].filter(Boolean).join(" ");
138
+ } else if (key === "style") {
139
+ merged[key] = { ...slotValue, ...childValue };
140
+ } else if (childValue !== void 0) {
141
+ merged[key] = childValue;
142
+ }
143
+ }
144
+ return merged;
145
+ }
146
+ function composeRefs(...refs) {
147
+ return (node) => {
148
+ for (const ref of refs) {
149
+ if (typeof ref === "function") {
150
+ ref(node);
151
+ } else if (ref != null) {
152
+ const objectRef = ref;
153
+ objectRef.current = node;
154
+ }
155
+ }
156
+ };
157
+ }
158
+ var Form = reactHookForm.FormProvider;
159
+ var FormFieldContext = React2__namespace.createContext(
160
+ void 0
161
+ );
162
+ var FormItemContext = React2__namespace.createContext(
163
+ void 0
164
+ );
165
+ function FormField(props) {
166
+ return /* @__PURE__ */ jsxRuntime.jsx(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsxRuntime.jsx(reactHookForm.Controller, { ...props }) });
167
+ }
168
+ function useFormField() {
169
+ const fieldContext = React2__namespace.useContext(FormFieldContext);
170
+ const itemContext = React2__namespace.useContext(FormItemContext);
171
+ const formContext = reactHookForm.useFormContext();
172
+ const { errors } = reactHookForm.useFormState({
173
+ control: formContext?.control,
174
+ name: fieldContext?.name,
175
+ exact: true
176
+ });
177
+ if (!fieldContext) {
178
+ devWarn(
179
+ "react-form/use-form-field-outside-form-field",
180
+ "useFormField (via FormLabel/FormControl/FormDescription/FormMessage) must be used inside a <FormField>. The missing FormFieldContext makes this throw."
181
+ );
182
+ throw new Error("useFormField must be used within a <FormField>");
183
+ }
184
+ if (!itemContext) {
185
+ devWarn(
186
+ "react-form/use-form-field-outside-form-item",
187
+ "useFormField (via FormLabel/FormControl/FormDescription/FormMessage) must be used inside a <FormItem>. The missing FormItemContext makes this throw."
188
+ );
189
+ throw new Error("useFormField must be used within a <FormItem>");
190
+ }
191
+ const { id } = itemContext;
192
+ const error = getNestedError(errors, fieldContext.name);
193
+ return {
194
+ id,
195
+ name: fieldContext.name,
196
+ formItemId: `${id}-form-item`,
197
+ formDescriptionId: `${id}-form-item-description`,
198
+ formMessageId: `${id}-form-item-message`,
199
+ error,
200
+ invalid: Boolean(error)
201
+ };
202
+ }
203
+ function getNestedError(errors, name) {
204
+ if (!errors) return void 0;
205
+ const segments = name.replace(/\[(\w+)\]/g, ".$1").split(".");
206
+ let cursor = errors;
207
+ for (const seg of segments) {
208
+ if (cursor && typeof cursor === "object" && seg in cursor) {
209
+ cursor = cursor[seg];
210
+ } else {
211
+ return void 0;
212
+ }
213
+ }
214
+ return cursor;
215
+ }
216
+ var formItemVariants = cva({ base: "space-y-2" });
217
+ var FormItem = React2__namespace.forwardRef(
218
+ ({ className, ...props }, ref) => {
219
+ const id = React2__namespace.useId();
220
+ return /* @__PURE__ */ jsxRuntime.jsx(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn(formItemVariants(), className), ...props }) });
221
+ }
222
+ );
223
+ FormItem.displayName = "FormItem";
224
+ var formLabelVariants = cva({
225
+ base: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
226
+ variants: {
227
+ invalid: {
228
+ true: "text-destructive",
229
+ false: ""
230
+ }
231
+ },
232
+ defaultVariants: {
233
+ invalid: "false"
234
+ }
235
+ });
236
+ var FormLabel = React2__namespace.forwardRef(
237
+ ({ className, ...props }, ref) => {
238
+ const { invalid, formItemId } = useFormField();
239
+ return /* @__PURE__ */ jsxRuntime.jsx(
240
+ "label",
241
+ {
242
+ ref,
243
+ htmlFor: formItemId,
244
+ "data-invalid": invalid ? "" : void 0,
245
+ className: cn(formLabelVariants({ invalid: invalid ? "true" : "false" }), className),
246
+ ...props
247
+ }
248
+ );
249
+ }
250
+ );
251
+ FormLabel.displayName = "FormLabel";
252
+ var FormControl = React2__namespace.forwardRef(
253
+ ({ ...props }, ref) => {
254
+ const { invalid, formItemId, formDescriptionId, formMessageId } = useFormField();
255
+ return /* @__PURE__ */ jsxRuntime.jsx(
256
+ Slot,
257
+ {
258
+ ref,
259
+ id: formItemId,
260
+ "aria-describedby": invalid ? `${formDescriptionId} ${formMessageId}` : formDescriptionId,
261
+ "aria-invalid": invalid || void 0,
262
+ ...props
263
+ }
264
+ );
265
+ }
266
+ );
267
+ FormControl.displayName = "FormControl";
268
+ var FormDescription = React2__namespace.forwardRef(({ className, ...props }, ref) => {
269
+ const { formDescriptionId } = useFormField();
270
+ return /* @__PURE__ */ jsxRuntime.jsx(
271
+ "p",
272
+ {
273
+ ref,
274
+ id: formDescriptionId,
275
+ className: cn("text-sm text-muted-foreground", className),
276
+ ...props
277
+ }
278
+ );
279
+ });
280
+ FormDescription.displayName = "FormDescription";
281
+ var FormMessage = React2__namespace.forwardRef(
282
+ ({ className, children, ...props }, ref) => {
283
+ const { error, formMessageId } = useFormField();
284
+ const body = error?.message ? String(error.message) : children;
285
+ if (!body) return null;
286
+ return /* @__PURE__ */ jsxRuntime.jsx(
287
+ "p",
288
+ {
289
+ ref,
290
+ id: formMessageId,
291
+ className: cn("text-sm font-medium text-destructive", className),
292
+ ...props,
293
+ children: body
294
+ }
295
+ );
296
+ }
297
+ );
298
+ FormMessage.displayName = "FormMessage";
299
+
300
+ Object.defineProperty(exports, "Controller", {
301
+ enumerable: true,
302
+ get: function () { return reactHookForm.Controller; }
303
+ });
304
+ Object.defineProperty(exports, "FormProvider", {
305
+ enumerable: true,
306
+ get: function () { return reactHookForm.FormProvider; }
307
+ });
308
+ Object.defineProperty(exports, "useController", {
309
+ enumerable: true,
310
+ get: function () { return reactHookForm.useController; }
311
+ });
312
+ Object.defineProperty(exports, "useForm", {
313
+ enumerable: true,
314
+ get: function () { return reactHookForm.useForm; }
315
+ });
316
+ Object.defineProperty(exports, "useFormContext", {
317
+ enumerable: true,
318
+ get: function () { return reactHookForm.useFormContext; }
319
+ });
320
+ Object.defineProperty(exports, "useFormState", {
321
+ enumerable: true,
322
+ get: function () { return reactHookForm.useFormState; }
323
+ });
324
+ Object.defineProperty(exports, "useWatch", {
325
+ enumerable: true,
326
+ get: function () { return reactHookForm.useWatch; }
327
+ });
328
+ exports.Form = Form;
329
+ exports.FormControl = FormControl;
330
+ exports.FormDescription = FormDescription;
331
+ exports.FormField = FormField;
332
+ exports.FormItem = FormItem;
333
+ exports.FormLabel = FormLabel;
334
+ exports.FormMessage = FormMessage;
335
+ exports.Slot = Slot;
336
+ exports.formItemVariants = formItemVariants;
337
+ exports.formLabelVariants = formLabelVariants;
338
+ exports.useFormField = useFormField;
339
+ //# sourceMappingURL=form.cjs.map
340
+ //# sourceMappingURL=form.cjs.map