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,639 +0,0 @@
1
- ---
2
- name: Button
3
- version: 2.4.5
4
- status: stable
5
- category: components/buttons
6
- tags: [interactive, form, action, accessible, polymorphic]
7
- last-reviewed: 2024-11-05
8
- bundle-size: 3.2kb
9
- dependencies:
10
- - "@radix-ui/react-slot": "^1.0.0"
11
- - "class-variance-authority": "^0.7.0"
12
- ---
13
-
14
- # Button
15
-
16
- > A versatile, accessible button component with multiple variants, sizes, and states. Supports icons, loading states, and polymorphic rendering through the `as` prop.
17
-
18
- ## Installation
19
-
20
- TORCH Glare is a copy-in library: the CLI copies this component's source into your project
21
- (you do **not** install it from the npm package). Run `init` once, then `add`:
22
-
23
- ```bash
24
- npx torch-glare@latest init
25
- npx torch-glare@latest add Button
26
- ```
27
-
28
- `add` also copies any components, hooks, and utilities that `Button` depends on.
29
-
30
- ## Import
31
-
32
- Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
33
-
34
- ```tsx
35
- import { Button } from "@/components/Button";
36
- ```
37
-
38
- ## Quick Examples
39
-
40
- ### Basic Usage
41
-
42
- ```typescript
43
- import { Button } from '@/components/Button'
44
-
45
- function Example() {
46
- return (
47
- <Button variant="PrimeStyle" onClick={() => console.log('clicked')}>
48
- Click me
49
- </Button>
50
- )
51
- }
52
- ```
53
-
54
- ### All Variants
55
-
56
- ```typescript
57
- // Primary styles
58
- <Button variant="PrimeStyle">Primary</Button>
59
- <Button variant="PrimeContStyle">Primary Container</Button>
60
-
61
- // Secondary styles
62
- <Button variant="BluSecStyle">Blue Secondary</Button>
63
- <Button variant="YelSecStyle">Yellow Secondary</Button>
64
- <Button variant="RedSecStyle">Red Secondary</Button>
65
-
66
- // Container styles
67
- <Button variant="BluContStyle">Blue Container</Button>
68
- <Button variant="RedContStyle">Red Container</Button>
69
-
70
- // Color (solid) styles
71
- <Button variant="PrimeColStyle">Primary Color</Button>
72
- <Button variant="BluColStyle">Blue Color</Button>
73
- <Button variant="RedColStyle">Red Color</Button>
74
- <Button variant="GreenColStyle">Green Color</Button>
75
- <Button variant="YelColStyle">Yellow Color</Button>
76
-
77
- // Border style
78
- <Button variant="BorderStyle">Border Only</Button>
79
- ```
80
-
81
- ### With Sizes
82
-
83
- ```typescript
84
- <Button size="S">Small</Button>
85
- <Button size="M">Medium (Default)</Button>
86
- <Button size="L">Large</Button>
87
- <Button size="XL">Extra Large</Button>
88
- <Button buttonType="icon">Icon Only</Button>
89
- ```
90
-
91
- ### Loading State
92
-
93
- ```typescript
94
- function SaveButton() {
95
- const [loading, setLoading] = useState(false)
96
-
97
- const handleSave = async () => {
98
- setLoading(true)
99
- await saveData()
100
- setLoading(false)
101
- }
102
-
103
- return (
104
- <Button
105
- variant="PrimeStyle"
106
- is_loading={loading}
107
- onClick={handleSave}
108
- >
109
- {loading ? 'Saving...' : 'Save'}
110
- </Button>
111
- )
112
- }
113
- ```
114
-
115
- ### With Icons
116
-
117
- ```typescript
118
- import { PlusIcon, TrashIcon } from '@heroicons/react/24/outline'
119
-
120
- // Icon before text
121
- <Button variant="PrimeStyle">
122
- <PlusIcon className="w-4 h-4 mr-2" />
123
- Add Item
124
- </Button>
125
-
126
- // Icon after text
127
- <Button variant="RedSecStyle">
128
- Delete
129
- <TrashIcon className="w-4 h-4 ml-2" />
130
- </Button>
131
-
132
- // Icon only
133
- <Button buttonType="icon" aria-label="Add new item">
134
- <PlusIcon className="w-5 h-5" />
135
- </Button>
136
- ```
137
-
138
- ### Polymorphic Component
139
-
140
- ```typescript
141
- // Render as anchor tag
142
- <Button as="a" href="/about" variant="BorderStyle">
143
- Learn More
144
- </Button>
145
-
146
- // Using asChild for complete control
147
- <Button asChild variant="PrimeStyle">
148
- <Link href="/dashboard">Go to Dashboard</Link>
149
- </Button>
150
- ```
151
-
152
- ### With Theme Override
153
-
154
- ```typescript
155
- <Button theme="dark" variant="PrimeStyle">
156
- Dark Theme Button
157
- </Button>
158
-
159
- <Button theme="light" variant="BluSecStyle">
160
- Light Theme Button
161
- </Button>
162
- ```
163
-
164
- ## API Reference
165
-
166
- ### Props
167
-
168
- | Prop | Type | Default | Description |
169
- |------|------|---------|-------------|
170
- | `variant` | `ButtonVariant` | `'PrimeStyle'` | Visual style variant of the button |
171
- | `size` | `'S' \| 'M' \| 'L' \| 'XL'` | `'M'` | Size of the button |
172
- | `buttonType` | `'button' \| 'icon'` | `'button'` | Layout type; `'icon'` renders a square icon-only button |
173
- | `is_loading` | `boolean` | `false` | Shows loading state and disables interaction |
174
- | `disabled` | `boolean` | `false` | Disables the button |
175
- | `asChild` | `boolean` | `false` | Merges props onto child element |
176
- | `as` | `React.ElementType` | `'button'` | Element type to render as |
177
- | `theme` | `'light' \| 'dark' \| 'default'` | - | Override theme for this component |
178
- | `containerClassName` | `string` | - | Additional classes for wrapper |
179
- | `className` | `string` | - | Additional CSS classes |
180
- | `type` | `'button' \| 'submit' \| 'reset'` | `'button'` | HTML button type |
181
- | `onClick` | `(event: MouseEvent) => void` | - | Click event handler |
182
- | `children` | `React.ReactNode` | - | Button content |
183
-
184
- ### TypeScript
185
-
186
- ```typescript
187
- import { ButtonHTMLAttributes } from 'react'
188
- import { VariantProps } from 'class-variance-authority'
189
-
190
- type ButtonVariant =
191
- | 'PrimeStyle'
192
- | 'BluSecStyle'
193
- | 'YelSecStyle'
194
- | 'RedSecStyle'
195
- | 'BorderStyle'
196
- | 'PrimeContStyle'
197
- | 'BluContStyle'
198
- | 'RedContStyle'
199
- | 'PrimeColStyle'
200
- | 'BluColStyle'
201
- | 'RedColStyle'
202
- | 'GreenColStyle'
203
- | 'YelColStyle'
204
-
205
- type Themes = 'light' | 'dark' | 'default'
206
-
207
- interface ButtonProps extends
208
- ButtonHTMLAttributes<HTMLButtonElement>,
209
- VariantProps<typeof buttonVariants> {
210
- is_loading?: boolean
211
- disabled?: boolean
212
- asChild?: boolean
213
- variant?: ButtonVariant
214
- buttonType?: 'button' | 'icon'
215
- as?: React.ElementType
216
- theme?: Themes
217
- containerClassName?: string
218
- }
219
-
220
- export const Button: React.ForwardRefExoticComponent<
221
- ButtonProps & React.RefAttributes<HTMLButtonElement>
222
- >
223
- ```
224
-
225
- ## Common Patterns
226
-
227
- ### Form Submit Button
228
-
229
- ```typescript
230
- import { Button } from '@/components/Button'
231
- import { Form } from '@/components/Form'
232
-
233
- function ContactForm() {
234
- const [isSubmitting, setIsSubmitting] = useState(false)
235
-
236
- const handleSubmit = async (e: FormEvent) => {
237
- e.preventDefault()
238
- setIsSubmitting(true)
239
-
240
- try {
241
- await submitForm(data)
242
- // Handle success
243
- } catch (error) {
244
- // Handle error
245
- } finally {
246
- setIsSubmitting(false)
247
- }
248
- }
249
-
250
- return (
251
- <Form onSubmit={handleSubmit}>
252
- {/* Form fields */}
253
-
254
- <Button
255
- type="submit"
256
- variant="PrimeStyle"
257
- is_loading={isSubmitting}
258
- disabled={isSubmitting}
259
- >
260
- Submit
261
- </Button>
262
- </Form>
263
- )
264
- }
265
- ```
266
-
267
- ### Button Group
268
-
269
- ```typescript
270
- import { Button } from '@/components/Button'
271
- import { ActionsGroup } from '@/components/ActionsGroup'
272
-
273
- function ButtonGroup() {
274
- return (
275
- <ActionsGroup>
276
- <Button variant="BorderStyle">Cancel</Button>
277
- <Button variant="PrimeStyle">Save</Button>
278
- <Button variant="RedSecStyle">Delete</Button>
279
- </ActionsGroup>
280
- )
281
- }
282
- ```
283
-
284
- ### Confirmation Pattern
285
-
286
- ```typescript
287
- function DeleteButton({ onDelete }: { onDelete: () => void }) {
288
- const [needsConfirm, setNeedsConfirm] = useState(false)
289
-
290
- if (needsConfirm) {
291
- return (
292
- <div className="flex gap-2">
293
- <Button
294
- size="S"
295
- variant="RedSecStyle"
296
- onClick={() => {
297
- onDelete()
298
- setNeedsConfirm(false)
299
- }}
300
- >
301
- Confirm Delete
302
- </Button>
303
- <Button
304
- size="S"
305
- variant="BorderStyle"
306
- onClick={() => setNeedsConfirm(false)}
307
- >
308
- Cancel
309
- </Button>
310
- </div>
311
- )
312
- }
313
-
314
- return (
315
- <Button
316
- variant="RedContStyle"
317
- onClick={() => setNeedsConfirm(true)}
318
- >
319
- Delete
320
- </Button>
321
- )
322
- }
323
- ```
324
-
325
- ### With Tooltip
326
-
327
- ```typescript
328
- import { Button } from '@/components/Button'
329
- import { Tooltip } from '@/components/Tooltip'
330
-
331
- function SaveButton() {
332
- return (
333
- <Tooltip content="Save your changes">
334
- <Button variant="PrimeStyle">
335
- Save
336
- </Button>
337
- </Tooltip>
338
- )
339
- }
340
- ```
341
-
342
- ## Testing
343
-
344
- ### Unit Test Example
345
-
346
- ```typescript
347
- import { render, screen, fireEvent } from '@testing-library/react'
348
- import { Button } from '@/components/Button'
349
-
350
- describe('Button', () => {
351
- it('handles click events', () => {
352
- const handleClick = jest.fn()
353
- render(
354
- <Button onClick={handleClick}>
355
- Click me
356
- </Button>
357
- )
358
-
359
- fireEvent.click(screen.getByText('Click me'))
360
- expect(handleClick).toHaveBeenCalledTimes(1)
361
- })
362
-
363
- it('shows loading state', () => {
364
- render(
365
- <Button is_loading={true}>
366
- Save
367
- </Button>
368
- )
369
-
370
- const button = screen.getByRole('button')
371
- expect(button).toBeDisabled()
372
- expect(button).toHaveAttribute('aria-busy', 'true')
373
- })
374
-
375
- it('applies variant classes', () => {
376
- render(
377
- <Button variant="RedSecStyle">
378
- Delete
379
- </Button>
380
- )
381
-
382
- const button = screen.getByRole('button')
383
- expect(button).toHaveClass('bg-red-500')
384
- })
385
- })
386
- ```
387
-
388
- ### Accessibility Test
389
-
390
- ```typescript
391
- import { axe } from '@axe-core/react'
392
-
393
- test('Button meets WCAG standards', async () => {
394
- const { container } = render(
395
- <Button variant="PrimeStyle">
396
- Accessible Button
397
- </Button>
398
- )
399
-
400
- const results = await axe(container)
401
- expect(results).toHaveNoViolations()
402
- })
403
- ```
404
-
405
- ## Accessibility
406
-
407
- ### Keyboard Support
408
-
409
- - **Space**: Activates the button
410
- - **Enter**: Activates the button
411
- - **Tab**: Moves focus to/from the button
412
-
413
- ### ARIA Attributes
414
-
415
- The Button component automatically includes:
416
-
417
- ```typescript
418
- <button
419
- type="button"
420
- disabled={disabled || is_loading}
421
- aria-busy={is_loading || undefined}
422
- >
423
- {children}
424
- {/* While loading, the spinner is rendered with role="status" and aria-label="Loading" */}
425
- </button>
426
- ```
427
-
428
- Notes:
429
- - The component renders a native `<button>` (or the element passed via `as`), so it does **not** add an explicit `role="button"`.
430
- - It sets the native `disabled` attribute (never `aria-disabled`) when `disabled` or `is_loading` is true.
431
- - `aria-busy` is set only while loading; it is omitted otherwise.
432
- - The loading spinner itself carries `role="status"` and `aria-label="Loading"`.
433
-
434
- ### Screen Reader Support
435
-
436
- ```typescript
437
- // Always provide aria-label for icon-only buttons
438
- <Button buttonType="icon" aria-label="Add new item">
439
- <PlusIcon className="w-5 h-5" />
440
- </Button>
441
-
442
- // Use aria-describedby for additional context
443
- <Button
444
- aria-describedby="delete-warning"
445
- variant="RedSecStyle"
446
- >
447
- Delete Account
448
- </Button>
449
- <span id="delete-warning" className="sr-only">
450
- This action cannot be undone
451
- </span>
452
- ```
453
-
454
- ### Focus Management
455
-
456
- - Visible focus ring on keyboard navigation
457
- - Proper focus trap when in loading state
458
- - Focus restoration after modal/dialog interactions
459
-
460
- ## Styling
461
-
462
- ### Custom Styles with className
463
-
464
- ```typescript
465
- <Button
466
- variant="PrimeStyle"
467
- className="rounded-full shadow-lg hover:shadow-xl"
468
- >
469
- Custom Styled Button
470
- </Button>
471
- ```
472
-
473
- ### Using with Tailwind CSS
474
-
475
- ```typescript
476
- <Button
477
- variant="BorderStyle"
478
- className="
479
- border-2 border-dashed
480
- hover:border-solid
481
- transition-all
482
- duration-200
483
- "
484
- >
485
- Tailwind Enhanced
486
- </Button>
487
- ```
488
-
489
- ### Theme Customization
490
-
491
- ```css
492
- /* Custom theme variables */
493
- [data-theme="custom"] {
494
- --button-primary-bg: #your-color;
495
- --button-primary-hover: #your-hover-color;
496
- --button-primary-text: #your-text-color;
497
- }
498
- ```
499
-
500
- ## Performance
501
-
502
- | Metric | Value |
503
- |--------|-------|
504
- | Bundle size (gzip) | 3.2kb |
505
- | First render | <10ms |
506
- | Re-render | <5ms |
507
- | Tree-shakeable | ✅ |
508
- | Memoized | ✅ |
509
-
510
- ### Optimization Tips
511
-
512
- 1. Use `React.memo()` for parent components
513
- 2. Memoize onClick handlers with `useCallback`
514
- 3. Lazy load icon libraries
515
- 4. Use dynamic imports for large button groups
516
-
517
- ## Migration
518
-
519
- ### From v1.0.x
520
-
521
- ```diff
522
- // Import path changed
523
- - import Button from 'torch-glare/Button'
524
- + import { Button } from '@/components/Button'
525
-
526
- // Loading prop renamed
527
- - <Button loading={true}>
528
- + <Button is_loading={true}>
529
-
530
- // Theme prop standardized
531
- - <Button colorScheme="dark">
532
- + <Button theme="dark">
533
- ```
534
-
535
- ## Troubleshooting
536
-
537
- ### Common Issues
538
-
539
- #### Button doesn't submit form
540
-
541
- **Solution:** Set `type="submit"`
542
-
543
- ```typescript
544
- <Button type="submit" variant="PrimeStyle">
545
- Submit Form
546
- </Button>
547
- ```
548
-
549
- #### Click handler fires twice
550
-
551
- **Solution:** Check for event bubbling
552
-
553
- ```typescript
554
- <Button onClick={(e) => {
555
- e.stopPropagation()
556
- handleClick()
557
- }}>
558
- Click Once
559
- </Button>
560
- ```
561
-
562
- #### Loading state doesn't show
563
-
564
- **Solution:** Check state management
565
-
566
- ```typescript
567
- const [loading, setLoading] = useState(false)
568
-
569
- // Make sure to set loading to true before async operation
570
- const handleClick = async () => {
571
- setLoading(true) // Set before await
572
- await someAsyncOperation()
573
- setLoading(false)
574
- }
575
- ```
576
-
577
- ## Related Components
578
-
579
- - [ActionButton](/docs/components/action-button.md) - Icon-only action buttons
580
- - [LinkButton](/docs/components/link-button.md) - Button styled as link
581
- - [LoginButton](/docs/components/login-button.md) - Specialized login button
582
- - [ActionsGroup](/docs/components/actions-group.md) - Group multiple buttons
583
-
584
- ## FAQ
585
-
586
- **Q: How do I make a button full width?**
587
-
588
- ```typescript
589
- <Button className="w-full" variant="PrimeStyle">
590
- Full Width Button
591
- </Button>
592
- ```
593
-
594
- **Q: Can I use custom icons?**
595
-
596
- Yes, any React component can be used as an icon:
597
-
598
- ```typescript
599
- <Button variant="PrimeStyle">
600
- <CustomIcon className="w-4 h-4 mr-2" />
601
- Custom Icon
602
- </Button>
603
- ```
604
-
605
- **Q: How do I disable a button conditionally?**
606
-
607
- ```typescript
608
- <Button
609
- disabled={!isFormValid}
610
- variant="PrimeStyle"
611
- >
612
- Submit
613
- </Button>
614
- ```
615
-
616
- ## Browser Support
617
-
618
- - Chrome 90+ ✅
619
- - Firefox 88+ ✅
620
- - Safari 14+ ✅
621
- - Edge 90+ ✅
622
- - Mobile browsers ✅
623
-
624
- ## Changelog
625
-
626
- ### v1.1.15
627
- - Added `containerClassName` prop
628
- - Improved loading state animations
629
- - Fixed focus ring in dark mode
630
-
631
- ### v1.1.14
632
- - Added polymorphic `as` prop
633
- - Enhanced TypeScript types
634
- - Performance optimizations
635
-
636
- ### v1.1.0
637
- - Initial stable release
638
- - 8 button variants
639
- - 5 size options