@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29
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 +51 -0
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +20 -18
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
- package/dist/AppShell/AppShell.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +55 -53
- package/dist/AspectRatio/AspectRatio.js +5 -5
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +27 -25
- package/dist/Avatar/AvatarStatusDot.js +5 -5
- package/dist/AvatarGroup/AvatarGroup.js +5 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
- package/dist/Badge/Badge.js +3 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -25
- package/dist/Blockquote/Blockquote.js +7 -7
- package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
- package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +47 -26
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +108 -64
- package/dist/Calendar/dayCellUtils.d.ts +67 -5
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- package/dist/Calendar/dayCellUtils.js +139 -18
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +2 -2
- package/dist/Card/Card.d.ts +4 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +18 -10
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +20 -19
- package/dist/Center/Center.js +3 -3
- package/dist/Chat/ChatComposer.js +23 -23
- package/dist/Chat/ChatComposerDrawer.js +14 -14
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +27 -15
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +13 -11
- package/dist/Chat/ChatLayout.js +17 -17
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +12 -10
- package/dist/Chat/ChatMessage.js +12 -12
- package/dist/Chat/ChatMessageBubble.js +7 -7
- package/dist/Chat/ChatMessageList.js +14 -14
- package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +14 -12
- package/dist/Chat/ChatPastedTextToken.js +13 -13
- package/dist/Chat/ChatSendButton.js +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +17 -17
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +24 -15
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +81 -74
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +32 -24
- package/dist/CheckboxList/CheckboxList.js +9 -9
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +8 -6
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +32 -9
- package/dist/Code/Code.d.ts +15 -1
- package/dist/Code/Code.d.ts.map +1 -1
- package/dist/Code/Code.js +35 -5
- package/dist/Code/index.d.ts +1 -1
- package/dist/Code/index.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +88 -52
- package/dist/CodeBlock/index.d.ts +1 -1
- package/dist/CodeBlock/index.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +110 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +73 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
- package/dist/Collapsible/index.d.ts +1 -0
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +4 -1
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +20 -6
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +36 -34
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
- package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
- package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
- package/dist/CommandPalette/CommandPaletteInput.js +13 -13
- package/dist/CommandPalette/CommandPaletteItem.js +3 -3
- package/dist/CommandPalette/CommandPaletteList.js +3 -3
- package/dist/ContextMenu/ContextMenu.d.ts +9 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +16 -11
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +23 -23
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +30 -26
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -9
- package/dist/Dialog/DialogHeader.js +16 -16
- package/dist/Dialog/useImperativeDialog.js +3 -3
- package/dist/Divider/Divider.d.ts +0 -22
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +7 -7
- package/dist/DropdownMenu/DropdownMenu.js +10 -10
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
- package/dist/DropdownMenu/renderDropdownItems.js +10 -10
- package/dist/EmptyState/EmptyState.js +9 -9
- package/dist/Field/Field.js +17 -17
- package/dist/Field/FieldLabel.js +15 -15
- package/dist/Field/InputClearButton.js +5 -5
- package/dist/FieldStatus/FieldStatus.js +3 -3
- package/dist/FileInput/FileInput.js +29 -29
- package/dist/FormLayout/FormLayout.js +5 -5
- package/dist/Grid/Grid.d.ts +4 -3
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +29 -12
- package/dist/Grid/GridSpan.js +3 -3
- package/dist/HStack/HStack.js +3 -3
- package/dist/Heading/Heading.js +10 -10
- package/dist/HoverCard/HoverCard.js +9 -9
- package/dist/HoverCard/useHoverCard.js +3 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +16 -12
- package/dist/Icon/defaultIcons.js +116 -116
- package/dist/IconButton/IconButton.js +3 -3
- package/dist/InputGroup/InputGroup.js +11 -11
- package/dist/InputGroup/InputGroupText.js +3 -3
- package/dist/Item/Item.js +18 -18
- package/dist/Kbd/Kbd.js +5 -5
- package/dist/Layer/LayerProvider.js +7 -7
- package/dist/Layer/useLayer.js +5 -5
- package/dist/Layout/Layout.js +21 -21
- package/dist/Layout/LayoutContent.js +3 -3
- package/dist/Layout/LayoutFooter.js +5 -5
- package/dist/Layout/LayoutHeader.js +5 -5
- package/dist/Layout/LayoutPanel.js +3 -3
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +55 -31
- package/dist/Lightbox/useLightbox.js +3 -3
- package/dist/Link/Link.js +15 -15
- package/dist/Link/LinkProvider.js +3 -3
- package/dist/Link/useLinkify.js +3 -3
- package/dist/List/List.js +11 -11
- package/dist/List/ListItem.js +11 -11
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +102 -102
- package/dist/Markdown/parser.d.ts +7 -0
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +300 -6
- package/dist/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.js +15 -15
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.d.ts +7 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +64 -55
- package/dist/NavIcon/NavIcon.js +3 -3
- package/dist/NavMenu/NavHeadingMenu.js +5 -5
- package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +48 -32
- package/dist/Outline/Outline.js +15 -15
- package/dist/OverflowList/OverflowList.js +8 -8
- package/dist/Overlay/Overlay.js +3 -3
- package/dist/Overlay/OverlayScrim.js +5 -5
- package/dist/Overlay/useOverlay.js +3 -3
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +125 -72
- package/dist/Popover/Popover.js +16 -16
- package/dist/Popover/usePopover.js +7 -7
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +110 -92
- package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
- package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
- package/dist/PowerSearch/PowerSearchToken.js +5 -5
- package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +25 -18
- package/dist/RadioList/RadioList.d.ts +7 -1
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +10 -8
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +30 -22
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +28 -10
- package/dist/Section/Section.js +5 -5
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +32 -10
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
- package/dist/SelectableCard/SelectableCard.js +5 -5
- package/dist/Selector/Selector.d.ts +6 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +54 -45
- package/dist/Selector/SelectorOption.js +3 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +38 -34
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +8 -6
- package/dist/SideNav/SideNavHeading.js +87 -87
- package/dist/SideNav/SideNavItem.js +42 -42
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.d.ts.map +1 -1
- package/dist/SideNav/SideNavSection.js +18 -16
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.d.ts +6 -0
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +31 -22
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +10 -10
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +13 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +41 -30
- package/dist/TabList/Tab.js +18 -18
- package/dist/TabList/TabList.js +5 -5
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +57 -30
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +51 -39
- package/dist/Table/Table.js +7 -7
- package/dist/Table/TableBody.d.ts +1 -1
- package/dist/Table/TableBody.d.ts.map +1 -1
- package/dist/Table/TableBody.js +9 -5
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +76 -7
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts.map +1 -1
- package/dist/Table/TableFooter.js +9 -5
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +9 -5
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
- package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +5 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/index.js +3 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
- package/dist/Table/plugins/selection/useTableSelection.js +18 -18
- package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
- package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
- package/dist/Table/tableContextMenu.d.ts +5 -1
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +19 -12
- package/dist/Text/Text.d.ts +1 -1
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +14 -13
- package/dist/Text/text.stylex.d.ts +35 -0
- package/dist/Text/text.stylex.d.ts.map +1 -1
- package/dist/Text/text.stylex.js +52 -1
- package/dist/TextArea/TextArea.js +14 -14
- package/dist/TextInput/TextInput.js +15 -15
- package/dist/Thumbnail/Thumbnail.d.ts +3 -2
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +30 -29
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +26 -21
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +37 -26
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -17
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +23 -11
- package/dist/Toast/useToast.js +4 -4
- package/dist/ToggleButton/ToggleButton.js +12 -12
- package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
- package/dist/Token/Token.js +21 -21
- package/dist/Tokenizer/Tokenizer.d.ts +6 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +38 -29
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.js +3 -3
- package/dist/TopNav/TopNav.js +32 -32
- package/dist/TopNav/TopNavHeading.js +67 -67
- package/dist/TopNav/TopNavItem.js +5 -5
- package/dist/TopNav/TopNavMegaMenu.js +30 -30
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
- package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
- package/dist/TopNav/TopNavMenu.js +32 -32
- package/dist/TreeList/TreeList.js +8 -8
- package/dist/TreeList/TreeListBranches.js +11 -11
- package/dist/TreeList/TreeListItem.js +30 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +23 -20
- package/dist/Typeahead/Typeahead.js +12 -12
- package/dist/Typeahead/TypeaheadItem.js +10 -10
- package/dist/VStack/VStack.js +3 -3
- package/dist/astryx.css +23 -0
- package/dist/astryx.umd.js +60 -58
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +13 -1
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.d.ts +1 -1
- package/dist/hooks/focusableSelector.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.js +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +3 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +38 -1
- package/dist/hooks/useHotkeys.d.ts +51 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -0
- package/dist/hooks/useHotkeys.js +160 -0
- package/dist/hooks/useInteractiveRole.d.ts +6 -2
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +6 -2
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +3 -1
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +14 -5
- package/dist/theme/MediaTheme.js +3 -3
- package/dist/theme/Theme.js +7 -7
- package/dist/theme/defineTheme.d.ts +1 -1
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +10 -3
- package/dist/theme/hct.d.ts +0 -15
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +9 -9
- package/dist/theme/syntax/SyntaxTheme.js +5 -5
- package/dist/theme/tokens.d.ts +10 -2
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +220 -4
- package/dist/utils/color.d.ts +42 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +150 -0
- package/dist/utils/composeEventHandlers.d.ts +30 -0
- package/dist/utils/composeEventHandlers.d.ts.map +1 -0
- package/dist/utils/composeEventHandlers.js +40 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +8 -5
- package/package.json +3 -3
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
- package/src/Avatar/Avatar.doc.mjs +13 -2
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +12 -20
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +38 -0
- package/src/Banner/Banner.tsx +8 -1
- package/src/Button/Button.tsx +39 -6
- package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +201 -17
- package/src/Calendar/Calendar.tsx +79 -26
- package/src/Calendar/dayCellUtils.test.ts +306 -1
- package/src/Calendar/dayCellUtils.ts +206 -13
- package/src/Calendar/styles.ts +12 -2
- package/src/Card/Card.doc.mjs +1 -1
- package/src/Card/Card.tsx +16 -6
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +13 -0
- package/src/Carousel/Carousel.tsx +1 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +24 -0
- package/src/Chat/ChatComposerInput.tsx +17 -1
- package/src/Chat/ChatDictationButton.test.tsx +43 -0
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
- package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
- package/src/Chat/ChatMessageMetadata.tsx +4 -6
- package/src/Chat/ChatSystemMessage.test.tsx +26 -11
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +29 -16
- package/src/Chat/ChatTokenizedText.tsx +15 -8
- package/src/Chat/ChatToolCalls.test.tsx +55 -0
- package/src/Chat/ChatToolCalls.tsx +10 -12
- package/src/Chat/index.ts +1 -4
- package/src/Chat/useChatNewMessages.test.tsx +4 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
- package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
- package/src/CheckboxInput/CheckboxInput.tsx +13 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
- package/src/CheckboxList/CheckboxList.test.tsx +19 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/Citation/Citation.doc.mjs +5 -0
- package/src/ClickableCard/ClickableCard.tsx +45 -2
- package/src/Code/Code.test.tsx +54 -0
- package/src/Code/Code.tsx +48 -4
- package/src/Code/index.ts +1 -1
- package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
- package/src/CodeBlock/CodeBlock.test.tsx +122 -3
- package/src/CodeBlock/CodeBlock.tsx +62 -4
- package/src/CodeBlock/index.ts +1 -1
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +405 -0
- package/src/Collapsible/Collapsible.tsx +86 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
- package/src/Collapsible/CollapsibleGroup.tsx +107 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
- package/src/Collapsible/index.ts +4 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
- package/src/ContextMenu/ContextMenu.test.tsx +15 -0
- package/src/ContextMenu/ContextMenu.tsx +19 -1
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.doc.mjs +6 -1
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateRangeInput/DateRangeInput.tsx +2 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +9 -8
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/Divider/Divider.tsx +1 -23
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.doc.mjs +1 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FileInput/FileInput.doc.mjs +1 -1
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.doc.mjs +3 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- package/src/Layout/Layout.test.tsx +285 -0
- package/src/Layout/LayoutContent.doc.mjs +12 -0
- package/src/Layout/LayoutPanel.doc.mjs +40 -0
- package/src/Layout/LayoutSlots.test.tsx +364 -0
- package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
- package/src/Lightbox/Lightbox.doc.mjs +5 -0
- package/src/Lightbox/Lightbox.test.tsx +123 -2
- package/src/Lightbox/Lightbox.tsx +29 -1
- package/src/Markdown/Markdown.test.tsx +23 -0
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/incremental.test.ts +36 -0
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/Markdown/parser.test.ts +210 -0
- package/src/Markdown/parser.ts +301 -6
- package/src/MobileNav/MobileNav.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
- package/src/MultiSelector/MultiSelector.test.tsx +33 -0
- package/src/MultiSelector/MultiSelector.tsx +20 -0
- package/src/NavMenu/NavMenu.doc.mjs +15 -0
- package/src/NumberInput/NumberInput.test.tsx +48 -3
- package/src/NumberInput/NumberInput.tsx +32 -15
- package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
- package/src/OverflowList/OverflowList.test.tsx +416 -0
- package/src/Overlay/Overlay.doc.mjs +6 -0
- package/src/Overlay/Overlay.test.tsx +356 -0
- package/src/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.doc.mjs +7 -1
- package/src/RadioList/RadioList.test.tsx +65 -0
- package/src/RadioList/RadioList.tsx +10 -1
- package/src/RadioList/RadioListItem.tsx +13 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/Section/Section.test.tsx +4 -10
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
- package/src/SegmentedControl/SegmentedControl.tsx +27 -5
- package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.doc.mjs +12 -1
- package/src/Selector/Selector.test.tsx +30 -0
- package/src/Selector/Selector.tsx +18 -0
- package/src/SideNav/SideNav.doc.mjs +7 -1
- package/src/SideNav/SideNav.test.tsx +66 -0
- package/src/SideNav/SideNav.tsx +6 -2
- package/src/SideNav/SideNavCollapseButton.tsx +4 -3
- package/src/SideNav/SideNavSection.tsx +6 -4
- package/src/SizeContext/SizeContext.test.tsx +226 -0
- package/src/Slider/Slider.doc.mjs +14 -2
- package/src/Slider/Slider.test.tsx +30 -0
- package/src/Slider/Slider.tsx +20 -0
- package/src/Spinner/Spinner.tsx +1 -0
- package/src/Switch/Switch.doc.mjs +21 -9
- package/src/Switch/Switch.test.tsx +137 -0
- package/src/Switch/Switch.tsx +32 -7
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +16 -3
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- package/src/Table/TableCell.tsx +87 -8
- package/src/Table/TableFooter.tsx +15 -2
- package/src/Table/TableHeader.tsx +15 -2
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
- package/src/Table/plugins/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/index.ts +7 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
- package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
- package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
- package/src/Table/tableContextMenu.test.tsx +27 -3
- package/src/Table/tableContextMenu.tsx +20 -2
- package/src/Table/useTablePagination.doc.mjs +4 -1
- package/src/Table/useTableRowExpansion.doc.mjs +80 -0
- package/src/Table/useTableSortable.doc.mjs +4 -1
- package/src/Text/Text.doc.mjs +2 -2
- package/src/Text/Text.test.tsx +11 -0
- package/src/Text/Text.tsx +4 -2
- package/src/Text/text.stylex.ts +41 -0
- package/src/TextArea/TextArea.doc.mjs +1 -1
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.doc.mjs +1 -1
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +36 -2
- package/src/Thumbnail/Thumbnail.tsx +4 -2
- package/src/TimeInput/TimeInput.doc.mjs +11 -6
- package/src/TimeInput/TimeInput.test.tsx +37 -0
- package/src/TimeInput/TimeInput.tsx +11 -1
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +52 -0
- package/src/Timestamp/Timestamp.tsx +30 -16
- package/src/Toast/Toast.tsx +11 -3
- package/src/Toast/ToastViewport.test.tsx +64 -0
- package/src/Toast/ToastViewport.tsx +12 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
- package/src/Tokenizer/Tokenizer.test.tsx +33 -0
- package/src/Tokenizer/Tokenizer.tsx +19 -0
- package/src/Toolbar/Toolbar.test.tsx +1 -1
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +18 -0
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
- package/src/Typeahead/BaseTypeahead.tsx +5 -2
- package/src/Typeahead/Typeahead.doc.mjs +7 -2
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- package/src/__tests__/TestIcon.tsx +26 -0
- package/src/__tests__/fastRoleQueries.ts +66 -0
- package/src/docPropReferences.test.ts +178 -0
- package/src/docs-types.ts +14 -0
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useFocusTrap.doc.mjs +4 -2
- package/src/hooks/useFocusTrap.test.tsx +149 -1
- package/src/hooks/useFocusTrap.ts +50 -1
- package/src/hooks/useHotkeys.doc.mjs +52 -0
- package/src/hooks/useHotkeys.test.ts +245 -0
- package/src/hooks/useHotkeys.ts +203 -0
- package/src/hooks/useInteractiveRole.ts +12 -4
- package/src/hooks/useKeyboardHint.doc.mjs +6 -6
- package/src/hooks/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +4 -13
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +29 -0
- package/src/theme/expandColorScale.ts +11 -6
- package/src/theme/hct.ts +9 -17
- package/src/theme/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +20 -0
- package/src/utils/color.test.ts +133 -0
- package/src/utils/color.ts +148 -0
- package/src/utils/composeEventHandlers.test.ts +71 -0
- package/src/utils/composeEventHandlers.ts +44 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/mergeProps.test.ts +166 -0
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +13 -0
- package/src/utils/timeParser.ts +8 -5
package/src/Button/Button.tsx
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
import {useRef, useTransition, type ReactNode} from 'react';
|
|
22
22
|
import type {BaseProps} from '../BaseProps';
|
|
23
23
|
import * as stylex from '@stylexjs/stylex';
|
|
24
|
+
import {useTooltip} from '../Tooltip/useTooltip';
|
|
24
25
|
import {
|
|
25
26
|
colorVars,
|
|
26
27
|
sizeVars,
|
|
@@ -32,14 +33,13 @@ import {
|
|
|
32
33
|
fontWeightVars,
|
|
33
34
|
typeScaleVars,
|
|
34
35
|
} from '../theme/tokens.stylex';
|
|
35
|
-
import {Tooltip} from '../Tooltip/Tooltip';
|
|
36
36
|
import {Spinner} from '../Spinner';
|
|
37
37
|
import {VisuallyHidden} from '../VisuallyHidden';
|
|
38
38
|
|
|
39
39
|
import {EDGE_COMP_ATTR} from '../Layout/edgeCompensation.stylex';
|
|
40
40
|
import {useSize} from '../SizeContext/SizeContext';
|
|
41
41
|
import {useButtonGroup} from '../ButtonGroup/ButtonGroupContext';
|
|
42
|
-
import {mergeProps} from '../utils';
|
|
42
|
+
import {mergeProps, mergeRefs} from '../utils';
|
|
43
43
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
44
44
|
import type {LinkComponentType} from '../Link/types';
|
|
45
45
|
import {themeProps} from '../utils/themeProps';
|
|
@@ -580,6 +580,16 @@ export function Button({
|
|
|
580
580
|
// for keyboard users to reach the tooltip. Otherwise use native disabled.
|
|
581
581
|
const useAriaDisabled = tooltip != null && buttonDisabled;
|
|
582
582
|
|
|
583
|
+
// Attach tooltip behavior via the hook rather than wrapping the button in a
|
|
584
|
+
// <Tooltip> element. The hook adds hover/focus triggers to the button itself,
|
|
585
|
+
// so no extra DOM node is inserted — the button stays a direct child of its
|
|
586
|
+
// container (no layout shift, and edge-compensation markers remain
|
|
587
|
+
// discoverable through the container's direct-child `:has()` selector).
|
|
588
|
+
const tooltipHook = useTooltip({
|
|
589
|
+
placement: 'above',
|
|
590
|
+
isEnabled: tooltip != null,
|
|
591
|
+
});
|
|
592
|
+
|
|
583
593
|
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
|
|
584
594
|
// The ref guard dedupes fire-once actions. Interruptible callers skip it so
|
|
585
595
|
// a re-click while pending starts a fresh action that interrupts the prior.
|
|
@@ -696,18 +706,39 @@ export function Button({
|
|
|
696
706
|
(children != null && children !== label);
|
|
697
707
|
const ariaLabelProp = needsAriaLabel ? {'aria-label': label} : null;
|
|
698
708
|
|
|
709
|
+
// When a tooltip is attached via the hook, point aria-describedby at the
|
|
710
|
+
// tooltip content (composing with any consumer-provided value).
|
|
711
|
+
const describedByProp =
|
|
712
|
+
tooltip != null
|
|
713
|
+
? {
|
|
714
|
+
'aria-describedby':
|
|
715
|
+
[props['aria-describedby'], tooltipHook.describedBy]
|
|
716
|
+
.filter(Boolean)
|
|
717
|
+
.join(' ') || undefined,
|
|
718
|
+
}
|
|
719
|
+
: null;
|
|
720
|
+
|
|
721
|
+
// Merge the consumer ref with the tooltip hook's trigger ref so both point at
|
|
722
|
+
// the same element. mergeRefs tolerates undefined, so this is a no-op for the
|
|
723
|
+
// tooltip side when no tooltip is set.
|
|
724
|
+
const mergedButtonRef = mergeRefs(
|
|
725
|
+
ref,
|
|
726
|
+
tooltip != null ? tooltipHook.ref : undefined,
|
|
727
|
+
);
|
|
728
|
+
|
|
699
729
|
let element: ReactNode;
|
|
700
730
|
|
|
701
731
|
if (renderAsLink) {
|
|
702
732
|
element = (
|
|
703
733
|
<LinkComponent
|
|
704
|
-
ref={
|
|
734
|
+
ref={mergedButtonRef as React.Ref<HTMLAnchorElement>}
|
|
705
735
|
href={href}
|
|
706
736
|
target={target}
|
|
707
737
|
rel={rel}
|
|
708
738
|
{...sharedMergedProps}
|
|
709
739
|
{...props}
|
|
710
740
|
{...ariaLabelProp}
|
|
741
|
+
{...describedByProp}
|
|
711
742
|
{...edgeCompAttr}
|
|
712
743
|
onClick={handleClick}>
|
|
713
744
|
{buttonContent}
|
|
@@ -716,12 +747,13 @@ export function Button({
|
|
|
716
747
|
} else {
|
|
717
748
|
element = (
|
|
718
749
|
<button
|
|
719
|
-
ref={
|
|
750
|
+
ref={mergedButtonRef}
|
|
720
751
|
type={type}
|
|
721
752
|
disabled={useAriaDisabled ? undefined : buttonDisabled}
|
|
722
753
|
{...sharedMergedProps}
|
|
723
754
|
{...props}
|
|
724
755
|
{...ariaLabelProp}
|
|
756
|
+
{...describedByProp}
|
|
725
757
|
{...edgeCompAttr}
|
|
726
758
|
aria-busy={isLoadingState || undefined}
|
|
727
759
|
aria-disabled={useAriaDisabled || undefined}
|
|
@@ -734,9 +766,10 @@ export function Button({
|
|
|
734
766
|
|
|
735
767
|
if (tooltip) {
|
|
736
768
|
return (
|
|
737
|
-
|
|
769
|
+
<>
|
|
738
770
|
{element}
|
|
739
|
-
|
|
771
|
+
{tooltipHook.renderTooltip(tooltip)}
|
|
772
|
+
</>
|
|
740
773
|
);
|
|
741
774
|
}
|
|
742
775
|
|
|
@@ -19,7 +19,7 @@ export const docs = {
|
|
|
19
19
|
{guidance: false, description: 'Disable large blocks of dates without context. The user should understand why dates are unavailable.'},
|
|
20
20
|
],
|
|
21
21
|
anatomy: [
|
|
22
|
-
{name: 'Month header', required: true, description: 'The month name and year with navigation arrows to move between months.'},
|
|
22
|
+
{name: 'Month header', required: true, description: 'The month name and year with navigation arrows to move between months. The arrows mirror automatically under dir="rtl".'},
|
|
23
23
|
{name: 'Day grid', required: true, description: 'A 7-column grid of days with column headers for the day names.'},
|
|
24
24
|
{name: 'Selected day', required: false, description: 'The currently selected date, highlighted. In range mode, the start and end dates plus the days between them.'},
|
|
25
25
|
{name: 'Today marker', required: false, description: 'A subtle indicator on the current date for orientation.'},
|
|
@@ -12,8 +12,11 @@
|
|
|
12
12
|
import {describe, it, expect, vi} from 'vitest';
|
|
13
13
|
import {act, render, screen, within} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
|
+
import {getButton} from '../__tests__/fastRoleQueries';
|
|
16
|
+
import * as stylex from '@stylexjs/stylex';
|
|
15
17
|
import {Calendar} from './Calendar';
|
|
16
18
|
import type {CalendarHandle} from './Calendar';
|
|
19
|
+
import {calendarStyles} from './styles';
|
|
17
20
|
|
|
18
21
|
/**
|
|
19
22
|
* Helper to find a day button by its day number.
|
|
@@ -24,7 +27,7 @@ import type {CalendarHandle} from './Calendar';
|
|
|
24
27
|
function getDayButton(day: number, month = 'January', year = 2026) {
|
|
25
28
|
// Match the full date pattern with the day number
|
|
26
29
|
const pattern = new RegExp(`${month}\\s+${day},\\s+${year}`);
|
|
27
|
-
return
|
|
30
|
+
return getButton(pattern);
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
describe('Calendar', () => {
|
|
@@ -71,6 +74,24 @@ describe('Calendar', () => {
|
|
|
71
74
|
expect(screen.getByText(expectedLabel)).toBeInTheDocument();
|
|
72
75
|
});
|
|
73
76
|
|
|
77
|
+
it("marks today's cell with aria-current='date'", () => {
|
|
78
|
+
render(<Calendar />);
|
|
79
|
+
|
|
80
|
+
const now = new Date();
|
|
81
|
+
const iso = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
|
|
82
|
+
|
|
83
|
+
const todayCell = document.querySelector(`button[data-date="${iso}"]`);
|
|
84
|
+
expect(todayCell).not.toBeNull();
|
|
85
|
+
expect(todayCell).toHaveAttribute('aria-current', 'date');
|
|
86
|
+
|
|
87
|
+
// Only today's cell is marked current.
|
|
88
|
+
const others = Array.from(
|
|
89
|
+
document.querySelectorAll('button[data-date]'),
|
|
90
|
+
).filter(el => el.getAttribute('data-date') !== iso);
|
|
91
|
+
expect(others.length).toBeGreaterThan(0);
|
|
92
|
+
others.forEach(el => expect(el).not.toHaveAttribute('aria-current'));
|
|
93
|
+
});
|
|
94
|
+
|
|
74
95
|
it('displays day names', () => {
|
|
75
96
|
render(<Calendar />);
|
|
76
97
|
|
|
@@ -97,7 +118,11 @@ describe('Calendar', () => {
|
|
|
97
118
|
render(<Calendar value="2026-01-15" focusDate="2026-01-01" />);
|
|
98
119
|
|
|
99
120
|
const day15 = getDayButton(15);
|
|
100
|
-
|
|
121
|
+
// In an ARIA grid, selection state lives on the gridcell, not the button
|
|
122
|
+
// (a plain button role does not permit aria-selected).
|
|
123
|
+
const gridcell15 = day15.closest('[role="gridcell"]');
|
|
124
|
+
expect(gridcell15).toHaveAttribute('aria-selected', 'true');
|
|
125
|
+
expect(day15).not.toHaveAttribute('aria-selected');
|
|
101
126
|
});
|
|
102
127
|
|
|
103
128
|
it('calls onChange when date is selected', async () => {
|
|
@@ -123,7 +148,7 @@ describe('Calendar', () => {
|
|
|
123
148
|
// Verify we start on February
|
|
124
149
|
expect(screen.getByText('February 2026')).toBeInTheDocument();
|
|
125
150
|
|
|
126
|
-
const prevButton =
|
|
151
|
+
const prevButton = getButton('Previous month');
|
|
127
152
|
await user.click(prevButton);
|
|
128
153
|
|
|
129
154
|
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
@@ -137,7 +162,7 @@ describe('Calendar', () => {
|
|
|
137
162
|
// Verify we start on January
|
|
138
163
|
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
139
164
|
|
|
140
|
-
const nextButton =
|
|
165
|
+
const nextButton = getButton('Next month');
|
|
141
166
|
await user.click(nextButton);
|
|
142
167
|
|
|
143
168
|
expect(screen.getByText('February 2026')).toBeInTheDocument();
|
|
@@ -151,7 +176,7 @@ describe('Calendar', () => {
|
|
|
151
176
|
<Calendar focusDate="2026-01-01" onFocusDateChange={handleFocusChange} />,
|
|
152
177
|
);
|
|
153
178
|
|
|
154
|
-
const nextButton =
|
|
179
|
+
const nextButton = getButton('Next month');
|
|
155
180
|
await user.click(nextButton);
|
|
156
181
|
|
|
157
182
|
expect(handleFocusChange).toHaveBeenCalledWith('2026-02-01');
|
|
@@ -209,12 +234,39 @@ describe('Calendar', () => {
|
|
|
209
234
|
|
|
210
235
|
render(<Calendar numberOfMonths={2} focusDate="2026-01-01" />);
|
|
211
236
|
|
|
212
|
-
const nextButton =
|
|
237
|
+
const nextButton = getButton('Next month');
|
|
213
238
|
await user.click(nextButton);
|
|
214
239
|
|
|
215
240
|
expect(screen.getByText(/February 2026.*March 2026/)).toBeInTheDocument();
|
|
216
241
|
});
|
|
217
242
|
|
|
243
|
+
it('clamps out-of-range numberOfMonths to a single month', () => {
|
|
244
|
+
// 1000 would otherwise try to render 1000 month grids and lock the page up.
|
|
245
|
+
render(
|
|
246
|
+
<Calendar
|
|
247
|
+
numberOfMonths={1000 as unknown as 1 | 2}
|
|
248
|
+
focusDate="2026-01-01"
|
|
249
|
+
/>,
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
// Only the focused month renders — no second month, no range separator.
|
|
253
|
+
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
254
|
+
expect(screen.queryByText(/February 2026/)).not.toBeInTheDocument();
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('clamps numberOfMonths={0} to a single month', () => {
|
|
258
|
+
render(
|
|
259
|
+
<Calendar
|
|
260
|
+
numberOfMonths={0 as unknown as 1 | 2}
|
|
261
|
+
focusDate="2026-01-01"
|
|
262
|
+
/>,
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
// 0 previously rendered no months at all; now falls back to one.
|
|
266
|
+
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
267
|
+
expect(screen.getAllByRole('gridcell').length).toBeGreaterThan(0);
|
|
268
|
+
});
|
|
269
|
+
|
|
218
270
|
// ─── Display Options ─────────────────────────────────────────
|
|
219
271
|
|
|
220
272
|
it('shows week numbers when hasWeekNumbers is true', () => {
|
|
@@ -310,9 +362,101 @@ describe('Calendar', () => {
|
|
|
310
362
|
const day12 = getDayButton(12);
|
|
311
363
|
const day15 = getDayButton(15);
|
|
312
364
|
|
|
313
|
-
|
|
314
|
-
expect(
|
|
315
|
-
|
|
365
|
+
// Selection state lives on the gridcell wrapper, not the day button.
|
|
366
|
+
expect(day10.closest('[role="gridcell"]')).toHaveAttribute(
|
|
367
|
+
'aria-selected',
|
|
368
|
+
'true',
|
|
369
|
+
);
|
|
370
|
+
expect(day12.closest('[role="gridcell"]')).toHaveAttribute(
|
|
371
|
+
'aria-selected',
|
|
372
|
+
'true',
|
|
373
|
+
);
|
|
374
|
+
expect(day15.closest('[role="gridcell"]')).toHaveAttribute(
|
|
375
|
+
'aria-selected',
|
|
376
|
+
'true',
|
|
377
|
+
);
|
|
378
|
+
expect(day10).not.toHaveAttribute('aria-selected');
|
|
379
|
+
expect(day12).not.toHaveAttribute('aria-selected');
|
|
380
|
+
expect(day15).not.toHaveAttribute('aria-selected');
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
it('caps the range highlight next to a disabled mid-range day (#2715)', () => {
|
|
384
|
+
// Disable Jan 13. With Jan 10–15 selected, day 12 (immediately before the
|
|
385
|
+
// disabled day) should get a rounded end cap on its right edge, and day 14
|
|
386
|
+
// (immediately after) a rounded cap on its left edge — so the highlight
|
|
387
|
+
// reads as terminating at the disabled gap rather than running square-edged
|
|
388
|
+
// into it.
|
|
389
|
+
const disableJan13 = (d: Date) =>
|
|
390
|
+
!(d.getFullYear() === 2026 && d.getMonth() === 0 && d.getDate() === 13);
|
|
391
|
+
render(
|
|
392
|
+
<Calendar
|
|
393
|
+
mode="range"
|
|
394
|
+
value={{start: '2026-01-10', end: '2026-01-15'}}
|
|
395
|
+
focusDate="2026-01-01"
|
|
396
|
+
dateConstraints={[disableJan13]}
|
|
397
|
+
/>,
|
|
398
|
+
);
|
|
399
|
+
|
|
400
|
+
// The range background is an absolutely-positioned sibling div inside the
|
|
401
|
+
// same gridcell as the day button.
|
|
402
|
+
const rangeBgFor = (day: number): HTMLElement => {
|
|
403
|
+
const button = getDayButton(day);
|
|
404
|
+
const cell = button.closest('[role="gridcell"]') as HTMLElement;
|
|
405
|
+
// First child div is the range background (rendered before the button).
|
|
406
|
+
return cell.firstElementChild as HTMLElement;
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
const day12Bg = rangeBgFor(12);
|
|
410
|
+
const day14Bg = rangeBgFor(14);
|
|
411
|
+
|
|
412
|
+
// Capped edges have a border radius; the un-capped edge stays square.
|
|
413
|
+
expect(getComputedStyle(day12Bg).borderTopRightRadius).not.toBe('');
|
|
414
|
+
expect(getComputedStyle(day12Bg).borderTopRightRadius).not.toBe('0px');
|
|
415
|
+
expect(getComputedStyle(day14Bg).borderTopLeftRadius).not.toBe('');
|
|
416
|
+
expect(getComputedStyle(day14Bg).borderTopLeftRadius).not.toBe('0px');
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
it('does not range-highlight adjacent-month spillover days in two-month view', () => {
|
|
420
|
+
// #2715: with July 1–31 selected and July+August visible, July 26–31 also
|
|
421
|
+
// render as outside days in the August pane. Those spillover copies must
|
|
422
|
+
// not carry the range-highlight state (data-in-range) even though their
|
|
423
|
+
// dates fall inside the selected range.
|
|
424
|
+
render(
|
|
425
|
+
<Calendar
|
|
426
|
+
mode="range"
|
|
427
|
+
numberOfMonths={2}
|
|
428
|
+
focusDate="2026-07-01"
|
|
429
|
+
value={{start: '2026-07-01', end: '2026-07-31'}}
|
|
430
|
+
/>,
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
const spillover = [
|
|
434
|
+
'2026-07-26',
|
|
435
|
+
'2026-07-27',
|
|
436
|
+
'2026-07-28',
|
|
437
|
+
'2026-07-29',
|
|
438
|
+
'2026-07-30',
|
|
439
|
+
'2026-07-31',
|
|
440
|
+
];
|
|
441
|
+
|
|
442
|
+
const allDayButtons = Array.from(
|
|
443
|
+
document.querySelectorAll<HTMLButtonElement>('button[data-date]'),
|
|
444
|
+
);
|
|
445
|
+
|
|
446
|
+
for (const iso of spillover) {
|
|
447
|
+
const matches = allDayButtons.filter(
|
|
448
|
+
b => b.getAttribute('data-date') === iso,
|
|
449
|
+
);
|
|
450
|
+
// Renders once in the July pane and once as a spillover in August.
|
|
451
|
+
expect(matches.length).toBeGreaterThanOrEqual(2);
|
|
452
|
+
const outsideCopies = matches.filter(
|
|
453
|
+
b => b.getAttribute('aria-disabled') === 'true',
|
|
454
|
+
);
|
|
455
|
+
expect(outsideCopies.length).toBeGreaterThanOrEqual(1);
|
|
456
|
+
for (const b of outsideCopies) {
|
|
457
|
+
expect(b).not.toHaveAttribute('data-in-range');
|
|
458
|
+
}
|
|
459
|
+
}
|
|
316
460
|
});
|
|
317
461
|
|
|
318
462
|
// ─── Accessibility ───────────────────────────────────────────
|
|
@@ -397,12 +541,8 @@ describe('Calendar', () => {
|
|
|
397
541
|
it('has navigation buttons with accessible labels', () => {
|
|
398
542
|
render(<Calendar />);
|
|
399
543
|
|
|
400
|
-
expect(
|
|
401
|
-
|
|
402
|
-
).toBeInTheDocument();
|
|
403
|
-
expect(
|
|
404
|
-
screen.getByRole('button', {name: 'Next month'}),
|
|
405
|
-
).toBeInTheDocument();
|
|
544
|
+
expect(getButton('Previous month')).toBeInTheDocument();
|
|
545
|
+
expect(getButton('Next month')).toBeInTheDocument();
|
|
406
546
|
});
|
|
407
547
|
|
|
408
548
|
// ─── Bug Regression Tests ───────────────────────────────────
|
|
@@ -510,14 +650,14 @@ describe('Calendar', () => {
|
|
|
510
650
|
it('prev button is disabled when focusDate month contains min', () => {
|
|
511
651
|
render(<Calendar focusDate="2026-01-01" min="2026-01-15" />);
|
|
512
652
|
|
|
513
|
-
const prevButton =
|
|
653
|
+
const prevButton = getButton('Previous month');
|
|
514
654
|
expect(prevButton).toBeDisabled();
|
|
515
655
|
});
|
|
516
656
|
|
|
517
657
|
it('next button is disabled when focusDate month contains max', () => {
|
|
518
658
|
render(<Calendar focusDate="2026-01-01" max="2026-01-15" />);
|
|
519
659
|
|
|
520
|
-
const nextButton =
|
|
660
|
+
const nextButton = getButton('Next month');
|
|
521
661
|
expect(nextButton).toBeDisabled();
|
|
522
662
|
});
|
|
523
663
|
|
|
@@ -596,4 +736,48 @@ describe('Calendar', () => {
|
|
|
596
736
|
}
|
|
597
737
|
}
|
|
598
738
|
});
|
|
739
|
+
|
|
740
|
+
// ─── RTL (#3388) ─────────────────────────────────────────────
|
|
741
|
+
|
|
742
|
+
describe('RTL month navigation', () => {
|
|
743
|
+
// jsdom does not apply compiled StyleX CSS, so the scaleX(-1) mirror
|
|
744
|
+
// itself is only observable in a browser (see the dir="rtl" Storybook
|
|
745
|
+
// story). These tests pin the structure the fix depends on: both nav
|
|
746
|
+
// chevrons render inside the navIcon wrapper that carries the
|
|
747
|
+
// ':is([dir="rtl"] *)' conditional transform.
|
|
748
|
+
it('wraps both nav chevrons in the RTL-mirroring navIcon wrapper', () => {
|
|
749
|
+
render(<Calendar focusDate="2026-01-01" />);
|
|
750
|
+
|
|
751
|
+
const {className: navIconClass} = stylex.props(calendarStyles.navIcon);
|
|
752
|
+
expect(navIconClass).toBeTruthy();
|
|
753
|
+
|
|
754
|
+
for (const name of ['Previous month', 'Next month']) {
|
|
755
|
+
const button = getButton(name);
|
|
756
|
+
const wrappers = Array.from(button.querySelectorAll('span')).filter(
|
|
757
|
+
span => span.className === navIconClass,
|
|
758
|
+
);
|
|
759
|
+
expect(wrappers.length).toBe(1);
|
|
760
|
+
}
|
|
761
|
+
});
|
|
762
|
+
|
|
763
|
+
it('keeps navigation semantics unchanged under dir="rtl"', async () => {
|
|
764
|
+
const user = userEvent.setup();
|
|
765
|
+
|
|
766
|
+
render(
|
|
767
|
+
<div dir="rtl">
|
|
768
|
+
<Calendar focusDate="2026-02-01" />
|
|
769
|
+
</div>,
|
|
770
|
+
);
|
|
771
|
+
|
|
772
|
+
expect(screen.getByText('February 2026')).toBeInTheDocument();
|
|
773
|
+
|
|
774
|
+
// DOM order and handlers must not change in RTL: flexbox already
|
|
775
|
+
// places "Previous month" at the visual right; only the glyph mirrors.
|
|
776
|
+
await user.click(getButton('Previous month'));
|
|
777
|
+
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
778
|
+
|
|
779
|
+
await user.click(getButton('Next month'));
|
|
780
|
+
expect(screen.getByText('February 2026')).toBeInTheDocument();
|
|
781
|
+
});
|
|
782
|
+
});
|
|
599
783
|
});
|
|
@@ -61,7 +61,9 @@ import {
|
|
|
61
61
|
computeDayCellState,
|
|
62
62
|
computeRangeRounding,
|
|
63
63
|
computePreviewRounding,
|
|
64
|
+
computeDayNeighborContinuity,
|
|
64
65
|
isEndpoint,
|
|
66
|
+
type DayNeighborContinuity,
|
|
65
67
|
} from './dayCellUtils';
|
|
66
68
|
|
|
67
69
|
// =============================================================================
|
|
@@ -201,7 +203,7 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
201
203
|
value,
|
|
202
204
|
defaultValue,
|
|
203
205
|
onChange,
|
|
204
|
-
numberOfMonths = 1,
|
|
206
|
+
numberOfMonths: numberOfMonthsProp = 1,
|
|
205
207
|
min,
|
|
206
208
|
max,
|
|
207
209
|
dateConstraints,
|
|
@@ -221,6 +223,11 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
221
223
|
// DayOfWeek so all downstream date math keeps working with an index.
|
|
222
224
|
const weekStartsOn = normalizeDayOfWeek(weekStartsOnProp);
|
|
223
225
|
|
|
226
|
+
// `numberOfMonths` is typed `1 | 2`; defensively clamp anything else that
|
|
227
|
+
// slips through at runtime to 1 so `Array.from({length})` can't render an
|
|
228
|
+
// absurd number of month grids (e.g. `numberOfMonths={1000}`).
|
|
229
|
+
const numberOfMonths = numberOfMonthsProp === 2 ? 2 : 1;
|
|
230
|
+
|
|
224
231
|
// Today's date (memoized)
|
|
225
232
|
const today = useMemo(() => plainDateToday(), []);
|
|
226
233
|
|
|
@@ -424,7 +431,14 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
424
431
|
<Button
|
|
425
432
|
label="Previous month"
|
|
426
433
|
variant="ghost"
|
|
427
|
-
icon={
|
|
434
|
+
icon={
|
|
435
|
+
// Wrapper span (not Icon props): Icon's string mode clobbers
|
|
436
|
+
// caller classNames, so the RTL mirror must live on its own
|
|
437
|
+
// element.
|
|
438
|
+
<span {...stylex.props(calendarStyles.navIcon)}>
|
|
439
|
+
<Icon icon="chevronLeft" size="sm" color="inherit" />
|
|
440
|
+
</span>
|
|
441
|
+
}
|
|
428
442
|
onClick={() => navigateMonth(-1)}
|
|
429
443
|
isDisabled={!canNavigatePrevious}
|
|
430
444
|
isIconOnly
|
|
@@ -437,7 +451,11 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
437
451
|
<Button
|
|
438
452
|
label="Next month"
|
|
439
453
|
variant="ghost"
|
|
440
|
-
icon={
|
|
454
|
+
icon={
|
|
455
|
+
<span {...stylex.props(calendarStyles.navIcon)}>
|
|
456
|
+
<Icon icon="chevronRight" size="sm" color="inherit" />
|
|
457
|
+
</span>
|
|
458
|
+
}
|
|
441
459
|
onClick={() => navigateMonth(1)}
|
|
442
460
|
isDisabled={!canNavigateNext}
|
|
443
461
|
isIconOnly
|
|
@@ -784,25 +802,42 @@ function MonthGrid({
|
|
|
784
802
|
{weekNum}
|
|
785
803
|
</div>
|
|
786
804
|
)}
|
|
787
|
-
{week.map((day, dayIndex) =>
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
isDisabled
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
805
|
+
{week.map((day, dayIndex) => {
|
|
806
|
+
// Whether the previous/next day in this week row continues the
|
|
807
|
+
// highlighted run (range and preview). A disabled or
|
|
808
|
+
// adjacent-month neighbour breaks continuity, so this day gets
|
|
809
|
+
// an end cap on that side (#2715).
|
|
810
|
+
const neighbors = computeDayNeighborContinuity({
|
|
811
|
+
week,
|
|
812
|
+
dayIndex,
|
|
813
|
+
mode,
|
|
814
|
+
rangeStart,
|
|
815
|
+
rangeEnd,
|
|
816
|
+
previewStart,
|
|
817
|
+
previewEnd,
|
|
818
|
+
isDisabled: isDateDisabled,
|
|
819
|
+
});
|
|
820
|
+
return (
|
|
821
|
+
<DayCell
|
|
822
|
+
key={day.iso}
|
|
823
|
+
day={day}
|
|
824
|
+
dayIndex={dayIndex}
|
|
825
|
+
mode={mode}
|
|
826
|
+
selectedDate={selectedDate}
|
|
827
|
+
rangeStart={rangeStart}
|
|
828
|
+
rangeEnd={rangeEnd}
|
|
829
|
+
previewStart={previewStart}
|
|
830
|
+
previewEnd={previewEnd}
|
|
831
|
+
today={today}
|
|
832
|
+
hasOutsideDays={hasOutsideDays}
|
|
833
|
+
isDisabled={isDateDisabled(day.date)}
|
|
834
|
+
neighbors={neighbors}
|
|
835
|
+
isTabbable={day.iso === seedTabbableIso}
|
|
836
|
+
onDayClick={onDayClick}
|
|
837
|
+
onDayHover={onDayHover}
|
|
838
|
+
/>
|
|
839
|
+
);
|
|
840
|
+
})}
|
|
806
841
|
</div>
|
|
807
842
|
);
|
|
808
843
|
})}
|
|
@@ -827,6 +862,12 @@ interface DayCellProps {
|
|
|
827
862
|
today: PlainDate;
|
|
828
863
|
hasOutsideDays: boolean;
|
|
829
864
|
isDisabled: boolean;
|
|
865
|
+
/**
|
|
866
|
+
* Whether the previous/next day in the same week continues the highlighted
|
|
867
|
+
* run (range and preview). When a neighbour is disabled or outside the month
|
|
868
|
+
* it breaks the run, so this day gets an end cap on that side (#2715).
|
|
869
|
+
*/
|
|
870
|
+
neighbors: DayNeighborContinuity;
|
|
830
871
|
/**
|
|
831
872
|
* Whether this day seeds the initial roving tab stop. useGridFocus
|
|
832
873
|
* (`hasRovingTabIndex`) owns the live tab stop thereafter — it honors an
|
|
@@ -849,6 +890,7 @@ function DayCell({
|
|
|
849
890
|
today,
|
|
850
891
|
hasOutsideDays,
|
|
851
892
|
isDisabled,
|
|
893
|
+
neighbors,
|
|
852
894
|
isTabbable: isTabbableDay,
|
|
853
895
|
onDayClick,
|
|
854
896
|
onDayHover,
|
|
@@ -876,11 +918,20 @@ function DayCell({
|
|
|
876
918
|
});
|
|
877
919
|
|
|
878
920
|
const endpoint = isEndpoint(state);
|
|
879
|
-
const rangeRounding = computeRangeRounding(state
|
|
880
|
-
|
|
921
|
+
const rangeRounding = computeRangeRounding(state, {
|
|
922
|
+
prevInRange: neighbors.prevInRange,
|
|
923
|
+
nextInRange: neighbors.nextInRange,
|
|
924
|
+
});
|
|
925
|
+
const previewRounding = computePreviewRounding(state, {
|
|
926
|
+
prevInPreview: neighbors.prevInPreview,
|
|
927
|
+
nextInPreview: neighbors.nextInPreview,
|
|
928
|
+
});
|
|
881
929
|
|
|
882
930
|
return (
|
|
883
|
-
<div
|
|
931
|
+
<div
|
|
932
|
+
role="gridcell"
|
|
933
|
+
aria-selected={state.isSelected || state.isInRange || undefined}
|
|
934
|
+
{...stylex.props(dayCellStyles.cell)}>
|
|
884
935
|
{/* Range background */}
|
|
885
936
|
{state.isInRange && (
|
|
886
937
|
<div
|
|
@@ -920,8 +971,10 @@ function DayCell({
|
|
|
920
971
|
type="button"
|
|
921
972
|
data-date={day.iso}
|
|
922
973
|
aria-label={plainDateFormat(date, DATE_FORMAT_WITH_WEEKDAY)}
|
|
923
|
-
aria-selected={state.isSelected || state.isInRange || undefined}
|
|
924
974
|
aria-disabled={state.effectivelyDisabled || undefined}
|
|
975
|
+
// Mark today's cell programmatically (APG date-picker pattern), not just
|
|
976
|
+
// visually, so screen-reader users can identify the current date.
|
|
977
|
+
aria-current={state.isToday ? 'date' : undefined}
|
|
925
978
|
disabled={isDisabled}
|
|
926
979
|
// Initial roving tab-stop seed; useGridFocus owns it after mount.
|
|
927
980
|
tabIndex={isTabbableDay ? 0 : -1}
|