@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../shared/src/cn.ts","../../shared/src/cva.ts","../../shared/src/dev-feedback.ts","../../react-form/src/slot.tsx","../../react-form/src/form.tsx"],"names":["React2","Slot","FormProvider","Controller","useFormContext","useFormState","jsx"],"mappings":"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","file":"form.cjs","sourcesContent":["/**\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","import * as React from 'react'\n\n/**\n * Minimal Slot implementation.\n *\n * Why not @radix-ui/react-slot? Per package policy, no external runtime deps\n * are allowed in @refraction-ui/* packages. This Slot does the small amount\n * of work we actually need:\n * - Forwards a single React child\n * - Merges incoming props onto that child (event handlers are chained,\n * className is concatenated, style is shallow-merged)\n * - Merges refs (callback refs and ref objects)\n *\n * It is intentionally simpler than Radix Slot — no <Slottable/>, no asChild\n * recursion. FormControl renders exactly one child input/textarea/etc., which\n * is all we need here.\n */\nexport interface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode\n}\n\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(function Slot(\n props,\n forwardedRef,\n) {\n const { children, ...slotProps } = props\n\n if (!React.isValidElement(children)) {\n return null\n }\n\n // The child element's existing props\n const childProps = (children.props ?? {}) as Record<string, unknown>\n\n const mergedProps = mergeProps(slotProps as Record<string, unknown>, childProps)\n\n // Forward + merge refs. In React 19 `ref` is a regular prop on `props`; in\n // React 18 it's hoisted onto the element. Prefer the prop and only fall back\n // to the element field if `props.ref` truly wasn't there — that fallback path\n // is React 18 only.\n let childRef: React.Ref<unknown> | undefined = childProps.ref as\n | React.Ref<unknown>\n | undefined\n if (childRef === undefined && !('ref' in (childProps as object))) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n childRef = (children as any).ref as React.Ref<unknown> | undefined\n }\n const mergedRef = composeRefs(forwardedRef as React.Ref<unknown>, childRef)\n\n return React.cloneElement(\n children as React.ReactElement,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { ...mergedProps, ref: mergedRef } as any,\n )\n})\n\nSlot.displayName = 'Slot'\n\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...slotProps }\n\n for (const key of Object.keys(childProps)) {\n const slotValue = slotProps[key]\n const childValue = childProps[key]\n\n // Chain event handlers: child's handler runs after slot's\n if (/^on[A-Z]/.test(key) && typeof slotValue === 'function' && typeof childValue === 'function') {\n merged[key] = (...args: unknown[]) => {\n const child = childValue as (...a: unknown[]) => unknown\n const slot = slotValue as (...a: unknown[]) => unknown\n child(...args)\n slot(...args)\n }\n } else if (key === 'className') {\n merged[key] = [slotValue, childValue].filter(Boolean).join(' ')\n } else if (key === 'style') {\n merged[key] = { ...(slotValue as object), ...(childValue as object) }\n } else if (childValue !== undefined) {\n // Child wins for non-event, non-merged props\n merged[key] = childValue\n }\n }\n\n return merged\n}\n\ntype PossibleRef<T> = React.Ref<T> | undefined\n\nfunction composeRefs<T>(...refs: Array<PossibleRef<T>>): React.RefCallback<T> {\n return (node: T) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref != null) {\n const objectRef = ref as React.MutableRefObject<T | null>\n objectRef.current = node\n }\n }\n }\n}\n","import * as React from 'react'\nimport {\n Controller,\n FormProvider,\n useFormContext,\n useFormState,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n} from 'react-hook-form'\nimport { cn, cva, devWarn } from '@refraction-ui/shared'\nimport { Slot } from './slot.js'\n\n/**\n * Form — RHF FormProvider wrapper.\n *\n * Spread the result of `useForm()` into <Form> so descendants can read the\n * form state via context. Renders no DOM of its own; consumers can place a\n * <form onSubmit={form.handleSubmit(...)}> inside.\n */\nconst Form = FormProvider\n\n// -----------------------------------------------------------------------------\n// Field context — bridges <FormField> and the inner Form* primitives.\n// -----------------------------------------------------------------------------\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | undefined>(\n undefined,\n)\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue | undefined>(\n undefined,\n)\n\n/**\n * FormField — connects a named field to RHF's Controller and provides\n * field-name context to the descendants (FormLabel, FormControl, FormMessage).\n */\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>(props: ControllerProps<TFieldValues, TName>) {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\n/**\n * useFormField — read-only access to the current field context.\n *\n * Returns the per-field id collection plus the live RHF error state. Useful\n * when building custom form controls that want the same wiring as FormControl.\n */\nfunction useFormField() {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const formContext = useFormContext()\n // useFormState subscribes to the specific field's error state, which keeps\n // re-renders narrow and works correctly with RHF v7 lazy subscriptions.\n const { errors } = useFormState({\n control: formContext?.control,\n name: fieldContext?.name as never,\n exact: true,\n })\n\n if (!fieldContext) {\n devWarn(\n 'react-form/use-form-field-outside-form-field',\n 'useFormField (via FormLabel/FormControl/FormDescription/FormMessage) must be used inside a <FormField>. The missing FormFieldContext makes this throw.',\n )\n throw new Error('useFormField must be used within a <FormField>')\n }\n if (!itemContext) {\n devWarn(\n 'react-form/use-form-field-outside-form-item',\n 'useFormField (via FormLabel/FormControl/FormDescription/FormMessage) must be used inside a <FormItem>. The missing FormItemContext makes this throw.',\n )\n throw new Error('useFormField must be used within a <FormItem>')\n }\n\n const { id } = itemContext\n const error = getNestedError(errors, fieldContext.name)\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n error,\n invalid: Boolean(error),\n }\n}\n\n// Walks a dot/bracket path through RHF's errors object. Mirrors the path\n// semantics of FieldPath without pulling in lodash.get.\nfunction getNestedError(\n errors: Record<string, unknown> | undefined,\n name: string,\n): { message?: string; type?: string } | undefined {\n if (!errors) return undefined\n const segments = name.replace(/\\[(\\w+)\\]/g, '.$1').split('.')\n let cursor: unknown = errors\n for (const seg of segments) {\n if (cursor && typeof cursor === 'object' && seg in (cursor as object)) {\n cursor = (cursor as Record<string, unknown>)[seg]\n } else {\n return undefined\n }\n }\n return cursor as { message?: string; type?: string } | undefined\n}\n\n// -----------------------------------------------------------------------------\n// FormItem — emits a stable id used by Label/Control/Description/Message.\n// -----------------------------------------------------------------------------\n\nconst formItemVariants = cva({ base: 'space-y-2' })\n\ninterface FormItemProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst FormItem = React.forwardRef<HTMLDivElement, FormItemProps>(\n ({ className, ...props }, ref) => {\n const id = React.useId()\n return (\n <FormItemContext.Provider value={{ id }}>\n <div ref={ref} className={cn(formItemVariants(), className)} {...props} />\n </FormItemContext.Provider>\n )\n },\n)\nFormItem.displayName = 'FormItem'\n\n// -----------------------------------------------------------------------------\n// FormLabel\n// -----------------------------------------------------------------------------\n\nconst formLabelVariants = cva({\n base: 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n variants: {\n invalid: {\n true: 'text-destructive',\n false: '',\n },\n },\n defaultVariants: {\n invalid: 'false',\n },\n})\n\ninterface FormLabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {}\n\nconst FormLabel = React.forwardRef<HTMLLabelElement, FormLabelProps>(\n ({ className, ...props }, ref) => {\n const { invalid, formItemId } = useFormField()\n return (\n <label\n ref={ref}\n htmlFor={formItemId}\n data-invalid={invalid ? '' : undefined}\n className={cn(formLabelVariants({ invalid: invalid ? 'true' : 'false' }), className)}\n {...props}\n />\n )\n },\n)\nFormLabel.displayName = 'FormLabel'\n\n// -----------------------------------------------------------------------------\n// FormControl — Slot that injects id/aria-describedby/aria-invalid.\n// -----------------------------------------------------------------------------\n\ninterface FormControlProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode\n}\n\nconst FormControl = React.forwardRef<HTMLElement, FormControlProps>(\n ({ ...props }, ref) => {\n const { invalid, formItemId, formDescriptionId, formMessageId } =\n useFormField()\n return (\n <Slot\n ref={ref}\n id={formItemId}\n aria-describedby={\n invalid\n ? `${formDescriptionId} ${formMessageId}`\n : formDescriptionId\n }\n aria-invalid={invalid || undefined}\n {...props}\n />\n )\n },\n)\nFormControl.displayName = 'FormControl'\n\n// -----------------------------------------------------------------------------\n// FormDescription\n// -----------------------------------------------------------------------------\n\ninterface FormDescriptionProps\n extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst FormDescription = React.forwardRef<\n HTMLParagraphElement,\n FormDescriptionProps\n>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField()\n return (\n <p\n ref={ref}\n id={formDescriptionId}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n )\n})\nFormDescription.displayName = 'FormDescription'\n\n// -----------------------------------------------------------------------------\n// FormMessage\n// -----------------------------------------------------------------------------\n\ninterface FormMessageProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst FormMessage = React.forwardRef<HTMLParagraphElement, FormMessageProps>(\n ({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField()\n const body = error?.message ? String(error.message) : children\n if (!body) return null\n return (\n <p\n ref={ref}\n id={formMessageId}\n className={cn('text-sm font-medium text-destructive', className)}\n {...props}\n >\n {body}\n </p>\n )\n },\n)\nFormMessage.displayName = 'FormMessage'\n\nexport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n useFormField,\n formItemVariants,\n formLabelVariants,\n}\n\nexport type {\n FormItemProps,\n FormLabelProps,\n FormControlProps,\n FormDescriptionProps,\n FormMessageProps,\n}\n"]}
@@ -0,0 +1 @@
1
+ export * from './internal/react-form/index.cjs';
package/dist/form.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './internal/react-form/index.js';
package/dist/form.js ADDED
@@ -0,0 +1,204 @@
1
+ import { cva, cn, devWarn } from './chunk-O4453CBF.js';
2
+ import * as React2 from 'react';
3
+ import { useFormContext, useFormState, FormProvider, Controller } from 'react-hook-form';
4
+ export { Controller, FormProvider, useController, useForm, useFormContext, useFormState, useWatch } from 'react-hook-form';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ var Slot = React2.forwardRef(function Slot2(props, forwardedRef) {
8
+ const { children, ...slotProps } = props;
9
+ if (!React2.isValidElement(children)) {
10
+ return null;
11
+ }
12
+ const childProps = children.props ?? {};
13
+ const mergedProps = mergeProps(slotProps, childProps);
14
+ let childRef = childProps.ref;
15
+ if (childRef === void 0 && !("ref" in childProps)) {
16
+ childRef = children.ref;
17
+ }
18
+ const mergedRef = composeRefs(forwardedRef, childRef);
19
+ return React2.cloneElement(
20
+ children,
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ { ...mergedProps, ref: mergedRef }
23
+ );
24
+ });
25
+ Slot.displayName = "Slot";
26
+ function mergeProps(slotProps, childProps) {
27
+ const merged = { ...slotProps };
28
+ for (const key of Object.keys(childProps)) {
29
+ const slotValue = slotProps[key];
30
+ const childValue = childProps[key];
31
+ if (/^on[A-Z]/.test(key) && typeof slotValue === "function" && typeof childValue === "function") {
32
+ merged[key] = (...args) => {
33
+ const child = childValue;
34
+ const slot = slotValue;
35
+ child(...args);
36
+ slot(...args);
37
+ };
38
+ } else if (key === "className") {
39
+ merged[key] = [slotValue, childValue].filter(Boolean).join(" ");
40
+ } else if (key === "style") {
41
+ merged[key] = { ...slotValue, ...childValue };
42
+ } else if (childValue !== void 0) {
43
+ merged[key] = childValue;
44
+ }
45
+ }
46
+ return merged;
47
+ }
48
+ function composeRefs(...refs) {
49
+ return (node) => {
50
+ for (const ref of refs) {
51
+ if (typeof ref === "function") {
52
+ ref(node);
53
+ } else if (ref != null) {
54
+ const objectRef = ref;
55
+ objectRef.current = node;
56
+ }
57
+ }
58
+ };
59
+ }
60
+ var Form = FormProvider;
61
+ var FormFieldContext = React2.createContext(
62
+ void 0
63
+ );
64
+ var FormItemContext = React2.createContext(
65
+ void 0
66
+ );
67
+ function FormField(props) {
68
+ return /* @__PURE__ */ jsx(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx(Controller, { ...props }) });
69
+ }
70
+ function useFormField() {
71
+ const fieldContext = React2.useContext(FormFieldContext);
72
+ const itemContext = React2.useContext(FormItemContext);
73
+ const formContext = useFormContext();
74
+ const { errors } = useFormState({
75
+ control: formContext?.control,
76
+ name: fieldContext?.name,
77
+ exact: true
78
+ });
79
+ if (!fieldContext) {
80
+ devWarn(
81
+ "react-form/use-form-field-outside-form-field",
82
+ "useFormField (via FormLabel/FormControl/FormDescription/FormMessage) must be used inside a <FormField>. The missing FormFieldContext makes this throw."
83
+ );
84
+ throw new Error("useFormField must be used within a <FormField>");
85
+ }
86
+ if (!itemContext) {
87
+ devWarn(
88
+ "react-form/use-form-field-outside-form-item",
89
+ "useFormField (via FormLabel/FormControl/FormDescription/FormMessage) must be used inside a <FormItem>. The missing FormItemContext makes this throw."
90
+ );
91
+ throw new Error("useFormField must be used within a <FormItem>");
92
+ }
93
+ const { id } = itemContext;
94
+ const error = getNestedError(errors, fieldContext.name);
95
+ return {
96
+ id,
97
+ name: fieldContext.name,
98
+ formItemId: `${id}-form-item`,
99
+ formDescriptionId: `${id}-form-item-description`,
100
+ formMessageId: `${id}-form-item-message`,
101
+ error,
102
+ invalid: Boolean(error)
103
+ };
104
+ }
105
+ function getNestedError(errors, name) {
106
+ if (!errors) return void 0;
107
+ const segments = name.replace(/\[(\w+)\]/g, ".$1").split(".");
108
+ let cursor = errors;
109
+ for (const seg of segments) {
110
+ if (cursor && typeof cursor === "object" && seg in cursor) {
111
+ cursor = cursor[seg];
112
+ } else {
113
+ return void 0;
114
+ }
115
+ }
116
+ return cursor;
117
+ }
118
+ var formItemVariants = cva({ base: "space-y-2" });
119
+ var FormItem = React2.forwardRef(
120
+ ({ className, ...props }, ref) => {
121
+ const id = React2.useId();
122
+ return /* @__PURE__ */ jsx(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ jsx("div", { ref, className: cn(formItemVariants(), className), ...props }) });
123
+ }
124
+ );
125
+ FormItem.displayName = "FormItem";
126
+ var formLabelVariants = cva({
127
+ base: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
128
+ variants: {
129
+ invalid: {
130
+ true: "text-destructive",
131
+ false: ""
132
+ }
133
+ },
134
+ defaultVariants: {
135
+ invalid: "false"
136
+ }
137
+ });
138
+ var FormLabel = React2.forwardRef(
139
+ ({ className, ...props }, ref) => {
140
+ const { invalid, formItemId } = useFormField();
141
+ return /* @__PURE__ */ jsx(
142
+ "label",
143
+ {
144
+ ref,
145
+ htmlFor: formItemId,
146
+ "data-invalid": invalid ? "" : void 0,
147
+ className: cn(formLabelVariants({ invalid: invalid ? "true" : "false" }), className),
148
+ ...props
149
+ }
150
+ );
151
+ }
152
+ );
153
+ FormLabel.displayName = "FormLabel";
154
+ var FormControl = React2.forwardRef(
155
+ ({ ...props }, ref) => {
156
+ const { invalid, formItemId, formDescriptionId, formMessageId } = useFormField();
157
+ return /* @__PURE__ */ jsx(
158
+ Slot,
159
+ {
160
+ ref,
161
+ id: formItemId,
162
+ "aria-describedby": invalid ? `${formDescriptionId} ${formMessageId}` : formDescriptionId,
163
+ "aria-invalid": invalid || void 0,
164
+ ...props
165
+ }
166
+ );
167
+ }
168
+ );
169
+ FormControl.displayName = "FormControl";
170
+ var FormDescription = React2.forwardRef(({ className, ...props }, ref) => {
171
+ const { formDescriptionId } = useFormField();
172
+ return /* @__PURE__ */ jsx(
173
+ "p",
174
+ {
175
+ ref,
176
+ id: formDescriptionId,
177
+ className: cn("text-sm text-muted-foreground", className),
178
+ ...props
179
+ }
180
+ );
181
+ });
182
+ FormDescription.displayName = "FormDescription";
183
+ var FormMessage = React2.forwardRef(
184
+ ({ className, children, ...props }, ref) => {
185
+ const { error, formMessageId } = useFormField();
186
+ const body = error?.message ? String(error.message) : children;
187
+ if (!body) return null;
188
+ return /* @__PURE__ */ jsx(
189
+ "p",
190
+ {
191
+ ref,
192
+ id: formMessageId,
193
+ className: cn("text-sm font-medium text-destructive", className),
194
+ ...props,
195
+ children: body
196
+ }
197
+ );
198
+ }
199
+ );
200
+ FormMessage.displayName = "FormMessage";
201
+
202
+ export { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Slot, formItemVariants, formLabelVariants, useFormField };
203
+ //# sourceMappingURL=form.js.map
204
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../react-form/src/slot.tsx","../../react-form/src/form.tsx"],"names":["Slot"],"mappings":"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","file":"form.js","sourcesContent":["import * as React from 'react'\n\n/**\n * Minimal Slot implementation.\n *\n * Why not @radix-ui/react-slot? Per package policy, no external runtime deps\n * are allowed in @refraction-ui/* packages. This Slot does the small amount\n * of work we actually need:\n * - Forwards a single React child\n * - Merges incoming props onto that child (event handlers are chained,\n * className is concatenated, style is shallow-merged)\n * - Merges refs (callback refs and ref objects)\n *\n * It is intentionally simpler than Radix Slot — no <Slottable/>, no asChild\n * recursion. FormControl renders exactly one child input/textarea/etc., which\n * is all we need here.\n */\nexport interface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode\n}\n\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(function Slot(\n props,\n forwardedRef,\n) {\n const { children, ...slotProps } = props\n\n if (!React.isValidElement(children)) {\n return null\n }\n\n // The child element's existing props\n const childProps = (children.props ?? {}) as Record<string, unknown>\n\n const mergedProps = mergeProps(slotProps as Record<string, unknown>, childProps)\n\n // Forward + merge refs. In React 19 `ref` is a regular prop on `props`; in\n // React 18 it's hoisted onto the element. Prefer the prop and only fall back\n // to the element field if `props.ref` truly wasn't there — that fallback path\n // is React 18 only.\n let childRef: React.Ref<unknown> | undefined = childProps.ref as\n | React.Ref<unknown>\n | undefined\n if (childRef === undefined && !('ref' in (childProps as object))) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n childRef = (children as any).ref as React.Ref<unknown> | undefined\n }\n const mergedRef = composeRefs(forwardedRef as React.Ref<unknown>, childRef)\n\n return React.cloneElement(\n children as React.ReactElement,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { ...mergedProps, ref: mergedRef } as any,\n )\n})\n\nSlot.displayName = 'Slot'\n\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...slotProps }\n\n for (const key of Object.keys(childProps)) {\n const slotValue = slotProps[key]\n const childValue = childProps[key]\n\n // Chain event handlers: child's handler runs after slot's\n if (/^on[A-Z]/.test(key) && typeof slotValue === 'function' && typeof childValue === 'function') {\n merged[key] = (...args: unknown[]) => {\n const child = childValue as (...a: unknown[]) => unknown\n const slot = slotValue as (...a: unknown[]) => unknown\n child(...args)\n slot(...args)\n }\n } else if (key === 'className') {\n merged[key] = [slotValue, childValue].filter(Boolean).join(' ')\n } else if (key === 'style') {\n merged[key] = { ...(slotValue as object), ...(childValue as object) }\n } else if (childValue !== undefined) {\n // Child wins for non-event, non-merged props\n merged[key] = childValue\n }\n }\n\n return merged\n}\n\ntype PossibleRef<T> = React.Ref<T> | undefined\n\nfunction composeRefs<T>(...refs: Array<PossibleRef<T>>): React.RefCallback<T> {\n return (node: T) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref != null) {\n const objectRef = ref as React.MutableRefObject<T | null>\n objectRef.current = node\n }\n }\n }\n}\n","import * as React from 'react'\nimport {\n Controller,\n FormProvider,\n useFormContext,\n useFormState,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n} from 'react-hook-form'\nimport { cn, cva, devWarn } from '@refraction-ui/shared'\nimport { Slot } from './slot.js'\n\n/**\n * Form — RHF FormProvider wrapper.\n *\n * Spread the result of `useForm()` into <Form> so descendants can read the\n * form state via context. Renders no DOM of its own; consumers can place a\n * <form onSubmit={form.handleSubmit(...)}> inside.\n */\nconst Form = FormProvider\n\n// -----------------------------------------------------------------------------\n// Field context — bridges <FormField> and the inner Form* primitives.\n// -----------------------------------------------------------------------------\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | undefined>(\n undefined,\n)\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue | undefined>(\n undefined,\n)\n\n/**\n * FormField — connects a named field to RHF's Controller and provides\n * field-name context to the descendants (FormLabel, FormControl, FormMessage).\n */\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>(props: ControllerProps<TFieldValues, TName>) {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\n/**\n * useFormField — read-only access to the current field context.\n *\n * Returns the per-field id collection plus the live RHF error state. Useful\n * when building custom form controls that want the same wiring as FormControl.\n */\nfunction useFormField() {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const formContext = useFormContext()\n // useFormState subscribes to the specific field's error state, which keeps\n // re-renders narrow and works correctly with RHF v7 lazy subscriptions.\n const { errors } = useFormState({\n control: formContext?.control,\n name: fieldContext?.name as never,\n exact: true,\n })\n\n if (!fieldContext) {\n devWarn(\n 'react-form/use-form-field-outside-form-field',\n 'useFormField (via FormLabel/FormControl/FormDescription/FormMessage) must be used inside a <FormField>. The missing FormFieldContext makes this throw.',\n )\n throw new Error('useFormField must be used within a <FormField>')\n }\n if (!itemContext) {\n devWarn(\n 'react-form/use-form-field-outside-form-item',\n 'useFormField (via FormLabel/FormControl/FormDescription/FormMessage) must be used inside a <FormItem>. The missing FormItemContext makes this throw.',\n )\n throw new Error('useFormField must be used within a <FormItem>')\n }\n\n const { id } = itemContext\n const error = getNestedError(errors, fieldContext.name)\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n error,\n invalid: Boolean(error),\n }\n}\n\n// Walks a dot/bracket path through RHF's errors object. Mirrors the path\n// semantics of FieldPath without pulling in lodash.get.\nfunction getNestedError(\n errors: Record<string, unknown> | undefined,\n name: string,\n): { message?: string; type?: string } | undefined {\n if (!errors) return undefined\n const segments = name.replace(/\\[(\\w+)\\]/g, '.$1').split('.')\n let cursor: unknown = errors\n for (const seg of segments) {\n if (cursor && typeof cursor === 'object' && seg in (cursor as object)) {\n cursor = (cursor as Record<string, unknown>)[seg]\n } else {\n return undefined\n }\n }\n return cursor as { message?: string; type?: string } | undefined\n}\n\n// -----------------------------------------------------------------------------\n// FormItem — emits a stable id used by Label/Control/Description/Message.\n// -----------------------------------------------------------------------------\n\nconst formItemVariants = cva({ base: 'space-y-2' })\n\ninterface FormItemProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst FormItem = React.forwardRef<HTMLDivElement, FormItemProps>(\n ({ className, ...props }, ref) => {\n const id = React.useId()\n return (\n <FormItemContext.Provider value={{ id }}>\n <div ref={ref} className={cn(formItemVariants(), className)} {...props} />\n </FormItemContext.Provider>\n )\n },\n)\nFormItem.displayName = 'FormItem'\n\n// -----------------------------------------------------------------------------\n// FormLabel\n// -----------------------------------------------------------------------------\n\nconst formLabelVariants = cva({\n base: 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n variants: {\n invalid: {\n true: 'text-destructive',\n false: '',\n },\n },\n defaultVariants: {\n invalid: 'false',\n },\n})\n\ninterface FormLabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {}\n\nconst FormLabel = React.forwardRef<HTMLLabelElement, FormLabelProps>(\n ({ className, ...props }, ref) => {\n const { invalid, formItemId } = useFormField()\n return (\n <label\n ref={ref}\n htmlFor={formItemId}\n data-invalid={invalid ? '' : undefined}\n className={cn(formLabelVariants({ invalid: invalid ? 'true' : 'false' }), className)}\n {...props}\n />\n )\n },\n)\nFormLabel.displayName = 'FormLabel'\n\n// -----------------------------------------------------------------------------\n// FormControl — Slot that injects id/aria-describedby/aria-invalid.\n// -----------------------------------------------------------------------------\n\ninterface FormControlProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode\n}\n\nconst FormControl = React.forwardRef<HTMLElement, FormControlProps>(\n ({ ...props }, ref) => {\n const { invalid, formItemId, formDescriptionId, formMessageId } =\n useFormField()\n return (\n <Slot\n ref={ref}\n id={formItemId}\n aria-describedby={\n invalid\n ? `${formDescriptionId} ${formMessageId}`\n : formDescriptionId\n }\n aria-invalid={invalid || undefined}\n {...props}\n />\n )\n },\n)\nFormControl.displayName = 'FormControl'\n\n// -----------------------------------------------------------------------------\n// FormDescription\n// -----------------------------------------------------------------------------\n\ninterface FormDescriptionProps\n extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst FormDescription = React.forwardRef<\n HTMLParagraphElement,\n FormDescriptionProps\n>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField()\n return (\n <p\n ref={ref}\n id={formDescriptionId}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n )\n})\nFormDescription.displayName = 'FormDescription'\n\n// -----------------------------------------------------------------------------\n// FormMessage\n// -----------------------------------------------------------------------------\n\ninterface FormMessageProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst FormMessage = React.forwardRef<HTMLParagraphElement, FormMessageProps>(\n ({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField()\n const body = error?.message ? String(error.message) : children\n if (!body) return null\n return (\n <p\n ref={ref}\n id={formMessageId}\n className={cn('text-sm font-medium text-destructive', className)}\n {...props}\n >\n {body}\n </p>\n )\n },\n)\nFormMessage.displayName = 'FormMessage'\n\nexport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n useFormField,\n formItemVariants,\n formLabelVariants,\n}\n\nexport type {\n FormItemProps,\n FormLabelProps,\n FormControlProps,\n FormDescriptionProps,\n FormMessageProps,\n}\n"]}