@commercetools/nimbus-mcp 0.1.0 → 2.10.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 +63 -14
- package/data/docs/route-manifest.json +10913 -0
- package/data/docs/routes/components-accessibility-visually-hidden.json +388 -0
- package/data/docs/routes/components-accessibility.json +34 -0
- package/data/docs/routes/components-buttons-button.json +715 -0
- package/data/docs/routes/components-buttons-icon-button.json +852 -0
- package/data/docs/routes/components-buttons-icon-toggle-button.json +594 -0
- package/data/docs/routes/components-buttons-split-button.json +670 -0
- package/data/docs/routes/components-buttons-toggle-button-group.json +722 -0
- package/data/docs/routes/components-buttons-toggle-button.json +689 -0
- package/data/docs/routes/components-buttons.json +36 -0
- package/data/docs/routes/components-data-display-badge.json +555 -0
- package/data/docs/routes/components-data-display-card.json +338 -0
- package/data/docs/routes/components-data-display-data-table.json +855 -0
- package/data/docs/routes/components-data-display-draggable-list.json +596 -0
- package/data/docs/routes/components-data-display-table.json +472 -0
- package/data/docs/routes/components-data-display-tag-group.json +535 -0
- package/data/docs/routes/components-data-display.json +34 -0
- package/data/docs/routes/components-feedback-alert.json +696 -0
- package/data/docs/routes/components-feedback-dialog.json +682 -0
- package/data/docs/routes/components-feedback-drawer.json +600 -0
- package/data/docs/routes/components-feedback-loading-spinner.json +415 -0
- package/data/docs/routes/components-feedback-progress-bar.json +661 -0
- package/data/docs/routes/components-feedback-toast.json +1040 -0
- package/data/docs/routes/components-feedback-tooltip.json +510 -0
- package/data/docs/routes/components-feedback.json +34 -0
- package/data/docs/routes/components-forms-field-errors.json +557 -0
- package/data/docs/routes/components-forms-form-field.json +848 -0
- package/data/docs/routes/components-forms-group.json +427 -0
- package/data/docs/routes/components-forms-localized-field.json +770 -0
- package/data/docs/routes/components-forms.json +37 -0
- package/data/docs/routes/components-inputs-calendar.json +611 -0
- package/data/docs/routes/components-inputs-checkbox.json +774 -0
- package/data/docs/routes/components-inputs-combo-box.json +761 -0
- package/data/docs/routes/components-inputs-date-input.json +628 -0
- package/data/docs/routes/components-inputs-date-picker.json +709 -0
- package/data/docs/routes/components-inputs-date-range-picker.json +599 -0
- package/data/docs/routes/components-inputs-money-input.json +721 -0
- package/data/docs/routes/components-inputs-multiline-text-input.json +611 -0
- package/data/docs/routes/components-inputs-number-input.json +647 -0
- package/data/docs/routes/components-inputs-password-input.json +576 -0
- package/data/docs/routes/components-inputs-radio-input.json +583 -0
- package/data/docs/routes/components-inputs-range-calendar.json +607 -0
- package/data/docs/routes/components-inputs-rich-text-input.json +599 -0
- package/data/docs/routes/components-inputs-scoped-search-input.json +570 -0
- package/data/docs/routes/components-inputs-search-input.json +588 -0
- package/data/docs/routes/components-inputs-select-input.json +960 -0
- package/data/docs/routes/components-inputs-switch.json +720 -0
- package/data/docs/routes/components-inputs-text-input.json +566 -0
- package/data/docs/routes/components-inputs-time-input.json +775 -0
- package/data/docs/routes/components-inputs.json +34 -0
- package/data/docs/routes/components-layout-box.json +501 -0
- package/data/docs/routes/components-layout-defaultpage.json +748 -0
- package/data/docs/routes/components-layout-flex.json +587 -0
- package/data/docs/routes/components-layout-grid.json +393 -0
- package/data/docs/routes/components-layout-modalpage.json +716 -0
- package/data/docs/routes/components-layout-pagecontent.json +673 -0
- package/data/docs/routes/components-layout-separator.json +461 -0
- package/data/docs/routes/components-layout-simple-grid.json +519 -0
- package/data/docs/routes/components-layout-spacer.json +573 -0
- package/data/docs/routes/components-layout-stack.json +481 -0
- package/data/docs/routes/components-layout.json +34 -0
- package/data/docs/routes/components-media-avatar.json +427 -0
- package/data/docs/routes/components-media-icon.json +663 -0
- package/data/docs/routes/components-media-image.json +511 -0
- package/data/docs/routes/components-media-inline-svg.json +586 -0
- package/data/docs/routes/components-media.json +34 -0
- package/data/docs/routes/components-navigation-accordion.json +643 -0
- package/data/docs/routes/components-navigation-collapsible-motion.json +628 -0
- package/data/docs/routes/components-navigation-link.json +554 -0
- package/data/docs/routes/components-navigation-menu.json +546 -0
- package/data/docs/routes/components-navigation-pagination.json +502 -0
- package/data/docs/routes/components-navigation-steps.json +629 -0
- package/data/docs/routes/components-navigation-tabnav.json +546 -0
- package/data/docs/routes/components-navigation-tabs.json +635 -0
- package/data/docs/routes/components-navigation-toolbar.json +549 -0
- package/data/docs/routes/components-navigation.json +34 -0
- package/data/docs/routes/components-typography-code.json +39 -0
- package/data/docs/routes/components-typography-heading.json +402 -0
- package/data/docs/routes/components-typography-kbd.json +399 -0
- package/data/docs/routes/components-typography-list.json +593 -0
- package/data/docs/routes/components-typography-text.json +444 -0
- package/data/docs/routes/components-typography.json +34 -0
- package/data/docs/routes/components-utilities-nimbus-i18n-provider.json +295 -0
- package/data/docs/routes/components-utilities-nimbus-provider.json +663 -0
- package/data/docs/routes/components-utilities.json +34 -0
- package/data/docs/routes/components.json +33 -0
- package/data/docs/routes/home-contribute-adrs-adr0001-consumer-component-apis.json +314 -0
- package/data/docs/routes/home-contribute-adrs-adr0002-compound-component-extraction.json +160 -0
- package/data/docs/routes/home-contribute-adrs-adr0003-component-lifecycle-states.json +460 -0
- package/data/docs/routes/home-contribute-adrs.json +205 -0
- package/data/docs/routes/home-contribute-development-setup.json +213 -0
- package/data/docs/routes/home-contribute-stats.json +36 -0
- package/data/docs/routes/home-contribute.json +36 -0
- package/data/docs/routes/home-design-tokens-aspect-ratios.json +36 -0
- package/data/docs/routes/home-design-tokens-borders.json +35 -0
- package/data/docs/routes/home-design-tokens-colors.json +157 -0
- package/data/docs/routes/home-design-tokens-other-animations.json +119 -0
- package/data/docs/routes/home-design-tokens-other-blurs.json +36 -0
- package/data/docs/routes/home-design-tokens-other-breakpoints.json +61 -0
- package/data/docs/routes/home-design-tokens-other-cursors.json +36 -0
- package/data/docs/routes/home-design-tokens-other-z-indices.json +39 -0
- package/data/docs/routes/home-design-tokens-other.json +35 -0
- package/data/docs/routes/home-design-tokens-radii.json +59 -0
- package/data/docs/routes/home-design-tokens-shadows.json +57 -0
- package/data/docs/routes/home-design-tokens-sizes.json +137 -0
- package/data/docs/routes/home-design-tokens-spacing.json +36 -0
- package/data/docs/routes/home-design-tokens-typography.json +184 -0
- package/data/docs/routes/home-design-tokens.json +34 -0
- package/data/docs/routes/home-getting-started-core-concepts.json +301 -0
- package/data/docs/routes/home-getting-started-installation.json +621 -0
- package/data/docs/routes/home-getting-started-mcp-server-overview.json +139 -0
- package/data/docs/routes/home-getting-started-mcp-server-setup.json +316 -0
- package/data/docs/routes/home-getting-started-release-process.json +294 -0
- package/data/docs/routes/home-getting-started-testing-setup.json +296 -0
- package/data/docs/routes/home-playground-markdown.json +638 -0
- package/data/docs/routes/home-playground-toc.json +169 -0
- package/data/docs/routes/home-playground.json +34 -0
- package/data/docs/routes/home-style-props-background.json +236 -0
- package/data/docs/routes/home-style-props-border.json +310 -0
- package/data/docs/routes/home-style-props-display.json +120 -0
- package/data/docs/routes/home-style-props-effects.json +116 -0
- package/data/docs/routes/home-style-props-filters.json +396 -0
- package/data/docs/routes/home-style-props-flex-and-grid.json +496 -0
- package/data/docs/routes/home-style-props-interactivity.json +356 -0
- package/data/docs/routes/home-style-props-layout.json +422 -0
- package/data/docs/routes/home-style-props-list.json +116 -0
- package/data/docs/routes/home-style-props-sizing.json +244 -0
- package/data/docs/routes/home-style-props-spacing.json +228 -0
- package/data/docs/routes/home-style-props-svg.json +96 -0
- package/data/docs/routes/home-style-props-tables.json +116 -0
- package/data/docs/routes/home-style-props-transforms.json +216 -0
- package/data/docs/routes/home-style-props-transitions.json +216 -0
- package/data/docs/routes/home-style-props-typography.json +536 -0
- package/data/docs/routes/home-style-props.json +33 -0
- package/data/docs/routes/home.json +32 -0
- package/data/docs/routes/hooks-usecopytoclipboard.json +76 -0
- package/data/docs/routes/hooks-usehotkeys.json +117 -0
- package/data/docs/routes/hooks.json +33 -0
- package/data/docs/routes/icons.json +32 -0
- package/data/docs/routes/patterns-fields-date-range-picker-field.json +393 -0
- package/data/docs/routes/patterns-fields-money-input-field.json +415 -0
- package/data/docs/routes/patterns-fields-multiline-text-input-field.json +404 -0
- package/data/docs/routes/patterns-fields-number-input-field.json +470 -0
- package/data/docs/routes/patterns-fields-password-input-field.json +319 -0
- package/data/docs/routes/patterns-fields-search-input-field.json +382 -0
- package/data/docs/routes/patterns-fields-text-input-field.json +404 -0
- package/data/docs/routes/patterns-fields.json +78 -0
- package/data/docs/routes/patterns.json +34 -0
- package/data/docs/search-index.json +1 -0
- package/data/docs/types/Accordion.json +12 -0
- package/data/docs/types/AccordionContent.json +286 -0
- package/data/docs/types/AccordionHeader.json +891 -0
- package/data/docs/types/AccordionHeaderRightContent.json +27 -0
- package/data/docs/types/AccordionItem.json +242 -0
- package/data/docs/types/AccordionRoot.json +162 -0
- package/data/docs/types/Alert.json +12 -0
- package/data/docs/types/AlertActions.json +11 -0
- package/data/docs/types/AlertDescription.json +118 -0
- package/data/docs/types/AlertDismissButton.json +937 -0
- package/data/docs/types/AlertRoot.json +42 -0
- package/data/docs/types/AlertTitle.json +118 -0
- package/data/docs/types/Avatar.json +125 -0
- package/data/docs/types/Badge.json +64 -0
- package/data/docs/types/Body.json +67 -0
- package/data/docs/types/Box.json +85 -0
- package/data/docs/types/Button.json +1015 -0
- package/data/docs/types/Calendar.json +565 -0
- package/data/docs/types/Caption.json +67 -0
- package/data/docs/types/Card.json +12 -0
- package/data/docs/types/CardContent.json +27 -0
- package/data/docs/types/CardHeader.json +27 -0
- package/data/docs/types/CardRoot.json +106 -0
- package/data/docs/types/Cell.json +227 -0
- package/data/docs/types/Checkbox.json +897 -0
- package/data/docs/types/Code.json +112 -0
- package/data/docs/types/CollapsibleMotionContent.json +35 -0
- package/data/docs/types/CollapsibleMotionRoot.json +99 -0
- package/data/docs/types/CollapsibleMotionTrigger.json +71 -0
- package/data/docs/types/Column.json +101 -0
- package/data/docs/types/ColumnGroup.json +101 -0
- package/data/docs/types/ColumnHeader.json +193 -0
- package/data/docs/types/ComboBoxListBox.json +751 -0
- package/data/docs/types/ComboBoxOption.json +672 -0
- package/data/docs/types/ComboBoxPopover.json +786 -0
- package/data/docs/types/ComboBoxRoot.json +747 -0
- package/data/docs/types/ComboBoxSection.json +277 -0
- package/data/docs/types/ComboBoxTrigger.json +70 -0
- package/data/docs/types/Content.json +33 -0
- package/data/docs/types/DataTable.json +596 -0
- package/data/docs/types/DataTableBody.json +223 -0
- package/data/docs/types/DataTableFooter.json +27 -0
- package/data/docs/types/DataTableHeader.json +269 -0
- package/data/docs/types/DataTableManager.json +11 -0
- package/data/docs/types/DataTableRoot.json +590 -0
- package/data/docs/types/DataTableTable.json +271 -0
- package/data/docs/types/DateInput.json +792 -0
- package/data/docs/types/DatePicker.json +700 -0
- package/data/docs/types/DateRangePicker.json +936 -0
- package/data/docs/types/DateRangePickerField.json +1047 -0
- package/data/docs/types/DefaultPage.json +12 -0
- package/data/docs/types/DefaultPageActions.json +27 -0
- package/data/docs/types/DefaultPageBackLink.json +213 -0
- package/data/docs/types/DefaultPageContent.json +27 -0
- package/data/docs/types/DefaultPageFooter.json +27 -0
- package/data/docs/types/DefaultPageHeader.json +27 -0
- package/data/docs/types/DefaultPageRoot.json +106 -0
- package/data/docs/types/DefaultPageSubtitle.json +27 -0
- package/data/docs/types/DefaultPageTabNav.json +28 -0
- package/data/docs/types/DefaultPageTitle.json +27 -0
- package/data/docs/types/DialogBody.json +27 -0
- package/data/docs/types/DialogCloseTrigger.json +939 -0
- package/data/docs/types/DialogContent.json +27 -0
- package/data/docs/types/DialogFooter.json +27 -0
- package/data/docs/types/DialogHeader.json +27 -0
- package/data/docs/types/DialogRoot.json +138 -0
- package/data/docs/types/DialogTitle.json +27 -0
- package/data/docs/types/DialogTrigger.json +80 -0
- package/data/docs/types/DraggableList.json +12 -0
- package/data/docs/types/DraggableListField.json +894 -0
- package/data/docs/types/DraggableListItem.json +574 -0
- package/data/docs/types/DraggableListRoot.json +745 -0
- package/data/docs/types/Drawer.json +12 -0
- package/data/docs/types/DrawerBody.json +27 -0
- package/data/docs/types/DrawerCloseTrigger.json +939 -0
- package/data/docs/types/DrawerContent.json +27 -0
- package/data/docs/types/DrawerFooter.json +27 -0
- package/data/docs/types/DrawerHeader.json +27 -0
- package/data/docs/types/DrawerRoot.json +142 -0
- package/data/docs/types/DrawerTitle.json +27 -0
- package/data/docs/types/DrawerTrigger.json +80 -0
- package/data/docs/types/FieldErrors.getBuiltInMessage.json +11 -0
- package/data/docs/types/FieldErrors.getCustomMessage.json +9 -0
- package/data/docs/types/FieldErrors.json +109 -0
- package/data/docs/types/Flex.json +238 -0
- package/data/docs/types/Footer.json +67 -0
- package/data/docs/types/FormFieldDescription.json +11 -0
- package/data/docs/types/FormFieldError.json +11 -0
- package/data/docs/types/FormFieldInfoBox.json +27 -0
- package/data/docs/types/FormFieldInput.json +11 -0
- package/data/docs/types/FormFieldLabel.json +11 -0
- package/data/docs/types/FormFieldRoot.json +148 -0
- package/data/docs/types/Grid.json +253 -0
- package/data/docs/types/GridProps.json +11 -0
- package/data/docs/types/Group.json +143 -0
- package/data/docs/types/Header.json +67 -0
- package/data/docs/types/Heading.json +109 -0
- package/data/docs/types/Icon.json +112 -0
- package/data/docs/types/IconButton.json +1019 -0
- package/data/docs/types/IconToggleButton.json +787 -0
- package/data/docs/types/Image.json +373 -0
- package/data/docs/types/Indicator.json +67 -0
- package/data/docs/types/InlineSvg.json +98 -0
- package/data/docs/types/Item.json +67 -0
- package/data/docs/types/Kbd.json +118 -0
- package/data/docs/types/Link.json +380 -0
- package/data/docs/types/List.json +12 -0
- package/data/docs/types/ListIndicator.json +70 -0
- package/data/docs/types/ListItem.json +70 -0
- package/data/docs/types/ListRoot.json +124 -0
- package/data/docs/types/LoadingSpinner.json +87 -0
- package/data/docs/types/LocalizedField.json +460 -0
- package/data/docs/types/LocalizedStringFormatter.json +9 -0
- package/data/docs/types/MakeElementFocusable.json +196 -0
- package/data/docs/types/MenuContent.json +111 -0
- package/data/docs/types/MenuItem.json +671 -0
- package/data/docs/types/MenuRoot.json +670 -0
- package/data/docs/types/MenuSection.json +364 -0
- package/data/docs/types/MenuSubmenu.json +111 -0
- package/data/docs/types/MenuSubmenuTrigger.json +67 -0
- package/data/docs/types/MenuTrigger.json +906 -0
- package/data/docs/types/ModalPage.json +12 -0
- package/data/docs/types/ModalPageActions.json +27 -0
- package/data/docs/types/ModalPageContent.json +27 -0
- package/data/docs/types/ModalPageFooter.json +27 -0
- package/data/docs/types/ModalPageHeader.json +27 -0
- package/data/docs/types/ModalPageRoot.json +87 -0
- package/data/docs/types/ModalPageSubtitle.json +27 -0
- package/data/docs/types/ModalPageTabNav.json +28 -0
- package/data/docs/types/ModalPageTitle.json +27 -0
- package/data/docs/types/ModalPageTopBar.json +57 -0
- package/data/docs/types/MoneyInput.isEmpty.json +40 -0
- package/data/docs/types/MoneyInput.json +282 -0
- package/data/docs/types/MoneyInputField.json +379 -0
- package/data/docs/types/MoneyInputFieldProps.json +9 -0
- package/data/docs/types/MultilineTextInput.json +1194 -0
- package/data/docs/types/MultilineTextInputField.json +1269 -0
- package/data/docs/types/MultilineTextInputFieldProps.json +9 -0
- package/data/docs/types/NimbusI18nProvider.json +42 -0
- package/data/docs/types/NimbusI18nProviderProps.json +9 -0
- package/data/docs/types/NimbusProvider.json +270 -0
- package/data/docs/types/NumberInput.json +952 -0
- package/data/docs/types/NumberInputField.json +1004 -0
- package/data/docs/types/NumberInputFieldProps.json +9 -0
- package/data/docs/types/PageContent.json +11 -0
- package/data/docs/types/PageContentColumn.json +99 -0
- package/data/docs/types/PageContentRoot.json +114 -0
- package/data/docs/types/Pagination.json +159 -0
- package/data/docs/types/PasswordInput.json +1120 -0
- package/data/docs/types/PasswordInputField.json +1216 -0
- package/data/docs/types/PasswordInputFieldProps.json +9 -0
- package/data/docs/types/ProgressBar.json +280 -0
- package/data/docs/types/RadioInputOption.json +550 -0
- package/data/docs/types/RadioInputRoot.json +514 -0
- package/data/docs/types/RangeCalendar.json +618 -0
- package/data/docs/types/RichTextInput.json +134 -0
- package/data/docs/types/Root.json +122 -0
- package/data/docs/types/Row.json +67 -0
- package/data/docs/types/ScopedSearchInput.isEmpty.json +40 -0
- package/data/docs/types/ScopedSearchInput.json +253 -0
- package/data/docs/types/ScrollArea.json +82 -0
- package/data/docs/types/SearchInput.json +1165 -0
- package/data/docs/types/SearchInputField.json +1240 -0
- package/data/docs/types/Select.json +12 -0
- package/data/docs/types/SelectOption.json +572 -0
- package/data/docs/types/SelectOptionGroup.json +215 -0
- package/data/docs/types/SelectOptions.json +693 -0
- package/data/docs/types/SelectRoot.json +926 -0
- package/data/docs/types/Separator.json +65 -0
- package/data/docs/types/SimpleGrid.json +291 -0
- package/data/docs/types/Spacer.json +27 -0
- package/data/docs/types/SpacerProps.json +9 -0
- package/data/docs/types/SplitButton.json +203 -0
- package/data/docs/types/Stack.json +144 -0
- package/data/docs/types/Steps.json +12 -0
- package/data/docs/types/StepsChangeDetails.json +9 -0
- package/data/docs/types/StepsCompletedContent.json +28 -0
- package/data/docs/types/StepsCompletedContentProps.json +9 -0
- package/data/docs/types/StepsContent.json +43 -0
- package/data/docs/types/StepsContentProps.json +9 -0
- package/data/docs/types/StepsDescription.json +28 -0
- package/data/docs/types/StepsDescriptionProps.json +9 -0
- package/data/docs/types/StepsIndicator.json +28 -0
- package/data/docs/types/StepsIndicatorProps.json +9 -0
- package/data/docs/types/StepsItem.json +43 -0
- package/data/docs/types/StepsItemProps.json +9 -0
- package/data/docs/types/StepsList.json +28 -0
- package/data/docs/types/StepsListProps.json +9 -0
- package/data/docs/types/StepsNextTrigger.json +62 -0
- package/data/docs/types/StepsNextTriggerProps.json +9 -0
- package/data/docs/types/StepsNumber.json +28 -0
- package/data/docs/types/StepsNumberProps.json +9 -0
- package/data/docs/types/StepsPrevTrigger.json +62 -0
- package/data/docs/types/StepsPrevTriggerProps.json +9 -0
- package/data/docs/types/StepsRoot.json +183 -0
- package/data/docs/types/StepsRootProps.json +11 -0
- package/data/docs/types/StepsSeparator.json +28 -0
- package/data/docs/types/StepsSeparatorProps.json +9 -0
- package/data/docs/types/StepsStatus.json +57 -0
- package/data/docs/types/StepsStatusProps.json +9 -0
- package/data/docs/types/StepsTitle.json +28 -0
- package/data/docs/types/StepsTitleProps.json +9 -0
- package/data/docs/types/StepsTrigger.json +47 -0
- package/data/docs/types/StepsTriggerProps.json +9 -0
- package/data/docs/types/Switch.json +371 -0
- package/data/docs/types/TabListProps.json +9 -0
- package/data/docs/types/TabNav.json +12 -0
- package/data/docs/types/TabNavItem.json +300 -0
- package/data/docs/types/TabNavItemProps.json +9 -0
- package/data/docs/types/TabNavProps.json +9 -0
- package/data/docs/types/TabNavRoot.json +80 -0
- package/data/docs/types/TabPanelProps.json +9 -0
- package/data/docs/types/TabPanelsProps.json +9 -0
- package/data/docs/types/TabProps.json +9 -0
- package/data/docs/types/Table.json +9 -0
- package/data/docs/types/TableBody.json +67 -0
- package/data/docs/types/TableBodyProps.json +9 -0
- package/data/docs/types/TableCaption.json +67 -0
- package/data/docs/types/TableCaptionProps.json +9 -0
- package/data/docs/types/TableCell.json +227 -0
- package/data/docs/types/TableCellProps.json +9 -0
- package/data/docs/types/TableColumn.json +101 -0
- package/data/docs/types/TableColumnGroup.json +101 -0
- package/data/docs/types/TableColumnGroupProps.json +9 -0
- package/data/docs/types/TableColumnHeader.json +193 -0
- package/data/docs/types/TableColumnHeaderProps.json +9 -0
- package/data/docs/types/TableColumnProps.json +9 -0
- package/data/docs/types/TableFooter.json +67 -0
- package/data/docs/types/TableFooterProps.json +9 -0
- package/data/docs/types/TableHeader.json +67 -0
- package/data/docs/types/TableHeaderProps.json +9 -0
- package/data/docs/types/TableRoot.json +365 -0
- package/data/docs/types/TableRootProps.json +12 -0
- package/data/docs/types/TableRow.json +67 -0
- package/data/docs/types/TableRowProps.json +9 -0
- package/data/docs/types/TableScrollArea.json +82 -0
- package/data/docs/types/TableScrollAreaProps.json +9 -0
- package/data/docs/types/Tabs.json +12 -0
- package/data/docs/types/TabsList.json +110 -0
- package/data/docs/types/TabsPanel.json +112 -0
- package/data/docs/types/TabsPanels.json +108 -0
- package/data/docs/types/TabsRoot.json +211 -0
- package/data/docs/types/TabsTab.json +174 -0
- package/data/docs/types/TagGroup.json +12 -0
- package/data/docs/types/TagGroupRoot.json +306 -0
- package/data/docs/types/TagGroupTag.json +595 -0
- package/data/docs/types/TagGroupTagList.json +166 -0
- package/data/docs/types/Text.json +119 -0
- package/data/docs/types/TextInput.json +1156 -0
- package/data/docs/types/TextInputField.json +1263 -0
- package/data/docs/types/TimeInput.json +752 -0
- package/data/docs/types/ToastAction.json +9 -0
- package/data/docs/types/ToastManagerApi.json +9 -0
- package/data/docs/types/ToastOptions.json +9 -0
- package/data/docs/types/ToastOutlet.json +12 -0
- package/data/docs/types/ToastPlacement.json +9 -0
- package/data/docs/types/ToastPromiseOptions.json +9 -0
- package/data/docs/types/ToastType.json +9 -0
- package/data/docs/types/ToastVariant.json +9 -0
- package/data/docs/types/ToggleButton.json +789 -0
- package/data/docs/types/ToggleButtonGroup.json +9 -0
- package/data/docs/types/ToggleButtonGroupButton.json +331 -0
- package/data/docs/types/ToggleButtonGroupRoot.json +269 -0
- package/data/docs/types/Toolbar.json +176 -0
- package/data/docs/types/Tooltip.json +12 -0
- package/data/docs/types/TooltipContent.json +372 -0
- package/data/docs/types/TooltipRoot.json +179 -0
- package/data/docs/types/Trigger.json +69 -0
- package/data/docs/types/VisuallyHidden.json +93 -0
- package/data/docs/types/__object.json +12 -0
- package/data/docs/types/filters.json +11 -0
- package/data/docs/types/manifest.json +278 -0
- package/data/docs/types/toast.json +234 -0
- package/data/docs/types/useColorMode.json +13 -0
- package/data/docs/types/useColorModeValue.json +13 -0
- package/data/docs/types/useColorScheme.json +12 -0
- package/data/docs/types/useLocalizedStringFormatter.json +14 -0
- package/data/icons.json +21940 -0
- package/data/tokens.json +40061 -0
- package/dist/index.js +2516 -17
- package/package.json +25 -6
- package/dist/data-loader.d.ts +0 -102
- package/dist/data-loader.js +0 -104
- package/dist/index.d.ts +0 -13
- package/dist/server.d.ts +0 -9
- package/dist/server.js +0 -22
- package/dist/server.spec.d.ts +0 -1
- package/dist/server.spec.js +0 -69
- package/dist/tools/list-components.d.ts +0 -9
- package/dist/tools/list-components.js +0 -42
- package/dist/types.d.ts +0 -28
- package/dist/types.js +0 -4
- package/src/data-loader.ts +0 -226
- package/src/index.ts +0 -29
- package/src/server.spec.ts +0 -86
- package/src/server.ts +0 -28
- package/src/tools/list-components.ts +0 -49
- package/src/types.ts +0 -31
- package/tsconfig.json +0 -14
- package/vitest.config.ts +0 -9
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
{
|
|
2
|
+
"meta": {
|
|
3
|
+
"id": "Components-RangeCalendar",
|
|
4
|
+
"title": "Range calendar",
|
|
5
|
+
"exportName": "RangeCalendar",
|
|
6
|
+
"description": "Range calendar displays a grid of days in one or more months and allow users to select a range of dates.",
|
|
7
|
+
"lifecycleState": "Stable",
|
|
8
|
+
"order": 999,
|
|
9
|
+
"repoPath": "packages/nimbus/src/components/range-calendar/range-calendar.mdx",
|
|
10
|
+
"menu": [
|
|
11
|
+
"Components",
|
|
12
|
+
"Inputs",
|
|
13
|
+
"Range calendar"
|
|
14
|
+
],
|
|
15
|
+
"route": "components/inputs/range-calendar",
|
|
16
|
+
"tags": [
|
|
17
|
+
"component",
|
|
18
|
+
"calendar"
|
|
19
|
+
],
|
|
20
|
+
"toc": [
|
|
21
|
+
{
|
|
22
|
+
"value": "Overview",
|
|
23
|
+
"href": "#overview",
|
|
24
|
+
"depth": 2,
|
|
25
|
+
"numbering": [
|
|
26
|
+
1,
|
|
27
|
+
1
|
|
28
|
+
],
|
|
29
|
+
"parent": "root"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"value": "Resources",
|
|
33
|
+
"href": "#resources",
|
|
34
|
+
"depth": 3,
|
|
35
|
+
"numbering": [
|
|
36
|
+
1,
|
|
37
|
+
1,
|
|
38
|
+
1
|
|
39
|
+
],
|
|
40
|
+
"parent": "root"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"value": "Variables",
|
|
44
|
+
"href": "#variables",
|
|
45
|
+
"depth": 2,
|
|
46
|
+
"numbering": [
|
|
47
|
+
1,
|
|
48
|
+
2
|
|
49
|
+
],
|
|
50
|
+
"parent": "root"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"value": "Visual options",
|
|
54
|
+
"href": "#visual-options",
|
|
55
|
+
"depth": 3,
|
|
56
|
+
"numbering": [
|
|
57
|
+
1,
|
|
58
|
+
2,
|
|
59
|
+
1
|
|
60
|
+
],
|
|
61
|
+
"parent": "root"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"value": "Date range",
|
|
65
|
+
"href": "#date-range",
|
|
66
|
+
"depth": 4,
|
|
67
|
+
"numbering": [
|
|
68
|
+
1,
|
|
69
|
+
2,
|
|
70
|
+
1,
|
|
71
|
+
1
|
|
72
|
+
],
|
|
73
|
+
"parent": "root"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"layout": "app-frame",
|
|
77
|
+
"tabs": [
|
|
78
|
+
{
|
|
79
|
+
"key": "overview",
|
|
80
|
+
"title": "Overview",
|
|
81
|
+
"order": 0
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"key": "guidelines",
|
|
85
|
+
"title": "Guidelines",
|
|
86
|
+
"order": 2
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"key": "dev",
|
|
90
|
+
"title": "Implementation",
|
|
91
|
+
"order": 3
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"key": "a11y",
|
|
95
|
+
"title": "Accessibility",
|
|
96
|
+
"order": 4
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
"mdx": "\n## Overview\n\nThe calendar component is most often used within the popover component when a\nuser interacts with a date input. Easily toggle, month, year, and select a\nrange.\n\n### Resources\n\nDeep dive into implementation details and access the Nimbus design library.\n\n[Figma library](https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?m=auto&node-id=5818-15651)\n[Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-date-rangecalendar--docs)\n\n## Variables\n\nGet familiar with the features.\n\n### Visual options\n\n#### Date range\n\nAllow users to select a range of dates.\n\n```jsx live\nconst App = () => <RangeCalendar aria-label=\"Enter dates\" />\n```\n",
|
|
101
|
+
"views": {
|
|
102
|
+
"overview": {
|
|
103
|
+
"mdx": "\n## Overview\n\nThe calendar component is most often used within the popover component when a\nuser interacts with a date input. Easily toggle, month, year, and select a\nrange.\n\n### Resources\n\nDeep dive into implementation details and access the Nimbus design library.\n\n[Figma library](https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?m=auto&node-id=5818-15651)\n[Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-date-rangecalendar--docs)\n\n## Variables\n\nGet familiar with the features.\n\n### Visual options\n\n#### Date range\n\nAllow users to select a range of dates.\n\n```jsx live\nconst App = () => <RangeCalendar aria-label=\"Enter dates\" />\n```\n",
|
|
104
|
+
"toc": [
|
|
105
|
+
{
|
|
106
|
+
"value": "Overview",
|
|
107
|
+
"href": "#overview",
|
|
108
|
+
"depth": 2,
|
|
109
|
+
"numbering": [
|
|
110
|
+
1,
|
|
111
|
+
1
|
|
112
|
+
],
|
|
113
|
+
"parent": "root"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"value": "Resources",
|
|
117
|
+
"href": "#resources",
|
|
118
|
+
"depth": 3,
|
|
119
|
+
"numbering": [
|
|
120
|
+
1,
|
|
121
|
+
1,
|
|
122
|
+
1
|
|
123
|
+
],
|
|
124
|
+
"parent": "root"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"value": "Variables",
|
|
128
|
+
"href": "#variables",
|
|
129
|
+
"depth": 2,
|
|
130
|
+
"numbering": [
|
|
131
|
+
1,
|
|
132
|
+
2
|
|
133
|
+
],
|
|
134
|
+
"parent": "root"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"value": "Visual options",
|
|
138
|
+
"href": "#visual-options",
|
|
139
|
+
"depth": 3,
|
|
140
|
+
"numbering": [
|
|
141
|
+
1,
|
|
142
|
+
2,
|
|
143
|
+
1
|
|
144
|
+
],
|
|
145
|
+
"parent": "root"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"value": "Date range",
|
|
149
|
+
"href": "#date-range",
|
|
150
|
+
"depth": 4,
|
|
151
|
+
"numbering": [
|
|
152
|
+
1,
|
|
153
|
+
2,
|
|
154
|
+
1,
|
|
155
|
+
1
|
|
156
|
+
],
|
|
157
|
+
"parent": "root"
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
"a11y": {
|
|
162
|
+
"mdx": "\n## Accessibility\n\nAccessibility ensures that digital content and functionality are usable by\neveryone, including people with disabilities, by addressing visual, auditory,\ncognitive, and physical limitations.\n\n```jsx live\nconst App = () => <RangeCalendar aria-label=\"Enter dates\" />\n```\n\n### Accessibility standards\n\n- Ensure the calendar is navigable using a keyboard.\n- Use Tab to move focus to and from the calendar component.\n- Use Enter or Space to activate controls (e.g., to open/close the calendar,\n select a date, or navigate months/years).\n- Use arrow keys to navigate between days within the calendar grid.\n- Ensure focus is clearly visible on the currently selected day or navigated\n day.\n- Clearly indicate the current month and year.\n- Provide accessible controls for navigating to previous and next months/years.\n These controls should have clear `aria-label` attributes if they are\n icon-only.\n- Ensure selected dates are clearly distinguished visually and announced by\n screen readers.\n- Communicate invalid or unavailable dates (e.g., past dates, blackout dates) to\n screen readers.\n- Provide a mechanism for users to select a specific date (e.g., clicking a day,\n or typing a date into an associated input field).\n- Announce changes in month or year to screen readers.\n- Ensure sufficient color contrast for all calendar elements (text, borders,\n icons, selected states, hover states).\n",
|
|
163
|
+
"toc": [
|
|
164
|
+
{
|
|
165
|
+
"value": "Accessibility",
|
|
166
|
+
"href": "#accessibility",
|
|
167
|
+
"depth": 2,
|
|
168
|
+
"numbering": [
|
|
169
|
+
1,
|
|
170
|
+
1
|
|
171
|
+
],
|
|
172
|
+
"parent": "root"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"value": "Accessibility standards",
|
|
176
|
+
"href": "#accessibility-standards",
|
|
177
|
+
"depth": 3,
|
|
178
|
+
"numbering": [
|
|
179
|
+
1,
|
|
180
|
+
1,
|
|
181
|
+
1
|
|
182
|
+
],
|
|
183
|
+
"parent": "root"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
"dev": {
|
|
188
|
+
"mdx": "\n## Getting started\n\n### Import\n\n```tsx\nimport { RangeCalendar, type RangeCalendarProps } from '@commercetools/nimbus';\n```\n\n### Basic usage\n\nThe simplest implementation displays a single-month calendar for date range selection:\n\n```jsx live-dev\nconst App = () => (\n <RangeCalendar aria-label=\"Select date range\" />\n)\n```\n\n## Working with date values\n\nThe RangeCalendar relies on `@internationalized/date`'s library for type-safe date handling. This library provides calendar system support, time zone handling, and locale-aware date formatting.\n\n### Date value types\n\nThe primary date type for RangeCalendar is `CalendarDate` for date-only scenarios:\n\n```tsx\nimport { CalendarDate } from '@internationalized/date';\n\n// Date only (no time)\nconst date = new CalendarDate(2024, 1, 15);\n```\n\n### Creating date values\n\nUse helper functions to parse ISO strings or create dates programmatically:\n\n```tsx\nimport { parseDate, today, getLocalTimeZone } from '@internationalized/date';\n\n// Parse ISO date string\nconst date = parseDate('2024-01-15');\n\n// Get today's date\nconst todayDate = today(getLocalTimeZone());\n\n// Create relative dates\nconst nextWeek = today(getLocalTimeZone()).add({ weeks: 1 });\n```\n\n### Converting to ISO strings\n\nUse `.toString()` to convert date objects for API/backend consumption:\n\n```tsx\nconst date = new CalendarDate(2024, 1, 15);\ndate.toString(); // \"2024-01-15\"\n\n// Convert date ranges for API calls\nconst dateRange = {\n start: new CalendarDate(2024, 1, 15),\n end: new CalendarDate(2024, 1, 20)\n};\n\nconst apiPayload = {\n startDate: dateRange.start.toString(), // \"2024-01-15\"\n endDate: dateRange.end.toString() // \"2024-01-20\"\n};\n```\n\n### Date range structure\n\nThe component expects and returns date ranges in this structure:\n\n```tsx\nimport type { RangeValue } from '@commercetools/nimbus';\nimport type { DateValue } from '@internationalized/date';\n\ntype DateRange = RangeValue<DateValue>;\n\n// Example:\nconst range: DateRange = {\n start: new CalendarDate(2024, 1, 15),\n end: new CalendarDate(2024, 1, 20)\n};\n```\n\n> [!TIP]\\\n> See [@internationalized/date documentation](https://react-spectrum.adobe.com/internationalized/date/) for complete API reference and advanced usage.\n\n## Usage examples\n\n### Multi-month display\n\nThe `visibleDuration` prop allows displaying multiple months simultaneously:\n\n```jsx live-dev\nconst App = () => (\n <Stack direction=\"column\" gap=\"600\">\n <Text fontWeight=\"600\">Two months:</Text>\n <RangeCalendar\n aria-label=\"Select date range\"\n visibleDuration={{ months: 2 }}\n />\n <Text fontWeight=\"600\">Three months:</Text>\n <RangeCalendar\n aria-label=\"Select date range\"\n visibleDuration={{ months: 3 }}\n />\n </Stack>\n)\n```\n\n### Paging behavior\n\nThe `pageBehavior` prop controls how navigation moves between months:\n\n```jsx live-dev\nconst App = () => (\n <Stack direction=\"column\" gap=\"600\">\n <Box>\n <Text fontWeight=\"600\" mb=\"200\">Single paging (one month at a time):</Text>\n <RangeCalendar\n aria-label=\"Select date range\"\n visibleDuration={{ months: 2 }}\n pageBehavior=\"single\"\n />\n </Box>\n <Box>\n <Text fontWeight=\"600\" mb=\"200\">Visible paging (all visible months at once):</Text>\n <RangeCalendar\n aria-label=\"Select date range\"\n visibleDuration={{ months: 2 }}\n pageBehavior=\"visible\"\n />\n </Box>\n </Stack>\n)\n```\n\n**Behavioral differences:**\n- `pageBehavior=\"single\"`: Navigates one month at a time\n- `pageBehavior=\"visible\"`: Navigates by the number of visible months\n\n### Date constraints\n\nUse `minValue` and `maxValue` to restrict the selectable date range:\n\n```jsx live-dev\nconst App = () => {\n const todayDate = today(getLocalTimeZone());\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Text textStyle=\"sm\" color=\"neutral.11\">\n Selection limited to dates from 1 week ago to 4 weeks ahead.\n </Text>\n <RangeCalendar\n aria-label=\"Select date range\"\n minValue={todayDate.subtract({ weeks: 1 })}\n maxValue={todayDate.add({ weeks: 4 })}\n />\n </Stack>\n );\n}\n```\n\n### Unavailable dates\n\nUse `isDateUnavailable` to mark specific dates as unavailable for selection:\n\n```jsx live-dev\nconst App = () => {\n // Mark weekends as unavailable\n const isWeekend = (date) => {\n const dayOfWeek = date.toDate(getLocalTimeZone()).getDay();\n return dayOfWeek === 0 || dayOfWeek === 6;\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Text textStyle=\"sm\" color=\"neutral.11\">\n Weekends are unavailable for selection.\n </Text>\n <RangeCalendar\n aria-label=\"Select date range\"\n isDateUnavailable={isWeekend}\n />\n </Stack>\n );\n}\n```\n\n### Non-contiguous ranges\n\nEnable selection of ranges that span across unavailable dates with `allowsNonContiguousRanges`:\n\n```jsx live-dev\nconst App = () => {\n // Mark Mondays as unavailable\n const isMonday = (date) => {\n return date.toDate(getLocalTimeZone()).getDay() === 1;\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Text textStyle=\"sm\" color=\"neutral.11\">\n Mondays are unavailable, but ranges can span across them.\n </Text>\n <RangeCalendar\n aria-label=\"Select date range\"\n allowsNonContiguousRanges={true}\n isDateUnavailable={isMonday}\n />\n </Stack>\n );\n}\n```\n\n### Custom week start\n\nUse `firstDayOfWeek` to change which day starts the week:\n\n```jsx live-dev\nconst App = () => (\n <Stack direction=\"column\" gap=\"400\">\n <Text textStyle=\"sm\" color=\"neutral.11\">\n Week starts on Monday (common in European locales):\n </Text>\n <RangeCalendar\n aria-label=\"Select date range\"\n firstDayOfWeek=\"mon\"\n />\n </Stack>\n)\n```\n\n### Form states\n\nThe component supports disabled and read-only states:\n\n```jsx live-dev\nconst App = () => {\n const defaultRange = {\n start: today(getLocalTimeZone()).add({ days: 3 }),\n end: today(getLocalTimeZone()).add({ days: 8 }),\n };\n\n return (\n <Stack direction=\"column\" gap=\"600\">\n <Box>\n <Text fontWeight=\"600\" mb=\"200\">Disabled:</Text>\n <RangeCalendar\n aria-label=\"Disabled calendar\"\n isDisabled\n defaultValue={defaultRange}\n />\n </Box>\n <Box>\n <Text fontWeight=\"600\" mb=\"200\">Read-only:</Text>\n <RangeCalendar\n aria-label=\"Read-only calendar\"\n isReadOnly\n defaultValue={defaultRange}\n />\n </Box>\n </Stack>\n );\n}\n```\n\n### Uncontrolled mode\n\nFor simpler use cases, use uncontrolled mode with `defaultValue` and `onChange`:\n\n```jsx live-dev\nconst App = () => {\n const [selectedRange, setSelectedRange] = useState<RangeCalendarProps[\"value\"]>({\n start: today(getLocalTimeZone()).add({ days: 3 }),\n end: today(getLocalTimeZone()).add({ days: 8 }),\n });\n\n const formatDate = (date) => {\n return date.toDate(getLocalTimeZone()).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <RangeCalendar\n aria-label=\"Select date range\"\n defaultValue={{\n start: today(getLocalTimeZone()).add({ days: 3 }),\n end: today(getLocalTimeZone()).add({ days: 8 }),\n }}\n onChange={setSelectedRange}\n />\n <Box p=\"200\" bg=\"neutral.2\" borderRadius=\"200\">\n <Text fontWeight=\"600\" mb=\"200\">Selected Range:</Text>\n <Text>\n {selectedRange\n ? `${formatDate(selectedRange.start)} to ${formatDate(selectedRange.end)}`\n : 'No range selected'}\n </Text>\n </Box>\n </Stack>\n );\n}\n```\n\nUse uncontrolled mode when you need to capture the selected value without managing state yourself.\n\n### Controlled mode\n\nFor scenarios requiring programmatic control or coordination with other components, use controlled mode:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<RangeCalendarProps[\"value\"]>({\n start: today(getLocalTimeZone()).add({ days: 3 }),\n end: today(getLocalTimeZone()).add({ days: 8 }),\n });\n\n const formatDate = (date) => {\n return date.toDate(getLocalTimeZone()).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <RangeCalendar\n aria-label=\"Select date range\"\n value={value}\n onChange={setValue}\n />\n <Box p=\"200\" bg=\"neutral.2\" borderRadius=\"200\">\n <Text fontWeight=\"600\" mb=\"200\">Selected Range:</Text>\n <Text>\n {value\n ? `${formatDate(value.start)} to ${formatDate(value.end)}`\n : 'No range selected'}\n </Text>\n </Box>\n <Button\n variant=\"outline\"\n onPress={() => setValue(null)}\n isDisabled={!value}\n >\n Clear selection\n </Button>\n </Stack>\n );\n}\n```\n\nUse controlled mode when you need to:\n- Synchronize the date range with external state\n- Validate or transform date selections\n- Clear or programmatically set the date range\n\n### Internationalization\n\nThe calendar automatically adapts to the locale provided by `NimbusI18nProvider`:\n\n```jsx live-dev\nconst App = () => (\n <Stack direction=\"column\" gap=\"600\">\n <Box>\n <Text fontWeight=\"600\" mb=\"200\">German (de-DE):</Text>\n <NimbusI18nProvider locale=\"de-DE\">\n <RangeCalendar aria-label=\"Datumsbereich auswählen\" />\n </NimbusI18nProvider>\n </Box>\n <Box>\n <Text fontWeight=\"600\" mb=\"200\">Spanish (es-MX):</Text>\n <NimbusI18nProvider locale=\"es-MX\">\n <RangeCalendar aria-label=\"Seleccionar rango de fechas\" />\n </NimbusI18nProvider>\n </Box>\n </Stack>\n)\n```\n\n## Component requirements\n\n### Date value types\n\nAll date values **must** use `@internationalized/date` types:\n- `CalendarDate` for date-only scenarios (most common)\n- Other types from `@internationalized/date` as needed\n\n## Accessibility\n\nThe RangeCalendar handles most accessibility requirements internally. However, you must always associate an internationalized label with the component using the `aria-label` prop:\n\n```tsx\n<RangeCalendar aria-label={msg.format(labelMessage)} />\n```\n\nAlternatively, use `aria-labelledby` to reference a visible label:\n\n```tsx\n<label id=\"calendar-label\">\n {msg.format(labelMessage)}\n</label>\n<RangeCalendar aria-labelledby=\"calendar-label\" />\n```\n\nIf your use case requires tracking and analytics for this component, it is good practice to add a **persistent**, **unique** id to the component:\n\n```tsx\nconst PERSISTENT_ID = \"example-range-calendar\";\n\nexport const Example = () => (\n <RangeCalendar id={PERSISTENT_ID} aria-label=\"Select dates\" />\n);\n```\n\n#### Keyboard navigation\n\nThe component supports full keyboard interaction:\n- `Tab` / `Shift+Tab`: Navigate between calendar controls and cells\n- `Arrow keys`: Navigate between days within the calendar grid\n- `Enter` / `Space`: Select a date (first press sets start, second press sets end)\n- `Page Up` / `Page Down`: Navigate to previous/next month\n- `Shift + Page Up` / `Shift + Page Down`: Navigate to previous/next year\n\n## API reference\n\n<PropsTable id=\"RangeCalendar\" />\n\n## Common patterns\n\n### Booking period selection\n\nFor booking systems that need to prevent selections before today and limit booking windows:\n\n```jsx live-dev\nconst App = () => {\n const [bookingRange, setBookingRange] = useState<RangeCalendarProps[\"value\"]>(null);\n const todayDate = today(getLocalTimeZone());\n\n // Calculate booking duration in days\n const getDuration = (range) => {\n if (!range) return 0;\n const startMs = range.start.toDate(getLocalTimeZone()).getTime();\n const endMs = range.end.toDate(getLocalTimeZone()).getTime();\n return Math.ceil((endMs - startMs) / (1000 * 60 * 60 * 24)) + 1;\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <RangeCalendar\n aria-label=\"Select booking dates\"\n visibleDuration={{ months: 2 }}\n minValue={todayDate}\n maxValue={todayDate.add({ months: 3 })}\n value={bookingRange}\n onChange={setBookingRange}\n />\n {bookingRange && (\n <Box p=\"300\" bg=\"primary.2\" borderRadius=\"200\">\n <Text fontWeight=\"600\">Booking Summary:</Text>\n <Text textStyle=\"sm\">Duration: {getDuration(bookingRange)} days</Text>\n </Box>\n )}\n </Stack>\n );\n}\n```\n\n### Business days only selection\n\nFor scenarios where only business days (weekdays) are selectable:\n\n```jsx live-dev\nconst App = () => {\n const [dateRange, setDateRange] = useState<RangeCalendarProps[\"value\"]>(null);\n\n const isWeekend = (date) => {\n const dayOfWeek = date.toDate(getLocalTimeZone()).getDay();\n return dayOfWeek === 0 || dayOfWeek === 6;\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Text textStyle=\"sm\" color=\"neutral.11\">\n Only business days (Monday-Friday) can be selected.\n </Text>\n <RangeCalendar\n aria-label=\"Select business days\"\n isDateUnavailable={isWeekend}\n value={dateRange}\n onChange={setDateRange}\n />\n {dateRange && (\n <Text textStyle=\"sm\">\n Selected: {dateRange.start.toString()} to {dateRange.end.toString()}\n </Text>\n )}\n </Stack>\n );\n}\n```\n\n## Testing your implementation\n\nThese examples demonstrate how to test your implementation when using RangeCalendar within your application. As the component's internal functionality is already tested by Nimbus, these patterns help you verify your integration and application-specific logic.\n\n### Basic Rendering Tests\n\nVerify the component renders with expected elements\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, within } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { CalendarDate, today, getLocalTimeZone } from \"@internationalized/date\";\nimport { RangeCalendar, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"RangeCalendar - Basic rendering\", () => {\n it(\"renders calendar grid\", () => {\n render(\n <NimbusProvider>\n <RangeCalendar aria-label=\"Select date range\" />\n </NimbusProvider>\n );\n\n expect(screen.getByRole(\"grid\")).toBeInTheDocument();\n });\n\n it(\"renders navigation buttons\", () => {\n render(\n <NimbusProvider>\n <RangeCalendar aria-label=\"Select date range\" />\n </NimbusProvider>\n );\n\n // Month navigation\n expect(\n screen.getByRole(\"button\", { name: /previous month/i })\n ).toBeInTheDocument();\n expect(\n screen.getByRole(\"button\", { name: /next month/i })\n ).toBeInTheDocument();\n\n // Year navigation\n expect(\n screen.getByRole(\"button\", { name: /previous year/i })\n ).toBeInTheDocument();\n expect(\n screen.getByRole(\"button\", { name: /next year/i })\n ).toBeInTheDocument();\n });\n\n it(\"renders date cells in the grid\", () => {\n render(\n <NimbusProvider>\n <RangeCalendar aria-label=\"Select date range\" />\n </NimbusProvider>\n );\n\n // Check for date buttons within the grid\n const grid = screen.getByRole(\"grid\");\n const gridCells = within(grid).getAllByRole(\"gridcell\");\n\n // A month should have at least 28 days\n expect(gridCells.length).toBeGreaterThanOrEqual(28);\n });\n});\n```\n\n### Interaction Tests\n\nTest user interactions with the component\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, within } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { CalendarDate, today, getLocalTimeZone } from \"@internationalized/date\";\nimport { RangeCalendar, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"RangeCalendar - Interactions\", () => {\n it(\"navigates to next month when clicking next button\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <RangeCalendar aria-label=\"Select date range\" />\n </NimbusProvider>\n );\n\n const nextMonthButton = screen.getByRole(\"button\", {\n name: /next month/i,\n });\n\n await user.click(nextMonthButton);\n\n // The calendar should have navigated (button should still be present)\n expect(\n screen.getByRole(\"button\", { name: /next month/i })\n ).toBeInTheDocument();\n });\n\n it(\"navigates to previous year when clicking previous year button\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <RangeCalendar aria-label=\"Select date range\" />\n </NimbusProvider>\n );\n\n const prevYearButton = screen.getByRole(\"button\", {\n name: /previous year/i,\n });\n\n await user.click(prevYearButton);\n\n // The calendar should have navigated\n expect(\n screen.getByRole(\"button\", { name: /previous year/i })\n ).toBeInTheDocument();\n });\n});\n```\n\n### Testing Controlled Mode\n\nTest controlled component behavior with value and onChange\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, within } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { CalendarDate, today, getLocalTimeZone } from \"@internationalized/date\";\nimport { RangeCalendar, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"RangeCalendar - Controlled mode\", () => {\n it(\"displays provided date range value\", () => {\n const dateRange = {\n start: new CalendarDate(2024, 6, 15),\n end: new CalendarDate(2024, 6, 20),\n };\n\n render(\n <NimbusProvider>\n <RangeCalendar\n aria-label=\"Select date range\"\n value={dateRange}\n onChange={() => {}}\n />\n </NimbusProvider>\n );\n\n // The calendar should render with the provided range\n expect(screen.getByRole(\"grid\")).toBeInTheDocument();\n\n // Find cells with selected state\n const grid = screen.getByRole(\"grid\");\n const selectedCells = within(grid)\n .getAllByRole(\"gridcell\")\n .filter((cell) => cell.getAttribute(\"aria-selected\") === \"true\");\n\n // Multiple cells should be selected for a range\n expect(selectedCells.length).toBeGreaterThan(0);\n });\n\n it(\"renders with null value (no selection)\", () => {\n const handleChange = vi.fn();\n\n render(\n <NimbusProvider>\n <RangeCalendar\n aria-label=\"Select date range\"\n value={null}\n onChange={handleChange}\n />\n </NimbusProvider>\n );\n\n // Calendar should render without errors\n expect(screen.getByRole(\"grid\")).toBeInTheDocument();\n });\n});\n```\n\n### Testing Component States\n\nTest disabled and read-only states\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, within } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { CalendarDate, today, getLocalTimeZone } from \"@internationalized/date\";\nimport { RangeCalendar, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"RangeCalendar - States\", () => {\n it(\"renders in disabled state\", () => {\n const dateRange = {\n start: new CalendarDate(2024, 6, 15),\n end: new CalendarDate(2024, 6, 20),\n };\n\n render(\n <NimbusProvider>\n <RangeCalendar\n aria-label=\"Select date range\"\n isDisabled\n defaultValue={dateRange}\n />\n </NimbusProvider>\n );\n\n // The grid should still render\n expect(screen.getByRole(\"grid\")).toBeInTheDocument();\n });\n\n it(\"renders in read-only state with value displayed\", () => {\n const dateRange = {\n start: new CalendarDate(2024, 6, 15),\n end: new CalendarDate(2024, 6, 20),\n };\n\n render(\n <NimbusProvider>\n <RangeCalendar\n aria-label=\"Select date range\"\n isReadOnly\n value={dateRange}\n onChange={() => {}}\n />\n </NimbusProvider>\n );\n\n // Calendar should render\n expect(screen.getByRole(\"grid\")).toBeInTheDocument();\n\n // Selected cells should be visible\n const grid = screen.getByRole(\"grid\");\n const selectedCells = within(grid)\n .getAllByRole(\"gridcell\")\n .filter((cell) => cell.getAttribute(\"aria-selected\") === \"true\");\n expect(selectedCells.length).toBeGreaterThan(0);\n });\n});\n```\n\n### Testing Date Constraints\n\nTest minValue, maxValue, and isDateUnavailable\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, within } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { CalendarDate, today, getLocalTimeZone } from \"@internationalized/date\";\nimport { RangeCalendar, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"RangeCalendar - Date constraints\", () => {\n it(\"marks dates outside min/max as disabled\", () => {\n const todayDate = today(getLocalTimeZone());\n\n render(\n <NimbusProvider>\n <RangeCalendar\n aria-label=\"Select date range\"\n minValue={todayDate}\n maxValue={todayDate.add({ days: 7 })}\n />\n </NimbusProvider>\n );\n\n // Check that the calendar renders with constraints applied\n const grid = screen.getByRole(\"grid\");\n const gridCells = within(grid).getAllByRole(\"gridcell\");\n\n // Some cells should be disabled (outside the allowed range)\n const disabledCells = gridCells.filter(\n (cell) => cell.getAttribute(\"aria-disabled\") === \"true\"\n );\n expect(disabledCells.length).toBeGreaterThan(0);\n });\n\n it(\"marks custom unavailable dates as disabled\", () => {\n // Mark all Mondays as unavailable\n const isMonday = (date: { toDate: (tz: string) => Date }) => {\n return date.toDate(getLocalTimeZone()).getDay() === 1;\n };\n\n render(\n <NimbusProvider>\n <RangeCalendar\n aria-label=\"Select date range\"\n isDateUnavailable={isMonday}\n />\n </NimbusProvider>\n );\n\n // The calendar should render with some unavailable dates\n const grid = screen.getByRole(\"grid\");\n const gridCells = within(grid).getAllByRole(\"gridcell\");\n const disabledCells = gridCells.filter(\n (cell) => cell.getAttribute(\"aria-disabled\") === \"true\"\n );\n\n // At least some cells should be disabled (Mondays)\n expect(disabledCells.length).toBeGreaterThan(0);\n });\n\n it(\"renders with visible duration showing multiple months\", () => {\n render(\n <NimbusProvider>\n <RangeCalendar\n aria-label=\"Select date range\"\n visibleDuration={{ months: 2 }}\n />\n </NimbusProvider>\n );\n\n // Multiple grids should be rendered for multiple months\n const grids = screen.getAllByRole(\"grid\");\n expect(grids.length).toBe(2);\n });\n});\n```\n\n\n## Resources\n\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-date-rangecalendar--docs)\n- [React Aria RangeCalendar](https://react-spectrum.adobe.com/react-aria/RangeCalendar.html)\n- [ARIA Grid Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/grid/)\n",
|
|
189
|
+
"toc": [
|
|
190
|
+
{
|
|
191
|
+
"value": "Getting started",
|
|
192
|
+
"href": "#getting-started",
|
|
193
|
+
"depth": 2,
|
|
194
|
+
"numbering": [
|
|
195
|
+
1,
|
|
196
|
+
1
|
|
197
|
+
],
|
|
198
|
+
"parent": "root"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"value": "Import",
|
|
202
|
+
"href": "#import",
|
|
203
|
+
"depth": 3,
|
|
204
|
+
"numbering": [
|
|
205
|
+
1,
|
|
206
|
+
1,
|
|
207
|
+
1
|
|
208
|
+
],
|
|
209
|
+
"parent": "root"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"value": "Basic usage",
|
|
213
|
+
"href": "#basic-usage",
|
|
214
|
+
"depth": 3,
|
|
215
|
+
"numbering": [
|
|
216
|
+
1,
|
|
217
|
+
1,
|
|
218
|
+
2
|
|
219
|
+
],
|
|
220
|
+
"parent": "root"
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"value": "Working with date values",
|
|
224
|
+
"href": "#working-with-date-values",
|
|
225
|
+
"depth": 2,
|
|
226
|
+
"numbering": [
|
|
227
|
+
1,
|
|
228
|
+
2
|
|
229
|
+
],
|
|
230
|
+
"parent": "root"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"value": "Date value types",
|
|
234
|
+
"href": "#date-value-types",
|
|
235
|
+
"depth": 3,
|
|
236
|
+
"numbering": [
|
|
237
|
+
1,
|
|
238
|
+
2,
|
|
239
|
+
1
|
|
240
|
+
],
|
|
241
|
+
"parent": "root"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"value": "Creating date values",
|
|
245
|
+
"href": "#creating-date-values",
|
|
246
|
+
"depth": 3,
|
|
247
|
+
"numbering": [
|
|
248
|
+
1,
|
|
249
|
+
2,
|
|
250
|
+
2
|
|
251
|
+
],
|
|
252
|
+
"parent": "root"
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"value": "Converting to ISO strings",
|
|
256
|
+
"href": "#converting-to-iso-strings",
|
|
257
|
+
"depth": 3,
|
|
258
|
+
"numbering": [
|
|
259
|
+
1,
|
|
260
|
+
2,
|
|
261
|
+
3
|
|
262
|
+
],
|
|
263
|
+
"parent": "root"
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"value": "Date range structure",
|
|
267
|
+
"href": "#date-range-structure",
|
|
268
|
+
"depth": 3,
|
|
269
|
+
"numbering": [
|
|
270
|
+
1,
|
|
271
|
+
2,
|
|
272
|
+
4
|
|
273
|
+
],
|
|
274
|
+
"parent": "root"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"value": "Usage examples",
|
|
278
|
+
"href": "#usage-examples",
|
|
279
|
+
"depth": 2,
|
|
280
|
+
"numbering": [
|
|
281
|
+
1,
|
|
282
|
+
3
|
|
283
|
+
],
|
|
284
|
+
"parent": "root"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"value": "Multi-month display",
|
|
288
|
+
"href": "#multi-month-display",
|
|
289
|
+
"depth": 3,
|
|
290
|
+
"numbering": [
|
|
291
|
+
1,
|
|
292
|
+
3,
|
|
293
|
+
1
|
|
294
|
+
],
|
|
295
|
+
"parent": "root"
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"value": "Paging behavior",
|
|
299
|
+
"href": "#paging-behavior",
|
|
300
|
+
"depth": 3,
|
|
301
|
+
"numbering": [
|
|
302
|
+
1,
|
|
303
|
+
3,
|
|
304
|
+
2
|
|
305
|
+
],
|
|
306
|
+
"parent": "root"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"value": "Date constraints",
|
|
310
|
+
"href": "#date-constraints",
|
|
311
|
+
"depth": 3,
|
|
312
|
+
"numbering": [
|
|
313
|
+
1,
|
|
314
|
+
3,
|
|
315
|
+
3
|
|
316
|
+
],
|
|
317
|
+
"parent": "root"
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"value": "Unavailable dates",
|
|
321
|
+
"href": "#unavailable-dates",
|
|
322
|
+
"depth": 3,
|
|
323
|
+
"numbering": [
|
|
324
|
+
1,
|
|
325
|
+
3,
|
|
326
|
+
4
|
|
327
|
+
],
|
|
328
|
+
"parent": "root"
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
"value": "Non-contiguous ranges",
|
|
332
|
+
"href": "#non-contiguous-ranges",
|
|
333
|
+
"depth": 3,
|
|
334
|
+
"numbering": [
|
|
335
|
+
1,
|
|
336
|
+
3,
|
|
337
|
+
5
|
|
338
|
+
],
|
|
339
|
+
"parent": "root"
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"value": "Custom week start",
|
|
343
|
+
"href": "#custom-week-start",
|
|
344
|
+
"depth": 3,
|
|
345
|
+
"numbering": [
|
|
346
|
+
1,
|
|
347
|
+
3,
|
|
348
|
+
6
|
|
349
|
+
],
|
|
350
|
+
"parent": "root"
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"value": "Form states",
|
|
354
|
+
"href": "#form-states",
|
|
355
|
+
"depth": 3,
|
|
356
|
+
"numbering": [
|
|
357
|
+
1,
|
|
358
|
+
3,
|
|
359
|
+
7
|
|
360
|
+
],
|
|
361
|
+
"parent": "root"
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
"value": "Uncontrolled mode",
|
|
365
|
+
"href": "#uncontrolled-mode",
|
|
366
|
+
"depth": 3,
|
|
367
|
+
"numbering": [
|
|
368
|
+
1,
|
|
369
|
+
3,
|
|
370
|
+
8
|
|
371
|
+
],
|
|
372
|
+
"parent": "root"
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"value": "Controlled mode",
|
|
376
|
+
"href": "#controlled-mode",
|
|
377
|
+
"depth": 3,
|
|
378
|
+
"numbering": [
|
|
379
|
+
1,
|
|
380
|
+
3,
|
|
381
|
+
9
|
|
382
|
+
],
|
|
383
|
+
"parent": "root"
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
"value": "Internationalization",
|
|
387
|
+
"href": "#internationalization",
|
|
388
|
+
"depth": 3,
|
|
389
|
+
"numbering": [
|
|
390
|
+
1,
|
|
391
|
+
3,
|
|
392
|
+
10
|
|
393
|
+
],
|
|
394
|
+
"parent": "root"
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"value": "Component requirements",
|
|
398
|
+
"href": "#component-requirements",
|
|
399
|
+
"depth": 2,
|
|
400
|
+
"numbering": [
|
|
401
|
+
1,
|
|
402
|
+
4
|
|
403
|
+
],
|
|
404
|
+
"parent": "root"
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"value": "Date value types",
|
|
408
|
+
"href": "#date-value-types-1",
|
|
409
|
+
"depth": 3,
|
|
410
|
+
"numbering": [
|
|
411
|
+
1,
|
|
412
|
+
4,
|
|
413
|
+
1
|
|
414
|
+
],
|
|
415
|
+
"parent": "root"
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
"value": "Accessibility",
|
|
419
|
+
"href": "#accessibility",
|
|
420
|
+
"depth": 2,
|
|
421
|
+
"numbering": [
|
|
422
|
+
1,
|
|
423
|
+
5
|
|
424
|
+
],
|
|
425
|
+
"parent": "root"
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"value": "Keyboard navigation",
|
|
429
|
+
"href": "#keyboard-navigation",
|
|
430
|
+
"depth": 4,
|
|
431
|
+
"numbering": [
|
|
432
|
+
1,
|
|
433
|
+
5,
|
|
434
|
+
1,
|
|
435
|
+
1
|
|
436
|
+
],
|
|
437
|
+
"parent": "root"
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
"value": "API reference",
|
|
441
|
+
"href": "#api-reference",
|
|
442
|
+
"depth": 2,
|
|
443
|
+
"numbering": [
|
|
444
|
+
1,
|
|
445
|
+
6
|
|
446
|
+
],
|
|
447
|
+
"parent": "root"
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
"value": "Common patterns",
|
|
451
|
+
"href": "#common-patterns",
|
|
452
|
+
"depth": 2,
|
|
453
|
+
"numbering": [
|
|
454
|
+
1,
|
|
455
|
+
7
|
|
456
|
+
],
|
|
457
|
+
"parent": "root"
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
"value": "Booking period selection",
|
|
461
|
+
"href": "#booking-period-selection",
|
|
462
|
+
"depth": 3,
|
|
463
|
+
"numbering": [
|
|
464
|
+
1,
|
|
465
|
+
7,
|
|
466
|
+
1
|
|
467
|
+
],
|
|
468
|
+
"parent": "root"
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
"value": "Business days only selection",
|
|
472
|
+
"href": "#business-days-only-selection",
|
|
473
|
+
"depth": 3,
|
|
474
|
+
"numbering": [
|
|
475
|
+
1,
|
|
476
|
+
7,
|
|
477
|
+
2
|
|
478
|
+
],
|
|
479
|
+
"parent": "root"
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"value": "Testing your implementation",
|
|
483
|
+
"href": "#testing-your-implementation",
|
|
484
|
+
"depth": 2,
|
|
485
|
+
"numbering": [
|
|
486
|
+
1,
|
|
487
|
+
8
|
|
488
|
+
],
|
|
489
|
+
"parent": "root"
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
"value": "Basic Rendering Tests",
|
|
493
|
+
"href": "#basic-rendering-tests",
|
|
494
|
+
"depth": 3,
|
|
495
|
+
"numbering": [
|
|
496
|
+
1,
|
|
497
|
+
8,
|
|
498
|
+
1
|
|
499
|
+
],
|
|
500
|
+
"parent": "root"
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
"value": "Interaction Tests",
|
|
504
|
+
"href": "#interaction-tests",
|
|
505
|
+
"depth": 3,
|
|
506
|
+
"numbering": [
|
|
507
|
+
1,
|
|
508
|
+
8,
|
|
509
|
+
2
|
|
510
|
+
],
|
|
511
|
+
"parent": "root"
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
"value": "Testing Controlled Mode",
|
|
515
|
+
"href": "#testing-controlled-mode",
|
|
516
|
+
"depth": 3,
|
|
517
|
+
"numbering": [
|
|
518
|
+
1,
|
|
519
|
+
8,
|
|
520
|
+
3
|
|
521
|
+
],
|
|
522
|
+
"parent": "root"
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
"value": "Testing Component States",
|
|
526
|
+
"href": "#testing-component-states",
|
|
527
|
+
"depth": 3,
|
|
528
|
+
"numbering": [
|
|
529
|
+
1,
|
|
530
|
+
8,
|
|
531
|
+
4
|
|
532
|
+
],
|
|
533
|
+
"parent": "root"
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
"value": "Testing Date Constraints",
|
|
537
|
+
"href": "#testing-date-constraints",
|
|
538
|
+
"depth": 3,
|
|
539
|
+
"numbering": [
|
|
540
|
+
1,
|
|
541
|
+
8,
|
|
542
|
+
5
|
|
543
|
+
],
|
|
544
|
+
"parent": "root"
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"value": "Resources",
|
|
548
|
+
"href": "#resources",
|
|
549
|
+
"depth": 2,
|
|
550
|
+
"numbering": [
|
|
551
|
+
1,
|
|
552
|
+
9
|
|
553
|
+
],
|
|
554
|
+
"parent": "root"
|
|
555
|
+
}
|
|
556
|
+
]
|
|
557
|
+
},
|
|
558
|
+
"guidelines": {
|
|
559
|
+
"mdx": "\n## Guidelines\n\nCalendar guidelines focus on creating intuitive and accessible interfaces for\nviewing, navigating, and interacting with dates and events.\n\n### Best practices\n\n- **Clear visual hierarchy:** Distinguish between days, weeks, months, and\n years. Highlight the current date and any selected dates.\n- **Intuitive navigation:** Provide clear controls to move between different\n time periods (days, weeks, months, years).\n- **Easy date range selection:** For applications requiring date ranges, provide\n an intuitive way to select start and end dates, often with visual\n highlighting.\n- **Clear labels and instructions:** Provide clear labels for navigation\n controls and any interactive elements within the calendar.\n\n### Usage\n\nA calendar is used to visually display and manage time-based information,\nallowing users to view, schedule, and interact with dates. A common way this\ncomponent is used is within the popover, and paired with the date input.\n\n> [!TIP]\\\n> When to use\n\n- **Scheduling:** When users need to select specific dates.\n- **Visualizing time-based data:** To display data or to filter data in a\n corresponding visual.\n- **Date range selection:** When users need to select a start and end date for a\n period.\n- **Browsing dates:** When users need to navigate through different days, weeks,\n or months to find a specific date.\n- **Contextual awareness of dates:** When the day of the week or the\n relationship between dates is important for decision-making.\n- **Recurring events:** To allow users to set up and manage events that repeat\n on a regular basis.\n\n### Keeping interactions simple\n\nSimple calendar interactions are vital because they minimize user effort and\ncognitive load, allowing for quick and efficient time management, the calendar's\nprimary function.\n\n> [!TIP]\\\n> **Do**\n>\n> - Provide clear navigation. Make it easy to move between days, weeks, months,\n> and years using intuitive controls (arrows, drop downs).\n> - Enable easy date range selection. If your application requires date ranges,\n> make the selection process straightforward (e.g., click start, click end).\n> - Consider time zones (if applicable). If your application deals with users in\n> different time zones, handle and display times accordingly.\n> - Ensure navigation controls are clearly labeled and their function is\n> obvious.\n\n```jsx live\nconst App = () => (\n <RangeCalendar\n defaultValue={{\n start: new CalendarDate(2025, 5, 2),\n end: new CalendarDate(2025, 5, 11),\n }}\n />\n);\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't over clutter. Avoid displaying too much information on the calendar\n> grid at once, which can make it overwhelming.\n> - Don't make navigation confusing. Ensure navigation controls are clearly\n> labeled and their function is obvious.\n> - Don't use it for simple date input. If users know the exact date, a direct\n> date input field might be more efficient.\n> - Don't auto-submit on date selection. Avoid automatically submitting forms or\n> triggering actions immediately after a date is selected.\n\n\n",
|
|
560
|
+
"toc": [
|
|
561
|
+
{
|
|
562
|
+
"value": "Guidelines",
|
|
563
|
+
"href": "#guidelines",
|
|
564
|
+
"depth": 2,
|
|
565
|
+
"numbering": [
|
|
566
|
+
1,
|
|
567
|
+
1
|
|
568
|
+
],
|
|
569
|
+
"parent": "root"
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
"value": "Best practices",
|
|
573
|
+
"href": "#best-practices",
|
|
574
|
+
"depth": 3,
|
|
575
|
+
"numbering": [
|
|
576
|
+
1,
|
|
577
|
+
1,
|
|
578
|
+
1
|
|
579
|
+
],
|
|
580
|
+
"parent": "root"
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
"value": "Usage",
|
|
584
|
+
"href": "#usage",
|
|
585
|
+
"depth": 3,
|
|
586
|
+
"numbering": [
|
|
587
|
+
1,
|
|
588
|
+
1,
|
|
589
|
+
2
|
|
590
|
+
],
|
|
591
|
+
"parent": "root"
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
"value": "Keeping interactions simple",
|
|
595
|
+
"href": "#keeping-interactions-simple",
|
|
596
|
+
"depth": 3,
|
|
597
|
+
"numbering": [
|
|
598
|
+
1,
|
|
599
|
+
1,
|
|
600
|
+
3
|
|
601
|
+
],
|
|
602
|
+
"parent": "root"
|
|
603
|
+
}
|
|
604
|
+
]
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|