torch-glare 2.5.6 → 2.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 (362) hide show
  1. package/README.md +4 -3
  2. package/dist/bin/index.js +9 -24
  3. package/dist/bin/index.js.map +1 -1
  4. package/dist/src/commands/add.d.ts +2 -2
  5. package/dist/src/commands/add.d.ts.map +1 -1
  6. package/dist/src/commands/add.js +4 -70
  7. package/dist/src/commands/add.js.map +1 -1
  8. package/dist/src/commands/hook.d.ts +5 -4
  9. package/dist/src/commands/hook.d.ts.map +1 -1
  10. package/dist/src/commands/hook.js +7 -75
  11. package/dist/src/commands/hook.js.map +1 -1
  12. package/dist/src/commands/init.js +1 -1
  13. package/dist/src/commands/init.js.map +1 -1
  14. package/dist/src/commands/layout.d.ts +5 -4
  15. package/dist/src/commands/layout.d.ts.map +1 -1
  16. package/dist/src/commands/layout.js +7 -75
  17. package/dist/src/commands/layout.js.map +1 -1
  18. package/dist/src/commands/provider.d.ts +5 -4
  19. package/dist/src/commands/provider.d.ts.map +1 -1
  20. package/dist/src/commands/provider.js +7 -75
  21. package/dist/src/commands/provider.js.map +1 -1
  22. package/dist/src/commands/update.d.ts.map +1 -1
  23. package/dist/src/commands/update.js +78 -43
  24. package/dist/src/commands/update.js.map +1 -1
  25. package/dist/src/commands/utils.d.ts +5 -4
  26. package/dist/src/commands/utils.d.ts.map +1 -1
  27. package/dist/src/commands/utils.js +7 -80
  28. package/dist/src/commands/utils.js.map +1 -1
  29. package/dist/src/shared/addFromRegistry.d.ts +16 -0
  30. package/dist/src/shared/addFromRegistry.d.ts.map +1 -0
  31. package/dist/src/shared/addFromRegistry.js +88 -0
  32. package/dist/src/shared/addFromRegistry.js.map +1 -0
  33. package/dist/src/shared/getInstallCommand.d.ts.map +1 -1
  34. package/dist/src/shared/getInstallCommand.js +5 -0
  35. package/dist/src/shared/getInstallCommand.js.map +1 -1
  36. package/dist/src/shared/installDependencies.d.ts +0 -10
  37. package/dist/src/shared/installDependencies.d.ts.map +1 -1
  38. package/dist/src/shared/installDependencies.js +0 -17
  39. package/dist/src/shared/installDependencies.js.map +1 -1
  40. package/dist/src/shared/installFromPlan.d.ts +7 -5
  41. package/dist/src/shared/installFromPlan.d.ts.map +1 -1
  42. package/dist/src/shared/installFromPlan.js +103 -36
  43. package/dist/src/shared/installFromPlan.js.map +1 -1
  44. package/dist/src/shared/loadRegistry.d.ts +12 -3
  45. package/dist/src/shared/loadRegistry.d.ts.map +1 -1
  46. package/dist/src/shared/loadRegistry.js +19 -20
  47. package/dist/src/shared/loadRegistry.js.map +1 -1
  48. package/dist/src/shared/registryClient.d.ts +19 -0
  49. package/dist/src/shared/registryClient.d.ts.map +1 -0
  50. package/dist/src/shared/registryClient.js +128 -0
  51. package/dist/src/shared/registryClient.js.map +1 -0
  52. package/dist/src/shared/resolveEntry.d.ts +10 -7
  53. package/dist/src/shared/resolveEntry.d.ts.map +1 -1
  54. package/dist/src/shared/resolveEntry.js +18 -13
  55. package/dist/src/shared/resolveEntry.js.map +1 -1
  56. package/dist/src/shared/suggestOtherCommand.d.ts +7 -1
  57. package/dist/src/shared/suggestOtherCommand.d.ts.map +1 -1
  58. package/dist/src/shared/suggestOtherCommand.js +29 -23
  59. package/dist/src/shared/suggestOtherCommand.js.map +1 -1
  60. package/dist/src/types/main.d.ts +31 -2
  61. package/dist/src/types/main.d.ts.map +1 -1
  62. package/package.json +6 -11
  63. package/apps/lib/components/ActionButton.tsx +0 -93
  64. package/apps/lib/components/ActionsGroup.tsx +0 -27
  65. package/apps/lib/components/AlertDialog.tsx +0 -204
  66. package/apps/lib/components/Avatar.tsx +0 -46
  67. package/apps/lib/components/Badge.tsx +0 -250
  68. package/apps/lib/components/BadgeField.tsx +0 -403
  69. package/apps/lib/components/Breadcrumb.tsx +0 -280
  70. package/apps/lib/components/Button.tsx +0 -325
  71. package/apps/lib/components/ButtonGroup.tsx +0 -190
  72. package/apps/lib/components/Calendar.tsx +0 -115
  73. package/apps/lib/components/Card.tsx +0 -95
  74. package/apps/lib/components/Checkbox.tsx +0 -42
  75. package/apps/lib/components/ColorPicker.tsx +0 -441
  76. package/apps/lib/components/ConclusionHeader.tsx +0 -148
  77. package/apps/lib/components/ContextMenu.tsx +0 -571
  78. package/apps/lib/components/CountBadge.tsx +0 -52
  79. package/apps/lib/components/DataTable.tsx +0 -213
  80. package/apps/lib/components/DataViews/badge.ts +0 -49
  81. package/apps/lib/components/DataViews/cell.tsx +0 -324
  82. package/apps/lib/components/DataViews/context.ts +0 -144
  83. package/apps/lib/components/DataViews/data-views.tsx +0 -395
  84. package/apps/lib/components/DataViews/filters/children.tsx +0 -98
  85. package/apps/lib/components/DataViews/filters/custom.tsx +0 -34
  86. package/apps/lib/components/DataViews/filters/filters.tsx +0 -157
  87. package/apps/lib/components/DataViews/filters/index.ts +0 -4
  88. package/apps/lib/components/DataViews/filters/labelled.tsx +0 -20
  89. package/apps/lib/components/DataViews/filters/presets.tsx +0 -65
  90. package/apps/lib/components/DataViews/filters/sync.tsx +0 -35
  91. package/apps/lib/components/DataViews/filters/values.ts +0 -173
  92. package/apps/lib/components/DataViews/header.tsx +0 -220
  93. package/apps/lib/components/DataViews/hooks/index.ts +0 -5
  94. package/apps/lib/components/DataViews/hooks/useActiveRow.ts +0 -22
  95. package/apps/lib/components/DataViews/hooks/useControllable.ts +0 -52
  96. package/apps/lib/components/DataViews/index.ts +0 -88
  97. package/apps/lib/components/DataViews/panel/columns.tsx +0 -153
  98. package/apps/lib/components/DataViews/panel/controls.tsx +0 -106
  99. package/apps/lib/components/DataViews/panel/index.ts +0 -3
  100. package/apps/lib/components/DataViews/panel/panel.tsx +0 -164
  101. package/apps/lib/components/DataViews/panel/saved-views.tsx +0 -67
  102. package/apps/lib/components/DataViews/panel/section.tsx +0 -81
  103. package/apps/lib/components/DataViews/panel/sort.tsx +0 -42
  104. package/apps/lib/components/DataViews/panel/tab.tsx +0 -31
  105. package/apps/lib/components/DataViews/slots.ts +0 -72
  106. package/apps/lib/components/DataViews/states.tsx +0 -73
  107. package/apps/lib/components/DataViews/types.ts +0 -510
  108. package/apps/lib/components/DataViews/views/board-view.tsx +0 -381
  109. package/apps/lib/components/DataViews/views/card-rows.tsx +0 -36
  110. package/apps/lib/components/DataViews/views/inbox-view.tsx +0 -260
  111. package/apps/lib/components/DataViews/views/pane-views.tsx +0 -196
  112. package/apps/lib/components/DataViews/views/table-view.tsx +0 -493
  113. package/apps/lib/components/DataViews/views/tree-view.tsx +0 -367
  114. package/apps/lib/components/DatePicker.tsx +0 -232
  115. package/apps/lib/components/Dialog.tsx +0 -116
  116. package/apps/lib/components/Divider.tsx +0 -28
  117. package/apps/lib/components/Drawer.tsx +0 -451
  118. package/apps/lib/components/DropdownMenu.tsx +0 -554
  119. package/apps/lib/components/FieldHint.tsx +0 -69
  120. package/apps/lib/components/Form.tsx +0 -182
  121. package/apps/lib/components/FormBuilder/context.ts +0 -85
  122. package/apps/lib/components/FormBuilder/field-kind.ts +0 -28
  123. package/apps/lib/components/FormBuilder/fields/ChoiceFields.tsx +0 -60
  124. package/apps/lib/components/FormBuilder/fields/ColorField.tsx +0 -59
  125. package/apps/lib/components/FormBuilder/fields/CustomField.tsx +0 -11
  126. package/apps/lib/components/FormBuilder/fields/DateField.tsx +0 -32
  127. package/apps/lib/components/FormBuilder/fields/FieldArray.tsx +0 -74
  128. package/apps/lib/components/FormBuilder/fields/FieldShell.tsx +0 -168
  129. package/apps/lib/components/FormBuilder/fields/FileField.tsx +0 -39
  130. package/apps/lib/components/FormBuilder/fields/OptionListFields.tsx +0 -132
  131. package/apps/lib/components/FormBuilder/fields/OtpField.tsx +0 -31
  132. package/apps/lib/components/FormBuilder/fields/PhoneField.tsx +0 -109
  133. package/apps/lib/components/FormBuilder/fields/RichTextEditorField.tsx +0 -31
  134. package/apps/lib/components/FormBuilder/fields/SelectField.tsx +0 -114
  135. package/apps/lib/components/FormBuilder/fields/SignatureField.tsx +0 -157
  136. package/apps/lib/components/FormBuilder/fields/SliderField.tsx +0 -67
  137. package/apps/lib/components/FormBuilder/fields/SwitchBoxField.tsx +0 -41
  138. package/apps/lib/components/FormBuilder/fields/TableField.tsx +0 -336
  139. package/apps/lib/components/FormBuilder/fields/TextField.tsx +0 -213
  140. package/apps/lib/components/FormBuilder/fields/TreeSelectField.tsx +0 -43
  141. package/apps/lib/components/FormBuilder/fields/countries.ts +0 -303
  142. package/apps/lib/components/FormBuilder/fields/index.ts +0 -25
  143. package/apps/lib/components/FormBuilder/form-builder.tsx +0 -198
  144. package/apps/lib/components/FormBuilder/index.ts +0 -31
  145. package/apps/lib/components/FormBuilder/numberFormat.ts +0 -16
  146. package/apps/lib/components/FormBuilder/submit.tsx +0 -67
  147. package/apps/lib/components/FormBuilder/types.ts +0 -316
  148. package/apps/lib/components/FormRenderer/FormDrawer.tsx +0 -250
  149. package/apps/lib/components/FormRenderer/detail.tsx +0 -256
  150. package/apps/lib/components/FormRenderer/form-renderer.tsx +0 -358
  151. package/apps/lib/components/FormRenderer/header.tsx +0 -88
  152. package/apps/lib/components/FormRenderer/index.ts +0 -17
  153. package/apps/lib/components/FormRenderer/notch-action.tsx +0 -64
  154. package/apps/lib/components/FormRenderer/section.tsx +0 -39
  155. package/apps/lib/components/FormRenderer/stepper.tsx +0 -393
  156. package/apps/lib/components/FormRenderer/types.ts +0 -115
  157. package/apps/lib/components/FormSummary.tsx +0 -282
  158. package/apps/lib/components/HeaderBar.tsx +0 -117
  159. package/apps/lib/components/ImageAttachment.tsx +0 -209
  160. package/apps/lib/components/InnerLabelField.tsx +0 -154
  161. package/apps/lib/components/Input.tsx +0 -224
  162. package/apps/lib/components/InputField.tsx +0 -147
  163. package/apps/lib/components/InputOTP.tsx +0 -84
  164. package/apps/lib/components/Label.tsx +0 -129
  165. package/apps/lib/components/LabelField.tsx +0 -76
  166. package/apps/lib/components/LabeledCheckBox.tsx +0 -51
  167. package/apps/lib/components/LabeledRadio.tsx +0 -51
  168. package/apps/lib/components/LinkButton.tsx +0 -94
  169. package/apps/lib/components/LoginButton.tsx +0 -51
  170. package/apps/lib/components/PasswordLevel.tsx +0 -58
  171. package/apps/lib/components/Popover.tsx +0 -312
  172. package/apps/lib/components/ProfileMenu.tsx +0 -85
  173. package/apps/lib/components/Radio.tsx +0 -59
  174. package/apps/lib/components/RadioCard.tsx +0 -50
  175. package/apps/lib/components/ScrollArea.tsx +0 -54
  176. package/apps/lib/components/SearchField.tsx +0 -62
  177. package/apps/lib/components/SearchableSelect.tsx +0 -318
  178. package/apps/lib/components/SearchableTable.tsx +0 -344
  179. package/apps/lib/components/SearchableTree.tsx +0 -485
  180. package/apps/lib/components/SearchableTreeDialog.tsx +0 -502
  181. package/apps/lib/components/SectionBlock.tsx +0 -168
  182. package/apps/lib/components/Select.tsx +0 -347
  183. package/apps/lib/components/SimpleSelect.tsx +0 -225
  184. package/apps/lib/components/Skeleton.tsx +0 -12
  185. package/apps/lib/components/SlideDatePicker.tsx +0 -255
  186. package/apps/lib/components/SpinLoading.tsx +0 -174
  187. package/apps/lib/components/Stepper.tsx +0 -480
  188. package/apps/lib/components/Switch.tsx +0 -82
  189. package/apps/lib/components/TabFormItem.tsx +0 -153
  190. package/apps/lib/components/TabSwitch.tsx +0 -172
  191. package/apps/lib/components/Table.tsx +0 -597
  192. package/apps/lib/components/TextEditor/ChartBlockTool.ts +0 -676
  193. package/apps/lib/components/TextEditor/RichTextField.tsx +0 -46
  194. package/apps/lib/components/TextEditor/TableDnDWrapper.ts +0 -462
  195. package/apps/lib/components/TextEditor/TextEditor.tsx +0 -1164
  196. package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +0 -429
  197. package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +0 -70
  198. package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +0 -50
  199. package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +0 -48
  200. package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +0 -98
  201. package/apps/lib/components/TextEditor/editorjs.d.ts +0 -60
  202. package/apps/lib/components/TextEditor/index.ts +0 -7
  203. package/apps/lib/components/TextEditor/markdownParser.ts +0 -346
  204. package/apps/lib/components/Textarea.tsx +0 -117
  205. package/apps/lib/components/Timeline.tsx +0 -263
  206. package/apps/lib/components/Toast.tsx +0 -87
  207. package/apps/lib/components/Toggle.tsx +0 -125
  208. package/apps/lib/components/ToggleButton.tsx +0 -140
  209. package/apps/lib/components/Tooltip.tsx +0 -116
  210. package/apps/lib/components/TransparentLabel.tsx +0 -71
  211. package/apps/lib/components/TreeDropDown.tsx +0 -115
  212. package/apps/lib/components/TreeFolder/TreeFolder.tsx +0 -380
  213. package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +0 -75
  214. package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +0 -354
  215. package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +0 -60
  216. package/apps/lib/components/TreeFolder/icons.tsx +0 -60
  217. package/apps/lib/components/TreeFolder/index.ts +0 -24
  218. package/apps/lib/components/TreeFolder/treeFolderUtils.ts +0 -109
  219. package/apps/lib/components/TreeFolder/types.ts +0 -77
  220. package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +0 -118
  221. package/apps/lib/hooks/useActiveTreeItem.ts +0 -61
  222. package/apps/lib/hooks/useClickOutside.ts +0 -27
  223. package/apps/lib/hooks/useDragDrop.tsx +0 -365
  224. package/apps/lib/hooks/useHtmlDir.ts +0 -31
  225. package/apps/lib/hooks/useInfiniteScroll.ts +0 -108
  226. package/apps/lib/hooks/useIsMobile.ts +0 -21
  227. package/apps/lib/hooks/useResize.ts +0 -67
  228. package/apps/lib/hooks/useTagSelection.ts +0 -300
  229. package/apps/lib/layouts/CNLayout.tsx +0 -372
  230. package/apps/lib/layouts/DataViewCard.tsx +0 -62
  231. package/apps/lib/layouts/FieldSection.tsx +0 -91
  232. package/apps/lib/layouts/TreeSubLayout.tsx +0 -173
  233. package/apps/lib/providers/ThemeProvider.tsx +0 -84
  234. package/apps/lib/registry.json +0 -1217
  235. package/apps/lib/tsconfig.json +0 -9
  236. package/apps/lib/tsconfig.tsbuildinfo +0 -1
  237. package/apps/lib/utils/cn.ts +0 -6
  238. package/apps/lib/utils/color.ts +0 -175
  239. package/apps/lib/utils/dataViews/path.ts +0 -67
  240. package/apps/lib/utils/dataViews/query.ts +0 -73
  241. package/apps/lib/utils/dataViews/types.ts +0 -187
  242. package/apps/lib/utils/dateFormat.ts +0 -108
  243. package/apps/lib/utils/resize.ts +0 -31
  244. package/apps/lib/utils/scroller.ts +0 -26
  245. package/apps/lib/utils/types.ts +0 -16
  246. package/docs/BLOCKS.md +0 -129
  247. package/docs/CHANGELOG-1.1.16.md +0 -108
  248. package/docs/Cover.png +0 -0
  249. package/docs/README.md +0 -215
  250. package/docs/components/action-button.md +0 -638
  251. package/docs/components/actions-group.md +0 -708
  252. package/docs/components/alert-dialog.md +0 -920
  253. package/docs/components/avatar.md +0 -709
  254. package/docs/components/badge-field.md +0 -738
  255. package/docs/components/badge.md +0 -301
  256. package/docs/components/breadcrumb.md +0 -930
  257. package/docs/components/button-group.md +0 -650
  258. package/docs/components/button.md +0 -639
  259. package/docs/components/calendar.md +0 -555
  260. package/docs/components/card.md +0 -622
  261. package/docs/components/chart-block-tool.md +0 -129
  262. package/docs/components/checkbox.md +0 -699
  263. package/docs/components/cn-layout.md +0 -854
  264. package/docs/components/color-picker.md +0 -101
  265. package/docs/components/conclusion-header.md +0 -80
  266. package/docs/components/context-menu.md +0 -483
  267. package/docs/components/count-badge.md +0 -560
  268. package/docs/components/data-table.md +0 -854
  269. package/docs/components/data-views/backend-response.md +0 -324
  270. package/docs/components/data-views/examples/a11y-rtl.md +0 -250
  271. package/docs/components/data-views/examples/api-orders-route.md +0 -130
  272. package/docs/components/data-views/examples/fields.md +0 -362
  273. package/docs/components/data-views/examples/filters.md +0 -307
  274. package/docs/components/data-views/examples/inbox-routing.md +0 -218
  275. package/docs/components/data-views/examples/index.md +0 -29
  276. package/docs/components/data-views/examples/overview.md +0 -244
  277. package/docs/components/data-views/examples/panel.md +0 -212
  278. package/docs/components/data-views/examples/scale.md +0 -231
  279. package/docs/components/data-views/examples/server-side.md +0 -210
  280. package/docs/components/data-views/examples/state.md +0 -250
  281. package/docs/components/data-views/examples/tree-custom.md +0 -388
  282. package/docs/components/data-views/examples/view-registry.md +0 -313
  283. package/docs/components/data-views/examples/views.md +0 -534
  284. package/docs/components/data-views/guide.md +0 -405
  285. package/docs/components/data-views/index.md +0 -1521
  286. package/docs/components/data-views/migration.md +0 -81
  287. package/docs/components/date-picker.md +0 -857
  288. package/docs/components/dialog.md +0 -929
  289. package/docs/components/divider.md +0 -766
  290. package/docs/components/drawer.md +0 -654
  291. package/docs/components/dropdown-menu.md +0 -668
  292. package/docs/components/field-hint.md +0 -898
  293. package/docs/components/field-section.md +0 -781
  294. package/docs/components/form-builder.md +0 -284
  295. package/docs/components/form-renderer.md +0 -396
  296. package/docs/components/form-summary.md +0 -138
  297. package/docs/components/form.md +0 -785
  298. package/docs/components/header-bar.md +0 -188
  299. package/docs/components/image-attachment.md +0 -906
  300. package/docs/components/inner-label-field.md +0 -819
  301. package/docs/components/input-field.md +0 -623
  302. package/docs/components/input-otp.md +0 -756
  303. package/docs/components/input.md +0 -634
  304. package/docs/components/label-field.md +0 -770
  305. package/docs/components/label.md +0 -761
  306. package/docs/components/labeled-check-box.md +0 -642
  307. package/docs/components/labeled-radio.md +0 -796
  308. package/docs/components/link-button.md +0 -685
  309. package/docs/components/login-button.md +0 -872
  310. package/docs/components/password-level.md +0 -803
  311. package/docs/components/popover.md +0 -649
  312. package/docs/components/profile-menu.md +0 -656
  313. package/docs/components/radio-card.md +0 -801
  314. package/docs/components/radio.md +0 -735
  315. package/docs/components/scroll-area.md +0 -691
  316. package/docs/components/search-field.md +0 -702
  317. package/docs/components/searchable-select.md +0 -368
  318. package/docs/components/searchable-table.md +0 -438
  319. package/docs/components/searchable-tree-dialog.md +0 -190
  320. package/docs/components/searchable-tree.md +0 -200
  321. package/docs/components/section-block.md +0 -483
  322. package/docs/components/select.md +0 -709
  323. package/docs/components/simple-select.md +0 -741
  324. package/docs/components/skeleton.md +0 -706
  325. package/docs/components/slide-date-picker.md +0 -837
  326. package/docs/components/spin-loading.md +0 -696
  327. package/docs/components/stepper.md +0 -316
  328. package/docs/components/switch.md +0 -770
  329. package/docs/components/tab-form-item.md +0 -773
  330. package/docs/components/tab-switch.md +0 -170
  331. package/docs/components/table-dnd-wrapper.md +0 -107
  332. package/docs/components/table.md +0 -1088
  333. package/docs/components/text-editor.md +0 -735
  334. package/docs/components/textarea.md +0 -681
  335. package/docs/components/timeline.md +0 -254
  336. package/docs/components/toast.md +0 -773
  337. package/docs/components/toggle-button.md +0 -643
  338. package/docs/components/toggle.md +0 -882
  339. package/docs/components/tooltip.md +0 -513
  340. package/docs/components/transparent-label.md +0 -721
  341. package/docs/components/tree-drop-down.md +0 -740
  342. package/docs/components/tree-folder.md +0 -110
  343. package/docs/components/tree-sub-layout.md +0 -707
  344. package/docs/explanation/architecture.md +0 -54
  345. package/docs/explanation/design-system.md +0 -52
  346. package/docs/how-to/form-and-list-recipes.md +0 -386
  347. package/docs/how-to/forms-with-form-builder.md +0 -472
  348. package/docs/how-to/guides.md +0 -1027
  349. package/docs/migration/changelog.md +0 -60
  350. package/docs/migration/form-builder-2.5.2.md +0 -113
  351. package/docs/reference/cli.md +0 -112
  352. package/docs/reference/components.md +0 -572
  353. package/docs/reference/hooks.md +0 -1523
  354. package/docs/reference/providers.md +0 -866
  355. package/docs/reference/tailwind-plugins.md +0 -942
  356. package/docs/reference/theme.md +0 -85
  357. package/docs/reference/types.md +0 -1016
  358. package/docs/reference/utilities.md +0 -726
  359. package/docs/tutorials/building-first-form.md +0 -846
  360. package/docs/tutorials/component-composition.md +0 -882
  361. package/docs/tutorials/getting-started.md +0 -302
  362. package/docs/tutorials/theming-basics.md +0 -785
