@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3
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/CHANGELOG.md +161 -1
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +45 -20
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +8 -4
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
- package/dist/Banner/Banner.d.ts +49 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +62 -20
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -6
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +7 -3
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +21 -23
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Calendar/styles.d.ts +5 -14
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -15
- package/dist/Card/Card.d.ts +12 -12
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +17 -9
- package/dist/Card/index.d.ts +35 -1
- package/dist/Card/index.d.ts.map +1 -1
- package/dist/Card/index.js +21 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -3
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +494 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +82 -23
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateInput/nativeDateSegments.d.ts +22 -0
- package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
- package/dist/DateInput/nativeDateSegments.js +111 -0
- package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +21 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +110 -58
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -13
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/Field/InputClearButton.d.ts +9 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +14 -3
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -3
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +19 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -19
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/gestureCounter.d.ts +8 -0
- package/dist/Layer/gestureCounter.d.ts.map +1 -0
- package/dist/Layer/gestureCounter.js +53 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayer.d.ts +23 -13
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +128 -8
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/List/List.d.ts +1 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +15 -4
- package/dist/Markdown/Markdown.d.ts +1 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +20 -7
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +182 -32
- package/dist/MetadataList/MetadataListItem.d.ts +1 -1
- package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
- package/dist/MetadataList/MetadataListItem.js +4 -1
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +32 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +73 -15
- package/dist/MultiSelector/hooks.d.ts +7 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +3 -2
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +9 -5
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +54 -104
- package/dist/NumberInput/numberInputCommit.d.ts +34 -0
- package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
- package/dist/NumberInput/numberInputCommit.js +71 -0
- package/dist/NumberInput/numberParser.d.ts +64 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +350 -0
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +1 -9
- package/dist/Popover/usePopover.d.ts +7 -41
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +40 -21
- package/dist/PowerSearch/PowerSearch.d.ts +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +12 -3
- package/dist/Selector/Selector.d.ts +18 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +91 -18
- package/dist/Selector/hooks.d.ts +7 -1
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +3 -2
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +37 -5
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +43 -5
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -3
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -10
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +15 -21
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +22 -7
- package/dist/Toast/ToastViewport.d.ts +1 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +71 -18
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -9
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +7 -4
- package/dist/Tokenizer/Tokenizer.d.ts +14 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +33 -21
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +31 -11
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +22 -7
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +7 -2
- package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +119 -37
- package/dist/Typeahead/Typeahead.d.ts +8 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +5 -2
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +7 -2
- package/dist/astryx.css +113 -11
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +46 -10
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/generateThemeRules.d.ts +21 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +26 -0
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/af-ZA.json +6 -6
- package/locales/ar-SA.json +6 -6
- package/locales/ca-ES.json +5 -5
- package/locales/cs-CZ.json +6 -6
- package/locales/da-DK.json +6 -6
- package/locales/de-DE.json +6 -6
- package/locales/el-GR.json +6 -6
- package/locales/en.json +163 -11
- package/locales/es-ES.json +5 -5
- package/locales/fi-FI.json +6 -6
- package/locales/fr-FR.json +6 -6
- package/locales/he-IL.json +6 -6
- package/locales/hu-HU.json +6 -6
- package/locales/it-IT.json +6 -6
- package/locales/ja-JP.json +6 -6
- package/locales/ko-KR.json +6 -6
- package/locales/nl-NL.json +6 -6
- package/locales/no-NO.json +6 -6
- package/locales/pl-PL.json +6 -6
- package/locales/pseudo.json +114 -0
- package/locales/pt-BR.json +6 -6
- package/locales/pt-PT.json +6 -6
- package/locales/ro-RO.json +6 -6
- package/locales/ru-RU.json +6 -6
- package/locales/sr-SP.json +6 -6
- package/locales/sv-SE.json +6 -6
- package/locales/tr-TR.json +6 -6
- package/locales/uk-UA.json +6 -6
- package/locales/vi-VN.json +6 -6
- package/locales/zh-CN.json +6 -6
- package/locales/zh-TW.json +6 -6
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
- package/src/AlertDialog/AlertDialog.test.tsx +211 -2
- package/src/AlertDialog/AlertDialog.tsx +62 -20
- package/src/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +22 -11
- package/src/Banner/Banner.test.tsx +177 -25
- package/src/Banner/Banner.tsx +93 -27
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +24 -1
- package/src/Button/Button.test.tsx +32 -4
- package/src/Button/Button.tsx +12 -5
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +7 -6
- package/src/Calendar/Calendar.test.tsx +143 -0
- package/src/Calendar/Calendar.tsx +30 -26
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Calendar/styles.ts +49 -31
- package/src/Card/Card.doc.mjs +10 -7
- package/src/Card/Card.test.tsx +113 -19
- package/src/Card/Card.tsx +67 -89
- package/src/Card/index.ts +36 -1
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
- package/src/ComplexSelector/ComplexSelector.tsx +1 -3
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +108 -24
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
- package/src/DateRangeInput/DateRangeInput.tsx +4 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +429 -2
- package/src/Dialog/Dialog.tsx +133 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
- package/src/DropdownMenu/DropdownMenu.tsx +4 -13
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/Field/InputClearButton.test.tsx +15 -1
- package/src/Field/InputClearButton.tsx +28 -4
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -3
- package/src/HoverCard/HoverCard.doc.mjs +13 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +143 -3
- package/src/HoverCard/useHoverCard.tsx +104 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/gestureCounter.ts +57 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayer.test.tsx +324 -15
- package/src/Layer/useLayer.tsx +164 -8
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/List/List.test.tsx +38 -0
- package/src/List/List.tsx +8 -1
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.test.tsx +37 -0
- package/src/Markdown/Markdown.tsx +16 -5
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +178 -2
- package/src/Markdown/parser.ts +253 -32
- package/src/MetadataList/MetadataList.test.tsx +75 -2
- package/src/MetadataList/MetadataListItem.tsx +5 -2
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
- package/src/MultiSelector/MultiSelector.test.tsx +311 -0
- package/src/MultiSelector/MultiSelector.tsx +151 -15
- package/src/MultiSelector/hooks.ts +9 -2
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
- package/src/NavMenu/NavHeadingMenu.tsx +9 -5
- package/src/NumberInput/NumberInput.doc.mjs +31 -7
- package/src/NumberInput/NumberInput.test.tsx +436 -8
- package/src/NumberInput/NumberInput.tsx +62 -114
- package/src/NumberInput/numberInputCommit.test.ts +72 -0
- package/src/NumberInput/numberInputCommit.ts +103 -0
- package/src/NumberInput/numberParser.docblock.test.ts +234 -0
- package/src/NumberInput/numberParser.test.ts +222 -0
- package/src/NumberInput/numberParser.ts +403 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/Popover.test.tsx +14 -0
- package/src/Popover/Popover.tsx +1 -9
- package/src/Popover/usePopover.tsx +57 -32
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- package/src/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
- package/src/SelectableCard/SelectableCard.tsx +19 -2
- package/src/Selector/Selector.doc.mjs +26 -1
- package/src/Selector/Selector.test.tsx +346 -1
- package/src/Selector/Selector.tsx +148 -21
- package/src/Selector/hooks.ts +17 -2
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +55 -3
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- package/src/Stepper/Step.doc.mjs +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
- package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +67 -1
- package/src/Text/Text.tsx +6 -3
- package/src/TextArea/TextArea.doc.mjs +12 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +37 -24
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.test.tsx +58 -0
- package/src/Timestamp/Timestamp.tsx +12 -10
- package/src/Toast/Toast.doc.mjs +26 -12
- package/src/Toast/Toast.tsx +28 -4
- package/src/Toast/ToastViewport.test.tsx +536 -8
- package/src/Toast/ToastViewport.tsx +81 -12
- package/src/Token/Token.test.tsx +95 -0
- package/src/Token/Token.tsx +15 -10
- package/src/Token/TokenLink.tsx +14 -5
- package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
- package/src/Tokenizer/Tokenizer.test.tsx +161 -0
- package/src/Tokenizer/Tokenizer.tsx +53 -24
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
- package/src/TopNav/TopNavMegaMenu.tsx +47 -5
- package/src/TopNav/TopNavMenu.test.tsx +133 -1
- package/src/TopNav/TopNavMenu.tsx +38 -7
- package/src/TreeList/TreeList.test.tsx +49 -0
- package/src/TreeList/TreeList.tsx +7 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
- package/src/Typeahead/BaseTypeahead.tsx +181 -39
- package/src/Typeahead/Typeahead.doc.mjs +11 -0
- package/src/Typeahead/Typeahead.test.tsx +203 -0
- package/src/Typeahead/Typeahead.tsx +12 -2
- package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
- package/src/Typeahead/TypeaheadItem.tsx +8 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useAnnounce.doc.mjs +96 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useDevWarning.doc.mjs +96 -0
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
- package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
- package/src/hooks/useInteractiveRole.doc.mjs +119 -0
- package/src/hooks/useLongPress.doc.mjs +123 -0
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/hooks/useTypeahead.doc.mjs +153 -0
- package/src/index.ts +1 -0
- package/src/raw-import.d.ts +14 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/Theme.test.tsx +104 -2
- package/src/theme/Theme.tsx +49 -14
- package/src/theme/defineTheme.test.ts +23 -0
- package/src/theme/derivedVarRegistry.test.ts +26 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +99 -1
- package/src/theme/generateThemeRules.ts +28 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
|
@@ -13,6 +13,10 @@ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
|
13
13
|
import {act, render, screen, within, waitFor} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {getButton} from '../__tests__/fastRoleQueries';
|
|
16
|
+
import {
|
|
17
|
+
getForcedColorsRules,
|
|
18
|
+
getAllInjectedCss,
|
|
19
|
+
} from '../__tests__/forcedColors';
|
|
16
20
|
import * as stylex from '@stylexjs/stylex';
|
|
17
21
|
import {Calendar} from './Calendar';
|
|
18
22
|
import type {CalendarHandle} from './Calendar';
|
|
@@ -263,6 +267,58 @@ describe('Calendar', () => {
|
|
|
263
267
|
expect(day15).not.toBeDisabled();
|
|
264
268
|
});
|
|
265
269
|
|
|
270
|
+
// ─── Initial Visible Month ───────────────────────────────────
|
|
271
|
+
|
|
272
|
+
describe('opens on a month inside the min/max window', () => {
|
|
273
|
+
beforeEach(() => {
|
|
274
|
+
vi.useFakeTimers({toFake: ['Date']});
|
|
275
|
+
vi.setSystemTime(new Date(2026, 7, 21, 12, 0, 0));
|
|
276
|
+
});
|
|
277
|
+
afterEach(() => {
|
|
278
|
+
vi.useRealTimers();
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it('opens on today when today is inside the window', () => {
|
|
282
|
+
render(<Calendar min="2026-01-01" max="2026-12-31" />);
|
|
283
|
+
|
|
284
|
+
expect(screen.getByText('August 2026')).toBeInTheDocument();
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it('opens on min when the window is entirely in the future', () => {
|
|
288
|
+
render(<Calendar min="2027-03-04" max="2027-06-30" />);
|
|
289
|
+
|
|
290
|
+
expect(screen.getByText('March 2027')).toBeInTheDocument();
|
|
291
|
+
expect(getDayButton(4, 'March', 2027)).not.toBeDisabled();
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it('opens on max when the window is entirely in the past', () => {
|
|
295
|
+
render(<Calendar min="2019-01-01" max="2019-04-30" />);
|
|
296
|
+
|
|
297
|
+
expect(screen.getByText('April 2019')).toBeInTheDocument();
|
|
298
|
+
expect(getDayButton(30, 'April', 2019)).not.toBeDisabled();
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
it('keeps max in the last pane in the two-month layout', () => {
|
|
302
|
+
render(<Calendar numberOfMonths={2} min="2019-01-01" max="2019-04-30" />);
|
|
303
|
+
|
|
304
|
+
expect(screen.getByText('March 2019 – April 2019')).toBeInTheDocument();
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it('still honors an explicit focusDate outside the window', () => {
|
|
308
|
+
render(
|
|
309
|
+
<Calendar focusDate="2026-01-01" min="2027-03-04" max="2027-06-30" />,
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it('still opens on the selected value outside the window', () => {
|
|
316
|
+
render(<Calendar defaultValue="2031-07-04" min="2019-01-01" />);
|
|
317
|
+
|
|
318
|
+
expect(screen.getByText('July 2031')).toBeInTheDocument();
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
|
|
266
322
|
it('respects custom dateConstraints', () => {
|
|
267
323
|
// Only allow weekdays
|
|
268
324
|
const isWeekday = (date: Date) => {
|
|
@@ -311,6 +367,46 @@ describe('Calendar', () => {
|
|
|
311
367
|
expect(getDayButton(9)).toBeDisabled(); // 2-day span — too short
|
|
312
368
|
});
|
|
313
369
|
|
|
370
|
+
it('commits a same-day range with the default minimum', async () => {
|
|
371
|
+
const user = userEvent.setup();
|
|
372
|
+
const handleChange = vi.fn();
|
|
373
|
+
|
|
374
|
+
render(
|
|
375
|
+
<Calendar mode="range" focusDate="2026-01-01" onChange={handleChange} />,
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
await user.click(getDayButton(10));
|
|
379
|
+
await user.click(getDayButton(10));
|
|
380
|
+
|
|
381
|
+
expect(handleChange).toHaveBeenCalledWith({
|
|
382
|
+
start: '2026-01-10',
|
|
383
|
+
end: '2026-01-10',
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
it('commits a same-day range when the minimum permits it, including with a maximum', async () => {
|
|
388
|
+
const user = userEvent.setup();
|
|
389
|
+
const handleChange = vi.fn();
|
|
390
|
+
|
|
391
|
+
render(
|
|
392
|
+
<Calendar
|
|
393
|
+
mode="range"
|
|
394
|
+
focusDate="2026-01-01"
|
|
395
|
+
onChange={handleChange}
|
|
396
|
+
minRangeSpan={1}
|
|
397
|
+
maxRangeSpan={7}
|
|
398
|
+
/>,
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
await user.click(getDayButton(10));
|
|
402
|
+
await user.click(getDayButton(10));
|
|
403
|
+
|
|
404
|
+
expect(handleChange).toHaveBeenCalledWith({
|
|
405
|
+
start: '2026-01-10',
|
|
406
|
+
end: '2026-01-10',
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
|
|
314
410
|
it('clears the in-progress start when the anchor is clicked again', async () => {
|
|
315
411
|
const user = userEvent.setup();
|
|
316
412
|
const handleChange = vi.fn();
|
|
@@ -337,6 +433,33 @@ describe('Calendar', () => {
|
|
|
337
433
|
expect(getDayButton(9)).not.toBeDisabled();
|
|
338
434
|
});
|
|
339
435
|
|
|
436
|
+
it('announces the cleared range in the provider locale', async () => {
|
|
437
|
+
const user = userEvent.setup();
|
|
438
|
+
|
|
439
|
+
render(
|
|
440
|
+
<InternationalizationProvider locale="ja-JP">
|
|
441
|
+
<Calendar mode="range" focusDate="2026-01-01" />
|
|
442
|
+
</InternationalizationProvider>,
|
|
443
|
+
);
|
|
444
|
+
|
|
445
|
+
// The day button's own accessible name is already localized through the
|
|
446
|
+
// provider. The announcement has to use the same date string: formatting
|
|
447
|
+
// it without the locale silently falls back to the host locale, so a
|
|
448
|
+
// Japanese user hears an English date.
|
|
449
|
+
const anchor = document.querySelector<HTMLButtonElement>(
|
|
450
|
+
'button[data-date="2026-01-10"]',
|
|
451
|
+
);
|
|
452
|
+
const localizedDate = anchor?.getAttribute('aria-label');
|
|
453
|
+
expect(localizedDate).toBeTruthy();
|
|
454
|
+
|
|
455
|
+
await user.click(anchor as HTMLButtonElement);
|
|
456
|
+
await user.click(anchor as HTMLButtonElement);
|
|
457
|
+
|
|
458
|
+
await waitFor(() => {
|
|
459
|
+
expect(politeRegion()?.textContent).toContain(localizedDate);
|
|
460
|
+
});
|
|
461
|
+
});
|
|
462
|
+
|
|
340
463
|
it('does not apply range-span constraints in single mode', async () => {
|
|
341
464
|
const user = userEvent.setup();
|
|
342
465
|
|
|
@@ -1378,3 +1501,23 @@ describe('Calendar', () => {
|
|
|
1378
1501
|
});
|
|
1379
1502
|
});
|
|
1380
1503
|
});
|
|
1504
|
+
|
|
1505
|
+
// jsdom cannot emulate forced-colors rendering, so this asserts that the
|
|
1506
|
+
// compiled output includes the forced-colors rules; visual behavior needs
|
|
1507
|
+
// manual verification under Windows High Contrast.
|
|
1508
|
+
describe('forced colors (WCAG 1.4.11)', () => {
|
|
1509
|
+
it('compiles a forced-colors fill so the selected date survives Windows High Contrast', () => {
|
|
1510
|
+
render(
|
|
1511
|
+
<Calendar mode="single" value="2026-01-15" focusDate="2026-01-01" />,
|
|
1512
|
+
);
|
|
1513
|
+
|
|
1514
|
+
const css = getForcedColorsRules();
|
|
1515
|
+
// Without these the accent fill is stripped and the selected date renders
|
|
1516
|
+
// identically to every other day in the month.
|
|
1517
|
+
expect(css).toContain('background-color: highlight;');
|
|
1518
|
+
expect(css).toContain('color: highlighttext;');
|
|
1519
|
+
// A <button> keeps the native ButtonFace surface and ignores the authored
|
|
1520
|
+
// Highlight fill unless it opts out of UA remapping.
|
|
1521
|
+
expect(getAllInjectedCss()).toContain('forced-color-adjust: none;');
|
|
1522
|
+
});
|
|
1523
|
+
});
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* SYNC: When modified, update these files to stay in sync:
|
|
13
13
|
* - /packages/core/src/Calendar/Calendar.doc.mjs (props table, features, implementation notes)
|
|
14
|
+
* - /packages/core/src/Calendar/getInitialFocusDate.ts (which month the calendar opens on)
|
|
14
15
|
* - /packages/core/src/Calendar/Calendar.test.tsx (tests for new/changed behavior)
|
|
15
16
|
* - /packages/core/src/Calendar/index.ts (exports if types change)
|
|
16
17
|
* - /apps/storybook/stories/Calendar.stories.tsx (storybook stories)
|
|
@@ -60,6 +61,7 @@ import {
|
|
|
60
61
|
} from '../utils/plainDate';
|
|
61
62
|
import {mergeProps, composeEventHandlers, rtlStyles} from '../utils';
|
|
62
63
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
64
|
+
import {getInitialFocusDate} from './getInitialFocusDate';
|
|
63
65
|
import {
|
|
64
66
|
computeDayCellState,
|
|
65
67
|
computeRangeRounding,
|
|
@@ -135,14 +137,18 @@ interface CalendarBaseProps extends Omit<
|
|
|
135
137
|
* Range mode only. Minimum number of days a selected range must span,
|
|
136
138
|
* counting both endpoints — `minRangeSpan={2}` forbids a single-day range.
|
|
137
139
|
* Once a start date is picked, days closer than this to it are disabled —
|
|
138
|
-
* except the start itself, which stays selectable
|
|
139
|
-
*
|
|
140
|
+
* except the start itself, which stays selectable. Clicking the start again
|
|
141
|
+
* commits a one-day range when the minimum allows it; otherwise it cancels
|
|
142
|
+
* the in-progress selection so the start can be moved. Defaults to 1 (a
|
|
143
|
+
* same-day start and end is allowed).
|
|
140
144
|
*/
|
|
141
145
|
minRangeSpan?: number;
|
|
142
146
|
|
|
143
147
|
/**
|
|
144
148
|
* Controlled focus date (which month is visible).
|
|
145
|
-
* If not provided, defaults to selected date
|
|
149
|
+
* If not provided, defaults to the selected date, else today clamped into
|
|
150
|
+
* the `min`/`max` window (so a window that excludes today opens on the
|
|
151
|
+
* bound nearest to it, not on an all-disabled month).
|
|
146
152
|
*/
|
|
147
153
|
focusDate?: ISODateString;
|
|
148
154
|
|
|
@@ -277,20 +283,19 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
277
283
|
// Determine effective value
|
|
278
284
|
const effectiveValue = value !== undefined ? value : internalValue;
|
|
279
285
|
|
|
280
|
-
// Focus date state (which month is visible)
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
});
|
|
286
|
+
// Focus date state (which month is visible). Falls back to today, clamped
|
|
287
|
+
// into the min/max window so a window that doesn't contain today doesn't
|
|
288
|
+
// open on an all-disabled month.
|
|
289
|
+
const [internalFocusDate, setInternalFocusDate] = useState<PlainDate>(() =>
|
|
290
|
+
getInitialFocusDate({
|
|
291
|
+
focusDate: focusDateProp,
|
|
292
|
+
value: effectiveValue,
|
|
293
|
+
min,
|
|
294
|
+
max,
|
|
295
|
+
numberOfMonths,
|
|
296
|
+
today,
|
|
297
|
+
}),
|
|
298
|
+
);
|
|
294
299
|
|
|
295
300
|
// Use controlled focusDate if callback is provided, otherwise use internal state
|
|
296
301
|
const isControlledFocus =
|
|
@@ -449,17 +454,16 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
449
454
|
// Second click - complete the range
|
|
450
455
|
const startPd = plainDateFromISO(rangeSelectionStart);
|
|
451
456
|
|
|
452
|
-
// Clicking the anchor again
|
|
453
|
-
//
|
|
454
|
-
//
|
|
455
|
-
//
|
|
456
|
-
//
|
|
457
|
-
|
|
458
|
-
if (plainDateIsEqual(date, startPd)) {
|
|
457
|
+
// Clicking the anchor again commits a one-day range when the minimum
|
|
458
|
+
// span allows it. For longer minimum spans, the repeated click clears
|
|
459
|
+
// the in-progress start instead: the anchor is the only nearby day
|
|
460
|
+
// that remains enabled, so this preserves an escape hatch for moving
|
|
461
|
+
// the start without violating the configured minimum.
|
|
462
|
+
if (plainDateIsEqual(date, startPd) && (minRangeSpan ?? 1) > 1) {
|
|
459
463
|
setRangeSelectionStart(null);
|
|
460
464
|
announce(
|
|
461
465
|
t('@astryx.calendar.rangeClearedAnnounce', {
|
|
462
|
-
date: plainDateFormat(date, DATE_FORMAT_WITH_WEEKDAY),
|
|
466
|
+
date: plainDateFormat(date, DATE_FORMAT_WITH_WEEKDAY, locale),
|
|
463
467
|
}),
|
|
464
468
|
);
|
|
465
469
|
return;
|
|
@@ -500,7 +504,7 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
500
504
|
}
|
|
501
505
|
}
|
|
502
506
|
},
|
|
503
|
-
[mode, onChange, rangeSelectionStart, announce, t, locale],
|
|
507
|
+
[mode, onChange, rangeSelectionStart, minRangeSpan, announce, t, locale],
|
|
504
508
|
);
|
|
505
509
|
|
|
506
510
|
return (
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file getInitialFocusDate.test.ts
|
|
5
|
+
* @input Uses vitest
|
|
6
|
+
* @output Test suite for getInitialFocusDate
|
|
7
|
+
* @position Tests for getInitialFocusDate.ts
|
|
8
|
+
*
|
|
9
|
+
* SYNC: When getInitialFocusDate.ts changes, update tests accordingly
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {describe, it, expect} from 'vitest';
|
|
13
|
+
import {getInitialFocusDate} from './getInitialFocusDate';
|
|
14
|
+
import {plainDateFromISO, plainDateToISO} from '../utils/plainDate';
|
|
15
|
+
|
|
16
|
+
const TODAY = plainDateFromISO('2026-08-21');
|
|
17
|
+
|
|
18
|
+
function focusISO(options: Partial<Parameters<typeof getInitialFocusDate>[0]>) {
|
|
19
|
+
return plainDateToISO(
|
|
20
|
+
getInitialFocusDate({numberOfMonths: 1, today: TODAY, ...options}),
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
describe('getInitialFocusDate', () => {
|
|
25
|
+
it('opens on today when there are no bounds', () => {
|
|
26
|
+
expect(focusISO({})).toBe('2026-08-21');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('opens on today when today is inside the min/max window', () => {
|
|
30
|
+
expect(focusISO({min: '2026-01-01', max: '2026-12-31'})).toBe('2026-08-21');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('treats the bounds as inclusive', () => {
|
|
34
|
+
expect(focusISO({min: '2026-08-21'})).toBe('2026-08-21');
|
|
35
|
+
expect(focusISO({max: '2026-08-21'})).toBe('2026-08-21');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('opens on min when the whole window is in the future', () => {
|
|
39
|
+
expect(focusISO({min: '2027-03-04', max: '2027-06-30'})).toBe('2027-03-04');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('opens on max when the whole window is in the past', () => {
|
|
43
|
+
expect(focusISO({min: '2019-01-01', max: '2019-04-30'})).toBe('2019-04-01');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('clamps against a one-sided min', () => {
|
|
47
|
+
expect(focusISO({min: '2030-05-17'})).toBe('2030-05-17');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('clamps against a one-sided max', () => {
|
|
51
|
+
expect(focusISO({max: '2020-02-09'})).toBe('2020-02-01');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('lands max in the last pane in the two-month layout', () => {
|
|
55
|
+
// Opening on max's month would spend the second pane entirely
|
|
56
|
+
// out of bounds, so the window's end sits on the right instead.
|
|
57
|
+
expect(focusISO({max: '2020-02-09', numberOfMonths: 2})).toBe('2020-01-01');
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('does not shift the two-month layout back past min', () => {
|
|
61
|
+
expect(
|
|
62
|
+
focusISO({min: '2020-02-03', max: '2020-02-09', numberOfMonths: 2}),
|
|
63
|
+
).toBe('2020-02-03');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('prefers the selected value over the bounds', () => {
|
|
67
|
+
expect(focusISO({value: '2031-07-04', min: '2019-01-01'})).toBe(
|
|
68
|
+
'2031-07-04',
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('uses a range value start as the visible month', () => {
|
|
73
|
+
expect(focusISO({value: {start: '2019-03-08', end: '2019-03-19'}})).toBe(
|
|
74
|
+
'2019-03-08',
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('prefers an explicit focusDate over everything else', () => {
|
|
79
|
+
expect(
|
|
80
|
+
focusISO({
|
|
81
|
+
focusDate: '2015-11-02',
|
|
82
|
+
value: '2031-07-04',
|
|
83
|
+
min: '2026-01-01',
|
|
84
|
+
max: '2026-12-31',
|
|
85
|
+
}),
|
|
86
|
+
).toBe('2015-11-02');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('prefers min when the bounds are inverted', () => {
|
|
90
|
+
// Degenerate input (min after max) — resolve it deterministically
|
|
91
|
+
// rather than reading the second bound off a contradiction.
|
|
92
|
+
expect(focusISO({min: '2027-01-01', max: '2020-01-01'})).toBe('2027-01-01');
|
|
93
|
+
});
|
|
94
|
+
});
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file getInitialFocusDate.ts
|
|
5
|
+
* @input PlainDate utilities, min/max bounds, today
|
|
6
|
+
* @output Exports getInitialFocusDate — the month Calendar opens on
|
|
7
|
+
* @position Calendar-specific helper; used by Calendar.tsx
|
|
8
|
+
*
|
|
9
|
+
* SYNC: When modified, update:
|
|
10
|
+
* - /packages/core/src/Calendar/getInitialFocusDate.test.ts
|
|
11
|
+
* - /packages/core/src/Calendar/Calendar.tsx (the only caller)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type {ISODateString, DateRange} from '../utils/dateTypes';
|
|
15
|
+
import {
|
|
16
|
+
type PlainDate,
|
|
17
|
+
plainDateFromISO,
|
|
18
|
+
plainDateSetFirstOfMonth,
|
|
19
|
+
plainDateAddMonths,
|
|
20
|
+
plainDateIsBefore,
|
|
21
|
+
plainDateIsAfter,
|
|
22
|
+
} from '../utils/plainDate';
|
|
23
|
+
|
|
24
|
+
export interface InitialFocusDateOptions {
|
|
25
|
+
/** Controlled visible month, if the consumer supplied one. */
|
|
26
|
+
focusDate?: ISODateString;
|
|
27
|
+
/** Selected value (single date or range), controlled or uncontrolled. */
|
|
28
|
+
value?: ISODateString | DateRange;
|
|
29
|
+
/** Earliest selectable date. */
|
|
30
|
+
min?: ISODateString;
|
|
31
|
+
/** Latest selectable date. */
|
|
32
|
+
max?: ISODateString;
|
|
33
|
+
/** How many month panes the calendar renders (1 or 2). */
|
|
34
|
+
numberOfMonths: number;
|
|
35
|
+
/** Today, injected so the caller keeps a single memoized source of "now". */
|
|
36
|
+
today: PlainDate;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Picks the date whose month the calendar opens on.
|
|
41
|
+
*
|
|
42
|
+
* An explicit `focusDate` wins, then the selected value — both are the
|
|
43
|
+
* consumer's own instruction about where to look, so neither is second-guessed
|
|
44
|
+
* against `min`/`max`.
|
|
45
|
+
*
|
|
46
|
+
* Otherwise the calendar opens on today, clamped into the `min`/`max` window.
|
|
47
|
+
* Without the clamp a window that doesn't contain today (a 2019 audit range, a
|
|
48
|
+
* booking window opening next spring) opened on today's month with every day
|
|
49
|
+
* disabled, leaving prev/next clicking as the only way in.
|
|
50
|
+
*
|
|
51
|
+
* When clamping forward to `min`, that month leads: the whole selectable window
|
|
52
|
+
* runs ahead of it. When clamping back to `max`, the last pane lands on `max`'s
|
|
53
|
+
* month instead — with `numberOfMonths={2}` opening on `[max, max + 1]` would
|
|
54
|
+
* spend half the calendar on a month that is entirely out of bounds. That
|
|
55
|
+
* shift never crosses `min`'s month.
|
|
56
|
+
*/
|
|
57
|
+
export function getInitialFocusDate(
|
|
58
|
+
options: InitialFocusDateOptions,
|
|
59
|
+
): PlainDate {
|
|
60
|
+
const {focusDate, value, min, max, numberOfMonths, today} = options;
|
|
61
|
+
|
|
62
|
+
if (focusDate) {
|
|
63
|
+
return plainDateFromISO(focusDate);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (value) {
|
|
67
|
+
return plainDateFromISO(typeof value === 'string' ? value : value.start);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const minDate = min ? plainDateFromISO(min) : null;
|
|
71
|
+
const maxDate = max ? plainDateFromISO(max) : null;
|
|
72
|
+
|
|
73
|
+
if (minDate && plainDateIsBefore(today, minDate)) {
|
|
74
|
+
return minDate;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (maxDate && plainDateIsAfter(today, maxDate)) {
|
|
78
|
+
const lastPaneOffset = Math.max(0, numberOfMonths - 1);
|
|
79
|
+
const shifted = plainDateAddMonths(
|
|
80
|
+
plainDateSetFirstOfMonth(maxDate),
|
|
81
|
+
-lastPaneOffset,
|
|
82
|
+
);
|
|
83
|
+
if (
|
|
84
|
+
minDate &&
|
|
85
|
+
plainDateIsBefore(shifted, plainDateSetFirstOfMonth(minDate))
|
|
86
|
+
) {
|
|
87
|
+
return minDate;
|
|
88
|
+
}
|
|
89
|
+
return shifted;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return today;
|
|
93
|
+
}
|
package/src/Calendar/styles.ts
CHANGED
|
@@ -51,19 +51,12 @@ export const calendarStyles = stylex.create({
|
|
|
51
51
|
},
|
|
52
52
|
monthsContainer: {
|
|
53
53
|
display: 'flex',
|
|
54
|
+
// Wraps rather than overflowing: two months side by side need ~488px, so
|
|
55
|
+
// an unwrapped row scrolls the document sideways below that and puts the
|
|
56
|
+
// next-month button off-viewport (WCAG 1.4.10). Above 488px nothing moves.
|
|
57
|
+
flexWrap: 'wrap',
|
|
54
58
|
gap: spacingVars['--spacing-4'],
|
|
55
59
|
},
|
|
56
|
-
srOnly: {
|
|
57
|
-
position: 'absolute',
|
|
58
|
-
width: '1px',
|
|
59
|
-
height: '1px',
|
|
60
|
-
padding: 0,
|
|
61
|
-
margin: '-1px',
|
|
62
|
-
overflow: 'hidden',
|
|
63
|
-
clip: 'rect(0, 0, 0, 0)',
|
|
64
|
-
whiteSpace: 'nowrap',
|
|
65
|
-
borderWidth: 0,
|
|
66
|
-
},
|
|
67
60
|
/**
|
|
68
61
|
* Wrapper for the month nav chevrons. RTL mirroring is applied by
|
|
69
62
|
* composing the shared `rtlStyles.mirror` transform onto this wrapper
|
|
@@ -123,6 +116,17 @@ export const monthGridStyles = stylex.create({
|
|
|
123
116
|
// Day Cell Styles - Structural (layout, sizing, positioning)
|
|
124
117
|
// =============================================================================
|
|
125
118
|
|
|
119
|
+
// Half the gap between the day button and its cell — (--size-element-md minus
|
|
120
|
+
// --size-element-sm) / 2 — so the band's rounded caps line up with the button
|
|
121
|
+
// and the button's ::before bleeds out to meet its neighbour's. Deliberately a
|
|
122
|
+
// literal and NOT a spacing token: this is a layout value derived from the two
|
|
123
|
+
// size tokens, and pinning it to --spacing-0-5 desynchronises it from them
|
|
124
|
+
// (matcha sets that step to 3px, which overlaps adjacent days' hit targets by
|
|
125
|
+
// 2px). Deriving it with calc() from the size tokens would be better still and
|
|
126
|
+
// would close butter's 4px dead gap; that needs its own measured change.
|
|
127
|
+
const BAND_INSET = '2px';
|
|
128
|
+
const HIT_BLEED = '-2px';
|
|
129
|
+
|
|
126
130
|
export const dayCellStyles = stylex.create({
|
|
127
131
|
// Cell container
|
|
128
132
|
cell: {
|
|
@@ -137,53 +141,53 @@ export const dayCellStyles = stylex.create({
|
|
|
137
141
|
// Range background - structural positioning
|
|
138
142
|
rangeBg: {
|
|
139
143
|
position: 'absolute',
|
|
140
|
-
top:
|
|
141
|
-
bottom:
|
|
144
|
+
top: BAND_INSET,
|
|
145
|
+
bottom: BAND_INSET,
|
|
142
146
|
insetInlineStart: 0,
|
|
143
147
|
insetInlineEnd: 0,
|
|
144
148
|
},
|
|
145
149
|
rangeBgRadiusStart: {
|
|
146
|
-
insetInlineStart:
|
|
150
|
+
insetInlineStart: BAND_INSET,
|
|
147
151
|
borderStartStartRadius: radiusVars['--radius-full'],
|
|
148
152
|
borderEndStartRadius: radiusVars['--radius-full'],
|
|
149
153
|
},
|
|
150
154
|
rangeBgRadiusEnd: {
|
|
151
|
-
insetInlineEnd:
|
|
155
|
+
insetInlineEnd: BAND_INSET,
|
|
152
156
|
borderStartEndRadius: radiusVars['--radius-full'],
|
|
153
157
|
borderEndEndRadius: radiusVars['--radius-full'],
|
|
154
158
|
},
|
|
155
159
|
rangeInsetStart: {
|
|
156
|
-
insetInlineStart:
|
|
160
|
+
insetInlineStart: BAND_INSET,
|
|
157
161
|
},
|
|
158
162
|
rangeInsetEnd: {
|
|
159
|
-
insetInlineEnd:
|
|
163
|
+
insetInlineEnd: BAND_INSET,
|
|
160
164
|
},
|
|
161
165
|
|
|
162
166
|
// Preview background - structural positioning
|
|
163
167
|
previewBg: {
|
|
164
168
|
position: 'absolute',
|
|
165
|
-
top:
|
|
166
|
-
bottom:
|
|
169
|
+
top: BAND_INSET,
|
|
170
|
+
bottom: BAND_INSET,
|
|
167
171
|
insetInlineStart: 0,
|
|
168
172
|
insetInlineEnd: 0,
|
|
169
173
|
},
|
|
170
174
|
previewBgRadiusStart: {
|
|
171
|
-
insetInlineStart:
|
|
175
|
+
insetInlineStart: BAND_INSET,
|
|
172
176
|
borderStartStartRadius: radiusVars['--radius-full'],
|
|
173
177
|
borderEndStartRadius: radiusVars['--radius-full'],
|
|
174
178
|
},
|
|
175
179
|
previewBgRadiusEnd: {
|
|
176
|
-
insetInlineEnd:
|
|
180
|
+
insetInlineEnd: BAND_INSET,
|
|
177
181
|
borderStartEndRadius: radiusVars['--radius-full'],
|
|
178
182
|
borderEndEndRadius: radiusVars['--radius-full'],
|
|
179
183
|
},
|
|
180
184
|
previewStart: {
|
|
181
|
-
insetInlineStart:
|
|
185
|
+
insetInlineStart: BAND_INSET,
|
|
182
186
|
borderStartStartRadius: radiusVars['--radius-full'],
|
|
183
187
|
borderEndStartRadius: radiusVars['--radius-full'],
|
|
184
188
|
},
|
|
185
189
|
previewEnd: {
|
|
186
|
-
insetInlineEnd:
|
|
190
|
+
insetInlineEnd: BAND_INSET,
|
|
187
191
|
borderStartEndRadius: radiusVars['--radius-full'],
|
|
188
192
|
borderEndEndRadius: radiusVars['--radius-full'],
|
|
189
193
|
},
|
|
@@ -195,7 +199,7 @@ export const dayCellStyles = stylex.create({
|
|
|
195
199
|
display: 'flex',
|
|
196
200
|
alignItems: 'center',
|
|
197
201
|
justifyContent: 'center',
|
|
198
|
-
borderRadius: '
|
|
202
|
+
borderRadius: radiusVars['--radius-full'],
|
|
199
203
|
borderWidth: 0,
|
|
200
204
|
borderStyle: 'none',
|
|
201
205
|
cursor: {
|
|
@@ -213,14 +217,14 @@ export const dayCellStyles = stylex.create({
|
|
|
213
217
|
},
|
|
214
218
|
transitionDuration: durationVars['--duration-fast'],
|
|
215
219
|
transitionTimingFunction: easeVars['--ease-standard'],
|
|
216
|
-
// Expand hit target
|
|
220
|
+
// Expand hit target so adjacent days meet with no gap
|
|
217
221
|
'::before': {
|
|
218
222
|
content: '""',
|
|
219
223
|
position: 'absolute',
|
|
220
|
-
top:
|
|
221
|
-
insetInlineEnd:
|
|
222
|
-
bottom:
|
|
223
|
-
insetInlineStart:
|
|
224
|
+
top: HIT_BLEED,
|
|
225
|
+
insetInlineEnd: HIT_BLEED,
|
|
226
|
+
bottom: HIT_BLEED,
|
|
227
|
+
insetInlineStart: HIT_BLEED,
|
|
224
228
|
},
|
|
225
229
|
},
|
|
226
230
|
|
|
@@ -280,8 +284,22 @@ export const dayCellTheme = stylex.create({
|
|
|
280
284
|
|
|
281
285
|
// Selected state (single selection or range endpoints)
|
|
282
286
|
daySelected: {
|
|
283
|
-
|
|
284
|
-
|
|
287
|
+
// Forced colors (Windows High Contrast) strips the accent fill, which
|
|
288
|
+
// leaves the selected date looking exactly like every other day.
|
|
289
|
+
// Highlight/HighlightText is the platform convention for a selected
|
|
290
|
+
// control (WCAG 1.4.11), and `forced-color-adjust: none` is required
|
|
291
|
+
// because this is a <button>: the UA otherwise keeps the native
|
|
292
|
+
// ButtonFace surface and ignores the authored fill, the same trap
|
|
293
|
+
// ToggleButton documents.
|
|
294
|
+
forcedColorAdjust: 'none',
|
|
295
|
+
backgroundColor: {
|
|
296
|
+
default: colorVars['--color-accent'],
|
|
297
|
+
'@media (forced-colors: active)': 'Highlight',
|
|
298
|
+
},
|
|
299
|
+
color: {
|
|
300
|
+
default: colorVars['--color-on-accent'],
|
|
301
|
+
'@media (forced-colors: active)': 'HighlightText',
|
|
302
|
+
},
|
|
285
303
|
backgroundImage: {
|
|
286
304
|
default: null,
|
|
287
305
|
':hover:where(:not(:disabled,[aria-disabled="true"]))': {
|