torch-glare 2.5.5 → 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 (359) 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 -338
  69. package/apps/lib/components/Breadcrumb.tsx +0 -280
  70. package/apps/lib/components/Button.tsx +0 -317
  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 -383
  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 -84
  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 -63
  106. package/apps/lib/components/DataViews/states.tsx +0 -38
  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 -420
  118. package/apps/lib/components/DropdownMenu.tsx +0 -540
  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 -73
  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 -163
  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 -91
  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 -47
  147. package/apps/lib/components/FormBuilder/types.ts +0 -311
  148. package/apps/lib/components/FormRenderer/FormDrawer.tsx +0 -128
  149. package/apps/lib/components/FormRenderer/detail.tsx +0 -207
  150. package/apps/lib/components/FormRenderer/form-renderer.tsx +0 -297
  151. package/apps/lib/components/FormRenderer/header.tsx +0 -88
  152. package/apps/lib/components/FormRenderer/index.ts +0 -15
  153. package/apps/lib/components/FormRenderer/section.tsx +0 -39
  154. package/apps/lib/components/FormRenderer/stepper.tsx +0 -339
  155. package/apps/lib/components/FormRenderer/types.ts +0 -78
  156. package/apps/lib/components/FormSummary.tsx +0 -282
  157. package/apps/lib/components/HeaderBar.tsx +0 -117
  158. package/apps/lib/components/ImageAttachment.tsx +0 -209
  159. package/apps/lib/components/InnerLabelField.tsx +0 -154
  160. package/apps/lib/components/Input.tsx +0 -224
  161. package/apps/lib/components/InputField.tsx +0 -147
  162. package/apps/lib/components/InputOTP.tsx +0 -84
  163. package/apps/lib/components/Label.tsx +0 -129
  164. package/apps/lib/components/LabelField.tsx +0 -76
  165. package/apps/lib/components/LabeledCheckBox.tsx +0 -51
  166. package/apps/lib/components/LabeledRadio.tsx +0 -51
  167. package/apps/lib/components/LinkButton.tsx +0 -94
  168. package/apps/lib/components/LoginButton.tsx +0 -51
  169. package/apps/lib/components/PasswordLevel.tsx +0 -58
  170. package/apps/lib/components/Popover.tsx +0 -312
  171. package/apps/lib/components/ProfileMenu.tsx +0 -85
  172. package/apps/lib/components/Radio.tsx +0 -59
  173. package/apps/lib/components/RadioCard.tsx +0 -50
  174. package/apps/lib/components/ScrollArea.tsx +0 -54
  175. package/apps/lib/components/SearchField.tsx +0 -62
  176. package/apps/lib/components/SearchableSelect.tsx +0 -318
  177. package/apps/lib/components/SearchableTable.tsx +0 -344
  178. package/apps/lib/components/SearchableTree.tsx +0 -485
  179. package/apps/lib/components/SearchableTreeDialog.tsx +0 -502
  180. package/apps/lib/components/SectionBlock.tsx +0 -147
  181. package/apps/lib/components/Select.tsx +0 -347
  182. package/apps/lib/components/SimpleSelect.tsx +0 -225
  183. package/apps/lib/components/Skeleton.tsx +0 -12
  184. package/apps/lib/components/SlideDatePicker.tsx +0 -253
  185. package/apps/lib/components/SpinLoading.tsx +0 -174
  186. package/apps/lib/components/Stepper.tsx +0 -480
  187. package/apps/lib/components/Switch.tsx +0 -82
  188. package/apps/lib/components/TabFormItem.tsx +0 -153
  189. package/apps/lib/components/TabSwitch.tsx +0 -172
  190. package/apps/lib/components/Table.tsx +0 -610
  191. package/apps/lib/components/TextEditor/ChartBlockTool.ts +0 -676
  192. package/apps/lib/components/TextEditor/RichTextField.tsx +0 -46
  193. package/apps/lib/components/TextEditor/TableDnDWrapper.ts +0 -462
  194. package/apps/lib/components/TextEditor/TextEditor.tsx +0 -1164
  195. package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +0 -429
  196. package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +0 -70
  197. package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +0 -50
  198. package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +0 -48
  199. package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +0 -98
  200. package/apps/lib/components/TextEditor/editorjs.d.ts +0 -60
  201. package/apps/lib/components/TextEditor/index.ts +0 -7
  202. package/apps/lib/components/TextEditor/markdownParser.ts +0 -346
  203. package/apps/lib/components/Textarea.tsx +0 -117
  204. package/apps/lib/components/Timeline.tsx +0 -263
  205. package/apps/lib/components/Toast.tsx +0 -87
  206. package/apps/lib/components/Toggle.tsx +0 -125
  207. package/apps/lib/components/ToggleButton.tsx +0 -140
  208. package/apps/lib/components/Tooltip.tsx +0 -116
  209. package/apps/lib/components/TransparentLabel.tsx +0 -71
  210. package/apps/lib/components/TreeDropDown.tsx +0 -115
  211. package/apps/lib/components/TreeFolder/TreeFolder.tsx +0 -380
  212. package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +0 -75
  213. package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +0 -354
  214. package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +0 -60
  215. package/apps/lib/components/TreeFolder/icons.tsx +0 -60
  216. package/apps/lib/components/TreeFolder/index.ts +0 -24
  217. package/apps/lib/components/TreeFolder/treeFolderUtils.ts +0 -109
  218. package/apps/lib/components/TreeFolder/types.ts +0 -77
  219. package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +0 -118
  220. package/apps/lib/hooks/useActiveTreeItem.ts +0 -58
  221. package/apps/lib/hooks/useClickOutside.ts +0 -27
  222. package/apps/lib/hooks/useDragDrop.tsx +0 -365
  223. package/apps/lib/hooks/useInfiniteScroll.ts +0 -108
  224. package/apps/lib/hooks/useIsMobile.ts +0 -21
  225. package/apps/lib/hooks/useResize.ts +0 -67
  226. package/apps/lib/hooks/useTagSelection.ts +0 -214
  227. package/apps/lib/layouts/CNLayout.tsx +0 -372
  228. package/apps/lib/layouts/DataViewCard.tsx +0 -62
  229. package/apps/lib/layouts/FieldSection.tsx +0 -91
  230. package/apps/lib/layouts/TreeSubLayout.tsx +0 -173
  231. package/apps/lib/providers/ThemeProvider.tsx +0 -84
  232. package/apps/lib/registry.json +0 -1201
  233. package/apps/lib/tsconfig.json +0 -9
  234. package/apps/lib/tsconfig.tsbuildinfo +0 -1
  235. package/apps/lib/utils/cn.ts +0 -6
  236. package/apps/lib/utils/color.ts +0 -175
  237. package/apps/lib/utils/dataViews/path.ts +0 -67
  238. package/apps/lib/utils/dataViews/query.ts +0 -73
  239. package/apps/lib/utils/dataViews/types.ts +0 -187
  240. package/apps/lib/utils/dateFormat.ts +0 -108
  241. package/apps/lib/utils/resize.ts +0 -31
  242. package/apps/lib/utils/types.ts +0 -16
  243. package/docs/BLOCKS.md +0 -129
  244. package/docs/CHANGELOG-1.1.16.md +0 -108
  245. package/docs/Cover.png +0 -0
  246. package/docs/README.md +0 -215
  247. package/docs/components/action-button.md +0 -638
  248. package/docs/components/actions-group.md +0 -708
  249. package/docs/components/alert-dialog.md +0 -920
  250. package/docs/components/avatar.md +0 -709
  251. package/docs/components/badge-field.md +0 -712
  252. package/docs/components/badge.md +0 -301
  253. package/docs/components/breadcrumb.md +0 -930
  254. package/docs/components/button-group.md +0 -650
  255. package/docs/components/button.md +0 -639
  256. package/docs/components/calendar.md +0 -555
  257. package/docs/components/card.md +0 -622
  258. package/docs/components/chart-block-tool.md +0 -129
  259. package/docs/components/checkbox.md +0 -699
  260. package/docs/components/cn-layout.md +0 -854
  261. package/docs/components/color-picker.md +0 -101
  262. package/docs/components/conclusion-header.md +0 -80
  263. package/docs/components/context-menu.md +0 -483
  264. package/docs/components/count-badge.md +0 -560
  265. package/docs/components/data-table.md +0 -854
  266. package/docs/components/data-views/backend-response.md +0 -324
  267. package/docs/components/data-views/examples/a11y-rtl.md +0 -250
  268. package/docs/components/data-views/examples/api-orders-route.md +0 -130
  269. package/docs/components/data-views/examples/fields.md +0 -362
  270. package/docs/components/data-views/examples/filters.md +0 -307
  271. package/docs/components/data-views/examples/inbox-routing.md +0 -218
  272. package/docs/components/data-views/examples/index.md +0 -29
  273. package/docs/components/data-views/examples/overview.md +0 -244
  274. package/docs/components/data-views/examples/panel.md +0 -212
  275. package/docs/components/data-views/examples/scale.md +0 -231
  276. package/docs/components/data-views/examples/server-side.md +0 -210
  277. package/docs/components/data-views/examples/state.md +0 -250
  278. package/docs/components/data-views/examples/tree-custom.md +0 -388
  279. package/docs/components/data-views/examples/view-registry.md +0 -313
  280. package/docs/components/data-views/examples/views.md +0 -534
  281. package/docs/components/data-views/guide.md +0 -405
  282. package/docs/components/data-views/index.md +0 -1495
  283. package/docs/components/data-views/migration.md +0 -79
  284. package/docs/components/date-picker.md +0 -857
  285. package/docs/components/dialog.md +0 -929
  286. package/docs/components/divider.md +0 -766
  287. package/docs/components/drawer.md +0 -654
  288. package/docs/components/dropdown-menu.md +0 -668
  289. package/docs/components/field-hint.md +0 -898
  290. package/docs/components/field-section.md +0 -781
  291. package/docs/components/form-builder.md +0 -276
  292. package/docs/components/form-renderer.md +0 -326
  293. package/docs/components/form-summary.md +0 -138
  294. package/docs/components/form.md +0 -785
  295. package/docs/components/header-bar.md +0 -188
  296. package/docs/components/image-attachment.md +0 -906
  297. package/docs/components/inner-label-field.md +0 -819
  298. package/docs/components/input-field.md +0 -623
  299. package/docs/components/input-otp.md +0 -756
  300. package/docs/components/input.md +0 -634
  301. package/docs/components/label-field.md +0 -770
  302. package/docs/components/label.md +0 -761
  303. package/docs/components/labeled-check-box.md +0 -642
  304. package/docs/components/labeled-radio.md +0 -796
  305. package/docs/components/link-button.md +0 -685
  306. package/docs/components/login-button.md +0 -872
  307. package/docs/components/password-level.md +0 -803
  308. package/docs/components/popover.md +0 -649
  309. package/docs/components/profile-menu.md +0 -656
  310. package/docs/components/radio-card.md +0 -801
  311. package/docs/components/radio.md +0 -735
  312. package/docs/components/scroll-area.md +0 -691
  313. package/docs/components/search-field.md +0 -702
  314. package/docs/components/searchable-select.md +0 -368
  315. package/docs/components/searchable-table.md +0 -438
  316. package/docs/components/searchable-tree-dialog.md +0 -190
  317. package/docs/components/searchable-tree.md +0 -200
  318. package/docs/components/section-block.md +0 -477
  319. package/docs/components/select.md +0 -709
  320. package/docs/components/simple-select.md +0 -741
  321. package/docs/components/skeleton.md +0 -706
  322. package/docs/components/slide-date-picker.md +0 -837
  323. package/docs/components/spin-loading.md +0 -696
  324. package/docs/components/stepper.md +0 -316
  325. package/docs/components/switch.md +0 -770
  326. package/docs/components/tab-form-item.md +0 -773
  327. package/docs/components/tab-switch.md +0 -170
  328. package/docs/components/table-dnd-wrapper.md +0 -107
  329. package/docs/components/table.md +0 -1088
  330. package/docs/components/text-editor.md +0 -735
  331. package/docs/components/textarea.md +0 -681
  332. package/docs/components/timeline.md +0 -254
  333. package/docs/components/toast.md +0 -773
  334. package/docs/components/toggle-button.md +0 -643
  335. package/docs/components/toggle.md +0 -882
  336. package/docs/components/tooltip.md +0 -513
  337. package/docs/components/transparent-label.md +0 -721
  338. package/docs/components/tree-drop-down.md +0 -740
  339. package/docs/components/tree-folder.md +0 -110
  340. package/docs/components/tree-sub-layout.md +0 -707
  341. package/docs/explanation/architecture.md +0 -54
  342. package/docs/explanation/design-system.md +0 -52
  343. package/docs/how-to/form-and-list-recipes.md +0 -386
  344. package/docs/how-to/forms-with-form-builder.md +0 -472
  345. package/docs/how-to/guides.md +0 -1027
  346. package/docs/migration/changelog.md +0 -54
  347. package/docs/migration/form-builder-2.5.2.md +0 -113
  348. package/docs/reference/cli.md +0 -112
  349. package/docs/reference/components.md +0 -572
  350. package/docs/reference/hooks.md +0 -1500
  351. package/docs/reference/providers.md +0 -866
  352. package/docs/reference/tailwind-plugins.md +0 -942
  353. package/docs/reference/theme.md +0 -85
  354. package/docs/reference/types.md +0 -1016
  355. package/docs/reference/utilities.md +0 -704
  356. package/docs/tutorials/building-first-form.md +0 -846
  357. package/docs/tutorials/component-composition.md +0 -882
  358. package/docs/tutorials/getting-started.md +0 -302
  359. package/docs/tutorials/theming-basics.md +0 -785
