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,638 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: ActionButton
|
|
3
|
-
description: Icon-only action button component for toolbar actions, inline operations, and compact interfaces.
|
|
4
|
-
component: true
|
|
5
|
-
group: Buttons & Actions
|
|
6
|
-
keywords: [button, action, icon, toolbar, compact, small]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# ActionButton
|
|
10
|
-
|
|
11
|
-
A compact icon-only button component designed for toolbars, action bars, and inline operations. Built on top of the Button component with predefined square dimensions.
|
|
12
|
-
|
|
13
|
-
## Installation
|
|
14
|
-
|
|
15
|
-
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
16
|
-
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npx torch-glare@latest init
|
|
20
|
-
npx torch-glare@latest add ActionButton
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
`add` also copies any components, hooks, and utilities that `ActionButton` depends on.
|
|
24
|
-
|
|
25
|
-
## Imports
|
|
26
|
-
|
|
27
|
-
```typescript
|
|
28
|
-
import { ActionButton } from '@/components/ActionButton'
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Basic Usage
|
|
32
|
-
|
|
33
|
-
```tsx
|
|
34
|
-
import { ActionButton } from '@/components/ActionButton'
|
|
35
|
-
|
|
36
|
-
export function BasicActionButton() {
|
|
37
|
-
return (
|
|
38
|
-
<ActionButton size="M">
|
|
39
|
-
<i className="ri-add-circle-fill"></i>
|
|
40
|
-
</ActionButton>
|
|
41
|
-
)
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Examples
|
|
46
|
-
|
|
47
|
-
### All Sizes
|
|
48
|
-
|
|
49
|
-
ActionButton comes in three sizes: XS, S, and M.
|
|
50
|
-
|
|
51
|
-
```tsx
|
|
52
|
-
export function ActionButtonSizes() {
|
|
53
|
-
return (
|
|
54
|
-
<div className="flex items-center gap-4">
|
|
55
|
-
<ActionButton size="XS" aria-label="Add item">
|
|
56
|
-
<i className="ri-add-line"></i>
|
|
57
|
-
</ActionButton>
|
|
58
|
-
|
|
59
|
-
<ActionButton size="S" aria-label="Edit item">
|
|
60
|
-
<i className="ri-pencil-line"></i>
|
|
61
|
-
</ActionButton>
|
|
62
|
-
|
|
63
|
-
<ActionButton size="M" aria-label="Delete item">
|
|
64
|
-
<i className="ri-delete-bin-line"></i>
|
|
65
|
-
</ActionButton>
|
|
66
|
-
</div>
|
|
67
|
-
)
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Toolbar Actions
|
|
72
|
-
|
|
73
|
-
Common toolbar implementation with ActionButtons.
|
|
74
|
-
|
|
75
|
-
```tsx
|
|
76
|
-
export function Toolbar() {
|
|
77
|
-
return (
|
|
78
|
-
<div className="flex items-center gap-2 p-2 border border-border-system-global-primary rounded-lg">
|
|
79
|
-
<ActionButton size="S" variant="PrimeStyle">
|
|
80
|
-
<i className="ri-save-line"></i>
|
|
81
|
-
</ActionButton>
|
|
82
|
-
|
|
83
|
-
<ActionButton size="S" variant="BluSecStyle">
|
|
84
|
-
<i className="ri-file-copy-line"></i>
|
|
85
|
-
</ActionButton>
|
|
86
|
-
|
|
87
|
-
<ActionButton size="S" variant="BluSecStyle">
|
|
88
|
-
<i className="ri-scissors-line"></i>
|
|
89
|
-
</ActionButton>
|
|
90
|
-
|
|
91
|
-
<ActionButton size="S" variant="BluSecStyle">
|
|
92
|
-
<i className="ri-clipboard-line"></i>
|
|
93
|
-
</ActionButton>
|
|
94
|
-
|
|
95
|
-
<div className="w-px h-6 bg-border-system-global-primary mx-1" />
|
|
96
|
-
|
|
97
|
-
<ActionButton size="S" variant="BluSecStyle">
|
|
98
|
-
<i className="ri-arrow-go-back-line"></i>
|
|
99
|
-
</ActionButton>
|
|
100
|
-
|
|
101
|
-
<ActionButton size="S" variant="BluSecStyle">
|
|
102
|
-
<i className="ri-arrow-go-forward-line"></i>
|
|
103
|
-
</ActionButton>
|
|
104
|
-
</div>
|
|
105
|
-
)
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
### Table Row Actions
|
|
110
|
-
|
|
111
|
-
Inline actions within table rows.
|
|
112
|
-
|
|
113
|
-
```tsx
|
|
114
|
-
export function TableRowActions({ row }) {
|
|
115
|
-
const [isEditing, setIsEditing] = useState(false)
|
|
116
|
-
|
|
117
|
-
return (
|
|
118
|
-
<td className="flex items-center gap-1 justify-end">
|
|
119
|
-
<ActionButton
|
|
120
|
-
size="XS"
|
|
121
|
-
variant="BluSecStyle"
|
|
122
|
-
onClick={() => setIsEditing(true)}
|
|
123
|
-
aria-label="Edit row"
|
|
124
|
-
>
|
|
125
|
-
<i className="ri-pencil-line"></i>
|
|
126
|
-
</ActionButton>
|
|
127
|
-
|
|
128
|
-
<ActionButton
|
|
129
|
-
size="XS"
|
|
130
|
-
variant="BluSecStyle"
|
|
131
|
-
onClick={() => handleDuplicate(row.id)}
|
|
132
|
-
aria-label="Duplicate row"
|
|
133
|
-
>
|
|
134
|
-
<i className="ri-file-copy-line"></i>
|
|
135
|
-
</ActionButton>
|
|
136
|
-
|
|
137
|
-
<ActionButton
|
|
138
|
-
size="XS"
|
|
139
|
-
variant="RedSecStyle"
|
|
140
|
-
onClick={() => handleDelete(row.id)}
|
|
141
|
-
aria-label="Delete row"
|
|
142
|
-
>
|
|
143
|
-
<i className="ri-delete-bin-line"></i>
|
|
144
|
-
</ActionButton>
|
|
145
|
-
</td>
|
|
146
|
-
)
|
|
147
|
-
}
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### Card Actions
|
|
151
|
-
|
|
152
|
-
Action buttons in card headers.
|
|
153
|
-
|
|
154
|
-
```tsx
|
|
155
|
-
export function CardWithActions() {
|
|
156
|
-
const [isFavorite, setIsFavorite] = useState(false)
|
|
157
|
-
const [isExpanded, setIsExpanded] = useState(false)
|
|
158
|
-
|
|
159
|
-
return (
|
|
160
|
-
<div className="border border-border-system-global-primary rounded-lg p-4">
|
|
161
|
-
<div className="flex items-center justify-between mb-3">
|
|
162
|
-
<h3 className="text-lg font-semibold">Card Title</h3>
|
|
163
|
-
|
|
164
|
-
<div className="flex items-center gap-1">
|
|
165
|
-
<ActionButton
|
|
166
|
-
size="S"
|
|
167
|
-
variant={isFavorite ? "YelSecStyle" : "BluSecStyle"}
|
|
168
|
-
onClick={() => setIsFavorite(!isFavorite)}
|
|
169
|
-
aria-label={isFavorite ? "Remove from favorites" : "Add to favorites"}
|
|
170
|
-
>
|
|
171
|
-
<i className={isFavorite ? "ri-star-fill" : "ri-star-line"}></i>
|
|
172
|
-
</ActionButton>
|
|
173
|
-
|
|
174
|
-
<ActionButton
|
|
175
|
-
size="S"
|
|
176
|
-
variant="BluSecStyle"
|
|
177
|
-
onClick={() => setIsExpanded(!isExpanded)}
|
|
178
|
-
aria-label={isExpanded ? "Collapse" : "Expand"}
|
|
179
|
-
>
|
|
180
|
-
<i className={`ri-arrow-${isExpanded ? 'up' : 'down'}-s-line`}></i>
|
|
181
|
-
</ActionButton>
|
|
182
|
-
|
|
183
|
-
<ActionButton
|
|
184
|
-
size="S"
|
|
185
|
-
variant="BluSecStyle"
|
|
186
|
-
aria-label="More options"
|
|
187
|
-
>
|
|
188
|
-
<i className="ri-more-2-fill"></i>
|
|
189
|
-
</ActionButton>
|
|
190
|
-
</div>
|
|
191
|
-
</div>
|
|
192
|
-
|
|
193
|
-
{/* Card content */}
|
|
194
|
-
</div>
|
|
195
|
-
)
|
|
196
|
-
}
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
### Loading State
|
|
200
|
-
|
|
201
|
-
ActionButton with loading indicator.
|
|
202
|
-
|
|
203
|
-
```tsx
|
|
204
|
-
export function LoadingActionButton() {
|
|
205
|
-
const [isLoading, setIsLoading] = useState(false)
|
|
206
|
-
|
|
207
|
-
const handleAction = async () => {
|
|
208
|
-
setIsLoading(true)
|
|
209
|
-
await performAction()
|
|
210
|
-
setIsLoading(false)
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
return (
|
|
214
|
-
<ActionButton
|
|
215
|
-
size="M"
|
|
216
|
-
variant="PrimeStyle"
|
|
217
|
-
onClick={handleAction}
|
|
218
|
-
disabled={isLoading}
|
|
219
|
-
is_loading={isLoading}
|
|
220
|
-
aria-label="Save changes"
|
|
221
|
-
>
|
|
222
|
-
{isLoading ? (
|
|
223
|
-
<i className="ri-loader-4-line animate-spin"></i>
|
|
224
|
-
) : (
|
|
225
|
-
<i className="ri-save-line"></i>
|
|
226
|
-
)}
|
|
227
|
-
</ActionButton>
|
|
228
|
-
)
|
|
229
|
-
}
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### Floating Action Button (FAB)
|
|
233
|
-
|
|
234
|
-
Mobile-style floating action button.
|
|
235
|
-
|
|
236
|
-
```tsx
|
|
237
|
-
export function FloatingActionButton() {
|
|
238
|
-
return (
|
|
239
|
-
<div className="fixed bottom-6 right-6 z-50">
|
|
240
|
-
<ActionButton
|
|
241
|
-
size="M"
|
|
242
|
-
variant="PrimeStyle"
|
|
243
|
-
className="shadow-lg hover:shadow-xl transition-shadow"
|
|
244
|
-
aria-label="Create new item"
|
|
245
|
-
>
|
|
246
|
-
<i className="ri-add-line text-xl"></i>
|
|
247
|
-
</ActionButton>
|
|
248
|
-
</div>
|
|
249
|
-
)
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
### Action Groups
|
|
254
|
-
|
|
255
|
-
Grouped actions with separators.
|
|
256
|
-
|
|
257
|
-
```tsx
|
|
258
|
-
export function ActionButtonGroup() {
|
|
259
|
-
const [activeView, setActiveView] = useState('grid')
|
|
260
|
-
|
|
261
|
-
return (
|
|
262
|
-
<div className="inline-flex items-center border border-border-system-global-primary rounded-lg overflow-hidden">
|
|
263
|
-
<ActionButton
|
|
264
|
-
size="S"
|
|
265
|
-
variant={activeView === 'list' ? "PrimeStyle" : "BluSecStyle"}
|
|
266
|
-
onClick={() => setActiveView('list')}
|
|
267
|
-
className="rounded-none border-0"
|
|
268
|
-
aria-label="List view"
|
|
269
|
-
>
|
|
270
|
-
<i className="ri-list-unordered"></i>
|
|
271
|
-
</ActionButton>
|
|
272
|
-
|
|
273
|
-
<ActionButton
|
|
274
|
-
size="S"
|
|
275
|
-
variant={activeView === 'grid' ? "PrimeStyle" : "BluSecStyle"}
|
|
276
|
-
onClick={() => setActiveView('grid')}
|
|
277
|
-
className="rounded-none border-0 border-l border-border-system-global-primary"
|
|
278
|
-
aria-label="Grid view"
|
|
279
|
-
>
|
|
280
|
-
<i className="ri-grid-fill"></i>
|
|
281
|
-
</ActionButton>
|
|
282
|
-
|
|
283
|
-
<ActionButton
|
|
284
|
-
size="S"
|
|
285
|
-
variant={activeView === 'kanban' ? "PrimeStyle" : "BluSecStyle"}
|
|
286
|
-
onClick={() => setActiveView('kanban')}
|
|
287
|
-
className="rounded-none border-0 border-l border-border-system-global-primary"
|
|
288
|
-
aria-label="Kanban view"
|
|
289
|
-
>
|
|
290
|
-
<i className="ri-layout-column-fill"></i>
|
|
291
|
-
</ActionButton>
|
|
292
|
-
</div>
|
|
293
|
-
)
|
|
294
|
-
}
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
### With Tooltips
|
|
298
|
-
|
|
299
|
-
ActionButtons with informative tooltips.
|
|
300
|
-
|
|
301
|
-
```tsx
|
|
302
|
-
import { Tooltip } from '@/components/Tooltip'
|
|
303
|
-
|
|
304
|
-
export function ActionButtonsWithTooltips() {
|
|
305
|
-
return (
|
|
306
|
-
<div className="flex items-center gap-2">
|
|
307
|
-
<Tooltip content="Bold (Ctrl+B)">
|
|
308
|
-
<ActionButton size="S" variant="BluSecStyle">
|
|
309
|
-
<i className="ri-bold"></i>
|
|
310
|
-
</ActionButton>
|
|
311
|
-
</Tooltip>
|
|
312
|
-
|
|
313
|
-
<Tooltip content="Italic (Ctrl+I)">
|
|
314
|
-
<ActionButton size="S" variant="BluSecStyle">
|
|
315
|
-
<i className="ri-italic"></i>
|
|
316
|
-
</ActionButton>
|
|
317
|
-
</Tooltip>
|
|
318
|
-
|
|
319
|
-
<Tooltip content="Underline (Ctrl+U)">
|
|
320
|
-
<ActionButton size="S" variant="BluSecStyle">
|
|
321
|
-
<i className="ri-underline"></i>
|
|
322
|
-
</ActionButton>
|
|
323
|
-
</Tooltip>
|
|
324
|
-
|
|
325
|
-
<Tooltip content="Strikethrough">
|
|
326
|
-
<ActionButton size="S" variant="BluSecStyle">
|
|
327
|
-
<i className="ri-strikethrough"></i>
|
|
328
|
-
</ActionButton>
|
|
329
|
-
</Tooltip>
|
|
330
|
-
</div>
|
|
331
|
-
)
|
|
332
|
-
}
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
## API Reference
|
|
336
|
-
|
|
337
|
-
### ActionButton Props
|
|
338
|
-
|
|
339
|
-
| Prop | Type | Default | Description |
|
|
340
|
-
|------|------|---------|-------------|
|
|
341
|
-
| size | `'XS' \| 'S' \| 'M'` | `'M'` | Button size |
|
|
342
|
-
| variant | `ButtonVariant` | `'SecStyle'` | Visual style variant |
|
|
343
|
-
| is_loading | `boolean` | `false` | Loading state |
|
|
344
|
-
| disabled | `boolean` | `false` | Disabled state |
|
|
345
|
-
| theme | `Themes` | - | Theme override |
|
|
346
|
-
| asChild | `boolean` | `false` | Merge props with child |
|
|
347
|
-
| as | `React.ElementType` | `'button'` | Custom element type |
|
|
348
|
-
| className | `string` | - | Additional CSS classes |
|
|
349
|
-
| children | `ReactNode` | - | Icon content |
|
|
350
|
-
| onClick | `() => void` | - | Click handler |
|
|
351
|
-
| type | `'button' \| 'submit' \| 'reset'` | `'button'` | Button type |
|
|
352
|
-
|
|
353
|
-
### Size Mapping
|
|
354
|
-
|
|
355
|
-
ActionButton sizes map to specific dimensions and Button component sizes:
|
|
356
|
-
|
|
357
|
-
| ActionButton Size | Dimensions | Button Size | Icon Size |
|
|
358
|
-
|-------------------|------------|-------------|-----------|
|
|
359
|
-
| XS | 18px × 18px | S | 12px |
|
|
360
|
-
| S | 22px × 22px | M | 12px |
|
|
361
|
-
| M | 32px × 32px | L | 18px |
|
|
362
|
-
|
|
363
|
-
### Available Variants
|
|
364
|
-
|
|
365
|
-
Inherits all variants from the Button component:
|
|
366
|
-
|
|
367
|
-
- `PrimeStyle` - Primary action style
|
|
368
|
-
- `SecStyle` - Secondary action style
|
|
369
|
-
- `DangerStyle` - Destructive actions
|
|
370
|
-
- `YelSecStyle` - Yellow secondary style
|
|
371
|
-
- `BluSecStyle` - Blue secondary style
|
|
372
|
-
- `RedSecStyle` - Red secondary style
|
|
373
|
-
- `BorderStyle` - Border-only style
|
|
374
|
-
- `NoBorderNoFillStyle` - Minimal style
|
|
375
|
-
|
|
376
|
-
## Styling
|
|
377
|
-
|
|
378
|
-
### Base Styles
|
|
379
|
-
|
|
380
|
-
- **Square dimensions**: Equal width and height for perfect icon centering
|
|
381
|
-
- **Rounded corners**: `radius/sm` (4px) at XS and S, `radius/lg` (8px) at M
|
|
382
|
-
- **Icon-only design**: Optimized padding for icon display
|
|
383
|
-
- **Action colours**: `action-secondary` at rest, `action-hover` on hover and
|
|
384
|
-
`action-disabled` when disabled — applied unless you pass an explicit `variant`
|
|
385
|
-
- **Inherits Button styles**: All Button component styles and behaviors
|
|
386
|
-
|
|
387
|
-
### Custom Styling
|
|
388
|
-
|
|
389
|
-
```tsx
|
|
390
|
-
// Custom colored action buttons
|
|
391
|
-
<ActionButton
|
|
392
|
-
size="M"
|
|
393
|
-
className="bg-green-500 hover:bg-green-600 text-white"
|
|
394
|
-
>
|
|
395
|
-
<i className="ri-check-line"></i>
|
|
396
|
-
</ActionButton>
|
|
397
|
-
|
|
398
|
-
// Circular action button
|
|
399
|
-
<ActionButton
|
|
400
|
-
size="M"
|
|
401
|
-
className="!rounded-full"
|
|
402
|
-
>
|
|
403
|
-
<i className="ri-heart-line"></i>
|
|
404
|
-
</ActionButton>
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
## TypeScript Types
|
|
408
|
-
|
|
409
|
-
```typescript
|
|
410
|
-
interface ActionButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
411
|
-
size?: 'XS' | 'S' | 'M'
|
|
412
|
-
variant?: ButtonVariant
|
|
413
|
-
is_loading?: boolean
|
|
414
|
-
disabled?: boolean
|
|
415
|
-
theme?: Themes
|
|
416
|
-
asChild?: boolean
|
|
417
|
-
as?: React.ElementType
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
type ButtonVariant =
|
|
421
|
-
| 'PrimeStyle'
|
|
422
|
-
| 'SecStyle'
|
|
423
|
-
| 'DangerStyle'
|
|
424
|
-
| 'YelSecStyle'
|
|
425
|
-
| 'BluSecStyle'
|
|
426
|
-
| 'RedSecStyle'
|
|
427
|
-
| 'BorderStyle'
|
|
428
|
-
| 'NoBorderNoFillStyle'
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
## Common Patterns
|
|
432
|
-
|
|
433
|
-
### Icon Button Bar
|
|
434
|
-
|
|
435
|
-
```tsx
|
|
436
|
-
function IconButtonBar({ onAction }) {
|
|
437
|
-
return (
|
|
438
|
-
<div className="flex items-center gap-1 p-1 bg-background-system-body-secondary rounded-lg">
|
|
439
|
-
{[
|
|
440
|
-
{ icon: 'ri-home-line', action: 'home' },
|
|
441
|
-
{ icon: 'ri-search-line', action: 'search' },
|
|
442
|
-
{ icon: 'ri-notification-line', action: 'notifications' },
|
|
443
|
-
{ icon: 'ri-settings-line', action: 'settings' },
|
|
444
|
-
].map(item => (
|
|
445
|
-
<ActionButton
|
|
446
|
-
key={item.action}
|
|
447
|
-
size="S"
|
|
448
|
-
variant="BluSecStyle"
|
|
449
|
-
onClick={() => onAction(item.action)}
|
|
450
|
-
>
|
|
451
|
-
<i className={item.icon}></i>
|
|
452
|
-
</ActionButton>
|
|
453
|
-
))}
|
|
454
|
-
</div>
|
|
455
|
-
)
|
|
456
|
-
}
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
### Conditional Actions
|
|
460
|
-
|
|
461
|
-
```tsx
|
|
462
|
-
function ConditionalActions({ permissions, item }) {
|
|
463
|
-
return (
|
|
464
|
-
<div className="flex items-center gap-1">
|
|
465
|
-
{permissions.canEdit && (
|
|
466
|
-
<ActionButton size="XS" onClick={() => editItem(item.id)}>
|
|
467
|
-
<i className="ri-pencil-line"></i>
|
|
468
|
-
</ActionButton>
|
|
469
|
-
)}
|
|
470
|
-
|
|
471
|
-
{permissions.canShare && (
|
|
472
|
-
<ActionButton size="XS" onClick={() => shareItem(item.id)}>
|
|
473
|
-
<i className="ri-share-line"></i>
|
|
474
|
-
</ActionButton>
|
|
475
|
-
)}
|
|
476
|
-
|
|
477
|
-
{permissions.canDelete && (
|
|
478
|
-
<ActionButton
|
|
479
|
-
size="XS"
|
|
480
|
-
variant="RedSecStyle"
|
|
481
|
-
onClick={() => deleteItem(item.id)}
|
|
482
|
-
>
|
|
483
|
-
<i className="ri-delete-bin-line"></i>
|
|
484
|
-
</ActionButton>
|
|
485
|
-
)}
|
|
486
|
-
</div>
|
|
487
|
-
)
|
|
488
|
-
}
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
## Testing
|
|
492
|
-
|
|
493
|
-
```typescript
|
|
494
|
-
import { render, screen, fireEvent } from '@testing-library/react'
|
|
495
|
-
import { ActionButton } from '@/components/ActionButton'
|
|
496
|
-
|
|
497
|
-
describe('ActionButton', () => {
|
|
498
|
-
it('renders with correct size', () => {
|
|
499
|
-
render(
|
|
500
|
-
<ActionButton size="S" aria-label="Test button">
|
|
501
|
-
<i className="ri-add-line"></i>
|
|
502
|
-
</ActionButton>
|
|
503
|
-
)
|
|
504
|
-
|
|
505
|
-
const button = screen.getByLabelText('Test button')
|
|
506
|
-
expect(button).toHaveClass('h-[22px]', 'w-[22px]')
|
|
507
|
-
})
|
|
508
|
-
|
|
509
|
-
it('handles click events', () => {
|
|
510
|
-
const handleClick = jest.fn()
|
|
511
|
-
render(
|
|
512
|
-
<ActionButton onClick={handleClick} aria-label="Test button">
|
|
513
|
-
<i className="ri-add-line"></i>
|
|
514
|
-
</ActionButton>
|
|
515
|
-
)
|
|
516
|
-
|
|
517
|
-
fireEvent.click(screen.getByLabelText('Test button'))
|
|
518
|
-
expect(handleClick).toHaveBeenCalledTimes(1)
|
|
519
|
-
})
|
|
520
|
-
|
|
521
|
-
it('shows loading state', () => {
|
|
522
|
-
render(
|
|
523
|
-
<ActionButton is_loading={true} aria-label="Loading">
|
|
524
|
-
<i className="ri-loader-line"></i>
|
|
525
|
-
</ActionButton>
|
|
526
|
-
)
|
|
527
|
-
|
|
528
|
-
const button = screen.getByLabelText('Loading')
|
|
529
|
-
expect(button).toBeInTheDocument()
|
|
530
|
-
})
|
|
531
|
-
|
|
532
|
-
it('applies disabled state', () => {
|
|
533
|
-
render(
|
|
534
|
-
<ActionButton disabled={true} aria-label="Disabled">
|
|
535
|
-
<i className="ri-close-line"></i>
|
|
536
|
-
</ActionButton>
|
|
537
|
-
)
|
|
538
|
-
|
|
539
|
-
const button = screen.getByLabelText('Disabled')
|
|
540
|
-
expect(button).toBeDisabled()
|
|
541
|
-
})
|
|
542
|
-
})
|
|
543
|
-
```
|
|
544
|
-
|
|
545
|
-
## Accessibility
|
|
546
|
-
|
|
547
|
-
- **ARIA Labels**: Always provide `aria-label` for icon-only buttons
|
|
548
|
-
- **Keyboard Navigation**: Full keyboard support with Tab and Enter/Space
|
|
549
|
-
- **Focus Indicators**: Clear focus states for keyboard navigation
|
|
550
|
-
- **Screen Reader Support**: Descriptive labels for all actions
|
|
551
|
-
- **Disabled State**: Properly communicates disabled state
|
|
552
|
-
|
|
553
|
-
### Accessibility Example
|
|
554
|
-
|
|
555
|
-
```tsx
|
|
556
|
-
<ActionButton
|
|
557
|
-
size="M"
|
|
558
|
-
variant="PrimeStyle"
|
|
559
|
-
aria-label="Save document"
|
|
560
|
-
aria-keyshortcuts="Ctrl+S"
|
|
561
|
-
aria-describedby="save-tooltip"
|
|
562
|
-
>
|
|
563
|
-
<i className="ri-save-line"></i>
|
|
564
|
-
</ActionButton>
|
|
565
|
-
<span id="save-tooltip" className="sr-only">
|
|
566
|
-
Save the current document
|
|
567
|
-
</span>
|
|
568
|
-
```
|
|
569
|
-
|
|
570
|
-
## Performance
|
|
571
|
-
|
|
572
|
-
- **Optimized Rendering**: Uses Button component's optimized rendering
|
|
573
|
-
- **Event Delegation**: Efficient event handling
|
|
574
|
-
- **CSS Variables**: Theme changes without re-renders
|
|
575
|
-
- **Memoization Ready**: Can be wrapped in React.memo for lists
|
|
576
|
-
|
|
577
|
-
### Performance Tips
|
|
578
|
-
|
|
579
|
-
```tsx
|
|
580
|
-
// Memoized action button for lists
|
|
581
|
-
const MemoizedActionButton = React.memo(ActionButton)
|
|
582
|
-
|
|
583
|
-
// Use stable callbacks
|
|
584
|
-
const handleClick = useCallback((id) => {
|
|
585
|
-
// Handle action
|
|
586
|
-
}, [])
|
|
587
|
-
|
|
588
|
-
// Render in list
|
|
589
|
-
items.map(item => (
|
|
590
|
-
<MemoizedActionButton
|
|
591
|
-
key={item.id}
|
|
592
|
-
size="XS"
|
|
593
|
-
onClick={() => handleClick(item.id)}
|
|
594
|
-
>
|
|
595
|
-
<i className="ri-edit-line"></i>
|
|
596
|
-
</MemoizedActionButton>
|
|
597
|
-
))
|
|
598
|
-
```
|
|
599
|
-
|
|
600
|
-
## Migration Guide
|
|
601
|
-
|
|
602
|
-
### From Icon Buttons
|
|
603
|
-
|
|
604
|
-
```tsx
|
|
605
|
-
// Before: Custom icon button
|
|
606
|
-
<button className="w-8 h-8 flex items-center justify-center">
|
|
607
|
-
<Icon name="add" />
|
|
608
|
-
</button>
|
|
609
|
-
|
|
610
|
-
// After: ActionButton
|
|
611
|
-
<ActionButton size="M">
|
|
612
|
-
<i className="ri-add-line"></i>
|
|
613
|
-
</ActionButton>
|
|
614
|
-
```
|
|
615
|
-
|
|
616
|
-
### From Other Libraries
|
|
617
|
-
|
|
618
|
-
```tsx
|
|
619
|
-
// Before: Material-UI IconButton
|
|
620
|
-
<IconButton size="S" color="primary">
|
|
621
|
-
<AddIcon />
|
|
622
|
-
</IconButton>
|
|
623
|
-
|
|
624
|
-
// After: ActionButton
|
|
625
|
-
<ActionButton size="S" variant="PrimeStyle">
|
|
626
|
-
<i className="ri-add-line"></i>
|
|
627
|
-
</ActionButton>
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
## Best Practices
|
|
631
|
-
|
|
632
|
-
1. **Always Use ARIA Labels**: Icon-only buttons must have descriptive labels
|
|
633
|
-
2. **Group Related Actions**: Use visual grouping for related actions
|
|
634
|
-
3. **Consistent Sizing**: Use the same size for actions at the same hierarchy level
|
|
635
|
-
4. **Meaningful Icons**: Choose universally recognized icons
|
|
636
|
-
5. **Provide Tooltips**: Add tooltips for less common actions
|
|
637
|
-
6. **Loading Feedback**: Show loading state for async operations
|
|
638
|
-
7. **Keyboard Shortcuts**: Support keyboard shortcuts for frequent actions
|