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,555 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Calendar
|
|
3
|
-
description: Calendar component built on react-day-picker with custom styling and dropdown navigation
|
|
4
|
-
group: Date & Time
|
|
5
|
-
keywords: [calendar, date, day-picker, month, year, react-day-picker]
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Calendar
|
|
9
|
-
|
|
10
|
-
> A fully-featured calendar component built on react-day-picker with custom theming, dropdown month/year selection, and support for single, multiple, and range date selection modes.
|
|
11
|
-
|
|
12
|
-
## Installation
|
|
13
|
-
|
|
14
|
-
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
15
|
-
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
npx torch-glare@latest init
|
|
19
|
-
npx torch-glare@latest add Calendar
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
`add` also copies any components, hooks, and utilities that `Calendar` depends on.
|
|
23
|
-
|
|
24
|
-
## Import
|
|
25
|
-
|
|
26
|
-
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
27
|
-
|
|
28
|
-
```tsx
|
|
29
|
-
import { Calendar } from "@/components/Calendar";
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Quick Examples
|
|
33
|
-
|
|
34
|
-
### Basic Usage
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
import { Calendar } from "@/components/Calendar";
|
|
38
|
-
import { useState } from 'react'
|
|
39
|
-
|
|
40
|
-
function Example() {
|
|
41
|
-
const [selected, setSelected] = useState<Date | undefined>(new Date())
|
|
42
|
-
|
|
43
|
-
return (
|
|
44
|
-
<Calendar
|
|
45
|
-
mode="single"
|
|
46
|
-
selected={selected}
|
|
47
|
-
onSelect={setSelected}
|
|
48
|
-
/>
|
|
49
|
-
)
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Range Selection
|
|
54
|
-
|
|
55
|
-
```typescript
|
|
56
|
-
import { Calendar } from "@/components/Calendar";
|
|
57
|
-
import { useState } from 'react'
|
|
58
|
-
import { DateRange } from 'react-day-picker'
|
|
59
|
-
|
|
60
|
-
function RangePicker() {
|
|
61
|
-
const [range, setRange] = useState<DateRange | undefined>({
|
|
62
|
-
from: new Date(),
|
|
63
|
-
to: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
return (
|
|
67
|
-
<Calendar
|
|
68
|
-
mode="range"
|
|
69
|
-
selected={range}
|
|
70
|
-
onSelect={setRange}
|
|
71
|
-
/>
|
|
72
|
-
)
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Multiple Date Selection
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
import { Calendar } from "@/components/Calendar";
|
|
80
|
-
import { useState } from 'react'
|
|
81
|
-
|
|
82
|
-
function MultiplePicker() {
|
|
83
|
-
const [dates, setDates] = useState<Date[]>([])
|
|
84
|
-
|
|
85
|
-
return (
|
|
86
|
-
<Calendar
|
|
87
|
-
mode="multiple"
|
|
88
|
-
selected={dates}
|
|
89
|
-
onSelect={setDates}
|
|
90
|
-
max={5} // Limit to 5 dates
|
|
91
|
-
/>
|
|
92
|
-
)
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### With Week Numbers
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
import { Calendar } from "@/components/Calendar";
|
|
100
|
-
|
|
101
|
-
function WeekNumbers() {
|
|
102
|
-
return (
|
|
103
|
-
<Calendar
|
|
104
|
-
mode="single"
|
|
105
|
-
showWeekNumber
|
|
106
|
-
/>
|
|
107
|
-
)
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Date Restrictions
|
|
112
|
-
|
|
113
|
-
```typescript
|
|
114
|
-
import { Calendar } from "@/components/Calendar";
|
|
115
|
-
|
|
116
|
-
function RestrictedCalendar() {
|
|
117
|
-
const today = new Date()
|
|
118
|
-
const nextMonth = new Date(today.getFullYear(), today.getMonth() + 1, 1)
|
|
119
|
-
|
|
120
|
-
return (
|
|
121
|
-
<Calendar
|
|
122
|
-
mode="single"
|
|
123
|
-
disabled={[
|
|
124
|
-
{ before: today }, // Disable past dates
|
|
125
|
-
{ dayOfWeek: [0, 6] }, // Disable weekends
|
|
126
|
-
]}
|
|
127
|
-
fromDate={today}
|
|
128
|
-
toDate={nextMonth}
|
|
129
|
-
/>
|
|
130
|
-
)
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### Custom Caption Layout
|
|
135
|
-
|
|
136
|
-
```typescript
|
|
137
|
-
import { Calendar } from "@/components/Calendar";
|
|
138
|
-
|
|
139
|
-
function LabelOnly() {
|
|
140
|
-
return (
|
|
141
|
-
<Calendar
|
|
142
|
-
mode="single"
|
|
143
|
-
captionLayout="label" // No dropdowns, labels only
|
|
144
|
-
/>
|
|
145
|
-
)
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
function DropdownMonthsOnly() {
|
|
149
|
-
return (
|
|
150
|
-
<Calendar
|
|
151
|
-
mode="single"
|
|
152
|
-
captionLayout="dropdown-months" // Only month dropdown
|
|
153
|
-
/>
|
|
154
|
-
)
|
|
155
|
-
}
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### With Footer
|
|
159
|
-
|
|
160
|
-
```typescript
|
|
161
|
-
import { Calendar } from "@/components/Calendar";
|
|
162
|
-
import { Button } from "@/components/Button";
|
|
163
|
-
|
|
164
|
-
function CalendarWithFooter() {
|
|
165
|
-
const [selected, setSelected] = useState<Date>()
|
|
166
|
-
|
|
167
|
-
return (
|
|
168
|
-
<Calendar
|
|
169
|
-
mode="single"
|
|
170
|
-
selected={selected}
|
|
171
|
-
onSelect={setSelected}
|
|
172
|
-
footer={
|
|
173
|
-
<div className="flex gap-2 p-2">
|
|
174
|
-
<Button onClick={() => setSelected(new Date())}>
|
|
175
|
-
Today
|
|
176
|
-
</Button>
|
|
177
|
-
<Button onClick={() => setSelected(undefined)}>
|
|
178
|
-
Clear
|
|
179
|
-
</Button>
|
|
180
|
-
</div>
|
|
181
|
-
}
|
|
182
|
-
/>
|
|
183
|
-
)
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### Multiple Months
|
|
188
|
-
|
|
189
|
-
```typescript
|
|
190
|
-
import { Calendar } from "@/components/Calendar";
|
|
191
|
-
|
|
192
|
-
function MultipleMonths() {
|
|
193
|
-
return (
|
|
194
|
-
<Calendar
|
|
195
|
-
mode="single"
|
|
196
|
-
numberOfMonths={2}
|
|
197
|
-
/>
|
|
198
|
-
)
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
### With Min/Max Date Range
|
|
203
|
-
|
|
204
|
-
```typescript
|
|
205
|
-
import { Calendar } from "@/components/Calendar";
|
|
206
|
-
import { DateRange } from 'react-day-picker'
|
|
207
|
-
import { useState } from 'react'
|
|
208
|
-
|
|
209
|
-
function RangeWithLimits() {
|
|
210
|
-
const [range, setRange] = useState<DateRange>()
|
|
211
|
-
|
|
212
|
-
return (
|
|
213
|
-
<Calendar
|
|
214
|
-
mode="range"
|
|
215
|
-
selected={range}
|
|
216
|
-
onSelect={setRange}
|
|
217
|
-
min={2} // Minimum 2 days
|
|
218
|
-
max={14} // Maximum 14 days
|
|
219
|
-
/>
|
|
220
|
-
)
|
|
221
|
-
}
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
### Custom Styling
|
|
225
|
-
|
|
226
|
-
```typescript
|
|
227
|
-
import { Calendar } from "@/components/Calendar";
|
|
228
|
-
|
|
229
|
-
function StyledCalendar() {
|
|
230
|
-
return (
|
|
231
|
-
<Calendar
|
|
232
|
-
mode="single"
|
|
233
|
-
className="shadow-lg"
|
|
234
|
-
classNames={{
|
|
235
|
-
day: "custom-day-class",
|
|
236
|
-
selected: "custom-selected-class",
|
|
237
|
-
}}
|
|
238
|
-
/>
|
|
239
|
-
)
|
|
240
|
-
}
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
## API Reference
|
|
244
|
-
|
|
245
|
-
### Calendar Props
|
|
246
|
-
|
|
247
|
-
Extends all `DayPicker` props from react-day-picker.
|
|
248
|
-
|
|
249
|
-
| Prop | Type | Default | Description |
|
|
250
|
-
|------|------|---------|-------------|
|
|
251
|
-
| `mode` | `'single' \| 'multiple' \| 'range'` | `'single'` | Selection mode |
|
|
252
|
-
| `selected` | `Date \| Date[] \| DateRange` | - | Selected date(s) |
|
|
253
|
-
| `onSelect` | `(date) => void` | - | Selection handler |
|
|
254
|
-
| `captionLayout` | `'dropdown' \| 'label' \| 'dropdown-months' \| 'dropdown-years'` | `'dropdown'` | Caption/navigation style |
|
|
255
|
-
| `showWeekNumber` | `boolean` | `false` | Show week numbers |
|
|
256
|
-
| `showOutsideDays` | `boolean` | `true` | Show days from adjacent months |
|
|
257
|
-
| `numberOfMonths` | `number` | `1` | Number of months to display |
|
|
258
|
-
| `fromDate` | `Date` | - | Earliest selectable date |
|
|
259
|
-
| `toDate` | `Date` | - | Latest selectable date |
|
|
260
|
-
| `disabled` | `Matcher \| Matcher[]` | - | Dates to disable |
|
|
261
|
-
| `min` | `number` | - | Minimum range length (range mode) |
|
|
262
|
-
| `max` | `number` | - | Maximum range/multiple count |
|
|
263
|
-
| `footer` | `ReactNode` | - | Footer content |
|
|
264
|
-
| `className` | `string` | - | Additional CSS classes |
|
|
265
|
-
| `classNames` | `object` | - | Custom class names for elements |
|
|
266
|
-
|
|
267
|
-
### Matcher Types
|
|
268
|
-
|
|
269
|
-
```typescript
|
|
270
|
-
type Matcher =
|
|
271
|
-
| Date
|
|
272
|
-
| { from: Date; to: Date }
|
|
273
|
-
| { before: Date }
|
|
274
|
-
| { after: Date }
|
|
275
|
-
| { dayOfWeek: number[] }
|
|
276
|
-
| ((date: Date) => boolean)
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
## TypeScript
|
|
280
|
-
|
|
281
|
-
### Full Type Definitions
|
|
282
|
-
|
|
283
|
-
```typescript
|
|
284
|
-
import { DayPicker, DateRange } from 'react-day-picker'
|
|
285
|
-
|
|
286
|
-
export type CalendarProps = React.ComponentProps<typeof DayPicker>
|
|
287
|
-
|
|
288
|
-
// Common type patterns
|
|
289
|
-
type SingleMode = {
|
|
290
|
-
mode: 'single'
|
|
291
|
-
selected?: Date
|
|
292
|
-
onSelect?: (date: Date | undefined) => void
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
type MultipleMode = {
|
|
296
|
-
mode: 'multiple'
|
|
297
|
-
selected?: Date[]
|
|
298
|
-
onSelect?: (dates: Date[] | undefined) => void
|
|
299
|
-
max?: number
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
type RangeMode = {
|
|
303
|
-
mode: 'range'
|
|
304
|
-
selected?: DateRange
|
|
305
|
-
onSelect?: (range: DateRange | undefined) => void
|
|
306
|
-
min?: number
|
|
307
|
-
max?: number
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
export const Calendar: React.FC<CalendarProps>
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
## Common Patterns
|
|
314
|
-
|
|
315
|
-
### Booking Calendar
|
|
316
|
-
|
|
317
|
-
```typescript
|
|
318
|
-
import { Calendar } from "@/components/Calendar";
|
|
319
|
-
import { useState } from 'react'
|
|
320
|
-
import { DateRange } from 'react-day-picker'
|
|
321
|
-
|
|
322
|
-
function BookingCalendar() {
|
|
323
|
-
const [range, setRange] = useState<DateRange>()
|
|
324
|
-
|
|
325
|
-
const bookedDates = [
|
|
326
|
-
new Date(2024, 0, 15),
|
|
327
|
-
new Date(2024, 0, 16),
|
|
328
|
-
{ from: new Date(2024, 0, 20), to: new Date(2024, 0, 22) },
|
|
329
|
-
]
|
|
330
|
-
|
|
331
|
-
return (
|
|
332
|
-
<Calendar
|
|
333
|
-
mode="range"
|
|
334
|
-
selected={range}
|
|
335
|
-
onSelect={setRange}
|
|
336
|
-
disabled={bookedDates}
|
|
337
|
-
min={1}
|
|
338
|
-
max={30}
|
|
339
|
-
footer={
|
|
340
|
-
range?.from && range?.to && (
|
|
341
|
-
<div className="p-2">
|
|
342
|
-
<p>
|
|
343
|
-
{range.to.getDate() - range.from.getDate()} nights selected
|
|
344
|
-
</p>
|
|
345
|
-
</div>
|
|
346
|
-
)
|
|
347
|
-
}
|
|
348
|
-
/>
|
|
349
|
-
)
|
|
350
|
-
}
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
### Event Calendar
|
|
354
|
-
|
|
355
|
-
```typescript
|
|
356
|
-
import { Calendar } from "@/components/Calendar";
|
|
357
|
-
|
|
358
|
-
function EventCalendar({ events }: { events: Event[] }) {
|
|
359
|
-
const eventDates = events.map(e => e.date)
|
|
360
|
-
|
|
361
|
-
return (
|
|
362
|
-
<Calendar
|
|
363
|
-
mode="single"
|
|
364
|
-
modifiers={{
|
|
365
|
-
hasEvent: eventDates,
|
|
366
|
-
}}
|
|
367
|
-
modifiersClassNames={{
|
|
368
|
-
hasEvent: 'bg-blue-100 font-bold',
|
|
369
|
-
}}
|
|
370
|
-
/>
|
|
371
|
-
)
|
|
372
|
-
}
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
## Testing
|
|
376
|
-
|
|
377
|
-
### Unit Test Example
|
|
378
|
-
|
|
379
|
-
```typescript
|
|
380
|
-
import { render, screen, fireEvent } from '@testing-library/react'
|
|
381
|
-
import { Calendar } from "@/components/Calendar";
|
|
382
|
-
|
|
383
|
-
describe('Calendar', () => {
|
|
384
|
-
it('renders current month', () => {
|
|
385
|
-
render(<Calendar mode="single" />)
|
|
386
|
-
|
|
387
|
-
const currentMonth = new Date().toLocaleDateString('en-US', { month: 'long' })
|
|
388
|
-
expect(screen.getByText(new RegExp(currentMonth))).toBeInTheDocument()
|
|
389
|
-
})
|
|
390
|
-
|
|
391
|
-
it('selects a date', () => {
|
|
392
|
-
const handleSelect = jest.fn()
|
|
393
|
-
|
|
394
|
-
render(
|
|
395
|
-
<Calendar
|
|
396
|
-
mode="single"
|
|
397
|
-
onSelect={handleSelect}
|
|
398
|
-
/>
|
|
399
|
-
)
|
|
400
|
-
|
|
401
|
-
const day15 = screen.getByRole('button', { name: /15/ })
|
|
402
|
-
fireEvent.click(day15)
|
|
403
|
-
|
|
404
|
-
expect(handleSelect).toHaveBeenCalled()
|
|
405
|
-
})
|
|
406
|
-
|
|
407
|
-
it('respects disabled dates', () => {
|
|
408
|
-
render(
|
|
409
|
-
<Calendar
|
|
410
|
-
mode="single"
|
|
411
|
-
disabled={{ before: new Date() }}
|
|
412
|
-
/>
|
|
413
|
-
)
|
|
414
|
-
|
|
415
|
-
// Test that past dates are disabled
|
|
416
|
-
const yesterday = new Date()
|
|
417
|
-
yesterday.setDate(yesterday.getDate() - 1)
|
|
418
|
-
|
|
419
|
-
const yesterdayButton = screen.queryByRole('button', {
|
|
420
|
-
name: new RegExp(yesterday.getDate().toString())
|
|
421
|
-
})
|
|
422
|
-
|
|
423
|
-
expect(yesterdayButton).toBeDisabled()
|
|
424
|
-
})
|
|
425
|
-
})
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
## Accessibility
|
|
429
|
-
|
|
430
|
-
- **Keyboard Navigation**:
|
|
431
|
-
- Arrow keys: Navigate between days
|
|
432
|
-
- Enter/Space: Select date
|
|
433
|
-
- Page Up/Down: Navigate months
|
|
434
|
-
- Shift + Page Up/Down: Navigate years
|
|
435
|
-
- **ARIA Attributes**: Provided by react-day-picker
|
|
436
|
-
- **Screen Readers**: Dates announced with full context
|
|
437
|
-
- **Focus Management**: Visible focus indicator on selected day
|
|
438
|
-
|
|
439
|
-
### Accessibility Best Practices
|
|
440
|
-
|
|
441
|
-
```typescript
|
|
442
|
-
// Provide clear labels
|
|
443
|
-
<Calendar
|
|
444
|
-
aria-label="Select a date"
|
|
445
|
-
mode="single"
|
|
446
|
-
/>
|
|
447
|
-
|
|
448
|
-
// Describe disabled dates
|
|
449
|
-
<Calendar
|
|
450
|
-
disabled={{ before: new Date() }}
|
|
451
|
-
aria-describedby="date-restrictions"
|
|
452
|
-
/>
|
|
453
|
-
<p id="date-restrictions">Past dates are not available</p>
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
## Performance
|
|
457
|
-
|
|
458
|
-
| Metric | Value |
|
|
459
|
-
|--------|-------|
|
|
460
|
-
| Bundle size (minified) | ~15kb |
|
|
461
|
-
| Bundle size (gzipped) | ~5kb |
|
|
462
|
-
| Dependencies | react-day-picker (~40kb) |
|
|
463
|
-
| Initial render | <20ms |
|
|
464
|
-
| Month navigation | <10ms |
|
|
465
|
-
| Tree-shakeable | ✅ |
|
|
466
|
-
|
|
467
|
-
### Performance Tips
|
|
468
|
-
|
|
469
|
-
1. **Memoize callbacks**:
|
|
470
|
-
```typescript
|
|
471
|
-
const handleSelect = useCallback((date: Date) => {
|
|
472
|
-
// Handle selection
|
|
473
|
-
}, [])
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
2. **Limit number of months**: Don't show more than 2-3 months simultaneously
|
|
477
|
-
|
|
478
|
-
3. **Use custom modifiers sparingly**: They can impact render performance
|
|
479
|
-
|
|
480
|
-
## Styling
|
|
481
|
-
|
|
482
|
-
### Custom Styles
|
|
483
|
-
|
|
484
|
-
The Calendar component uses CSS variables and can be fully customized:
|
|
485
|
-
|
|
486
|
-
```typescript
|
|
487
|
-
<Calendar
|
|
488
|
-
className="custom-calendar"
|
|
489
|
-
classNames={{
|
|
490
|
-
day: "custom-day",
|
|
491
|
-
selected: "custom-selected",
|
|
492
|
-
today: "custom-today",
|
|
493
|
-
outside: "custom-outside",
|
|
494
|
-
disabled: "custom-disabled",
|
|
495
|
-
range_start: "custom-range-start",
|
|
496
|
-
range_end: "custom-range-end",
|
|
497
|
-
range_middle: "custom-range-middle",
|
|
498
|
-
}}
|
|
499
|
-
/>
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
### Default Styling
|
|
503
|
-
|
|
504
|
-
- Days: 30x30px rounded squares
|
|
505
|
-
- Selected: Purple background with border
|
|
506
|
-
- Today: Highlighted background
|
|
507
|
-
- Range: Connected selection with rounded ends
|
|
508
|
-
- Hover: Light purple background
|
|
509
|
-
|
|
510
|
-
## Migration from react-day-picker
|
|
511
|
-
|
|
512
|
-
```diff
|
|
513
|
-
- import { DayPicker } from 'react-day-picker'
|
|
514
|
-
+ import { Calendar } from "@/components/Calendar";
|
|
515
|
-
|
|
516
|
-
- <DayPicker
|
|
517
|
-
+ <Calendar
|
|
518
|
-
mode="single"
|
|
519
|
-
selected={date}
|
|
520
|
-
onSelect={setDate}
|
|
521
|
-
- />
|
|
522
|
-
+ />
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
The Calendar component provides pre-styled navigation and consistent theming.
|
|
526
|
-
|
|
527
|
-
## Best Practices
|
|
528
|
-
|
|
529
|
-
1. **Always specify mode**: Be explicit about selection type
|
|
530
|
-
```typescript
|
|
531
|
-
<Calendar mode="single" />
|
|
532
|
-
```
|
|
533
|
-
|
|
534
|
-
2. **Handle undefined selections**: User can deselect
|
|
535
|
-
```typescript
|
|
536
|
-
onSelect={(date) => {
|
|
537
|
-
setDate(date || new Date()) // Provide fallback
|
|
538
|
-
}}
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
3. **Validate date ranges**: Check min/max constraints
|
|
542
|
-
```typescript
|
|
543
|
-
<Calendar mode="range" min={1} max={7} />
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
4. **Provide visual feedback**: Show selected dates clearly
|
|
547
|
-
5. **Disable unavailable dates**: Don't let users select invalid dates
|
|
548
|
-
6. **Use appropriate caption layout**: Dropdown for wide date ranges, label for current month
|
|
549
|
-
7. **Test keyboard navigation**: Ensure all dates are keyboard accessible
|
|
550
|
-
|
|
551
|
-
## Related Components
|
|
552
|
-
|
|
553
|
-
- [DatePicker](./date-picker.md) - Date picker with calendar and time selection
|
|
554
|
-
- [SlideDatePicker](./slide-date-picker.md) - Mobile-optimized slide picker
|
|
555
|
-
- [Input](./input.md) - Text input for manual date entry
|