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.
- package/README.md +4 -3
- package/dist/bin/index.js +9 -24
- package/dist/bin/index.js.map +1 -1
- package/dist/src/commands/add.d.ts +2 -2
- package/dist/src/commands/add.d.ts.map +1 -1
- package/dist/src/commands/add.js +4 -70
- package/dist/src/commands/add.js.map +1 -1
- package/dist/src/commands/hook.d.ts +5 -4
- package/dist/src/commands/hook.d.ts.map +1 -1
- package/dist/src/commands/hook.js +7 -75
- package/dist/src/commands/hook.js.map +1 -1
- package/dist/src/commands/init.js +1 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/layout.d.ts +5 -4
- package/dist/src/commands/layout.d.ts.map +1 -1
- package/dist/src/commands/layout.js +7 -75
- package/dist/src/commands/layout.js.map +1 -1
- package/dist/src/commands/provider.d.ts +5 -4
- package/dist/src/commands/provider.d.ts.map +1 -1
- package/dist/src/commands/provider.js +7 -75
- package/dist/src/commands/provider.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +78 -43
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/utils.d.ts +5 -4
- package/dist/src/commands/utils.d.ts.map +1 -1
- package/dist/src/commands/utils.js +7 -80
- package/dist/src/commands/utils.js.map +1 -1
- package/dist/src/shared/addFromRegistry.d.ts +16 -0
- package/dist/src/shared/addFromRegistry.d.ts.map +1 -0
- package/dist/src/shared/addFromRegistry.js +88 -0
- package/dist/src/shared/addFromRegistry.js.map +1 -0
- package/dist/src/shared/getInstallCommand.d.ts.map +1 -1
- package/dist/src/shared/getInstallCommand.js +5 -0
- package/dist/src/shared/getInstallCommand.js.map +1 -1
- package/dist/src/shared/installDependencies.d.ts +0 -10
- package/dist/src/shared/installDependencies.d.ts.map +1 -1
- package/dist/src/shared/installDependencies.js +0 -17
- package/dist/src/shared/installDependencies.js.map +1 -1
- package/dist/src/shared/installFromPlan.d.ts +7 -5
- package/dist/src/shared/installFromPlan.d.ts.map +1 -1
- package/dist/src/shared/installFromPlan.js +103 -36
- package/dist/src/shared/installFromPlan.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +12 -3
- package/dist/src/shared/loadRegistry.d.ts.map +1 -1
- package/dist/src/shared/loadRegistry.js +19 -20
- package/dist/src/shared/loadRegistry.js.map +1 -1
- package/dist/src/shared/registryClient.d.ts +19 -0
- package/dist/src/shared/registryClient.d.ts.map +1 -0
- package/dist/src/shared/registryClient.js +128 -0
- package/dist/src/shared/registryClient.js.map +1 -0
- package/dist/src/shared/resolveEntry.d.ts +10 -7
- package/dist/src/shared/resolveEntry.d.ts.map +1 -1
- package/dist/src/shared/resolveEntry.js +18 -13
- package/dist/src/shared/resolveEntry.js.map +1 -1
- package/dist/src/shared/suggestOtherCommand.d.ts +7 -1
- package/dist/src/shared/suggestOtherCommand.d.ts.map +1 -1
- package/dist/src/shared/suggestOtherCommand.js +29 -23
- package/dist/src/shared/suggestOtherCommand.js.map +1 -1
- package/dist/src/types/main.d.ts +31 -2
- package/dist/src/types/main.d.ts.map +1 -1
- package/package.json +6 -11
- package/apps/lib/components/ActionButton.tsx +0 -93
- package/apps/lib/components/ActionsGroup.tsx +0 -27
- package/apps/lib/components/AlertDialog.tsx +0 -204
- package/apps/lib/components/Avatar.tsx +0 -46
- package/apps/lib/components/Badge.tsx +0 -250
- package/apps/lib/components/BadgeField.tsx +0 -403
- package/apps/lib/components/Breadcrumb.tsx +0 -280
- package/apps/lib/components/Button.tsx +0 -325
- package/apps/lib/components/ButtonGroup.tsx +0 -190
- package/apps/lib/components/Calendar.tsx +0 -115
- package/apps/lib/components/Card.tsx +0 -95
- package/apps/lib/components/Checkbox.tsx +0 -42
- package/apps/lib/components/ColorPicker.tsx +0 -441
- package/apps/lib/components/ConclusionHeader.tsx +0 -148
- package/apps/lib/components/ContextMenu.tsx +0 -571
- package/apps/lib/components/CountBadge.tsx +0 -52
- package/apps/lib/components/DataTable.tsx +0 -213
- package/apps/lib/components/DataViews/badge.ts +0 -49
- package/apps/lib/components/DataViews/cell.tsx +0 -324
- package/apps/lib/components/DataViews/context.ts +0 -144
- package/apps/lib/components/DataViews/data-views.tsx +0 -395
- package/apps/lib/components/DataViews/filters/children.tsx +0 -98
- package/apps/lib/components/DataViews/filters/custom.tsx +0 -34
- package/apps/lib/components/DataViews/filters/filters.tsx +0 -157
- package/apps/lib/components/DataViews/filters/index.ts +0 -4
- package/apps/lib/components/DataViews/filters/labelled.tsx +0 -20
- package/apps/lib/components/DataViews/filters/presets.tsx +0 -65
- package/apps/lib/components/DataViews/filters/sync.tsx +0 -35
- package/apps/lib/components/DataViews/filters/values.ts +0 -173
- package/apps/lib/components/DataViews/header.tsx +0 -220
- package/apps/lib/components/DataViews/hooks/index.ts +0 -5
- package/apps/lib/components/DataViews/hooks/useActiveRow.ts +0 -22
- package/apps/lib/components/DataViews/hooks/useControllable.ts +0 -52
- package/apps/lib/components/DataViews/index.ts +0 -88
- package/apps/lib/components/DataViews/panel/columns.tsx +0 -153
- package/apps/lib/components/DataViews/panel/controls.tsx +0 -106
- package/apps/lib/components/DataViews/panel/index.ts +0 -3
- package/apps/lib/components/DataViews/panel/panel.tsx +0 -164
- package/apps/lib/components/DataViews/panel/saved-views.tsx +0 -67
- package/apps/lib/components/DataViews/panel/section.tsx +0 -81
- package/apps/lib/components/DataViews/panel/sort.tsx +0 -42
- package/apps/lib/components/DataViews/panel/tab.tsx +0 -31
- package/apps/lib/components/DataViews/slots.ts +0 -72
- package/apps/lib/components/DataViews/states.tsx +0 -73
- package/apps/lib/components/DataViews/types.ts +0 -510
- package/apps/lib/components/DataViews/views/board-view.tsx +0 -381
- package/apps/lib/components/DataViews/views/card-rows.tsx +0 -36
- package/apps/lib/components/DataViews/views/inbox-view.tsx +0 -260
- package/apps/lib/components/DataViews/views/pane-views.tsx +0 -196
- package/apps/lib/components/DataViews/views/table-view.tsx +0 -493
- package/apps/lib/components/DataViews/views/tree-view.tsx +0 -367
- package/apps/lib/components/DatePicker.tsx +0 -232
- package/apps/lib/components/Dialog.tsx +0 -116
- package/apps/lib/components/Divider.tsx +0 -28
- package/apps/lib/components/Drawer.tsx +0 -451
- package/apps/lib/components/DropdownMenu.tsx +0 -554
- package/apps/lib/components/FieldHint.tsx +0 -69
- package/apps/lib/components/Form.tsx +0 -182
- package/apps/lib/components/FormBuilder/context.ts +0 -85
- package/apps/lib/components/FormBuilder/field-kind.ts +0 -28
- package/apps/lib/components/FormBuilder/fields/ChoiceFields.tsx +0 -60
- package/apps/lib/components/FormBuilder/fields/ColorField.tsx +0 -59
- package/apps/lib/components/FormBuilder/fields/CustomField.tsx +0 -11
- package/apps/lib/components/FormBuilder/fields/DateField.tsx +0 -32
- package/apps/lib/components/FormBuilder/fields/FieldArray.tsx +0 -74
- package/apps/lib/components/FormBuilder/fields/FieldShell.tsx +0 -168
- package/apps/lib/components/FormBuilder/fields/FileField.tsx +0 -39
- package/apps/lib/components/FormBuilder/fields/OptionListFields.tsx +0 -132
- package/apps/lib/components/FormBuilder/fields/OtpField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/PhoneField.tsx +0 -109
- package/apps/lib/components/FormBuilder/fields/RichTextEditorField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/SelectField.tsx +0 -114
- package/apps/lib/components/FormBuilder/fields/SignatureField.tsx +0 -157
- package/apps/lib/components/FormBuilder/fields/SliderField.tsx +0 -67
- package/apps/lib/components/FormBuilder/fields/SwitchBoxField.tsx +0 -41
- package/apps/lib/components/FormBuilder/fields/TableField.tsx +0 -336
- package/apps/lib/components/FormBuilder/fields/TextField.tsx +0 -213
- package/apps/lib/components/FormBuilder/fields/TreeSelectField.tsx +0 -43
- package/apps/lib/components/FormBuilder/fields/countries.ts +0 -303
- package/apps/lib/components/FormBuilder/fields/index.ts +0 -25
- package/apps/lib/components/FormBuilder/form-builder.tsx +0 -198
- package/apps/lib/components/FormBuilder/index.ts +0 -31
- package/apps/lib/components/FormBuilder/numberFormat.ts +0 -16
- package/apps/lib/components/FormBuilder/submit.tsx +0 -67
- package/apps/lib/components/FormBuilder/types.ts +0 -316
- package/apps/lib/components/FormRenderer/FormDrawer.tsx +0 -250
- package/apps/lib/components/FormRenderer/detail.tsx +0 -256
- package/apps/lib/components/FormRenderer/form-renderer.tsx +0 -358
- package/apps/lib/components/FormRenderer/header.tsx +0 -88
- package/apps/lib/components/FormRenderer/index.ts +0 -17
- package/apps/lib/components/FormRenderer/notch-action.tsx +0 -64
- package/apps/lib/components/FormRenderer/section.tsx +0 -39
- package/apps/lib/components/FormRenderer/stepper.tsx +0 -393
- package/apps/lib/components/FormRenderer/types.ts +0 -115
- package/apps/lib/components/FormSummary.tsx +0 -282
- package/apps/lib/components/HeaderBar.tsx +0 -117
- package/apps/lib/components/ImageAttachment.tsx +0 -209
- package/apps/lib/components/InnerLabelField.tsx +0 -154
- package/apps/lib/components/Input.tsx +0 -224
- package/apps/lib/components/InputField.tsx +0 -147
- package/apps/lib/components/InputOTP.tsx +0 -84
- package/apps/lib/components/Label.tsx +0 -129
- package/apps/lib/components/LabelField.tsx +0 -76
- package/apps/lib/components/LabeledCheckBox.tsx +0 -51
- package/apps/lib/components/LabeledRadio.tsx +0 -51
- package/apps/lib/components/LinkButton.tsx +0 -94
- package/apps/lib/components/LoginButton.tsx +0 -51
- package/apps/lib/components/PasswordLevel.tsx +0 -58
- package/apps/lib/components/Popover.tsx +0 -312
- package/apps/lib/components/ProfileMenu.tsx +0 -85
- package/apps/lib/components/Radio.tsx +0 -59
- package/apps/lib/components/RadioCard.tsx +0 -50
- package/apps/lib/components/ScrollArea.tsx +0 -54
- package/apps/lib/components/SearchField.tsx +0 -62
- package/apps/lib/components/SearchableSelect.tsx +0 -318
- package/apps/lib/components/SearchableTable.tsx +0 -344
- package/apps/lib/components/SearchableTree.tsx +0 -485
- package/apps/lib/components/SearchableTreeDialog.tsx +0 -502
- package/apps/lib/components/SectionBlock.tsx +0 -168
- package/apps/lib/components/Select.tsx +0 -347
- package/apps/lib/components/SimpleSelect.tsx +0 -225
- package/apps/lib/components/Skeleton.tsx +0 -12
- package/apps/lib/components/SlideDatePicker.tsx +0 -255
- package/apps/lib/components/SpinLoading.tsx +0 -174
- package/apps/lib/components/Stepper.tsx +0 -480
- package/apps/lib/components/Switch.tsx +0 -82
- package/apps/lib/components/TabFormItem.tsx +0 -153
- package/apps/lib/components/TabSwitch.tsx +0 -172
- package/apps/lib/components/Table.tsx +0 -597
- package/apps/lib/components/TextEditor/ChartBlockTool.ts +0 -676
- package/apps/lib/components/TextEditor/RichTextField.tsx +0 -46
- package/apps/lib/components/TextEditor/TableDnDWrapper.ts +0 -462
- package/apps/lib/components/TextEditor/TextEditor.tsx +0 -1164
- package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +0 -429
- package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +0 -70
- package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +0 -50
- package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +0 -48
- package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +0 -98
- package/apps/lib/components/TextEditor/editorjs.d.ts +0 -60
- package/apps/lib/components/TextEditor/index.ts +0 -7
- package/apps/lib/components/TextEditor/markdownParser.ts +0 -346
- package/apps/lib/components/Textarea.tsx +0 -117
- package/apps/lib/components/Timeline.tsx +0 -263
- package/apps/lib/components/Toast.tsx +0 -87
- package/apps/lib/components/Toggle.tsx +0 -125
- package/apps/lib/components/ToggleButton.tsx +0 -140
- package/apps/lib/components/Tooltip.tsx +0 -116
- package/apps/lib/components/TransparentLabel.tsx +0 -71
- package/apps/lib/components/TreeDropDown.tsx +0 -115
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +0 -380
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +0 -75
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +0 -354
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +0 -60
- package/apps/lib/components/TreeFolder/icons.tsx +0 -60
- package/apps/lib/components/TreeFolder/index.ts +0 -24
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +0 -109
- package/apps/lib/components/TreeFolder/types.ts +0 -77
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +0 -118
- package/apps/lib/hooks/useActiveTreeItem.ts +0 -61
- package/apps/lib/hooks/useClickOutside.ts +0 -27
- package/apps/lib/hooks/useDragDrop.tsx +0 -365
- package/apps/lib/hooks/useHtmlDir.ts +0 -31
- package/apps/lib/hooks/useInfiniteScroll.ts +0 -108
- package/apps/lib/hooks/useIsMobile.ts +0 -21
- package/apps/lib/hooks/useResize.ts +0 -67
- package/apps/lib/hooks/useTagSelection.ts +0 -300
- package/apps/lib/layouts/CNLayout.tsx +0 -372
- package/apps/lib/layouts/DataViewCard.tsx +0 -62
- package/apps/lib/layouts/FieldSection.tsx +0 -91
- package/apps/lib/layouts/TreeSubLayout.tsx +0 -173
- package/apps/lib/providers/ThemeProvider.tsx +0 -84
- package/apps/lib/registry.json +0 -1217
- package/apps/lib/tsconfig.json +0 -9
- package/apps/lib/tsconfig.tsbuildinfo +0 -1
- package/apps/lib/utils/cn.ts +0 -6
- package/apps/lib/utils/color.ts +0 -175
- package/apps/lib/utils/dataViews/path.ts +0 -67
- package/apps/lib/utils/dataViews/query.ts +0 -73
- package/apps/lib/utils/dataViews/types.ts +0 -187
- package/apps/lib/utils/dateFormat.ts +0 -108
- package/apps/lib/utils/resize.ts +0 -31
- package/apps/lib/utils/scroller.ts +0 -26
- package/apps/lib/utils/types.ts +0 -16
- package/docs/BLOCKS.md +0 -129
- package/docs/CHANGELOG-1.1.16.md +0 -108
- package/docs/Cover.png +0 -0
- package/docs/README.md +0 -215
- package/docs/components/action-button.md +0 -638
- package/docs/components/actions-group.md +0 -708
- package/docs/components/alert-dialog.md +0 -920
- package/docs/components/avatar.md +0 -709
- package/docs/components/badge-field.md +0 -738
- package/docs/components/badge.md +0 -301
- package/docs/components/breadcrumb.md +0 -930
- package/docs/components/button-group.md +0 -650
- package/docs/components/button.md +0 -639
- package/docs/components/calendar.md +0 -555
- package/docs/components/card.md +0 -622
- package/docs/components/chart-block-tool.md +0 -129
- package/docs/components/checkbox.md +0 -699
- package/docs/components/cn-layout.md +0 -854
- package/docs/components/color-picker.md +0 -101
- package/docs/components/conclusion-header.md +0 -80
- package/docs/components/context-menu.md +0 -483
- package/docs/components/count-badge.md +0 -560
- package/docs/components/data-table.md +0 -854
- package/docs/components/data-views/backend-response.md +0 -324
- package/docs/components/data-views/examples/a11y-rtl.md +0 -250
- package/docs/components/data-views/examples/api-orders-route.md +0 -130
- package/docs/components/data-views/examples/fields.md +0 -362
- package/docs/components/data-views/examples/filters.md +0 -307
- package/docs/components/data-views/examples/inbox-routing.md +0 -218
- package/docs/components/data-views/examples/index.md +0 -29
- package/docs/components/data-views/examples/overview.md +0 -244
- package/docs/components/data-views/examples/panel.md +0 -212
- package/docs/components/data-views/examples/scale.md +0 -231
- package/docs/components/data-views/examples/server-side.md +0 -210
- package/docs/components/data-views/examples/state.md +0 -250
- package/docs/components/data-views/examples/tree-custom.md +0 -388
- package/docs/components/data-views/examples/view-registry.md +0 -313
- package/docs/components/data-views/examples/views.md +0 -534
- package/docs/components/data-views/guide.md +0 -405
- package/docs/components/data-views/index.md +0 -1521
- package/docs/components/data-views/migration.md +0 -81
- package/docs/components/date-picker.md +0 -857
- package/docs/components/dialog.md +0 -929
- package/docs/components/divider.md +0 -766
- package/docs/components/drawer.md +0 -654
- package/docs/components/dropdown-menu.md +0 -668
- package/docs/components/field-hint.md +0 -898
- package/docs/components/field-section.md +0 -781
- package/docs/components/form-builder.md +0 -284
- package/docs/components/form-renderer.md +0 -396
- package/docs/components/form-summary.md +0 -138
- package/docs/components/form.md +0 -785
- package/docs/components/header-bar.md +0 -188
- package/docs/components/image-attachment.md +0 -906
- package/docs/components/inner-label-field.md +0 -819
- package/docs/components/input-field.md +0 -623
- package/docs/components/input-otp.md +0 -756
- package/docs/components/input.md +0 -634
- package/docs/components/label-field.md +0 -770
- package/docs/components/label.md +0 -761
- package/docs/components/labeled-check-box.md +0 -642
- package/docs/components/labeled-radio.md +0 -796
- package/docs/components/link-button.md +0 -685
- package/docs/components/login-button.md +0 -872
- package/docs/components/password-level.md +0 -803
- package/docs/components/popover.md +0 -649
- package/docs/components/profile-menu.md +0 -656
- package/docs/components/radio-card.md +0 -801
- package/docs/components/radio.md +0 -735
- package/docs/components/scroll-area.md +0 -691
- package/docs/components/search-field.md +0 -702
- package/docs/components/searchable-select.md +0 -368
- package/docs/components/searchable-table.md +0 -438
- package/docs/components/searchable-tree-dialog.md +0 -190
- package/docs/components/searchable-tree.md +0 -200
- package/docs/components/section-block.md +0 -483
- package/docs/components/select.md +0 -709
- package/docs/components/simple-select.md +0 -741
- package/docs/components/skeleton.md +0 -706
- package/docs/components/slide-date-picker.md +0 -837
- package/docs/components/spin-loading.md +0 -696
- package/docs/components/stepper.md +0 -316
- package/docs/components/switch.md +0 -770
- package/docs/components/tab-form-item.md +0 -773
- package/docs/components/tab-switch.md +0 -170
- package/docs/components/table-dnd-wrapper.md +0 -107
- package/docs/components/table.md +0 -1088
- package/docs/components/text-editor.md +0 -735
- package/docs/components/textarea.md +0 -681
- package/docs/components/timeline.md +0 -254
- package/docs/components/toast.md +0 -773
- package/docs/components/toggle-button.md +0 -643
- package/docs/components/toggle.md +0 -882
- package/docs/components/tooltip.md +0 -513
- package/docs/components/transparent-label.md +0 -721
- package/docs/components/tree-drop-down.md +0 -740
- package/docs/components/tree-folder.md +0 -110
- package/docs/components/tree-sub-layout.md +0 -707
- package/docs/explanation/architecture.md +0 -54
- package/docs/explanation/design-system.md +0 -52
- package/docs/how-to/form-and-list-recipes.md +0 -386
- package/docs/how-to/forms-with-form-builder.md +0 -472
- package/docs/how-to/guides.md +0 -1027
- package/docs/migration/changelog.md +0 -60
- package/docs/migration/form-builder-2.5.2.md +0 -113
- package/docs/reference/cli.md +0 -112
- package/docs/reference/components.md +0 -572
- package/docs/reference/hooks.md +0 -1523
- package/docs/reference/providers.md +0 -866
- package/docs/reference/tailwind-plugins.md +0 -942
- package/docs/reference/theme.md +0 -85
- package/docs/reference/types.md +0 -1016
- package/docs/reference/utilities.md +0 -726
- package/docs/tutorials/building-first-form.md +0 -846
- package/docs/tutorials/component-composition.md +0 -882
- package/docs/tutorials/getting-started.md +0 -302
- 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
|