@@ -1,297 +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 { Section } from "./section";
21
- import {
22
- Back,
23
- Next,
24
- Step,
25
- StepSlot,
26
- Stepper,
27
- StepperActions,
28
- StepperContext,
29
- StepperNav,
30
- isStepElement,
31
- isStepperElement,
32
- useStepperState,
33
- type StepProps,
34
- } from "./stepper";
35
- import type { FormRendererProps } from "./types";
36
-
37
- /**
38
- * FormRenderer — the chrome around a `FormBuilder`.
39
- *
40
- * `FormBuilder` is the fields and nothing else: a `<form>`, its react-hook-form context, and the
41
- * field components. Every pixel drawn *around* those fields is here — page-vs-drawer display, the
42
- * absolute title header, the `actions` bar, titled `FormRenderer.Section` cards, the page gutters,
43
- * the scroll shell, the wizard rail (`FormRenderer.Stepper`), and the `summary` column.
44
- *
45
- * FormRenderer never manufactures a Submit — you compose it and hand it to `actions`
46
- * (`actions={<FormBuilder.Submit>Save</FormBuilder.Submit>}`). It renders in the form's header
47
- * action pill (page) or the drawer header (drawer), and auto-targets this form.
48
- *
49
- * Give it `FormRenderer.Sidebar` + `FormRenderer.Tab` children instead of fields and it switches to
50
- * a **detail-tabs** view: a display-only page (no `<form>`) whose sidebar swaps
51
- * `FormRenderer.Section` panels — the sidebar sits where a stepper's rail would.
52
- */
53
- function FormRendererRoot<T extends FieldValues = FieldValues>({
54
- children,
55
- id,
56
- onSubmit,
57
- onInvalid,
58
- resolver,
59
- defaultValues,
60
- values,
61
- loading,
62
- resetOnSuccess,
63
- fieldDirection,
64
- form,
65
- display = "page",
66
- header,
67
- summary,
68
- className,
69
- actions,
70
- open = false,
71
- onOpenChange,
72
- title,
73
- badge,
74
- onOpenInNewTab,
75
- }: FormRendererProps<T>) {
76
- const isDrawer = display === "drawer";
77
-
78
- // FormRenderer owns the display decision: a drawer form lays out vertically.
79
- const effectiveDirection = fieldDirection ?? (isDrawer ? "vertical" : undefined);
80
- // The absolute title header is a page concern — the drawer has its own header.
81
- const useHeader = !!header && !isDrawer;
82
- // A stable `id` lets a button OUTSIDE the form submit it via `form={id}` (the header action
83
- // pill / drawer header). Falls back to a generated id, provided to the Submit via context.
84
- const autoId = useId();
85
- const formId = id ?? autoId;
86
-
87
- // The form instance is created HERE, not in FormBuilder, because the stepper needs `trigger` to
88
- // validate a step before advancing — and the rail that calls it renders outside the `<form>`.
89
- // Same pattern FormBuilder uses: one is always created (hooks can't be conditional), the
90
- // caller's hoisted instance wins when given.
91
- const ownForm = useForm<T>({ resolver, defaultValues, values });
92
- const formInstance = form ?? ownForm;
93
-
94
- const childArray = Children.toArray(children);
95
-
96
- // Detail-tabs mode: a `FormRenderer.Sidebar` + `FormRenderer.Tab` children mean a display-only
97
- // detail page (no `<form>`) — the sidebar swaps Section panels via Radix Tabs. Detected here so
98
- // the form props below are simply unused.
99
- const detailSidebar = childArray.find(isDetailSidebarElement);
100
- const detailTabs = childArray.filter(isDetailTabElement);
101
-
102
- // Split out a `FormRenderer.Stepper`: its Steps become the visibility-toggled slots inside the
103
- // `<form>`, its non-Step children a footer, and its state drives the rail beside them.
104
- const stepperEl = childArray.find(isStepperElement);
105
- const stepChildren = stepperEl ? Children.toArray(stepperEl.props.children) : [];
106
- const steps = stepChildren.filter(isStepElement) as ReactElement<StepProps>[];
107
- const stepExtras = stepChildren.filter((n) => !isStepElement(n));
108
- const isStepper = !!stepperEl;
109
-
110
- // Called unconditionally (inert when there are no steps) to keep hooks order stable.
111
- const stepper = useStepperState(
112
- steps,
113
- formInstance.trigger as Parameters<typeof useStepperState>[1],
114
- );
115
-
116
- if (detailSidebar && detailTabs.length > 0) {
117
- return (
118
- <DetailTabsView
119
- header={header}
120
- actions={actions}
121
- sidebar={detailSidebar}
122
- tabs={detailTabs}
123
- className={className}
124
- />
125
- );
126
- }
127
-
128
- // The fields the `<form>` wraps: the stepper's steps (+ any custom footer extras), or the
129
- // children as authored. Every step stays mounted so the whole form is registered at all times.
130
- const fields: ReactNode = isStepper ? (
131
- <>
132
- {steps.map((step, i) => (
133
- <StepSlot key={i} index={i} active={i === stepper.currentStep}>
134
- {step.props.children}
135
- </StepSlot>
136
- ))}
137
- {stepExtras}
138
- </>
139
- ) : (
140
- children
141
- );
142
-
143
- const formEl = (
144
- <FormBuilder
145
- id={formId}
146
- form={formInstance}
147
- onSubmit={onSubmit ?? (() => {})}
148
- onInvalid={onInvalid}
149
- loading={loading}
150
- fieldDirection={effectiveDirection}
151
- resetOnSuccess={resetOnSuccess}
152
- >
153
- {fields}
154
- </FormBuilder>
155
- );
156
-
157
- // The fields column caps at 1100px and centres — standalone, and as the middle column of the
158
- // stepper grid. This is page framing, which is why it wraps FormBuilder rather than living
159
- // inside it: a form embedded in a 260px rail has no room to give up 96px to gutters.
160
- const fieldsColumn = <div className="mx-auto w-full max-w-[1100px] px-[48px]">{formEl}</div>;
161
-
162
- // Inside the form surface: the stepper rail beside the fields. Columns never wrap — the layout
163
- // stays side-by-side at every screen size; when space runs short the fields column shrinks and
164
- // the rail's labels truncate.
165
- //
166
- // `minmax(180px,1fr)` and not a bare `1fr` on the side tracks. `1fr` means `minmax(auto,1fr)`,
167
- // whose *auto* minimum stops a track shrinking below its content — so a long step label made the
168
- // rail's track wider than the empty track opposite it, and the two side tracks being equal is the
169
- // only thing centring the middle column. Hovering a step made it visibly worse: the label's
170
- // padding grows 6px→9px on hover (FormStepper), so the centre jumped 3px every time.
171
- //
172
- // The minimum is a fixed 180px rather than `auto` precisely so it cannot depend on the labels:
173
- // both side tracks size identically whatever the rail holds, so the middle column stays centred,
174
- // and the rail still has room to be legible (a plain `minmax(0,…)` let it collapse to 0 in a
175
- // narrow preview frame). Past that floor the labels truncate instead of pushing.
176
- const bodyInner = isStepper ? (
177
- // `@container` on the wrapper, not on the grid: an element cannot query its own size, so the
178
- // measured box has to be an ancestor. It sits here rather than on the scroll body because
179
- // `bodyInner` is also used directly when there is no header, and this way both paths get a
180
- // container. The form then reacts to the width it is actually given — a rail, a drawer, a
181
- // narrow preview frame — instead of the viewport's.
182
- <div className="@container w-full">
183
- {/* Below `@lg` the balancing column is dropped: it is empty, and in a narrow container its
184
- 180px floor plus a 32px gap is width the fields column needs more than the centring.
185
- Both halves are required — a `display:none` child is not a grid item, but the third
186
- track would still be reserved if the template kept describing it. */}
187
- <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)]">
188
- <StepperNav control={formInstance.control as Control<FieldValues>} />
189
- {fieldsColumn}
190
- {/* Empty third column — balances the rail's gutter so the middle column is centred. */}
191
- <div className="hidden @lg:block" />
192
- </div>
193
- </div>
194
- ) : (
195
- fieldsColumn
196
- );
197
-
198
- const surface = useHeader ? (
199
- // Scroll shell: the absolute header floats over the scrollable body. No fixed height — it
200
- // fills whatever the parent gives it (like the drawer's panel fills its tray) and the body
201
- // scrolls internally.
202
- <div className="relative isolate flex h-full w-full flex-col overflow-hidden rounded-2xl bg-background-presentation-body-primary">
203
- <FormHeaderBar title={header!.title} label={header!.label} variant={header!.variant}>
204
- {/* A stepper form prepends chevron Back/Next + a divider before the Submit. */}
205
- {actions && <StepperActions>{actions}</StepperActions>}
206
- </FormHeaderBar>
207
- <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">
208
- {bodyInner}
209
- </div>
210
- </div>
211
- ) : (
212
- bodyInner
213
- );
214
-
215
- // The summary (right) lives OUTSIDE the scroll surface — its own panel beside it (mirroring the
216
- // drawer's tray, a 6px gutter). Only the surface's body scrolls; the summary stays put. In a
217
- // drawer it goes to FormDrawer's tray instead.
218
- const pageBody =
219
- summary && !isDrawer ? (
220
- <div className="flex h-full flex-row items-stretch">
221
- <div className="min-h-0 min-w-0 flex-1">{surface}</div>
222
- <div className="ml-[6px] flex min-h-0">{summary}</div>
223
- </div>
224
- ) : (
225
- surface
226
- );
227
-
228
- // `className` lands on the OUTERMOST element — the one a parent lays out (e.g. `flex-1 min-h-0`
229
- // to fill a flex column). `h-full` fills a parent that has a definite height.
230
- //
231
- // The form-id and loading contexts are supplied HERE as well as inside FormBuilder, because the
232
- // header's action pill renders outside the `<FormBuilder>` subtree: a bare `FormBuilder.Submit`
233
- // in `actions` reads the id from context to target the `<form>` by native form-association.
234
- // Same reason the drawer branch below re-provides them around its own header.
235
- const inner = (
236
- <LoadingContext.Provider value={!!loading}>
237
- <FormIdContext.Provider value={formId}>
238
- <div className={cn("h-full w-full", !isDrawer && className)}>{pageBody}</div>
239
- </FormIdContext.Provider>
240
- </LoadingContext.Provider>
241
- );
242
-
243
- // One provider around the whole tree: the rail renders outside the `<form>`, the step slots
244
- // inside it, and both read the same state.
245
- const tree = isStepper ? (
246
- <StepperContext.Provider value={stepper}>{inner}</StepperContext.Provider>
247
- ) : (
248
- inner
249
- );
250
-
251
- if (isDrawer) {
252
- return (
253
- <FormDrawer
254
- open={open}
255
- onOpenChange={onOpenChange ?? (() => {})}
256
- title={title ?? header?.title}
257
- badge={badge ?? header?.label}
258
- variant={header?.variant}
259
- summary={summary}
260
- // The drawer header sits outside the `<form>`, so re-supply the form-id and loading
261
- // context a bare `FormBuilder.Submit` reads (on the page it gets these from the tree).
262
- actions={
263
- actions ? (
264
- <LoadingContext.Provider value={!!loading}>
265
- <FormIdContext.Provider value={formId}>{actions}</FormIdContext.Provider>
266
- </LoadingContext.Provider>
267
- ) : undefined
268
- }
269
- onOpenInNewTab={onOpenInNewTab}
270
- >
271
- {tree}
272
- </FormDrawer>
273
- );
274
- }
275
-
276
- return tree;
277
- }
278
-
279
- /**
280
- * FormRenderer — see {@link FormRendererRoot}. The compound statics are the form's chrome:
281
- *
282
- * - `FormRenderer.Section` — a titled card grouping fields (or display rows).
283
- * - `FormRenderer.Stepper` / `.Step` — the wizard; `.Back` / `.Next` are the chevron controls,
284
- * which the header's action bar already prepends for you.
285
- * - `FormRenderer.Sidebar` / `.Tab` / `.Grid` / `.Row` — the display-only **detail-tabs** view.
286
- */
287
- export const FormRenderer = Object.assign(FormRendererRoot, {
288
- Section,
289
- Stepper,
290
- Step,
291
- Back,
292
- Next,
293
- Sidebar: DetailSidebar,
294
- Tab: DetailTab,
295
- Grid: DetailGrid,
296
- Row: DetailRow,
297
- });
@@ -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,15 +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 type { HeaderConfig, HeaderVariant, FormHeaderBarProps } from "./header";
6
- export type { SectionProps } from "./section";
7
- export type { StepProps, StepperProps } from "./stepper";
8
- export type { FormRendererProps, FormRendererDisplay, FieldDirection } from "./types";
9
- export type {
10
- DetailSidebarProps,
11
- DetailSidebarItemProps,
12
- DetailTabProps,
13
- DetailRowProps,
14
- DetailGridProps,
15
- } from "./detail";
@@ -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
- }