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,650 +0,0 @@
1
- ---
2
- name: ButtonGroup
3
- version: 2.4.5
4
- status: stable
5
- category: components/buttons
6
- tags: [toggle-group, button-group, selection, radix-ui, accessible, compound]
7
- last-reviewed: 2024-11-05
8
- bundle-size: 3.8kb
9
- dependencies:
10
- - "@radix-ui/react-toggle-group": "^1.0.0"
11
- - "class-variance-authority": "^0.7.0"
12
- ---
13
-
14
- # ButtonGroup
15
-
16
- > A compound component built on Radix UI Toggle Group that enables single or multiple selection within a group of toggle buttons. Supports three visual variants, four sizes, and automatic variant/size inheritance from parent to child items.
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 ButtonGroup
26
- ```
27
-
28
- `add` also copies any components, hooks, and utilities that `ButtonGroup` 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 { ButtonGroup } from "@/components/ButtonGroup";
36
- ```
37
-
38
- ## Quick Examples
39
-
40
- ### Basic Usage (Single Selection)
41
-
42
- ```typescript
43
- import { ButtonGroup, ButtonGroupItem } from "@/components/ButtonGroup";
44
-
45
- function Example() {
46
- const [value, setValue] = useState('left')
47
-
48
- return (
49
- <ButtonGroup
50
- type="single"
51
- value={value}
52
- onValueChange={setValue}
53
- >
54
- <ButtonGroupItem value="left">Left</ButtonGroupItem>
55
- <ButtonGroupItem value="center">Center</ButtonGroupItem>
56
- <ButtonGroupItem value="right">Right</ButtonGroupItem>
57
- </ButtonGroup>
58
- )
59
- }
60
- ```
61
-
62
- ### Multiple Selection
63
-
64
- ```typescript
65
- function MultipleExample() {
66
- const [values, setValues] = useState<string[]>(['bold'])
67
-
68
- return (
69
- <ButtonGroup
70
- type="multiple"
71
- value={values}
72
- onValueChange={setValues}
73
- >
74
- <ButtonGroupItem value="bold">
75
- <i className="ri-bold" />
76
- </ButtonGroupItem>
77
- <ButtonGroupItem value="italic">
78
- <i className="ri-italic" />
79
- </ButtonGroupItem>
80
- <ButtonGroupItem value="underline">
81
- <i className="ri-underline" />
82
- </ButtonGroupItem>
83
- </ButtonGroup>
84
- )
85
- }
86
- ```
87
-
88
- ### All Variants
89
-
90
- ```typescript
91
- // PrimeStyle (default)
92
- <ButtonGroup type="single" variant="PrimeStyle" defaultValue="a">
93
- <ButtonGroupItem value="a">Option A</ButtonGroupItem>
94
- <ButtonGroupItem value="b">Option B</ButtonGroupItem>
95
- </ButtonGroup>
96
-
97
- // BorderStyle
98
- <ButtonGroup type="single" variant="BorderStyle" defaultValue="a">
99
- <ButtonGroupItem value="a">Option A</ButtonGroupItem>
100
- <ButtonGroupItem value="b">Option B</ButtonGroupItem>
101
- </ButtonGroup>
102
-
103
- // SystemStyle
104
- <ButtonGroup type="single" variant="SystemStyle" defaultValue="a">
105
- <ButtonGroupItem value="a">Option A</ButtonGroupItem>
106
- <ButtonGroupItem value="b">Option B</ButtonGroupItem>
107
- </ButtonGroup>
108
- ```
109
-
110
- ### With Sizes
111
-
112
- ```typescript
113
- <ButtonGroup type="single" size="S" defaultValue="a">
114
- <ButtonGroupItem value="a">Small</ButtonGroupItem>
115
- <ButtonGroupItem value="b">Items</ButtonGroupItem>
116
- </ButtonGroup>
117
-
118
- <ButtonGroup type="single" size="M" defaultValue="a">
119
- <ButtonGroupItem value="a">Medium</ButtonGroupItem>
120
- <ButtonGroupItem value="b">Items</ButtonGroupItem>
121
- </ButtonGroup>
122
-
123
- <ButtonGroup type="single" size="L" defaultValue="a">
124
- <ButtonGroupItem value="a">Large</ButtonGroupItem>
125
- <ButtonGroupItem value="b">Items</ButtonGroupItem>
126
- </ButtonGroup>
127
-
128
- <ButtonGroup type="single" size="XL" defaultValue="a">
129
- <ButtonGroupItem value="a">Extra Large</ButtonGroupItem>
130
- <ButtonGroupItem value="b">Items</ButtonGroupItem>
131
- </ButtonGroup>
132
- ```
133
-
134
- ### Full Width
135
-
136
- ```typescript
137
- <ButtonGroup type="single" fullWidth defaultValue="monthly">
138
- <ButtonGroupItem value="monthly">Monthly</ButtonGroupItem>
139
- <ButtonGroupItem value="yearly">Yearly</ButtonGroupItem>
140
- </ButtonGroup>
141
- ```
142
-
143
- ### With Icons
144
-
145
- ```typescript
146
- function ViewToggle() {
147
- const [view, setView] = useState('grid')
148
-
149
- return (
150
- <ButtonGroup type="single" value={view} onValueChange={setView} size="M">
151
- <ButtonGroupItem value="grid" aria-label="Grid view">
152
- <i className="ri-grid-fill" />
153
- </ButtonGroupItem>
154
- <ButtonGroupItem value="list" aria-label="List view">
155
- <i className="ri-list-unordered" />
156
- </ButtonGroupItem>
157
- <ButtonGroupItem value="kanban" aria-label="Kanban view">
158
- <i className="ri-kanban-view" />
159
- </ButtonGroupItem>
160
- </ButtonGroup>
161
- )
162
- }
163
- ```
164
-
165
- ### With Theme Override
166
-
167
- ```typescript
168
- <ButtonGroup type="single" theme="dark" variant="PrimeStyle" defaultValue="a">
169
- <ButtonGroupItem value="a">Dark A</ButtonGroupItem>
170
- <ButtonGroupItem value="b">Dark B</ButtonGroupItem>
171
- </ButtonGroup>
172
- ```
173
-
174
- ### Item Variant/Size Override
175
-
176
- ```typescript
177
- <ButtonGroup type="single" variant="PrimeStyle" size="M" defaultValue="a">
178
- {/* This item overrides to BorderStyle and L size */}
179
- <ButtonGroupItem value="a" variant="BorderStyle" size="L">
180
- Custom
181
- </ButtonGroupItem>
182
- {/* This item inherits PrimeStyle and M from parent */}
183
- <ButtonGroupItem value="b">Inherited</ButtonGroupItem>
184
- </ButtonGroup>
185
- ```
186
-
187
- ### Disabled Items
188
-
189
- ```typescript
190
- <ButtonGroup type="single" defaultValue="a">
191
- <ButtonGroupItem value="a">Active</ButtonGroupItem>
192
- <ButtonGroupItem value="b" disabled>Disabled</ButtonGroupItem>
193
- <ButtonGroupItem value="c">Active</ButtonGroupItem>
194
- </ButtonGroup>
195
- ```
196
-
197
- ## API Reference
198
-
199
- ### ButtonGroup Props
200
-
201
- | Prop | Type | Default | Description |
202
- |------|------|---------|-------------|
203
- | `type` | `'single' \| 'multiple'` | Required | Selection mode |
204
- | `value` | `string \| string[]` | - | Controlled selected value(s) |
205
- | `defaultValue` | `string \| string[]` | - | Uncontrolled default value(s) |
206
- | `onValueChange` | `(value: string \| string[]) => void` | - | Called when selection changes |
207
- | `variant` | `'PrimeStyle' \| 'BorderStyle' \| 'SystemStyle'` | `'PrimeStyle'` | Visual style variant |
208
- | `size` | `'S' \| 'M' \| 'L' \| 'XL'` | `'M'` | Size of the group and items |
209
- | `fullWidth` | `boolean` | `false` | Makes the group span full width |
210
- | `theme` | `'light' \| 'dark' \| 'default'` | - | Override theme for this component |
211
- | `className` | `string` | - | Additional CSS classes |
212
- | `children` | `React.ReactNode` | - | ButtonGroupItem children |
213
-
214
- ### ButtonGroupItem Props
215
-
216
- | Prop | Type | Default | Description |
217
- |------|------|---------|-------------|
218
- | `value` | `string` | Required | Unique value for this item |
219
- | `variant` | `'PrimeStyle' \| 'BorderStyle' \| 'SystemStyle'` | Inherited | Override parent variant |
220
- | `size` | `'S' \| 'M' \| 'L' \| 'XL'` | Inherited | Override parent size |
221
- | `disabled` | `boolean` | `false` | Disables this item |
222
- | `theme` | `'light' \| 'dark' \| 'default'` | - | Override theme for this item |
223
- | `className` | `string` | - | Additional CSS classes |
224
- | `children` | `React.ReactNode` | - | Item content |
225
-
226
- ### Size Variants
227
-
228
- | Size | Height | Padding | Typography | Icon Size |
229
- |------|--------|---------|------------|-----------|
230
- | S | 22px | 8px | Small Medium | 12px |
231
- | M | 28px | 12px | Large Medium | 18px |
232
- | L | 34px | 16px | Large Medium | 20px |
233
- | XL | 40px | 20px | Headers Medium | 22px |
234
-
235
- ### TypeScript
236
-
237
- ```typescript
238
- import { ComponentPropsWithoutRef } from 'react'
239
- import { VariantProps } from 'class-variance-authority'
240
- import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'
241
-
242
- type Themes = 'light' | 'dark' | 'default'
243
-
244
- type ButtonGroupSingleProps = {
245
- type: 'single'
246
- value?: string
247
- defaultValue?: string
248
- onValueChange?: (value: string) => void
249
- }
250
-
251
- type ButtonGroupMultipleProps = {
252
- type: 'multiple'
253
- value?: string[]
254
- defaultValue?: string[]
255
- onValueChange?: (value: string[]) => void
256
- }
257
-
258
- type ButtonGroupProps = (ButtonGroupSingleProps | ButtonGroupMultipleProps) &
259
- Omit<ComponentPropsWithoutRef<'div'>, 'type' | 'value' | 'defaultValue'> &
260
- VariantProps<typeof buttonGroupStyles> & {
261
- theme?: Themes
262
- children?: React.ReactNode
263
- }
264
-
265
- type ButtonGroupItemProps =
266
- ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &
267
- VariantProps<typeof buttonGroupItemStyles> & {
268
- theme?: Themes
269
- children?: React.ReactNode
270
- _groupVariant?: 'PrimeStyle' | 'BorderStyle' | 'SystemStyle' | null
271
- _groupSize?: 'S' | 'M' | 'L' | 'XL' | null
272
- }
273
-
274
- export const ButtonGroup: React.ForwardRefExoticComponent<
275
- ButtonGroupProps & React.RefAttributes<HTMLDivElement>
276
- >
277
-
278
- export const ButtonGroupItem: React.ForwardRefExoticComponent<
279
- ButtonGroupItemProps & React.RefAttributes<HTMLButtonElement>
280
- >
281
- ```
282
-
283
- ## Common Patterns
284
-
285
- ### Text Alignment Toolbar
286
-
287
- ```typescript
288
- function AlignmentToolbar() {
289
- const [alignment, setAlignment] = useState('left')
290
-
291
- return (
292
- <ButtonGroup type="single" value={alignment} onValueChange={setAlignment} size="S">
293
- <ButtonGroupItem value="left" aria-label="Align left">
294
- <i className="ri-align-left" />
295
- </ButtonGroupItem>
296
- <ButtonGroupItem value="center" aria-label="Align center">
297
- <i className="ri-align-center" />
298
- </ButtonGroupItem>
299
- <ButtonGroupItem value="right" aria-label="Align right">
300
- <i className="ri-align-right" />
301
- </ButtonGroupItem>
302
- <ButtonGroupItem value="justify" aria-label="Justify">
303
- <i className="ri-align-justify" />
304
- </ButtonGroupItem>
305
- </ButtonGroup>
306
- )
307
- }
308
- ```
309
-
310
- ### Pricing Toggle
311
-
312
- ```typescript
313
- function PricingToggle() {
314
- const [billing, setBilling] = useState('monthly')
315
-
316
- return (
317
- <div className="text-center">
318
- <ButtonGroup
319
- type="single"
320
- value={billing}
321
- onValueChange={setBilling}
322
- variant="BorderStyle"
323
- size="L"
324
- >
325
- <ButtonGroupItem value="monthly">Monthly</ButtonGroupItem>
326
- <ButtonGroupItem value="yearly">
327
- Yearly
328
- <span className="ml-1 text-xs text-green-500">-20%</span>
329
- </ButtonGroupItem>
330
- </ButtonGroup>
331
- </div>
332
- )
333
- }
334
- ```
335
-
336
- ### Formatting Toolbar (Multiple Selection)
337
-
338
- ```typescript
339
- function FormattingToolbar() {
340
- const [formats, setFormats] = useState<string[]>([])
341
-
342
- return (
343
- <ButtonGroup
344
- type="multiple"
345
- value={formats}
346
- onValueChange={setFormats}
347
- size="S"
348
- variant="BorderStyle"
349
- >
350
- <ButtonGroupItem value="bold" aria-label="Bold">
351
- <i className="ri-bold" />
352
- </ButtonGroupItem>
353
- <ButtonGroupItem value="italic" aria-label="Italic">
354
- <i className="ri-italic" />
355
- </ButtonGroupItem>
356
- <ButtonGroupItem value="underline" aria-label="Underline">
357
- <i className="ri-underline" />
358
- </ButtonGroupItem>
359
- <ButtonGroupItem value="strikethrough" aria-label="Strikethrough">
360
- <i className="ri-strikethrough" />
361
- </ButtonGroupItem>
362
- </ButtonGroup>
363
- )
364
- }
365
- ```
366
-
367
- ### Tab-like Navigation
368
-
369
- ```typescript
370
- function TabNavigation() {
371
- const [tab, setTab] = useState('overview')
372
-
373
- return (
374
- <ButtonGroup
375
- type="single"
376
- value={tab}
377
- onValueChange={setTab}
378
- fullWidth
379
- variant="PrimeStyle"
380
- size="L"
381
- >
382
- <ButtonGroupItem value="overview">Overview</ButtonGroupItem>
383
- <ButtonGroupItem value="analytics">Analytics</ButtonGroupItem>
384
- <ButtonGroupItem value="settings">Settings</ButtonGroupItem>
385
- </ButtonGroup>
386
- )
387
- }
388
- ```
389
-
390
- ### System Style (Dark UI)
391
-
392
- ```typescript
393
- function DarkToolbar() {
394
- const [tool, setTool] = useState('select')
395
-
396
- return (
397
- <div className="bg-gray-900 p-4 rounded">
398
- <ButtonGroup
399
- type="single"
400
- value={tool}
401
- onValueChange={setTool}
402
- variant="SystemStyle"
403
- size="M"
404
- >
405
- <ButtonGroupItem value="select" aria-label="Select tool">
406
- <i className="ri-cursor-fill" />
407
- </ButtonGroupItem>
408
- <ButtonGroupItem value="draw" aria-label="Draw tool">
409
- <i className="ri-pencil-fill" />
410
- </ButtonGroupItem>
411
- <ButtonGroupItem value="eraser" aria-label="Eraser tool">
412
- <i className="ri-eraser-fill" />
413
- </ButtonGroupItem>
414
- </ButtonGroup>
415
- </div>
416
- )
417
- }
418
- ```
419
-
420
- ## Testing
421
-
422
- ### Unit Test Example
423
-
424
- ```typescript
425
- import { render, screen, fireEvent } from '@testing-library/react'
426
- import { ButtonGroup, ButtonGroupItem } from "@/components/ButtonGroup";
427
-
428
- describe('ButtonGroup', () => {
429
- it('selects a single value', () => {
430
- const handleChange = jest.fn()
431
- render(
432
- <ButtonGroup type="single" onValueChange={handleChange}>
433
- <ButtonGroupItem value="a">A</ButtonGroupItem>
434
- <ButtonGroupItem value="b">B</ButtonGroupItem>
435
- </ButtonGroup>
436
- )
437
-
438
- fireEvent.click(screen.getByText('B'))
439
- expect(handleChange).toHaveBeenCalledWith('b')
440
- })
441
-
442
- it('supports multiple selection', () => {
443
- const handleChange = jest.fn()
444
- render(
445
- <ButtonGroup type="multiple" onValueChange={handleChange}>
446
- <ButtonGroupItem value="bold">B</ButtonGroupItem>
447
- <ButtonGroupItem value="italic">I</ButtonGroupItem>
448
- </ButtonGroup>
449
- )
450
-
451
- fireEvent.click(screen.getByText('B'))
452
- expect(handleChange).toHaveBeenCalledWith(['bold'])
453
-
454
- fireEvent.click(screen.getByText('I'))
455
- expect(handleChange).toHaveBeenCalledWith(['bold', 'italic'])
456
- })
457
-
458
- it('disables individual items', () => {
459
- const handleChange = jest.fn()
460
- render(
461
- <ButtonGroup type="single" onValueChange={handleChange}>
462
- <ButtonGroupItem value="a">A</ButtonGroupItem>
463
- <ButtonGroupItem value="b" disabled>B</ButtonGroupItem>
464
- </ButtonGroup>
465
- )
466
-
467
- fireEvent.click(screen.getByText('B'))
468
- expect(handleChange).not.toHaveBeenCalled()
469
- })
470
-
471
- it('applies active state styling', () => {
472
- render(
473
- <ButtonGroup type="single" value="a">
474
- <ButtonGroupItem value="a">A</ButtonGroupItem>
475
- <ButtonGroupItem value="b">B</ButtonGroupItem>
476
- </ButtonGroup>
477
- )
478
-
479
- expect(screen.getByText('A').closest('button')).toHaveAttribute('data-state', 'on')
480
- expect(screen.getByText('B').closest('button')).toHaveAttribute('data-state', 'off')
481
- })
482
- })
483
- ```
484
-
485
- ### Accessibility Test
486
-
487
- ```typescript
488
- import { axe } from '@axe-core/react'
489
-
490
- test('ButtonGroup meets WCAG standards', async () => {
491
- const { container } = render(
492
- <ButtonGroup type="single" defaultValue="a">
493
- <ButtonGroupItem value="a">Option A</ButtonGroupItem>
494
- <ButtonGroupItem value="b">Option B</ButtonGroupItem>
495
- </ButtonGroup>
496
- )
497
-
498
- const results = await axe(container)
499
- expect(results).toHaveNoViolations()
500
- })
501
- ```
502
-
503
- ## Accessibility
504
-
505
- ### Keyboard Support
506
-
507
- - **Tab**: Move focus to/from the button group
508
- - **Arrow Left/Right**: Navigate between items within the group
509
- - **Space**: Toggle the focused item
510
- - **Enter**: Toggle the focused item
511
-
512
- ### ARIA Attributes
513
-
514
- Radix UI Toggle Group automatically provides:
515
-
516
- ```html
517
- <!-- Single selection -->
518
- <div role="group">
519
- <button
520
- role="radio"
521
- aria-checked="true"
522
- data-state="on"
523
- >Selected</button>
524
- <button
525
- role="radio"
526
- aria-checked="false"
527
- data-state="off"
528
- >Not Selected</button>
529
- </div>
530
-
531
- <!-- Multiple selection -->
532
- <div role="group">
533
- <button
534
- aria-pressed="true"
535
- data-state="on"
536
- >Active</button>
537
- <button
538
- aria-pressed="false"
539
- data-state="off"
540
- >Inactive</button>
541
- </div>
542
- ```
543
-
544
- ### Screen Reader Support
545
-
546
- - Announces group role and item count
547
- - Communicates selected/pressed state per item
548
- - Reads aria-label or text content for each item
549
- - Announces state changes on toggle
550
-
551
- ### Best Practices
552
-
553
- ```typescript
554
- // Always provide aria-label for icon-only items
555
- <ButtonGroupItem value="grid" aria-label="Grid view">
556
- <i className="ri-grid-fill" />
557
- </ButtonGroupItem>
558
-
559
- // Or include screen-reader text
560
- <ButtonGroupItem value="grid">
561
- <i className="ri-grid-fill" />
562
- <span className="sr-only">Grid view</span>
563
- </ButtonGroupItem>
564
- ```
565
-
566
- ## Styling
567
-
568
- ### Variant Styles
569
-
570
- Each variant provides different visual styles for the group container and items:
571
-
572
- - **PrimeStyle**: Secondary background with disabled border, hover and active highlights
573
- - **BorderStyle**: Border-style background with disabled border, same hover/active as PrimeStyle
574
- - **SystemStyle**: Dark/transparent background with white text, white alpha hover/active states
575
-
576
- ### Active State
577
-
578
- Items use `data-[state=on]` for active styling:
579
-
580
- ```css
581
- /* PrimeStyle / BorderStyle active */
582
- data-[state=on]:bg-background-presentation-action-hover
583
- data-[state=on]:text-content-presentation-action-hover
584
-
585
- /* SystemStyle active */
586
- data-[state=on]:bg-white/20
587
- data-[state=on]:text-white
588
- ```
589
-
590
- ### Focus Visible
591
-
592
- Items display a focus ring on keyboard navigation:
593
-
594
- ```css
595
- focus-visible:ring-2 focus-visible:ring-inset
596
- focus-visible:ring-border-presentation-state-focus
597
- ```
598
-
599
- ### Custom Styles
600
-
601
- ```typescript
602
- <ButtonGroup
603
- type="single"
604
- className="rounded-full shadow-md"
605
- defaultValue="a"
606
- >
607
- <ButtonGroupItem value="a" className="first:rounded-l-full">A</ButtonGroupItem>
608
- <ButtonGroupItem value="b" className="last:rounded-r-full">B</ButtonGroupItem>
609
- </ButtonGroup>
610
- ```
611
-
612
- ## Performance
613
-
614
- | Metric | Value |
615
- |--------|-------|
616
- | Bundle size (gzip) | 3.8kb |
617
- | First render | <8ms |
618
- | Re-render | <3ms |
619
- | Tree-shakeable | Yes |
620
-
621
- ### Optimization Tips
622
-
623
- 1. Use `defaultValue` for uncontrolled mode when possible
624
- 2. Memoize `onValueChange` handlers with `useCallback`
625
- 3. Avoid recreating children arrays on each render
626
-
627
- ## Related Components
628
-
629
- - [ToggleButton](/docs/components/toggle-button.md) - Standalone toggle button (re-exported from ButtonGroup)
630
- - [Toggle](/docs/components/toggle.md) - Individual toggle with more variant options
631
- - [Button](/docs/components/button.md) - Standard action buttons
632
- - [ActionsGroup](/docs/components/actions-group.md) - Group of action buttons
633
-
634
- ## Browser Support
635
-
636
- - Chrome 90+
637
- - Firefox 88+
638
- - Safari 14+
639
- - Edge 90+
640
- - Mobile browsers
641
-
642
- ## Changelog
643
-
644
- ### v1.1.15
645
- - Initial stable release
646
- - 3 visual variants (PrimeStyle, BorderStyle, SystemStyle)
647
- - 4 size variants (S, M, L, XL)
648
- - Single and multiple selection modes
649
- - Automatic variant/size inheritance from parent to items
650
- - Re-exports ToggleButton component