@@ -1,198 +0,0 @@
1
- "use client";
2
-
3
- import { useForm, type FieldValues } from "react-hook-form";
4
-
5
- import { cn } from "../../utils/cn";
6
- import { Form } from "../Form";
7
- import { LoadingContext, DirectionContext, FormIdContext } from "./context";
8
- import { markFieldKind } from "./field-kind";
9
- import type { FormBuilderRootProps } from "./types";
10
- import {
11
- TextField,
12
- EmailField,
13
- PasswordField,
14
- NumberField,
15
- CurrencyField,
16
- TextareaField,
17
- SelectField,
18
- SearchableSelectField,
19
- MultiSelectField,
20
- CheckboxField,
21
- RadioCardsField,
22
- RadioListField,
23
- CheckboxGroupField,
24
- SwitchBoxField,
25
- DateField,
26
- OtpField,
27
- TreeSelectField,
28
- SliderField,
29
- ColorField,
30
- SignatureField,
31
- PhoneField,
32
- FieldArray,
33
- TableField,
34
- FileField,
35
- RichTextField,
36
- CustomField,
37
- } from "./fields";
38
- import { SubmitButton } from "./submit";
39
-
40
- // ─── Root ────────────────────────────────────────────────────────────────────
41
-
42
- function FormBuilderRoot<T extends FieldValues = FieldValues>({
43
- children,
44
- id,
45
- form: formProp,
46
- onSubmit,
47
- onInvalid,
48
- resolver,
49
- defaultValues,
50
- values,
51
- loading = false,
52
- fieldDirection,
53
- resetOnSuccess,
54
- className,
55
- }: FormBuilderRootProps<T>) {
56
- // Hooks can't be conditional, so always create one; `formProp` wins when given
57
- // (the caller hoisted `useForm` to share values with something outside the form).
58
- const ownForm = useForm<T>({ resolver, defaultValues, values });
59
- const form = formProp ?? ownForm;
60
- // Don't force a direction — left undefined, FieldSection uses its responsive `flexible`
61
- // layout (stacked on small screens, two-column at `lg`). Only a caller-set `fieldDirection`
62
- // (e.g. vertical inside a drawer) pins it.
63
- const direction = fieldDirection;
64
-
65
- const handleValid = async (v: T) => {
66
- await onSubmit(v);
67
- if (resetOnSuccess) form.reset();
68
- };
69
-
70
- // The `<form>` IS the outermost element — FormBuilder draws no frame of its own. `gap-4` is the
71
- // spacing between sections, which is field structure; `@container` scopes any container query a
72
- // field wants to the form's own width. Everything that used to wrap this — the page gutters, the
73
- // scroll shell, the header, the stepper rail, the summary column — belongs to `FormRenderer`.
74
- //
75
- // `className` lands here, so a parent still lays the form out (e.g. `flex-1 min-h-0`).
76
- return (
77
- <FormIdContext.Provider value={id}>
78
- <LoadingContext.Provider value={loading}>
79
- <DirectionContext.Provider value={direction}>
80
- <Form {...form}>
81
- <form
82
- id={id}
83
- className={cn("flex w-full min-w-0 flex-col gap-4 @container", className)}
84
- onSubmit={form.handleSubmit(handleValid, onInvalid)}
85
- >
86
- {children}
87
- </form>
88
- </Form>
89
- </DirectionContext.Provider>
90
- </LoadingContext.Provider>
91
- </FormIdContext.Provider>
92
- );
93
- }
94
-
95
- /**
96
- * FormBuilder — a compound, composition-based form. Author a form as JSX:
97
- *
98
- * ```tsx
99
- * <FormBuilder onSubmit={fn} resolver={r} defaultValues={d}>
100
- * <FormBuilder.Text name="name" label="Name" required />
101
- * <FormBuilder.Select name="category" label="Category" options={CATEGORY} />
102
- * </FormBuilder>
103
- * ```
104
- *
105
- * **FormBuilder is the fields and nothing else** — the `<form>`, its react-hook-form context and
106
- * the field components. Each field draws its own `FieldSection` row (label, required marker,
107
- * hint); beyond that FormBuilder draws no frame at all: no titled section cards, no page gutters,
108
- * no scroll shell, no title header, no stepper rail, no summary column. Rendered bare it fills
109
- * whatever you put it in, which is what an embedded form — a settings rail, a `DataViews` filter
110
- * panel — wants.
111
- *
112
- * For a real page or drawer form, wrap it in `FormRenderer`, which owns all of that chrome:
113
- * `display` (page vs drawer), `header`, `actions`, `summary`, `FormRenderer.Section` and the
114
- * wizard (`FormRenderer.Stepper` + `FormRenderer.Step`).
115
- *
116
- * `FormBuilder.Submit` stays here — it is the form's own submit button, wired to the `<form>` by
117
- * id so it works even when the chrome renders it outside the element.
118
- */
119
- export const FormBuilder = Object.assign(FormBuilderRoot, {
120
- // fields
121
- Text: TextField,
122
- Email: EmailField,
123
- Password: PasswordField,
124
- Number: NumberField,
125
- Currency: CurrencyField,
126
- Textarea: TextareaField,
127
- Select: SelectField,
128
- SearchableSelect: SearchableSelectField,
129
- MultiSelect: MultiSelectField,
130
- Tags: MultiSelectField,
131
- RadioList: RadioListField,
132
- RadioCards: RadioCardsField,
133
- Checkbox: CheckboxField,
134
- CheckboxGroup: CheckboxGroupField,
135
- SwitchBox: SwitchBoxField,
136
- Otp: OtpField,
137
- TreeSelect: TreeSelectField,
138
- Slider: SliderField,
139
- Color: ColorField,
140
- Signature: SignatureField,
141
- Phone: PhoneField,
142
- FieldArray: FieldArray,
143
- Table: TableField,
144
- Date: DateField,
145
- DateRange: (props: Parameters<typeof DateField>[0]) => <DateField {...props} mode="range" />,
146
- DateMultiple: (props: Parameters<typeof DateField>[0]) => (
147
- <DateField {...props} mode="multiple" />
148
- ),
149
- DateTime: (props: Parameters<typeof DateField>[0]) => <DateField {...props} timePicker />,
150
- File: FileField,
151
- Image: (props: Parameters<typeof FileField>[0]) => <FileField {...props} image />,
152
- RichText: RichTextField,
153
- Custom: CustomField,
154
- // the form's own submit button
155
- Submit: SubmitButton,
156
- });
157
-
158
- /**
159
- * What each field produces, for consumers that read a form they did not author.
160
- *
161
- * Stamped here rather than on the field definitions because the aliases — `DateRange`, `Tags`,
162
- * `Image` — only exist in the table above, and a reader checking "is this list complete?" should
163
- * have one place to look. `Tags` and `MultiSelect` are the same component, so the repeat is
164
- * harmless.
165
- */
166
- (
167
- [
168
- [FormBuilder.Text, "text"],
169
- [FormBuilder.Email, "text"],
170
- [FormBuilder.Password, "text"],
171
- [FormBuilder.Textarea, "text"],
172
- [FormBuilder.Otp, "text"],
173
- [FormBuilder.Color, "text"],
174
- [FormBuilder.Phone, "text"],
175
- [FormBuilder.Number, "number"],
176
- [FormBuilder.Currency, "number"],
177
- [FormBuilder.Select, "choice"],
178
- [FormBuilder.SearchableSelect, "choice"],
179
- [FormBuilder.RadioList, "choice"],
180
- [FormBuilder.RadioCards, "choice"],
181
- [FormBuilder.MultiSelect, "multiChoice"],
182
- [FormBuilder.Tags, "multiChoice"],
183
- [FormBuilder.CheckboxGroup, "multiChoice"],
184
- [FormBuilder.TreeSelect, "multiChoice"],
185
- [FormBuilder.Checkbox, "boolean"],
186
- [FormBuilder.SwitchBox, "boolean"],
187
- [FormBuilder.Date, "date"],
188
- [FormBuilder.DateRange, "date"],
189
- [FormBuilder.DateTime, "date"],
190
- [FormBuilder.DateMultiple, "date"],
191
- [FormBuilder.Slider, "slider"],
192
- [FormBuilder.Custom, "custom"],
193
- [FormBuilder.File, "custom"],
194
- [FormBuilder.Image, "custom"],
195
- [FormBuilder.Signature, "custom"],
196
- [FormBuilder.RichText, "custom"],
197
- ] as const
198
- ).forEach(([component, kind]) => markFieldKind(component, kind));
@@ -1,31 +0,0 @@
1
- export { FormBuilder } from "./form-builder";
2
- export { fieldKindOf, markFieldKind } from "./field-kind";
3
- export { RichTextField } from "../TextEditor/RichTextField";
4
- export type { FieldDirection, CellMode } from "./context";
5
- export type {
6
- BaseFieldProps,
7
- FieldKind,
8
- OptionItem,
9
- SelectFieldProps,
10
- SearchableSelectFieldProps,
11
- OptionsFieldProps,
12
- CurrencyFieldProps,
13
- FileFieldProps,
14
- CustomFieldProps,
15
- DateFieldProps,
16
- OtpFieldProps,
17
- RadioCardOption,
18
- RadioCardsFieldProps,
19
- SwitchBoxFieldProps,
20
- CheckboxFieldProps,
21
- TreeSelectFieldProps,
22
- PasswordFieldProps,
23
- SliderFieldProps,
24
- ColorFieldProps,
25
- SignatureFieldProps,
26
- PhoneFieldProps,
27
- FieldArrayProps,
28
- TableColumn,
29
- TableFieldProps,
30
- FormBuilderRootProps,
31
- } from "./types";
@@ -1,16 +0,0 @@
1
- const nf = new Intl.NumberFormat("en-US", { maximumFractionDigits: 20 });
2
-
3
- /** Format a number with thousands separators (e.g. 1299 → "1,299"). Blank for empty. */
4
- export function formatNumber(value: unknown): string {
5
- if (value == null || value === "") return "";
6
- const n = typeof value === "number" ? value : Number(String(value).replace(/,/g, ""));
7
- return Number.isNaN(n) ? "" : nf.format(n);
8
- }
9
-
10
- /** Parse a possibly comma-formatted string to a number (or undefined when blank). */
11
- export function parseNumber(raw: string): number | undefined {
12
- const cleaned = raw.replace(/,/g, "").trim();
13
- if (cleaned === "" || cleaned === "-" || cleaned === ".") return undefined;
14
- const n = Number(cleaned);
15
- return Number.isNaN(n) ? undefined : n;
16
- }
@@ -1,67 +0,0 @@
1
- "use client";
2
-
3
- import { ReactNode } from "react";
4
-
5
- import { cn } from "../../utils/cn";
6
- import { Button } from "../Button";
7
- import { useFormId, useLoading } from "./context";
8
-
9
- export interface SubmitButtonProps {
10
- children?: ReactNode;
11
- className?: string;
12
- loadingText?: ReactNode;
13
- /**
14
- * The form to submit, by `id`. Defaults to the enclosing FormBuilder's own form id (via
15
- * context), so a bare `<FormBuilder.Submit>` works even in a header / action bar rendered
16
- * **outside** the `<form>` element. Set it explicitly only to target a different form.
17
- */
18
- form?: string;
19
- /**
20
- * LOCAL PATCH (Contact Center): upstream removed this in 2.5.5, leaving no way to
21
- * disable a Save. Re-apply after any `npx torch-glare update`.
22
- *
23
- * Disable the button while leaving the form readable.
24
- *
25
- * Used by permission gating: someone with read access should still SEE a
26
- * record, so a Save they may not use is disabled rather than removed --
27
- * a missing button looks broken, a disabled one says "not yours to change".
28
- * The server refuses the write either way.
29
- */
30
- disabled?: boolean;
31
- }
32
-
33
- /** `FormBuilder.Submit` — a loading-aware submit button, hidden in view mode. */
34
- export function SubmitButton({
35
- children,
36
- className,
37
- loadingText,
38
- form,
39
- disabled,
40
- }: SubmitButtonProps) {
41
- const loading = useLoading();
42
- const ctxFormId = useFormId();
43
-
44
- return (
45
- <Button
46
- type="submit"
47
- // Defaults to the enclosing form's id, so a Save in the header (outside the `<form>`)
48
- // still submits it via native form-association.
49
- form={form ?? ctxFormId}
50
- // The blue fill, because Save is the form's primary action and a primary action is blue.
51
- // Deliberately not a prop: a form has one primary action, and letting each caller pick a
52
- // variant is how the rule stops being a rule.
53
- variant="BluColStyle"
54
- is_loading={loading}
55
- // LOCAL PATCH (Contact Center) -- see `disabled` in SubmitButtonProps.
56
- disabled={disabled}
57
- // `w-fit` because the FormBuilder root is a flex COLUMN: a direct child with `width: auto`
58
- // inherits `align-items: stretch` and spans the whole form. Sections want that (SectionBlock
59
- // sets its own `w-full`); a Save button does not. `w-fit` rather than `self-start` so the
60
- // header action bar — a row with `items-center` — is untouched at every button size.
61
- // Merged through `cn` so a caller can still opt into `className="w-full"` in a narrow drawer.
62
- className={cn("w-fit", className)}
63
- >
64
- {loading ? (loadingText ?? children ?? "Saving…") : (children ?? "Save")}
65
- </Button>
66
- );
67
- }
@@ -1,316 +0,0 @@
1
- import { ReactNode } from "react";
2
- import type {
3
- ControllerRenderProps,
4
- ControllerFieldState,
5
- DefaultValues,
6
- FieldErrors,
7
- FieldValues,
8
- Resolver,
9
- UseFormReturn,
10
- } from "react-hook-form";
11
- import type { FieldDirection } from "./context";
12
- import type { SectionColor } from "../SectionBlock";
13
-
14
- /**
15
- * What shape of value a field produces, stamped on each `FormBuilder.*` field component.
16
- *
17
- * This is for consumers that have to interpret a form they did not author — `DataViews.Filters`
18
- * reads it to decide whether a child's value becomes a list, a numeric range or a date range. It
19
- * describes the field, not any one consumer's use of it.
20
- *
21
- * Read it with `fieldKindOf(element)` rather than comparing `element.type` against an imported
22
- * component: identity comparison breaks across duplicated module instances and stops matching
23
- * after a hot reload.
24
- */
25
- export type FieldKind =
26
- /** A string value — `Text`, `Textarea`, `Email`, `Password`, `Color`, `Phone`, `Otp`. */
27
- | "text"
28
- /** A number — `Number`, `Currency`. */
29
- | "number"
30
- /** One of a supplied list — `Select`, `SearchableSelect`, `RadioList`, `RadioCards`. */
31
- | "choice"
32
- /** Several of a supplied list — `MultiSelect`, `Tags`, `CheckboxGroup`, `TreeSelect`. */
33
- | "multiChoice"
34
- /** A boolean — `Checkbox`, `SwitchBox`. */
35
- | "boolean"
36
- /** A date or date range — `Date`, `DateRange`, `DateTime`, `DateMultiple`. */
37
- | "date"
38
- /** Two numbers when `range`, otherwise one — `Slider`. */
39
- | "slider"
40
- /** Whatever the caller renders — `Custom`, `File`, `Image`, `Signature`, `RichText`. */
41
- | "custom";
42
-
43
- /** Props shared by every `FormBuilder.*` field. `name` is the RHF path. */
44
- /**
45
- * One alert under a field. Mirrors `FieldHint`'s own props so the design system stays the single
46
- * source of truth for how each state looks.
47
- */
48
- export interface FieldHintSpec {
49
- label: ReactNode;
50
- state?: "info" | "warning" | "error" | "success";
51
- icon?: ReactNode;
52
- }
53
-
54
- export interface BaseFieldProps {
55
- name: string;
56
- label?: ReactNode;
57
- placeholder?: string;
58
- description?: ReactNode;
59
- required?: boolean;
60
- disabled?: boolean;
61
- hidden?: boolean;
62
- /** Span the full section width. */
63
- fullWidth?: boolean;
64
- /**
65
- * Alerts stacked under the field. The validation error, when there is one, always renders first —
66
- * it is the actionable message — and these follow in order. Ignored in `bare` mode (a
67
- * `FormBuilder.Table` cell), where errors surface as a tooltip to keep the row one line tall.
68
- */
69
- hints?: FieldHintSpec[];
70
- }
71
-
72
- export interface OptionItem {
73
- label: string;
74
- value: string;
75
- icon?: ReactNode;
76
- /** Secondary row label — shown by `FormBuilder.RadioList` / `.CheckboxGroup`. */
77
- description?: string;
78
- }
79
-
80
- /** `FormBuilder.Select` / `.SearchableSelect` — supports async option loading. */
81
- /** `FormBuilder.Select` — the plain `Select` dropdown. */
82
- export interface SelectFieldProps extends BaseFieldProps {
83
- options: OptionItem[];
84
- }
85
-
86
- /**
87
- * `FormBuilder.SearchableSelect` — the `SearchableSelect` combobox: a search box with
88
- * client-side filtering, or server-side search + infinite scroll via the async props.
89
- */
90
- export interface SearchableSelectFieldProps extends SelectFieldProps {
91
- /** Filter `options` locally (default). Set false for server-side search. */
92
- filterClientSide?: boolean;
93
- /** Debounced as the user types — refetch your data here. */
94
- onSearchChange?: (query: string) => void;
95
- /** Called when the list bottom scrolls into view and `hasMore && !loading`. */
96
- onLoadMore?: () => void;
97
- hasMore?: boolean;
98
- loading?: boolean;
99
- }
100
-
101
- /** `FormBuilder.MultiSelect` / `.Tags`, `.Radio`. */
102
- export interface OptionsFieldProps extends BaseFieldProps {
103
- options: OptionItem[];
104
- /**
105
- * LOCAL PATCH (Contact Center): `MultiSelect`/`Tags` only — let the user type a value that is
106
- * not in `options` and have it become a badge. Pass `options={[]}` for a pure free-text list.
107
- */
108
- creatable?: boolean;
109
- }
110
-
111
- /** `FormBuilder.Currency`. */
112
- export interface CurrencyFieldProps extends BaseFieldProps {
113
- currencySymbol?: ReactNode;
114
- }
115
-
116
- /** `FormBuilder.File` / `.Image`. */
117
- export interface FileFieldProps extends BaseFieldProps {
118
- accept?: string;
119
- multiple?: boolean;
120
- }
121
-
122
- /** `FormBuilder.Custom` — bring your own control, keeping the FieldSection + validation wiring. */
123
- export interface CustomFieldProps extends BaseFieldProps {
124
- render: (args: {
125
- field: ControllerRenderProps<FieldValues, string>;
126
- fieldState: ControllerFieldState;
127
- }) => ReactNode;
128
- }
129
-
130
- /** `FormBuilder.Date` / `.DateRange` / `.DateMultiple` / `.DateTime`. */
131
- export interface DateFieldProps extends BaseFieldProps {
132
- mode?: "single" | "multiple" | "range";
133
- timePicker?: boolean;
134
- /** Display format, e.g. "yyyy/MM/dd" (DatePicker default). */
135
- dateFormat?: string;
136
- }
137
-
138
- /** `FormBuilder.Otp` — code input; value is a string of `length` digits. */
139
- export interface OtpFieldProps extends BaseFieldProps {
140
- /** Number of digit slots (default 6). */
141
- length?: number;
142
- }
143
-
144
- /** `FormBuilder.SwitchBox` — a switch inside a `#f9f9f9` field box. */
145
- export interface SwitchBoxFieldProps extends BaseFieldProps {
146
- /** Text shown inside the box, left of the divider (the design's "Sub-Field-Header"). */
147
- subLabel?: string;
148
- }
149
-
150
- /** `FormBuilder.Checkbox` — a single boolean checkbox with an optional inline label. */
151
- export interface CheckboxFieldProps extends BaseFieldProps {
152
- /** Text shown inline next to the checkbox (in addition to the field `label`). */
153
- subLabel?: string;
154
- }
155
-
156
- /** One option for `FormBuilder.RadioCards`. */
157
- export interface RadioCardOption {
158
- label: ReactNode;
159
- value: string;
160
- description?: ReactNode;
161
- disabled?: boolean;
162
- }
163
-
164
- /** `FormBuilder.RadioCards` — radio options rendered as cards. */
165
- export interface RadioCardsFieldProps extends BaseFieldProps {
166
- options: RadioCardOption[];
167
- }
168
-
169
- /** `FormBuilder.TreeSelect` (SearchableTree) — hierarchical single-select; value = node id. */
170
- export interface TreeSelectFieldProps<T = unknown> extends BaseFieldProps {
171
- nodes: T[];
172
- getNodeId: (node: T) => string;
173
- getNodeLabel: (node: T) => ReactNode;
174
- /** Nested data: expose each node's children. */
175
- getNodeChildren?: (node: T) => T[] | undefined;
176
- /** Flat data: the key on each node pointing at its parent's id. */
177
- parentIdKey?: string;
178
- /** Allow selecting branch (folder) nodes too. */
179
- selectableFolders?: boolean;
180
- }
181
-
182
- /** `FormBuilder.Password` — optionally show a strength meter. */
183
- export interface PasswordFieldProps extends BaseFieldProps {
184
- strengthMeter?: boolean;
185
- }
186
-
187
- /** `FormBuilder.Slider` — numeric slider; value `number` (or `[number, number]` with `range`). */
188
- export interface SliderFieldProps extends BaseFieldProps {
189
- min?: number;
190
- max?: number;
191
- step?: number;
192
- /** Two thumbs — value becomes `[number, number]`. */
193
- range?: boolean;
194
- /** Appended to the value readout, e.g. `"%"` → `50%`. */
195
- suffix?: string;
196
- }
197
-
198
- /** `FormBuilder.Color` — color picker; value hex `string`. */
199
- export interface ColorFieldProps extends BaseFieldProps {
200
- presets?: string[];
201
- /** Enable the opacity slider and `#rrggbbaa` output (default true). */
202
- alpha?: boolean;
203
- }
204
-
205
- /** `FormBuilder.Phone` — country dial-code + number; value `string`. */
206
- export interface PhoneFieldProps extends BaseFieldProps {
207
- defaultCountry?: string;
208
- }
209
-
210
- /** `FormBuilder.Signature` — freehand signature pad; value is a PNG data-URL `string`. */
211
- export interface SignatureFieldProps extends BaseFieldProps {
212
- /** Stroke color (default `#111827`). */
213
- penColor?: string;
214
- }
215
-
216
- /** `FormBuilder.FieldArray` — a repeating list of sub-fields (RHF `useFieldArray`). */
217
- export interface FieldArrayProps {
218
- name: string;
219
- label?: ReactNode;
220
- description?: ReactNode;
221
- hidden?: boolean;
222
- addLabel?: ReactNode;
223
- /** Value for a newly-added row. */
224
- defaultItem?: Record<string, unknown>;
225
- /** Render a row's sub-fields; use names like `${rowName}.field`. */
226
- children: (rowName: string, index: number, remove: () => void) => ReactNode;
227
- }
228
-
229
- /** One column of `FormBuilder.Table`. `cell` renders any `FormBuilder.*` field for a row. */
230
- export interface TableColumn {
231
- header: ReactNode;
232
- /** Fixed column width in px (otherwise the column sizes to content). */
233
- width?: number;
234
- align?: "start" | "center" | "end";
235
- /**
236
- * The row-object key this column edits. Set it to make the column header **sortable** — a
237
- * sort toggle appears and clicking it reorders the rows by this key (asc/desc). Omit for
238
- * non-sortable columns.
239
- */
240
- sortKey?: string;
241
- /**
242
- * Render the cell's field. `rowName` is the array path for this row (e.g. `lines.0`), so name
243
- * sub-fields `${rowName}.<key>`. The field renders "bare" (control only, error as a tooltip).
244
- */
245
- cell: (rowName: string, index: number) => ReactNode;
246
- }
247
-
248
- /**
249
- * `FormBuilder.Table` — an editable table field (built on RHF `useFieldArray`). Each row is a
250
- * record; each column cell is any `FormBuilder.*` field. Supports per-row checkbox selection
251
- * (+ select-all + bulk delete), drag-drop reordering, and add/remove rows. Renders inside a
252
- * `SectionBlock`, so place it as a top-level child (not inside a `FormRenderer.Section`).
253
- */
254
- export interface TableFieldProps {
255
- name: string;
256
- /** SectionBlock title. */
257
- title?: ReactNode;
258
- /** SectionBlock color badge (default `"Blue"`). */
259
- color?: SectionColor;
260
- icon?: ReactNode;
261
- description?: ReactNode;
262
- hidden?: boolean;
263
- columns: TableColumn[];
264
- /** Value for a newly-added row. */
265
- defaultItem?: Record<string, unknown>;
266
- addLabel?: ReactNode;
267
- /** Per-row checkboxes + select-all + bulk delete (default `true`). */
268
- selectable?: boolean;
269
- /** Drag-drop row reordering (default `true`). */
270
- reorderable?: boolean;
271
- }
272
-
273
- /** Root `<FormBuilder>` props. */
274
- export interface FormBuilderRootProps<T extends FieldValues = FieldValues> {
275
- children: ReactNode;
276
- /** `id` on the underlying `<form>` — lets an outside button submit it via `form={id}`. */
277
- id?: string;
278
- /**
279
- * An existing react-hook-form instance. Pass one when something **outside** the
280
- * form needs the same values — e.g. a `FormSummary` rendered beside it:
281
- *
282
- * ```tsx
283
- * const form = useForm({ resolver, defaultValues })
284
- * <FormBuilder form={form} …>…</FormBuilder>
285
- * <FormSummary form={form}>…</FormSummary>
286
- * ```
287
- *
288
- * When omitted, FormBuilder creates its own from `resolver`/`defaultValues`/`values`.
289
- */
290
- form?: UseFormReturn<T>;
291
- onSubmit: (values: T) => void | Promise<void>;
292
- onInvalid?: (errors: FieldErrors<T>) => void;
293
- /** RHF resolver — e.g. `zodResolver(schema)`. Library stays validation-agnostic. */
294
- resolver?: Resolver<T>;
295
- defaultValues?: DefaultValues<T>;
296
- /** Controlled values for edit — the form re-syncs when this changes. */
297
- values?: T;
298
- /** Loading flag — Submit shows a spinner and inputs disable. */
299
- loading?: boolean;
300
- /**
301
- * Field row direction. Unset means `"flexible"` — stacked, then label-beside-control once the
302
- * field row passes the container `md` breakpoint. `FormRenderer` pins `"vertical"` in a drawer;
303
- * pass `"flexible"` there to get the responsive layout back.
304
- */
305
- fieldDirection?: FieldDirection;
306
- /** Reset to defaults after a successful submit. */
307
- resetOnSuccess?: boolean;
308
- /**
309
- * Lands on the `<form>` element itself — FormBuilder renders nothing around it. Use it to let
310
- * the form fill its parent (e.g. `"flex-1 min-h-0"` inside a flex column that has a height).
311
- *
312
- * There is no `layout` prop: the fields always fill their container. The page framing that
313
- * used to live here — the 1100px cap and 48px gutters — belongs to `FormRenderer`.
314
- */
315
- className?: string;
316
- }