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,699 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Checkbox
|
|
3
|
-
version: 2.4.5
|
|
4
|
-
status: stable
|
|
5
|
-
category: components/forms
|
|
6
|
-
tags: [form, checkbox, selection, radix-ui, accessible, controlled]
|
|
7
|
-
last-reviewed: 2024-11-05
|
|
8
|
-
bundle-size: 1.8kb
|
|
9
|
-
dependencies:
|
|
10
|
-
- "@radix-ui/react-checkbox": "^1.0.0"
|
|
11
|
-
- "class-variance-authority": "^0.7.0"
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Checkbox
|
|
15
|
-
|
|
16
|
-
> A fully accessible checkbox component built on Radix UI primitives with two size variants and comprehensive state management. Supports controlled and uncontrolled usage, indeterminate state, and form integration.
|
|
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 Checkbox
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
`add` also copies any components, hooks, and utilities that `Checkbox` 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 { Checkbox } from "@/components/Checkbox";
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Quick Examples
|
|
39
|
-
|
|
40
|
-
### Basic Usage
|
|
41
|
-
|
|
42
|
-
```typescript
|
|
43
|
-
import { Checkbox } from '@/components/Checkbox'
|
|
44
|
-
|
|
45
|
-
function Example() {
|
|
46
|
-
const [checked, setChecked] = useState(false)
|
|
47
|
-
|
|
48
|
-
return (
|
|
49
|
-
<Checkbox
|
|
50
|
-
checked={checked}
|
|
51
|
-
onCheckedChange={setChecked}
|
|
52
|
-
/>
|
|
53
|
-
)
|
|
54
|
-
}
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### With Label
|
|
58
|
-
|
|
59
|
-
```typescript
|
|
60
|
-
function LabeledCheckbox() {
|
|
61
|
-
const [agreed, setAgreed] = useState(false)
|
|
62
|
-
|
|
63
|
-
return (
|
|
64
|
-
<label className="flex items-center gap-2">
|
|
65
|
-
<Checkbox
|
|
66
|
-
checked={agreed}
|
|
67
|
-
onCheckedChange={setAgreed}
|
|
68
|
-
id="terms"
|
|
69
|
-
/>
|
|
70
|
-
<span>I agree to the terms and conditions</span>
|
|
71
|
-
</label>
|
|
72
|
-
)
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Different Sizes
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
function SizeVariants() {
|
|
80
|
-
return (
|
|
81
|
-
<div className="space-y-4">
|
|
82
|
-
<label className="flex items-center gap-2">
|
|
83
|
-
<Checkbox size="S" />
|
|
84
|
-
<span className="text-sm">Small checkbox</span>
|
|
85
|
-
</label>
|
|
86
|
-
|
|
87
|
-
<label className="flex items-center gap-2">
|
|
88
|
-
<Checkbox size="M" />
|
|
89
|
-
<span>Medium checkbox (default)</span>
|
|
90
|
-
</label>
|
|
91
|
-
</div>
|
|
92
|
-
)
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### Indeterminate State
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
function IndeterminateExample() {
|
|
100
|
-
const [checkedItems, setCheckedItems] = useState([false, false, false])
|
|
101
|
-
|
|
102
|
-
const allChecked = checkedItems.every(Boolean)
|
|
103
|
-
const indeterminate = checkedItems.some(Boolean) && !allChecked
|
|
104
|
-
|
|
105
|
-
return (
|
|
106
|
-
<div>
|
|
107
|
-
<label className="flex items-center gap-2 font-semibold">
|
|
108
|
-
<Checkbox
|
|
109
|
-
checked={allChecked ? true : indeterminate ? 'indeterminate' : false}
|
|
110
|
-
onCheckedChange={(checked) => {
|
|
111
|
-
setCheckedItems([checked === true, checked === true, checked === true])
|
|
112
|
-
}}
|
|
113
|
-
/>
|
|
114
|
-
<span>Select all</span>
|
|
115
|
-
</label>
|
|
116
|
-
|
|
117
|
-
<div className="ml-6 mt-2 space-y-2">
|
|
118
|
-
{checkedItems.map((checked, index) => (
|
|
119
|
-
<label key={index} className="flex items-center gap-2">
|
|
120
|
-
<Checkbox
|
|
121
|
-
checked={checked}
|
|
122
|
-
onCheckedChange={(value) => {
|
|
123
|
-
const updated = [...checkedItems]
|
|
124
|
-
updated[index] = value === true
|
|
125
|
-
setCheckedItems(updated)
|
|
126
|
-
}}
|
|
127
|
-
/>
|
|
128
|
-
<span>Option {index + 1}</span>
|
|
129
|
-
</label>
|
|
130
|
-
))}
|
|
131
|
-
</div>
|
|
132
|
-
</div>
|
|
133
|
-
)
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### Disabled State
|
|
138
|
-
|
|
139
|
-
```typescript
|
|
140
|
-
function DisabledCheckboxes() {
|
|
141
|
-
return (
|
|
142
|
-
<div className="space-y-2">
|
|
143
|
-
<label className="flex items-center gap-2">
|
|
144
|
-
<Checkbox disabled />
|
|
145
|
-
<span className="text-gray-500">Disabled unchecked</span>
|
|
146
|
-
</label>
|
|
147
|
-
|
|
148
|
-
<label className="flex items-center gap-2">
|
|
149
|
-
<Checkbox disabled checked />
|
|
150
|
-
<span className="text-gray-500">Disabled checked</span>
|
|
151
|
-
</label>
|
|
152
|
-
</div>
|
|
153
|
-
)
|
|
154
|
-
}
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### Form Integration
|
|
158
|
-
|
|
159
|
-
```typescript
|
|
160
|
-
function CheckboxForm() {
|
|
161
|
-
const [formData, setFormData] = useState({
|
|
162
|
-
subscribe: false,
|
|
163
|
-
notifications: false,
|
|
164
|
-
marketing: false
|
|
165
|
-
})
|
|
166
|
-
|
|
167
|
-
const handleSubmit = (e: FormEvent) => {
|
|
168
|
-
e.preventDefault()
|
|
169
|
-
console.log('Form data:', formData)
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
return (
|
|
173
|
-
<form onSubmit={handleSubmit} className="space-y-4">
|
|
174
|
-
<fieldset className="space-y-2">
|
|
175
|
-
<legend className="font-semibold">Email Preferences</legend>
|
|
176
|
-
|
|
177
|
-
<label className="flex items-center gap-2">
|
|
178
|
-
<Checkbox
|
|
179
|
-
checked={formData.subscribe}
|
|
180
|
-
onCheckedChange={(checked) =>
|
|
181
|
-
setFormData({ ...formData, subscribe: checked === true })
|
|
182
|
-
}
|
|
183
|
-
/>
|
|
184
|
-
<span>Subscribe to newsletter</span>
|
|
185
|
-
</label>
|
|
186
|
-
|
|
187
|
-
<label className="flex items-center gap-2">
|
|
188
|
-
<Checkbox
|
|
189
|
-
checked={formData.notifications}
|
|
190
|
-
onCheckedChange={(checked) =>
|
|
191
|
-
setFormData({ ...formData, notifications: checked === true })
|
|
192
|
-
}
|
|
193
|
-
/>
|
|
194
|
-
<span>Email notifications</span>
|
|
195
|
-
</label>
|
|
196
|
-
|
|
197
|
-
<label className="flex items-center gap-2">
|
|
198
|
-
<Checkbox
|
|
199
|
-
checked={formData.marketing}
|
|
200
|
-
onCheckedChange={(checked) =>
|
|
201
|
-
setFormData({ ...formData, marketing: checked === true })
|
|
202
|
-
}
|
|
203
|
-
/>
|
|
204
|
-
<span>Marketing emails</span>
|
|
205
|
-
</label>
|
|
206
|
-
</fieldset>
|
|
207
|
-
|
|
208
|
-
<button type="submit">Save Preferences</button>
|
|
209
|
-
</form>
|
|
210
|
-
)
|
|
211
|
-
}
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
## API Reference
|
|
215
|
-
|
|
216
|
-
### Checkbox Props
|
|
217
|
-
|
|
218
|
-
| Prop | Type | Default | Description |
|
|
219
|
-
|------|------|---------|-------------|
|
|
220
|
-
| `size` | `'S' \| 'M'` | `'M'` | Size variant |
|
|
221
|
-
| `checked` | `boolean \| 'indeterminate'` | - | Controlled checked state |
|
|
222
|
-
| `defaultChecked` | `boolean` | - | Uncontrolled default state |
|
|
223
|
-
| `onCheckedChange` | `(checked: boolean \| 'indeterminate') => void` | - | Called when state changes |
|
|
224
|
-
| `disabled` | `boolean` | `false` | Disables the checkbox |
|
|
225
|
-
| `required` | `boolean` | `false` | Makes field required |
|
|
226
|
-
| `name` | `string` | - | Form field name |
|
|
227
|
-
| `value` | `string` | `'on'` | Form field value |
|
|
228
|
-
| `id` | `string` | - | HTML id attribute |
|
|
229
|
-
| `className` | `string` | - | Additional CSS classes |
|
|
230
|
-
|
|
231
|
-
### TypeScript
|
|
232
|
-
|
|
233
|
-
```typescript
|
|
234
|
-
import { CheckboxProps as RadixCheckboxProps } from '@radix-ui/react-checkbox'
|
|
235
|
-
|
|
236
|
-
interface CheckboxProps extends RadixCheckboxProps {
|
|
237
|
-
size?: 'S' | 'M'
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
export const Checkbox: React.ForwardRefExoticComponent<CheckboxProps>
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
## Common Patterns
|
|
244
|
-
|
|
245
|
-
### Checkbox Group
|
|
246
|
-
|
|
247
|
-
```typescript
|
|
248
|
-
function CheckboxGroup() {
|
|
249
|
-
const options = [
|
|
250
|
-
{ id: 'option1', label: 'Option 1' },
|
|
251
|
-
{ id: 'option2', label: 'Option 2' },
|
|
252
|
-
{ id: 'option3', label: 'Option 3' },
|
|
253
|
-
]
|
|
254
|
-
|
|
255
|
-
const [selected, setSelected] = useState<string[]>([])
|
|
256
|
-
|
|
257
|
-
const toggleOption = (id: string) => {
|
|
258
|
-
setSelected(prev =>
|
|
259
|
-
prev.includes(id)
|
|
260
|
-
? prev.filter(item => item !== id)
|
|
261
|
-
: [...prev, id]
|
|
262
|
-
)
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
return (
|
|
266
|
-
<fieldset>
|
|
267
|
-
<legend>Select options</legend>
|
|
268
|
-
{options.map(option => (
|
|
269
|
-
<label key={option.id} className="flex items-center gap-2 py-1">
|
|
270
|
-
<Checkbox
|
|
271
|
-
checked={selected.includes(option.id)}
|
|
272
|
-
onCheckedChange={() => toggleOption(option.id)}
|
|
273
|
-
/>
|
|
274
|
-
<span>{option.label}</span>
|
|
275
|
-
</label>
|
|
276
|
-
))}
|
|
277
|
-
<p className="text-sm text-gray-500 mt-2">
|
|
278
|
-
Selected: {selected.join(', ') || 'None'}
|
|
279
|
-
</p>
|
|
280
|
-
</fieldset>
|
|
281
|
-
)
|
|
282
|
-
}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
### Task List
|
|
286
|
-
|
|
287
|
-
```typescript
|
|
288
|
-
interface Task {
|
|
289
|
-
id: string
|
|
290
|
-
text: string
|
|
291
|
-
completed: boolean
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
function TaskList() {
|
|
295
|
-
const [tasks, setTasks] = useState<Task[]>([
|
|
296
|
-
{ id: '1', text: 'Buy groceries', completed: false },
|
|
297
|
-
{ id: '2', text: 'Walk the dog', completed: false },
|
|
298
|
-
{ id: '3', text: 'Read a book', completed: false },
|
|
299
|
-
])
|
|
300
|
-
|
|
301
|
-
const toggleTask = (id: string) => {
|
|
302
|
-
setTasks(tasks.map(task =>
|
|
303
|
-
task.id === id ? { ...task, completed: !task.completed } : task
|
|
304
|
-
))
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
const completedCount = tasks.filter(t => t.completed).length
|
|
308
|
-
|
|
309
|
-
return (
|
|
310
|
-
<div className="space-y-2">
|
|
311
|
-
<h3>Tasks ({completedCount}/{tasks.length} completed)</h3>
|
|
312
|
-
{tasks.map(task => (
|
|
313
|
-
<label
|
|
314
|
-
key={task.id}
|
|
315
|
-
className={cn(
|
|
316
|
-
"flex items-center gap-2 p-2 rounded",
|
|
317
|
-
task.completed && "bg-gray-100"
|
|
318
|
-
)}
|
|
319
|
-
>
|
|
320
|
-
<Checkbox
|
|
321
|
-
checked={task.completed}
|
|
322
|
-
onCheckedChange={() => toggleTask(task.id)}
|
|
323
|
-
/>
|
|
324
|
-
<span className={cn(
|
|
325
|
-
task.completed && "line-through text-gray-500"
|
|
326
|
-
)}>
|
|
327
|
-
{task.text}
|
|
328
|
-
</span>
|
|
329
|
-
</label>
|
|
330
|
-
))}
|
|
331
|
-
</div>
|
|
332
|
-
)
|
|
333
|
-
}
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
### Filter Options
|
|
337
|
-
|
|
338
|
-
```typescript
|
|
339
|
-
function FilterPanel() {
|
|
340
|
-
const [filters, setFilters] = useState({
|
|
341
|
-
inStock: false,
|
|
342
|
-
onSale: false,
|
|
343
|
-
freeShipping: false,
|
|
344
|
-
highRating: false,
|
|
345
|
-
})
|
|
346
|
-
|
|
347
|
-
const activeFilters = Object.entries(filters)
|
|
348
|
-
.filter(([_, active]) => active)
|
|
349
|
-
.map(([key]) => key)
|
|
350
|
-
|
|
351
|
-
return (
|
|
352
|
-
<div className="p-4 border rounded">
|
|
353
|
-
<h4 className="font-semibold mb-3">Filters</h4>
|
|
354
|
-
|
|
355
|
-
<div className="space-y-2">
|
|
356
|
-
<label className="flex items-center gap-2">
|
|
357
|
-
<Checkbox
|
|
358
|
-
checked={filters.inStock}
|
|
359
|
-
onCheckedChange={(checked) =>
|
|
360
|
-
setFilters({ ...filters, inStock: checked === true })
|
|
361
|
-
}
|
|
362
|
-
/>
|
|
363
|
-
<span>In Stock Only</span>
|
|
364
|
-
</label>
|
|
365
|
-
|
|
366
|
-
<label className="flex items-center gap-2">
|
|
367
|
-
<Checkbox
|
|
368
|
-
checked={filters.onSale}
|
|
369
|
-
onCheckedChange={(checked) =>
|
|
370
|
-
setFilters({ ...filters, onSale: checked === true })
|
|
371
|
-
}
|
|
372
|
-
/>
|
|
373
|
-
<span>On Sale</span>
|
|
374
|
-
</label>
|
|
375
|
-
|
|
376
|
-
<label className="flex items-center gap-2">
|
|
377
|
-
<Checkbox
|
|
378
|
-
checked={filters.freeShipping}
|
|
379
|
-
onCheckedChange={(checked) =>
|
|
380
|
-
setFilters({ ...filters, freeShipping: checked === true })
|
|
381
|
-
}
|
|
382
|
-
/>
|
|
383
|
-
<span>Free Shipping</span>
|
|
384
|
-
</label>
|
|
385
|
-
|
|
386
|
-
<label className="flex items-center gap-2">
|
|
387
|
-
<Checkbox
|
|
388
|
-
checked={filters.highRating}
|
|
389
|
-
onCheckedChange={(checked) =>
|
|
390
|
-
setFilters({ ...filters, highRating: checked === true })
|
|
391
|
-
}
|
|
392
|
-
/>
|
|
393
|
-
<span>4+ Stars</span>
|
|
394
|
-
</label>
|
|
395
|
-
</div>
|
|
396
|
-
|
|
397
|
-
{activeFilters.length > 0 && (
|
|
398
|
-
<div className="mt-4 p-2 bg-blue-50 rounded text-sm">
|
|
399
|
-
Active: {activeFilters.join(', ')}
|
|
400
|
-
</div>
|
|
401
|
-
)}
|
|
402
|
-
</div>
|
|
403
|
-
)
|
|
404
|
-
}
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
## Testing
|
|
408
|
-
|
|
409
|
-
### Unit Test Example
|
|
410
|
-
|
|
411
|
-
```typescript
|
|
412
|
-
import { render, screen, fireEvent } from '@testing-library/react'
|
|
413
|
-
import { Checkbox } from '@/components/Checkbox'
|
|
414
|
-
|
|
415
|
-
describe('Checkbox', () => {
|
|
416
|
-
it('handles checked state changes', () => {
|
|
417
|
-
const handleChange = jest.fn()
|
|
418
|
-
render(
|
|
419
|
-
<Checkbox
|
|
420
|
-
onCheckedChange={handleChange}
|
|
421
|
-
/>
|
|
422
|
-
)
|
|
423
|
-
|
|
424
|
-
const checkbox = screen.getByRole('checkbox')
|
|
425
|
-
fireEvent.click(checkbox)
|
|
426
|
-
|
|
427
|
-
expect(handleChange).toHaveBeenCalledWith(true)
|
|
428
|
-
})
|
|
429
|
-
|
|
430
|
-
it('supports indeterminate state', () => {
|
|
431
|
-
render(
|
|
432
|
-
<Checkbox checked="indeterminate" />
|
|
433
|
-
)
|
|
434
|
-
|
|
435
|
-
const checkbox = screen.getByRole('checkbox')
|
|
436
|
-
expect(checkbox).toHaveAttribute('data-state', 'indeterminate')
|
|
437
|
-
})
|
|
438
|
-
|
|
439
|
-
it('respects disabled state', () => {
|
|
440
|
-
const handleChange = jest.fn()
|
|
441
|
-
render(
|
|
442
|
-
<Checkbox
|
|
443
|
-
disabled
|
|
444
|
-
onCheckedChange={handleChange}
|
|
445
|
-
/>
|
|
446
|
-
)
|
|
447
|
-
|
|
448
|
-
const checkbox = screen.getByRole('checkbox')
|
|
449
|
-
fireEvent.click(checkbox)
|
|
450
|
-
|
|
451
|
-
expect(handleChange).not.toHaveBeenCalled()
|
|
452
|
-
expect(checkbox).toBeDisabled()
|
|
453
|
-
})
|
|
454
|
-
|
|
455
|
-
it('applies size variants', () => {
|
|
456
|
-
const { rerender } = render(<Checkbox size="S" />)
|
|
457
|
-
let checkbox = screen.getByRole('checkbox')
|
|
458
|
-
expect(checkbox).toHaveClass('w-[14px]', 'h-[14px]')
|
|
459
|
-
|
|
460
|
-
rerender(<Checkbox size="M" />)
|
|
461
|
-
checkbox = screen.getByRole('checkbox')
|
|
462
|
-
expect(checkbox).toHaveClass('w-[16px]', 'h-[16px]')
|
|
463
|
-
})
|
|
464
|
-
})
|
|
465
|
-
```
|
|
466
|
-
|
|
467
|
-
### Accessibility Test
|
|
468
|
-
|
|
469
|
-
```typescript
|
|
470
|
-
import { axe } from '@axe-core/react'
|
|
471
|
-
|
|
472
|
-
test('Checkbox meets WCAG standards', async () => {
|
|
473
|
-
const { container } = render(
|
|
474
|
-
<div>
|
|
475
|
-
<label htmlFor="terms">
|
|
476
|
-
<Checkbox id="terms" />
|
|
477
|
-
I agree to the terms
|
|
478
|
-
</label>
|
|
479
|
-
</div>
|
|
480
|
-
)
|
|
481
|
-
|
|
482
|
-
const results = await axe(container)
|
|
483
|
-
expect(results).toHaveNoViolations()
|
|
484
|
-
})
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
## Accessibility
|
|
488
|
-
|
|
489
|
-
### Keyboard Support
|
|
490
|
-
|
|
491
|
-
- **Space**: Toggle checkbox when focused
|
|
492
|
-
- **Tab**: Move focus to/from checkbox
|
|
493
|
-
- **Shift + Tab**: Move focus backwards
|
|
494
|
-
|
|
495
|
-
### ARIA Attributes
|
|
496
|
-
|
|
497
|
-
Radix UI automatically handles ARIA attributes:
|
|
498
|
-
|
|
499
|
-
```html
|
|
500
|
-
<!-- Unchecked -->
|
|
501
|
-
<button role="checkbox" aria-checked="false" data-state="unchecked">
|
|
502
|
-
|
|
503
|
-
<!-- Checked -->
|
|
504
|
-
<button role="checkbox" aria-checked="true" data-state="checked">
|
|
505
|
-
|
|
506
|
-
<!-- Indeterminate -->
|
|
507
|
-
<button role="checkbox" aria-checked="mixed" data-state="indeterminate">
|
|
508
|
-
|
|
509
|
-
<!-- Disabled -->
|
|
510
|
-
<button role="checkbox" aria-checked="false" data-disabled="">
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
### Screen Reader Support
|
|
514
|
-
|
|
515
|
-
- Announces checkbox role and state
|
|
516
|
-
- Reads associated label content
|
|
517
|
-
- Announces state changes
|
|
518
|
-
- Communicates disabled state
|
|
519
|
-
|
|
520
|
-
### Label Association
|
|
521
|
-
|
|
522
|
-
```typescript
|
|
523
|
-
// Method 1: Wrap in label
|
|
524
|
-
<label>
|
|
525
|
-
<Checkbox />
|
|
526
|
-
<span>Label text</span>
|
|
527
|
-
</label>
|
|
528
|
-
|
|
529
|
-
// Method 2: Use htmlFor
|
|
530
|
-
<Checkbox id="my-checkbox" />
|
|
531
|
-
<label htmlFor="my-checkbox">Label text</label>
|
|
532
|
-
|
|
533
|
-
// Method 3: Use aria-label
|
|
534
|
-
<Checkbox aria-label="Accept terms" />
|
|
535
|
-
```
|
|
536
|
-
|
|
537
|
-
## Styling
|
|
538
|
-
|
|
539
|
-
### Custom Styles
|
|
540
|
-
|
|
541
|
-
```typescript
|
|
542
|
-
<Checkbox
|
|
543
|
-
className="border-blue-500 data-[state=checked]:bg-blue-500"
|
|
544
|
-
size="M"
|
|
545
|
-
/>
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
### CSS Variables
|
|
549
|
-
|
|
550
|
-
```css
|
|
551
|
-
/* Custom theme variables */
|
|
552
|
-
:root {
|
|
553
|
-
--checkbox-size-small: 14px;
|
|
554
|
-
--checkbox-size-medium: 16px;
|
|
555
|
-
--checkbox-border: #d1d5db;
|
|
556
|
-
--checkbox-border-hover: #9ca3af;
|
|
557
|
-
--checkbox-bg-checked: #3b82f6;
|
|
558
|
-
--checkbox-bg-disabled: #f3f4f6;
|
|
559
|
-
}
|
|
560
|
-
```
|
|
561
|
-
|
|
562
|
-
### State-Based Styling
|
|
563
|
-
|
|
564
|
-
```css
|
|
565
|
-
/* Using data attributes from Radix UI */
|
|
566
|
-
.checkbox[data-state="checked"] {
|
|
567
|
-
background: var(--primary);
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
.checkbox[data-state="indeterminate"] {
|
|
571
|
-
background: var(--secondary);
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
.checkbox[data-disabled] {
|
|
575
|
-
opacity: 0.5;
|
|
576
|
-
cursor: not-allowed;
|
|
577
|
-
}
|
|
578
|
-
```
|
|
579
|
-
|
|
580
|
-
## Performance
|
|
581
|
-
|
|
582
|
-
| Metric | Value |
|
|
583
|
-
|--------|-------|
|
|
584
|
-
| Bundle size (gzip) | 1.8kb |
|
|
585
|
-
| First render | <5ms |
|
|
586
|
-
| Re-render | <2ms |
|
|
587
|
-
| Interaction | <1ms |
|
|
588
|
-
| Tree-shakeable | ✅ |
|
|
589
|
-
|
|
590
|
-
### Optimization Tips
|
|
591
|
-
|
|
592
|
-
1. Use `React.memo()` for checkbox lists
|
|
593
|
-
2. Memoize change handlers with `useCallback`
|
|
594
|
-
3. Use virtualization for long lists
|
|
595
|
-
4. Batch state updates for multiple checkboxes
|
|
596
|
-
5. Consider uncontrolled mode for better performance
|
|
597
|
-
|
|
598
|
-
## Migration
|
|
599
|
-
|
|
600
|
-
### From Native Checkbox
|
|
601
|
-
|
|
602
|
-
```diff
|
|
603
|
-
// From HTML checkbox
|
|
604
|
-
- <input
|
|
605
|
-
- type="checkbox"
|
|
606
|
-
- checked={checked}
|
|
607
|
-
- onChange={(e) => setChecked(e.target.checked)}
|
|
608
|
-
- />
|
|
609
|
-
+ <Checkbox
|
|
610
|
-
+ checked={checked}
|
|
611
|
-
+ onCheckedChange={setChecked}
|
|
612
|
-
+ />
|
|
613
|
-
```
|
|
614
|
-
|
|
615
|
-
### From v1.0.x
|
|
616
|
-
|
|
617
|
-
```diff
|
|
618
|
-
// Import path changed
|
|
619
|
-
- import Checkbox from 'torch-glare/Checkbox'
|
|
620
|
-
+ import { Checkbox } from '@/components/Checkbox'
|
|
621
|
-
|
|
622
|
-
// Size prop values changed
|
|
623
|
-
- <Checkbox size="M" />
|
|
624
|
-
+ <Checkbox size="S" />
|
|
625
|
-
```
|
|
626
|
-
|
|
627
|
-
## Troubleshooting
|
|
628
|
-
|
|
629
|
-
### Checkbox not updating
|
|
630
|
-
|
|
631
|
-
**Solution:** Use controlled state properly
|
|
632
|
-
|
|
633
|
-
```typescript
|
|
634
|
-
// ❌ Wrong - missing state handler
|
|
635
|
-
<Checkbox checked={true} />
|
|
636
|
-
|
|
637
|
-
// ✅ Correct - with state handler
|
|
638
|
-
const [checked, setChecked] = useState(false)
|
|
639
|
-
<Checkbox checked={checked} onCheckedChange={setChecked} />
|
|
640
|
-
|
|
641
|
-
// ✅ Or use uncontrolled
|
|
642
|
-
<Checkbox defaultChecked />
|
|
643
|
-
```
|
|
644
|
-
|
|
645
|
-
### Indeterminate not working
|
|
646
|
-
|
|
647
|
-
**Solution:** Pass 'indeterminate' string value
|
|
648
|
-
|
|
649
|
-
```typescript
|
|
650
|
-
// ❌ Wrong - boolean value
|
|
651
|
-
<Checkbox checked={indeterminate} />
|
|
652
|
-
|
|
653
|
-
// ✅ Correct - 'indeterminate' string
|
|
654
|
-
<Checkbox checked={indeterminate ? 'indeterminate' : false} />
|
|
655
|
-
```
|
|
656
|
-
|
|
657
|
-
### Form submission not working
|
|
658
|
-
|
|
659
|
-
**Solution:** Add name and value props
|
|
660
|
-
|
|
661
|
-
```typescript
|
|
662
|
-
<form>
|
|
663
|
-
<Checkbox
|
|
664
|
-
name="terms"
|
|
665
|
-
value="accepted"
|
|
666
|
-
required
|
|
667
|
-
/>
|
|
668
|
-
</form>
|
|
669
|
-
```
|
|
670
|
-
|
|
671
|
-
## Related Components
|
|
672
|
-
|
|
673
|
-
- [LabeledCheckBox](/docs/components/labeled-checkbox.md) - Checkbox with integrated label
|
|
674
|
-
- [Switch](/docs/components/switch.md) - Toggle switch alternative
|
|
675
|
-
- [Radio](/docs/components/radio.md) - Single selection option
|
|
676
|
-
- [Form](/docs/components/form.md) - Form wrapper with validation
|
|
677
|
-
|
|
678
|
-
## Browser Support
|
|
679
|
-
|
|
680
|
-
- Chrome 90+ ✅
|
|
681
|
-
- Firefox 88+ ✅
|
|
682
|
-
- Safari 14+ ✅
|
|
683
|
-
- Edge 90+ ✅
|
|
684
|
-
- Mobile browsers ✅
|
|
685
|
-
|
|
686
|
-
## Changelog
|
|
687
|
-
|
|
688
|
-
### v1.1.15
|
|
689
|
-
- Migrated to Radix UI primitives
|
|
690
|
-
- Added indeterminate state support
|
|
691
|
-
- Improved accessibility
|
|
692
|
-
|
|
693
|
-
### v1.1.14
|
|
694
|
-
- Added size variants
|
|
695
|
-
- Fixed focus styles
|
|
696
|
-
- Performance optimizations
|
|
697
|
-
|
|
698
|
-
### v1.1.0
|
|
699
|
-
- Initial stable release
|