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,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