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,358 +0,0 @@
1
- "use client";
2
-
3
- import { Children, useId, type ReactElement, type ReactNode } from "react";
4
- import { useForm, type Control, type FieldValues } from "react-hook-form";
5
-
6
- import { cn } from "../../utils/cn";
7
- import { FormBuilder } from "../FormBuilder";
8
- import { FormIdContext, LoadingContext } from "../FormBuilder/context";
9
- import {
10
- DetailSidebar,
11
- DetailTab,
12
- DetailGrid,
13
- DetailRow,
14
- DetailTabsView,
15
- isDetailSidebarElement,
16
- isDetailTabElement,
17
- } from "./detail";
18
- import { FormDrawer } from "./FormDrawer";
19
- import { FormHeaderBar } from "./header";
20
- import { NotchAction, isNotchActionElement } from "./notch-action";
21
- import { Section } from "./section";
22
- import {
23
- Back,
24
- Next,
25
- Step,
26
- StepSlot,
27
- Stepper,
28
- StepperActions,
29
- StepperContext,
30
- StepperNav,
31
- isStepElement,
32
- isStepperElement,
33
- useStepperState,
34
- type StepProps,
35
- } from "./stepper";
36
- import type { FormRendererProps } from "./types";
37
-
38
- /**
39
- * FormRenderer — the chrome around a `FormBuilder`.
40
- *
41
- * `FormBuilder` is the fields and nothing else: a `<form>`, its react-hook-form context, and the
42
- * field components. Every pixel drawn *around* those fields is here — page-vs-drawer display, the
43
- * absolute title header, the `actions` bar, titled `FormRenderer.Section` cards, the page gutters,
44
- * the scroll shell, the wizard rail (`FormRenderer.Stepper`), and the `summary` column.
45
- *
46
- * FormRenderer never manufactures a Submit — you compose it and hand it to `actions`
47
- * (`actions={<FormBuilder.Submit>Save</FormBuilder.Submit>}`). It renders in the form's header
48
- * action pill (page) or the drawer header (drawer), and auto-targets this form.
49
- *
50
- * Give it `FormRenderer.Sidebar` + `FormRenderer.Tab` children instead of fields and it switches to
51
- * a **detail-tabs** view: a display-only page (no `<form>`) whose sidebar swaps
52
- * `FormRenderer.Section` panels — the sidebar sits where a stepper's rail would.
53
- */
54
- function FormRendererRoot<T extends FieldValues = FieldValues>({
55
- children,
56
- id,
57
- onSubmit,
58
- onInvalid,
59
- resolver,
60
- defaultValues,
61
- values,
62
- loading,
63
- resetOnSuccess,
64
- fieldDirection,
65
- form,
66
- display = "page",
67
- header,
68
- summary,
69
- className,
70
- actions,
71
- open = false,
72
- onOpenChange,
73
- title,
74
- badge,
75
- onOpenInNewTab,
76
- // LOCAL PATCH (Contact Center): detail-tabs control — see FormRendererProps.
77
- activeTab,
78
- onTabChange,
79
- embedded,
80
- // LOCAL PATCH (Contact Center): external stepper control — see FormRendererProps.
81
- activeStep,
82
- onStepChange,
83
- // LOCAL PATCH (Contact Center): drawer layout — see FormRendererProps.
84
- drawer,
85
- }: FormRendererProps<T>) {
86
- const isDrawer = display === "drawer";
87
-
88
- // FormRenderer owns the display decision: a drawer form lays out vertically.
89
- const effectiveDirection = fieldDirection ?? (isDrawer ? "vertical" : undefined);
90
- // The absolute title header is a page concern — the drawer has its own header.
91
- const useHeader = !!header && !isDrawer;
92
- // A stable `id` lets a button OUTSIDE the form submit it via `form={id}` (the header action
93
- // pill / drawer header). Falls back to a generated id, provided to the Submit via context.
94
- const autoId = useId();
95
- const formId = id ?? autoId;
96
-
97
- // The form instance is created HERE, not in FormBuilder, because the stepper needs `trigger` to
98
- // validate a step before advancing — and the rail that calls it renders outside the `<form>`.
99
- // Same pattern FormBuilder uses: one is always created (hooks can't be conditional), the
100
- // caller's hoisted instance wins when given.
101
- const ownForm = useForm<T>({ resolver, defaultValues, values });
102
- const formInstance = form ?? ownForm;
103
-
104
- const childArray = Children.toArray(children);
105
-
106
- // Detail-tabs mode: a `FormRenderer.Sidebar` + `FormRenderer.Tab` children mean a display-only
107
- // detail page (no `<form>`) — the sidebar swaps Section panels via Radix Tabs. Detected here so
108
- // the form props below are simply unused.
109
- const detailSidebar = childArray.find(isDetailSidebarElement);
110
- const detailTabs = childArray.filter(isDetailTabElement);
111
-
112
- // Split out a `FormRenderer.Stepper`: its Steps become the visibility-toggled slots inside the
113
- // `<form>`, its non-Step children a footer, and its state drives the rail beside them.
114
- // LOCAL PATCH (Contact Center): lift `FormRenderer.NotchAction` children out of the form
115
- // body and into the drawer's notch. Authored as children so the caller owns the label (and
116
- // therefore its translation) instead of the component hardcoding English — see notch-action.tsx.
117
- const notchActions = childArray.filter(isNotchActionElement);
118
- const bodyChildren = notchActions.length
119
- ? childArray.filter((n) => !isNotchActionElement(n))
120
- : children;
121
-
122
- const stepperEl = childArray.find(isStepperElement);
123
- const stepChildren = stepperEl ? Children.toArray(stepperEl.props.children) : [];
124
- const steps = stepChildren.filter(isStepElement) as ReactElement<StepProps>[];
125
- const stepExtras = stepChildren.filter((n) => !isStepElement(n));
126
- const isStepper = !!stepperEl;
127
-
128
- // Called unconditionally (inert when there are no steps) to keep hooks order stable.
129
- const stepper = useStepperState(
130
- steps,
131
- formInstance.trigger as Parameters<typeof useStepperState>[1],
132
- // LOCAL PATCH (Contact Center): undefined `activeStep` leaves the stepper uncontrolled.
133
- { activeStep, onStepChange },
134
- );
135
-
136
- if (detailSidebar && detailTabs.length > 0) {
137
- const detailView = (
138
- <DetailTabsView
139
- // In a drawer the tray already paints the surface and the drawer header carries the
140
- // title, so the view drops its own card and its own floating header.
141
- header={isDrawer ? undefined : header}
142
- actions={isDrawer ? undefined : actions}
143
- sidebar={detailSidebar}
144
- tabs={detailTabs}
145
- className={className}
146
- // LOCAL PATCH (Contact Center): lets the caller keep the tab in the URL, and render
147
- // inside a surface that already draws its own card. Both optional.
148
- value={activeTab}
149
- onValueChange={onTabChange}
150
- embedded={embedded ?? isDrawer}
151
- />
152
- );
153
-
154
- // LOCAL PATCH (Contact Center): a detail view can be a DRAWER too.
155
- //
156
- // Upstream returned the detail surface here unconditionally, *before* the `isDrawer` branch
157
- // below — so `FormRenderer.Sidebar` + `display="drawer"` silently rendered a full page inside
158
- // whatever the caller put it in, and a quick-view drawer had to be hand-rolled around the
159
- // detail view instead. A record looks the same whether you opened it from a row or from its
160
- // own route; only the surface differs, which is exactly what `display` is for.
161
- if (!isDrawer) return detailView;
162
- return (
163
- <FormDrawer
164
- open={open}
165
- onOpenChange={onOpenChange ?? (() => {})}
166
- title={title ?? header?.title}
167
- badge={badge ?? header?.label}
168
- variant={header?.variant}
169
- actions={actions}
170
- onOpenInNewTab={onOpenInNewTab}
171
- notchActions={notchActions.length > 0 ? notchActions : undefined}
172
- // `DetailTabsView` already owns its scroll container and already offsets for a header,
173
- // so the drawer must not add a second of each — that is what `bareBody` is for. The
174
- // drawer's own header still renders, carrying the title and actions.
175
- bareBody
176
- {...drawer}
177
- >
178
- {detailView}
179
- </FormDrawer>
180
- );
181
- }
182
-
183
- // The fields the `<form>` wraps: the stepper's steps (+ any custom footer extras), or the
184
- // children as authored. Every step stays mounted so the whole form is registered at all times.
185
- const fields: ReactNode = isStepper ? (
186
- <>
187
- {steps.map((step, i) => (
188
- <StepSlot key={i} index={i} active={i === stepper.currentStep}>
189
- {step.props.children}
190
- </StepSlot>
191
- ))}
192
- {stepExtras}
193
- </>
194
- ) : (
195
- bodyChildren
196
- );
197
-
198
- const formEl = (
199
- <FormBuilder
200
- id={formId}
201
- form={formInstance}
202
- onSubmit={onSubmit ?? (() => {})}
203
- onInvalid={onInvalid}
204
- loading={loading}
205
- fieldDirection={effectiveDirection}
206
- resetOnSuccess={resetOnSuccess}
207
- >
208
- {fields}
209
- </FormBuilder>
210
- );
211
-
212
- // The fields column caps at 1100px and centres — standalone, and as the middle column of the
213
- // stepper grid. This is page framing, which is why it wraps FormBuilder rather than living
214
- // inside it: a form embedded in a 260px rail has no room to give up 96px to gutters.
215
- const fieldsColumn = <div className="mx-auto w-full max-w-[1100px] px-[48px]">{formEl}</div>;
216
-
217
- // Inside the form surface: the stepper rail beside the fields. Columns never wrap — the layout
218
- // stays side-by-side at every screen size; when space runs short the fields column shrinks and
219
- // the rail's labels truncate.
220
- //
221
- // `minmax(180px,1fr)` and not a bare `1fr` on the side tracks. `1fr` means `minmax(auto,1fr)`,
222
- // whose *auto* minimum stops a track shrinking below its content — so a long step label made the
223
- // rail's track wider than the empty track opposite it, and the two side tracks being equal is the
224
- // only thing centring the middle column. Hovering a step made it visibly worse: the label's
225
- // padding grows 6px→9px on hover (FormStepper), so the centre jumped 3px every time.
226
- //
227
- // The minimum is a fixed 180px rather than `auto` precisely so it cannot depend on the labels:
228
- // both side tracks size identically whatever the rail holds, so the middle column stays centred,
229
- // and the rail still has room to be legible (a plain `minmax(0,…)` let it collapse to 0 in a
230
- // narrow preview frame). Past that floor the labels truncate instead of pushing.
231
- const bodyInner = isStepper ? (
232
- // `@container` on the wrapper, not on the grid: an element cannot query its own size, so the
233
- // measured box has to be an ancestor. It sits here rather than on the scroll body because
234
- // `bodyInner` is also used directly when there is no header, and this way both paths get a
235
- // container. The form then reacts to the width it is actually given — a rail, a drawer, a
236
- // narrow preview frame — instead of the viewport's.
237
- <div className="@container w-full">
238
- {/* Below `@lg` the balancing column is dropped: it is empty, and in a narrow container its
239
- 180px floor plus a 32px gap is width the fields column needs more than the centring.
240
- Both halves are required — a `display:none` child is not a grid item, but the third
241
- track would still be reserved if the template kept describing it. */}
242
- <div className="grid w-full grid-cols-[minmax(180px,1fr)_minmax(0,1100px)] gap-8 @lg:grid-cols-[minmax(180px,1fr)_minmax(0,1100px)_minmax(180px,1fr)]">
243
- <StepperNav control={formInstance.control as Control<FieldValues>} />
244
- {fieldsColumn}
245
- {/* Empty third column — balances the rail's gutter so the middle column is centred. */}
246
- <div className="hidden @lg:block" />
247
- </div>
248
- </div>
249
- ) : (
250
- fieldsColumn
251
- );
252
-
253
- const surface = useHeader ? (
254
- // Scroll shell: the absolute header floats over the scrollable body. No fixed height — it
255
- // fills whatever the parent gives it (like the drawer's panel fills its tray) and the body
256
- // scrolls internally.
257
- <div className="relative isolate flex h-full w-full flex-col overflow-hidden rounded-2xl bg-background-presentation-body-primary">
258
- <FormHeaderBar title={header!.title} label={header!.label} variant={header!.variant}>
259
- {/* A stepper form prepends chevron Back/Next + a divider before the Submit. */}
260
- {actions && <StepperActions>{actions}</StepperActions>}
261
- </FormHeaderBar>
262
- <div className="relative z-[1] flex min-h-0 w-full flex-1 flex-col overflow-y-auto px-6 py-6 pt-[72px] scrollbar-hide">
263
- {bodyInner}
264
- </div>
265
- </div>
266
- ) : (
267
- bodyInner
268
- );
269
-
270
- // The summary (right) lives OUTSIDE the scroll surface — its own panel beside it (mirroring the
271
- // drawer's tray, a 6px gutter). Only the surface's body scrolls; the summary stays put. In a
272
- // drawer it goes to FormDrawer's tray instead.
273
- const pageBody =
274
- summary && !isDrawer ? (
275
- <div className="flex h-full flex-row items-stretch">
276
- <div className="min-h-0 min-w-0 flex-1">{surface}</div>
277
- {/* LOCAL PATCH (Contact Center): `ms-`, not `ml-`. Under `dir="rtl"` the summary sits to
278
- the LEFT of the surface, so a physical left margin puts the gutter on its far side and
279
- the two panels butt together. */}
280
- <div className="ms-[6px] flex min-h-0">{summary}</div>
281
- </div>
282
- ) : (
283
- surface
284
- );
285
-
286
- // `className` lands on the OUTERMOST element — the one a parent lays out (e.g. `flex-1 min-h-0`
287
- // to fill a flex column). `h-full` fills a parent that has a definite height.
288
- //
289
- // The form-id and loading contexts are supplied HERE as well as inside FormBuilder, because the
290
- // header's action pill renders outside the `<FormBuilder>` subtree: a bare `FormBuilder.Submit`
291
- // in `actions` reads the id from context to target the `<form>` by native form-association.
292
- // Same reason the drawer branch below re-provides them around its own header.
293
- const inner = (
294
- <LoadingContext.Provider value={!!loading}>
295
- <FormIdContext.Provider value={formId}>
296
- <div className={cn("h-full w-full", !isDrawer && className)}>{pageBody}</div>
297
- </FormIdContext.Provider>
298
- </LoadingContext.Provider>
299
- );
300
-
301
- // One provider around the whole tree: the rail renders outside the `<form>`, the step slots
302
- // inside it, and both read the same state.
303
- const tree = isStepper ? (
304
- <StepperContext.Provider value={stepper}>{inner}</StepperContext.Provider>
305
- ) : (
306
- inner
307
- );
308
-
309
- if (isDrawer) {
310
- return (
311
- <FormDrawer
312
- open={open}
313
- onOpenChange={onOpenChange ?? (() => {})}
314
- title={title ?? header?.title}
315
- badge={badge ?? header?.label}
316
- variant={header?.variant}
317
- summary={summary}
318
- // The drawer header sits outside the `<form>`, so re-supply the form-id and loading
319
- // context a bare `FormBuilder.Submit` reads (on the page it gets these from the tree).
320
- actions={
321
- actions ? (
322
- <LoadingContext.Provider value={!!loading}>
323
- <FormIdContext.Provider value={formId}>{actions}</FormIdContext.Provider>
324
- </LoadingContext.Provider>
325
- ) : undefined
326
- }
327
- onOpenInNewTab={onOpenInNewTab}
328
- notchActions={notchActions.length > 0 ? notchActions : undefined}
329
- {...drawer}
330
- >
331
- {tree}
332
- </FormDrawer>
333
- );
334
- }
335
-
336
- return tree;
337
- }
338
-
339
- /**
340
- * FormRenderer — see {@link FormRendererRoot}. The compound statics are the form's chrome:
341
- *
342
- * - `FormRenderer.Section` — a titled card grouping fields (or display rows).
343
- * - `FormRenderer.Stepper` / `.Step` — the wizard; `.Back` / `.Next` are the chevron controls,
344
- * which the header's action bar already prepends for you.
345
- * - `FormRenderer.Sidebar` / `.Tab` / `.Grid` / `.Row` — the display-only **detail-tabs** view.
346
- */
347
- export const FormRenderer = Object.assign(FormRendererRoot, {
348
- Section,
349
- Stepper,
350
- Step,
351
- Back,
352
- Next,
353
- NotchAction,
354
- Sidebar: DetailSidebar,
355
- Tab: DetailTab,
356
- Grid: DetailGrid,
357
- Row: DetailRow,
358
- });
@@ -1,88 +0,0 @@
1
- "use client";
2
-
3
- import { ReactNode } from "react";
4
-
5
- import { cn } from "../../utils/cn";
6
- import { HeaderBar } from "../HeaderBar";
7
-
8
- export type HeaderVariant = "new" | "edit" | "detail";
9
-
10
- const DEFAULT_LABEL: Record<HeaderVariant, string> = {
11
- new: "New",
12
- edit: "Edit",
13
- detail: "View",
14
- };
15
-
16
- export interface FormHeaderBarProps {
17
- /** Plain title text (uppercased), e.g. the entity label or SKU. */
18
- title: string;
19
- /** Badge text — defaults from `variant` (New / Edit / View). */
20
- label?: string;
21
- /** Colored badge variant. */
22
- variant?: HeaderVariant;
23
- /** Action buttons shown in the right-hand action pill. */
24
- children?: ReactNode;
25
- className?: string;
26
- }
27
-
28
- /**
29
- * The floating form header: a `HeaderBar` title pill on the left and a dark action
30
- * pill on the right, absolutely positioned over the scrollable body.
31
- *
32
- * Shared by all three FormRenderer surfaces — the page form, `FormDrawer` and the
33
- * detail view — so a form's title looks identical wherever it is rendered. This is
34
- * chrome, so it lives here rather than in `FormBuilder`: a bare `<FormBuilder>` is
35
- * fields and nothing else.
36
- *
37
- * Per the design both pills are 44px tall, reached differently: the title pill is
38
- * 6px padding + 32px content, the action pill 8px + 28px.
39
- */
40
- export function FormHeaderBar({
41
- title,
42
- label,
43
- variant = "new",
44
- children,
45
- className,
46
- }: FormHeaderBarProps) {
47
- return (
48
- <div
49
- className={cn(
50
- "absolute inset-x-0 top-0 z-[2] flex w-full items-start justify-between gap-2 p-1",
51
- className,
52
- )}
53
- >
54
- <HeaderBar
55
- variant={variant}
56
- label={label ?? DEFAULT_LABEL[variant]}
57
- title={title}
58
- theme="dark"
59
- />
60
-
61
- {children && (
62
- <div
63
- data-theme="dark"
64
- className="flex flex-col items-start rounded-[14px] border border-border-presentation-global-primary bg-background-presentation-form-base shadow-[0_0_32px_0_rgba(0,0,0,0.15)]"
65
- >
66
- <div className="sticky top-0 flex w-full items-center justify-between p-2">
67
- <div className="flex h-7 items-center justify-center gap-2">{children}</div>
68
- </div>
69
- </div>
70
- )}
71
- </div>
72
- );
73
- }
74
-
75
- /**
76
- * The `header` prop's shape — `header={{ title, label, variant }}` on `FormRenderer`.
77
- * There is no `FormRenderer.Header` component: the header is a prop, not a child, so a
78
- * child element can never reconfigure the surrounding layout the way the old
79
- * `FormBuilder.Header` did.
80
- */
81
- export interface HeaderConfig {
82
- /** Plain title text (uppercased), e.g. the entity label or SKU. */
83
- title: string;
84
- /** Badge text — defaults from `variant` (New / Edit / View). */
85
- label?: string;
86
- /** Colored badge variant. */
87
- variant?: HeaderVariant;
88
- }
@@ -1,17 +0,0 @@
1
- export { FormRenderer } from "./form-renderer";
2
- export { FormDrawer } from "./FormDrawer";
3
- export type { FormDrawerProps } from "./FormDrawer";
4
- export { FormHeaderBar } from "./header";
5
- export { NotchAction } from "./notch-action";
6
- export type { NotchActionProps } from "./notch-action";
7
- export type { HeaderConfig, HeaderVariant, FormHeaderBarProps } from "./header";
8
- export type { SectionProps } from "./section";
9
- export type { StepProps, StepperProps } from "./stepper";
10
- export type { FormRendererProps, FormRendererDisplay, FieldDirection } from "./types";
11
- export type {
12
- DetailSidebarProps,
13
- DetailSidebarItemProps,
14
- DetailTabProps,
15
- DetailRowProps,
16
- DetailGridProps,
17
- } from "./detail";
@@ -1,64 +0,0 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
-
5
- import { cn } from "../../utils/cn";
6
- import { DrawerNotchPill } from "../Drawer";
7
-
8
- /**
9
- * `FormRenderer.NotchAction` — a button in the drawer's notch, authored as a CHILD.
10
- *
11
- * LOCAL PATCH (Contact Center). Upstream models the one notch action it ships as a pair of
12
- * props on `FormDrawer` / `FormRenderer`: `onOpenInNewTab` (a handler) plus a hardcoded
13
- * English "Open in new tab" label. That shape has two problems:
14
- *
15
- * 1. The label is the component's, not the caller's, so a localized app cannot translate it
16
- * without a second prop — which is exactly the `openInNewTabLabel` patch we kept having
17
- * to re-apply after every `npx torch-glare update`.
18
- * 2. It only ever admits ONE action, and only that action. Anything else in the notch means
19
- * another prop pair.
20
- *
21
- * Passing the button as a child fixes both at once: the caller owns the text (so i18n is just
22
- * `{t(...)}`, no prop), owns the icon, and can render more than one. Same bargain the rest of
23
- * the library strikes — `DataViews` registers a view because you rendered it, `FormRenderer`
24
- * renders a step because you wrote a `<Step>`.
25
- *
26
- * It renders nothing where it is written: `FormRenderer` lifts it out of the children and hands
27
- * it to `FormDrawer`'s notch, the same way it lifts a `Stepper`. Ignored entirely on a page-display
28
- * form, which has no notch.
29
- *
30
- * ```tsx
31
- * <FormRenderer display="drawer" …>
32
- * <FormRenderer.NotchAction onClick={openInTab}>
33
- * {t("contacts.formShell.openInNewTab")}
34
- * <i className="ri-arrow-right-up-line text-[12px]" />
35
- * </FormRenderer.NotchAction>
36
- * <FormRenderer.Section …>…</FormRenderer.Section>
37
- * </FormRenderer>
38
- * ```
39
- */
40
- export interface NotchActionProps
41
- extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "color"> {
42
- /** Pill colour, matching `DrawerNotchPill`. Defaults to the yellow "open elsewhere" pill. */
43
- color?: React.ComponentProps<typeof DrawerNotchPill>["color"];
44
- children?: React.ReactNode;
45
- }
46
-
47
- export function NotchAction({ color = "Yellow", className, children, ...props }: NotchActionProps) {
48
- return (
49
- <DrawerNotchPill color={color} className={cn(className)} {...props}>
50
- {children}
51
- </DrawerNotchPill>
52
- );
53
- }
54
-
55
- (NotchAction as unknown as { __isFormNotchAction: boolean }).__isFormNotchAction = true;
56
-
57
- export function isNotchActionElement(
58
- node: React.ReactNode,
59
- ): node is React.ReactElement<NotchActionProps> {
60
- return (
61
- React.isValidElement(node) &&
62
- (node.type as { __isFormNotchAction?: boolean })?.__isFormNotchAction === true
63
- );
64
- }
@@ -1,39 +0,0 @@
1
- "use client";
2
-
3
- import { ReactNode } from "react";
4
-
5
- import { SectionBlock, type SectionColor, type SectionVariant } from "../SectionBlock";
6
-
7
- export interface SectionProps {
8
- title?: ReactNode;
9
- color?: SectionColor;
10
- icon?: ReactNode;
11
- /**
12
- * `"Table"` switches to the full-bleed table shell — no body padding, a rule under
13
- * the header, and the card clipped to its radius. `FormBuilder.Table` uses it; pass
14
- * it here only when hand-composing a table inside a section.
15
- */
16
- variant?: SectionVariant;
17
- /** Right-aligned content on the title row — e.g. action buttons. */
18
- action?: ReactNode;
19
- children: ReactNode;
20
- }
21
-
22
- /**
23
- * `FormRenderer.Section` — a titled Glare `SectionBlock` grouping fields.
24
- *
25
- * It lives here, not on `FormBuilder`, because it is presentation: a coloured card with a title
26
- * row and an action slot. It holds no form state and reads no form context, so it works just as
27
- * well around the read-only `FormRenderer.Grid` rows of a detail page as it does around fields.
28
- *
29
- * The per-field row layout — label, required marker, hint, the two-column split — is a different
30
- * thing entirely: that is `FieldSection`, applied by every field itself, and it stays inside
31
- * FormBuilder where the fields are.
32
- */
33
- export function Section({ title, color, icon, variant, action, children }: SectionProps) {
34
- return (
35
- <SectionBlock title={title} color={color} icon={icon} variant={variant} action={action}>
36
- {children}
37
- </SectionBlock>
38
- );
39
- }