@astryxdesign/core 0.1.9 → 0.2.0-canary.068bda9
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 +107 -0
- package/dist/Avatar/Avatar.d.ts +42 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +190 -59
- package/dist/Avatar/AvatarStatusDot.d.ts +6 -4
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -2
- package/dist/Banner/Banner.js +2 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -4
- package/dist/Breadcrumbs/index.d.ts +1 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +2 -1
- package/dist/Button/Button.d.ts +1 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +6 -4
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +50 -9
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +2 -2
- package/dist/Calendar/styles.d.ts +30 -31
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +30 -31
- package/dist/Card/Card.js +1 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +22 -12
- package/dist/Chat/ChatComposerInput.js +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +3 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
- package/dist/Chat/ChatMessageBubble.js +8 -8
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +10 -3
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -6
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +19 -4
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +16 -10
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +42 -3
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +23 -5
- package/dist/ContextMenu/index.d.ts +1 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +3 -1
- package/dist/DateInput/DateInput.d.ts +10 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +33 -19
- package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +23 -20
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +23 -18
- package/dist/Divider/Divider.d.ts +2 -2
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +13 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +22 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +3 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +435 -0
- package/dist/DropdownMenu/index.d.ts +10 -0
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +13 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +24 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +34 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemRoles.js +10 -1
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -6
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +4 -1
- package/dist/Field/FieldLabel.d.ts +2 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -5
- package/dist/Field/inputStyles.stylex.d.ts +1 -0
- package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
- package/dist/Field/inputStyles.stylex.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +10 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +51 -5
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +93 -65
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +3 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +10 -4
- package/dist/Icon/Icon.d.ts +15 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +16 -3
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +31 -6
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +10 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +34 -15
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +6 -3
- package/dist/List/ListItem.d.ts +11 -1
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +2 -0
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MetadataList/MetadataList.d.ts +1 -1
- package/dist/MetadataList/MetadataList.d.ts.map +1 -1
- package/dist/MetadataList/MetadataList.js +4 -2
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +81 -43
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +10 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +22 -17
- package/dist/Outline/Outline.js +2 -2
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +6 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +5 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +49 -19
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -3
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +66 -17
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +5 -5
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +13 -10
- package/dist/SideNav/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +2 -2
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +87 -34
- package/dist/Spinner/Spinner.d.ts +3 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +11 -2
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +171 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabList.d.ts +2 -11
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +5 -9
- package/dist/TabList/TabListContext.d.ts +0 -5
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +0 -5
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +30 -4
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +37 -27
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +3 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +15 -7
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +29 -23
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Text/Text.d.ts +10 -1
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +25 -2
- package/dist/Text/index.d.ts +2 -2
- package/dist/Text/index.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +119 -52
- package/dist/TextInput/TextInput.d.ts +10 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -17
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +51 -45
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +17 -17
- package/dist/Timestamp/Timestamp.d.ts +31 -3
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +48 -77
- package/dist/Timestamp/formatInstant.d.ts +41 -0
- package/dist/Timestamp/formatInstant.d.ts.map +1 -0
- package/dist/Timestamp/formatInstant.js +177 -0
- package/dist/Timestamp/index.d.ts +1 -0
- package/dist/Timestamp/index.d.ts.map +1 -1
- package/dist/Timestamp/tooltipEntries.d.ts +56 -0
- package/dist/Timestamp/tooltipEntries.d.ts.map +1 -0
- package/dist/Timestamp/tooltipEntries.js +163 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +61 -9
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +3 -1
- package/dist/Token/Token.d.ts +34 -4
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +85 -45
- package/dist/Token/TokenLink.d.ts +62 -0
- package/dist/Token/TokenLink.d.ts.map +1 -0
- package/dist/Token/TokenLink.js +76 -0
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +9 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +4 -2
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavItem.d.ts +3 -1
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +30 -3
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +9 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +1 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +8 -6
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +32 -14
- package/dist/Typeahead/BaseTypeahead.d.ts +9 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +22 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +11 -2
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +20 -10
- package/dist/astryx.css +114 -35
- package/dist/astryx.umd.js +50 -50
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.pool.stylex.d.ts +281 -0
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.pool.stylex.js +281 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useAnnounce.d.ts +3 -0
- package/dist/hooks/useAnnounce.d.ts.map +1 -1
- package/dist/hooks/useAnnounce.js +39 -1
- package/dist/hooks/useContainerReveal.d.ts +83 -0
- package/dist/hooks/useContainerReveal.d.ts.map +1 -0
- package/dist/hooks/useContainerReveal.js +123 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +52 -11
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useHotkeys.d.ts +9 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +9 -0
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +169 -0
- package/dist/hooks/useKeyboardHint.d.ts +1 -1
- package/dist/hooks/useKeyboardHint.d.ts.map +1 -1
- package/dist/hooks/useKeyboardHint.js +4 -2
- package/dist/hooks/useListFocus.d.ts +39 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +54 -9
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/index.d.ts +3 -3
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/types.d.ts +39 -2
- package/dist/theme/types.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/plainDate.d.ts +17 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +23 -4
- package/dist/utils/rtlStyles.d.ts +24 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -0
- package/dist/utils/rtlStyles.js +27 -0
- package/locales/en.json +120 -0
- package/locales/pseudo.json +90 -0
- package/package.json +7 -2
- package/src/Avatar/Avatar.doc.mjs +50 -3
- package/src/Avatar/Avatar.test.tsx +218 -0
- package/src/Avatar/Avatar.tsx +285 -79
- package/src/Avatar/AvatarStatusDot.doc.mjs +4 -4
- package/src/Avatar/AvatarStatusDot.tsx +6 -4
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +162 -2
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +5 -2
- package/src/Banner/Banner.tsx +6 -6
- package/src/Breadcrumbs/BreadcrumbItem.tsx +10 -10
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +52 -1
- package/src/Breadcrumbs/index.ts +4 -0
- package/src/Button/Button.doc.mjs +0 -4
- package/src/Button/Button.test.tsx +16 -0
- package/src/Button/Button.tsx +6 -4
- package/src/Calendar/Calendar.test.tsx +170 -20
- package/src/Calendar/Calendar.tsx +73 -16
- package/src/Calendar/dayCellUtils.test.ts +18 -18
- package/src/Calendar/dayCellUtils.ts +2 -2
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.tsx +1 -1
- package/src/Carousel/Carousel.tsx +25 -6
- package/src/Chat/ChatComposer.doc.mjs +2 -2
- package/src/Chat/ChatComposerInput.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.tsx +2 -2
- package/src/Chat/ChatDictationButton.tsx +7 -1
- package/src/Chat/ChatLayout.tsx +4 -4
- package/src/Chat/ChatMessageBubble.tsx +15 -10
- package/src/Chat/ChatSystemMessage.test.tsx +5 -0
- package/src/Chat/ChatToolCalls.tsx +9 -2
- package/src/Chat/useTriggerMenu.tsx +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +23 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -6
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +94 -3
- package/src/CheckboxList/CheckboxListItem.tsx +17 -10
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/CodeBlock/CodeBlock.test.tsx +17 -0
- package/src/CodeBlock/CodeBlock.tsx +38 -11
- package/src/Collapsible/Collapsible.doc.mjs +1 -0
- package/src/Collapsible/Collapsible.test.tsx +7 -0
- package/src/Collapsible/Collapsible.tsx +16 -6
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +41 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +59 -2
- package/src/ContextMenu/ContextMenu.tsx +22 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +25 -0
- package/src/DateInput/DateInput.test.tsx +230 -0
- package/src/DateInput/DateInput.tsx +51 -29
- package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
- package/src/DateRangeInput/DateRangeInput.tsx +42 -30
- package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +112 -0
- package/src/DateTimeInput/DateTimeInput.tsx +44 -39
- package/src/Divider/Divider.test.tsx +32 -8
- package/src/Divider/Divider.tsx +14 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +60 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +4 -12
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +9 -10
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +20 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +663 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +561 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +40 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.doc.mjs +4 -0
- package/src/Field/Field.tsx +14 -9
- package/src/Field/FieldLabel.test.tsx +25 -0
- package/src/Field/FieldLabel.tsx +12 -3
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +1 -0
- package/src/FieldStatus/FieldStatus.test.tsx +133 -0
- package/src/FieldStatus/FieldStatus.tsx +61 -4
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +104 -13
- package/src/FileInput/FileInput.tsx +106 -79
- package/src/Heading/Heading.tsx +2 -1
- package/src/HoverCard/useHoverCard.tsx +15 -3
- package/src/Icon/Icon.doc.mjs +13 -0
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +51 -3
- package/src/Item/Item.doc.mjs +5 -0
- package/src/Item/Item.test.tsx +88 -0
- package/src/Item/Item.tsx +57 -11
- package/src/Layer/layerAnimations.stylex.ts +23 -0
- package/src/Lightbox/Lightbox.test.tsx +33 -0
- package/src/Lightbox/Lightbox.tsx +30 -10
- package/src/List/List.test.tsx +17 -29
- package/src/List/List.tsx +6 -1
- package/src/List/ListItem.doc.mjs +12 -0
- package/src/List/ListItem.tsx +13 -0
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MetadataList/MetadataList.test.tsx +24 -0
- package/src/MetadataList/MetadataList.tsx +6 -2
- package/src/MultiSelector/MultiSelector.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.test.tsx +402 -0
- package/src/MultiSelector/MultiSelector.tsx +126 -64
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +71 -0
- package/src/NumberInput/NumberInput.tsx +35 -26
- package/src/Outline/Outline.test.tsx +12 -12
- package/src/Outline/Outline.tsx +2 -2
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
- package/src/PowerSearch/PowerSearch.test.tsx +23 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/ProgressBar/ProgressBar.test.tsx +34 -0
- package/src/ProgressBar/ProgressBar.tsx +16 -1
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.test.tsx +26 -4
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +12 -5
- package/src/Resizable/ResizeHandle.test.tsx +94 -0
- package/src/Resizable/ResizeHandle.tsx +70 -20
- package/src/SegmentedControl/SegmentedControl.test.tsx +28 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +22 -2
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +370 -0
- package/src/Selector/Selector.tsx +88 -20
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +9 -7
- package/src/SideNav/SideNavItem.tsx +5 -3
- package/src/Skeleton/Skeleton.test.tsx +16 -0
- package/src/Skeleton/Skeleton.tsx +13 -1
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +240 -12
- package/src/Slider/Slider.tsx +96 -23
- package/src/Spinner/Spinner.test.tsx +10 -8
- package/src/Spinner/Spinner.tsx +15 -5
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +111 -0
- package/src/Switch/Switch.tsx +149 -32
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabList.doc.mjs +0 -6
- package/src/TabList/TabList.test.tsx +3 -15
- package/src/TabList/TabList.tsx +6 -17
- package/src/TabList/TabListContext.ts +0 -6
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +34 -2
- package/src/Table/Table.doc.mjs +11 -0
- package/src/Table/Table.test.tsx +85 -0
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +9 -6
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +19 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +27 -18
- package/src/Table/plugins/selection/useTableSelection.test.tsx +61 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +3 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +38 -9
- package/src/Table/plugins/tree/useTableTreeData.tsx +17 -13
- package/src/Table/types.ts +33 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Text/Heading.doc.mjs +3 -3
- package/src/Text/Text.doc.mjs +1 -1
- package/src/Text/Text.test.tsx +42 -0
- package/src/Text/Text.tsx +25 -1
- package/src/Text/index.ts +2 -6
- package/src/TextArea/TextArea.doc.mjs +23 -2
- package/src/TextArea/TextArea.test.tsx +132 -4
- package/src/TextArea/TextArea.tsx +161 -67
- package/src/TextInput/TextInput.doc.mjs +21 -0
- package/src/TextInput/TextInput.test.tsx +150 -0
- package/src/TextInput/TextInput.tsx +28 -25
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/Thumbnail/Thumbnail.test.tsx +24 -1
- package/src/Thumbnail/Thumbnail.tsx +28 -35
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +23 -0
- package/src/TimeInput/TimeInput.tsx +24 -25
- package/src/Timestamp/Timestamp.doc.mjs +32 -6
- package/src/Timestamp/Timestamp.test.tsx +371 -0
- package/src/Timestamp/Timestamp.tsx +96 -93
- package/src/Timestamp/formatInstant.ts +218 -0
- package/src/Timestamp/index.ts +4 -0
- package/src/Timestamp/tooltipEntries.test.ts +552 -0
- package/src/Timestamp/tooltipEntries.ts +210 -0
- package/src/Toast/ToastViewport.test.tsx +218 -8
- package/src/Toast/ToastViewport.tsx +71 -12
- package/src/ToggleButton/ToggleButton.test.tsx +24 -0
- package/src/ToggleButton/ToggleButton.tsx +19 -1
- package/src/Token/Token.test.tsx +166 -15
- package/src/Token/Token.tsx +104 -47
- package/src/Token/TokenLink.tsx +107 -0
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +23 -1
- package/src/Tokenizer/Tokenizer.test.tsx +23 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +93 -2
- package/src/TopNav/TopNavItem.doc.mjs +3 -3
- package/src/TopNav/TopNavItem.tsx +35 -6
- package/src/TopNav/TopNavMegaMenu.tsx +26 -2
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +1 -1
- package/src/TreeList/TreeList.doc.mjs +6 -0
- package/src/TreeList/TreeList.test.tsx +50 -10
- package/src/TreeList/TreeList.tsx +5 -0
- package/src/TreeList/TreeListBranches.tsx +8 -6
- package/src/TreeList/TreeListItem.tsx +33 -11
- package/src/Typeahead/BaseTypeahead.tsx +42 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +112 -0
- package/src/Typeahead/Typeahead.tsx +17 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/babelPluginAddExtensions.test.ts +190 -0
- package/src/__tests__/forcedColors.ts +60 -0
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/doc-mjs.d.ts +19 -0
- package/src/hooks/containerReveal.pool.stylex.ts +464 -0
- package/src/hooks/index.ts +13 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useAnnounce.test.tsx +75 -2
- package/src/hooks/useAnnounce.ts +47 -1
- package/src/hooks/useContainerReveal.test.tsx +116 -0
- package/src/hooks/useContainerReveal.ts +180 -0
- package/src/hooks/useFocusTrap.test.tsx +104 -0
- package/src/hooks/useFocusTrap.ts +61 -12
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useHotkeys.ts +9 -0
- package/src/hooks/useInputStatusIcon.test.tsx +221 -0
- package/src/hooks/useInputStatusIcon.tsx +235 -0
- package/src/hooks/useKeyboardHint.test.tsx +22 -0
- package/src/hooks/useKeyboardHint.tsx +6 -2
- package/src/hooks/useListFocus.doc.mjs +25 -3
- package/src/hooks/useListFocus.test.tsx +153 -1
- package/src/hooks/useListFocus.ts +102 -9
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +42 -0
- package/src/theme/index.ts +4 -8
- package/src/theme/types.ts +43 -13
- package/src/utils/index.ts +2 -0
- package/src/utils/plainDate.test.ts +24 -6
- package/src/utils/plainDate.ts +18 -4
- package/src/utils/rtlStyles.ts +27 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +0 -9
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +0 -1
- package/dist/Thumbnail/thumbnail.markers.stylex.js +0 -14
- package/src/Thumbnail/thumbnail.markers.stylex.ts +0 -12
|
@@ -19,6 +19,9 @@ import userEvent from '@testing-library/user-event';
|
|
|
19
19
|
import {getButton, queryButton} from '../__tests__/fastRoleQueries';
|
|
20
20
|
import {DateRangeInput} from './DateRangeInput';
|
|
21
21
|
import type {DateRange} from './DateRangeInput';
|
|
22
|
+
import {Icon} from '../Icon';
|
|
23
|
+
import {defineTheme} from '../theme/defineTheme';
|
|
24
|
+
import {generateThemeCSSFlat} from '../theme/generateThemeRules';
|
|
22
25
|
|
|
23
26
|
describe('DateRangeInput', () => {
|
|
24
27
|
it('renders with label', () => {
|
|
@@ -471,3 +474,140 @@ describe('DateRangeInput', () => {
|
|
|
471
474
|
});
|
|
472
475
|
});
|
|
473
476
|
});
|
|
477
|
+
|
|
478
|
+
describe('DateRangeInput statusVariant forwarding', () => {
|
|
479
|
+
it('defaults to attached (status renders with data-variant="attached")', () => {
|
|
480
|
+
const {container} = render(
|
|
481
|
+
<DateRangeInput
|
|
482
|
+
label="Range"
|
|
483
|
+
value={null}
|
|
484
|
+
onChange={() => {}}
|
|
485
|
+
status={{type: 'error', message: 'Required'}}
|
|
486
|
+
/>,
|
|
487
|
+
);
|
|
488
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
489
|
+
'data-variant',
|
|
490
|
+
'attached',
|
|
491
|
+
);
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
it('forwards statusVariant="detached" to the underlying Field status', () => {
|
|
495
|
+
const {container} = render(
|
|
496
|
+
<DateRangeInput
|
|
497
|
+
label="Range"
|
|
498
|
+
value={null}
|
|
499
|
+
onChange={() => {}}
|
|
500
|
+
status={{type: 'error', message: 'Required'}}
|
|
501
|
+
statusVariant="detached"
|
|
502
|
+
/>,
|
|
503
|
+
);
|
|
504
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
505
|
+
'data-variant',
|
|
506
|
+
'detached',
|
|
507
|
+
);
|
|
508
|
+
});
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
describe('DateRangeInput icon theme targets', () => {
|
|
512
|
+
const RANGE: DateRange = {start: '2026-03-15', end: '2026-03-22'};
|
|
513
|
+
|
|
514
|
+
// Resolve a glyph span (the astryx-icon element) inside a given button,
|
|
515
|
+
// independent of the theme target class.
|
|
516
|
+
const iconIn = (button: HTMLElement): HTMLElement => {
|
|
517
|
+
const icon = button.querySelector('.astryx-icon');
|
|
518
|
+
if (icon == null) {
|
|
519
|
+
throw new Error('icon not found');
|
|
520
|
+
}
|
|
521
|
+
return icon as HTMLElement;
|
|
522
|
+
};
|
|
523
|
+
|
|
524
|
+
it('renders astryx-date-range-input-clear-icon on the clear glyph', () => {
|
|
525
|
+
render(
|
|
526
|
+
<DateRangeInput
|
|
527
|
+
label="Range"
|
|
528
|
+
value={RANGE}
|
|
529
|
+
onChange={() => {}}
|
|
530
|
+
hasClear
|
|
531
|
+
/>,
|
|
532
|
+
);
|
|
533
|
+
// The stable target lands on the icon element itself (not the button), so a
|
|
534
|
+
// theme can restyle just this glyph (color, size, hover) via defineTheme —
|
|
535
|
+
// a button-level target could not reach the icon's own color/size.
|
|
536
|
+
const icon = iconIn(getButton('Clear Range'));
|
|
537
|
+
expect(icon).toHaveClass('astryx-date-range-input-clear-icon');
|
|
538
|
+
expect(icon).toHaveClass('astryx-icon');
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
it('renders astryx-date-range-input-toggle-icon on the calendar-toggle glyph, reflecting state', () => {
|
|
542
|
+
render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
|
|
543
|
+
const icon = iconIn(getButton('Open calendar'));
|
|
544
|
+
expect(icon).toHaveClass('astryx-date-range-input-toggle-icon');
|
|
545
|
+
expect(icon).toHaveClass('astryx-icon');
|
|
546
|
+
// Closed by default → data-state="collapsed".
|
|
547
|
+
expect(icon).toHaveAttribute('data-state', 'collapsed');
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
it('renders the default icons (secondary color, sm size) byte-identically', () => {
|
|
551
|
+
// Pixel-identical default guard: the glyphs must carry the exact same
|
|
552
|
+
// StyleX color/size classes as a standalone secondary/sm icon. The added
|
|
553
|
+
// target class is purely additive — it changes nothing until a theme
|
|
554
|
+
// targets it.
|
|
555
|
+
render(
|
|
556
|
+
<DateRangeInput
|
|
557
|
+
label="Range"
|
|
558
|
+
value={RANGE}
|
|
559
|
+
onChange={() => {}}
|
|
560
|
+
hasClear
|
|
561
|
+
/>,
|
|
562
|
+
);
|
|
563
|
+
const clearIcon = iconIn(getButton('Clear Range'));
|
|
564
|
+
|
|
565
|
+
const {container: refContainer} = render(
|
|
566
|
+
<Icon icon="close" size="sm" color="secondary" />,
|
|
567
|
+
);
|
|
568
|
+
const refIcon = refContainer.querySelector('.astryx-icon') as HTMLElement;
|
|
569
|
+
|
|
570
|
+
const styleClasses = (el: HTMLElement) =>
|
|
571
|
+
el.className
|
|
572
|
+
.split(' ')
|
|
573
|
+
.filter(
|
|
574
|
+
c =>
|
|
575
|
+
c !== 'astryx-date-range-input-clear-icon' &&
|
|
576
|
+
c !== 'astryx-date-range-input-toggle-icon',
|
|
577
|
+
)
|
|
578
|
+
.sort();
|
|
579
|
+
|
|
580
|
+
expect(styleClasses(clearIcon)).toEqual(styleClasses(refIcon));
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
it('exposes the icon targets so a theme reaches icon color, size, and hover', () => {
|
|
584
|
+
// jsdom cannot resolve the @layer cascade, so the DOM-class assertions
|
|
585
|
+
// above (targets land on the icon elements) plus this generation assertion
|
|
586
|
+
// (the theme emits same-element icon rules in @layer astryx-theme) together
|
|
587
|
+
// prove the seam: a same-element theme rule wins over the icon's own
|
|
588
|
+
// base-layer color/size.
|
|
589
|
+
const theme = defineTheme({
|
|
590
|
+
name: 'date-range-input-icon-test',
|
|
591
|
+
components: {
|
|
592
|
+
'date-range-input-clear-icon': {
|
|
593
|
+
base: {
|
|
594
|
+
width: '12px',
|
|
595
|
+
height: '12px',
|
|
596
|
+
fontSize: '12px',
|
|
597
|
+
color: 'var(--color-icon-secondary)',
|
|
598
|
+
':hover': {color: 'var(--color-icon-primary)'},
|
|
599
|
+
},
|
|
600
|
+
},
|
|
601
|
+
'date-range-input-toggle-icon': {
|
|
602
|
+
base: {width: '14px', height: '14px', fontSize: '14px'},
|
|
603
|
+
},
|
|
604
|
+
},
|
|
605
|
+
});
|
|
606
|
+
const css = generateThemeCSSFlat(theme);
|
|
607
|
+
expect(css).toContain('.astryx-date-range-input-clear-icon');
|
|
608
|
+
expect(css).toContain('.astryx-date-range-input-toggle-icon');
|
|
609
|
+
expect(css).toContain(':hover');
|
|
610
|
+
expect(css).toContain('12px');
|
|
611
|
+
expect(css).toContain('14px');
|
|
612
|
+
});
|
|
613
|
+
});
|
|
@@ -25,7 +25,6 @@ import {
|
|
|
25
25
|
DATE_FORMAT_SHORT,
|
|
26
26
|
DATE_FORMAT_SHORT_WITH_YEAR,
|
|
27
27
|
} from '../utils/plainDate';
|
|
28
|
-
import type {IconName} from '../Icon';
|
|
29
28
|
import {
|
|
30
29
|
colorVars,
|
|
31
30
|
sizeVars,
|
|
@@ -38,11 +37,11 @@ import {
|
|
|
38
37
|
import {
|
|
39
38
|
Field,
|
|
40
39
|
type InputStatus,
|
|
41
|
-
type InputStatusType,
|
|
42
40
|
inputWrapperStyles,
|
|
43
41
|
inputStatusBorderStyles,
|
|
44
42
|
inputStatusHoverShadowStyles,
|
|
45
43
|
inputStatusFocusWithinStyles,
|
|
44
|
+
type FieldStatusVariant,
|
|
46
45
|
} from '../Field';
|
|
47
46
|
import {Icon} from '../Icon';
|
|
48
47
|
import {Spinner} from '../Spinner';
|
|
@@ -53,6 +52,7 @@ import {mergeProps} from '../utils';
|
|
|
53
52
|
import type {BaseProps} from '../BaseProps';
|
|
54
53
|
import type {SizeValue} from '../utils/types';
|
|
55
54
|
import {useSize} from '../SizeContext/SizeContext';
|
|
55
|
+
import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
|
|
56
56
|
import {themeProps} from '../utils/themeProps';
|
|
57
57
|
import {useTranslator} from '../i18n';
|
|
58
58
|
|
|
@@ -127,9 +127,9 @@ const styles = stylex.create({
|
|
|
127
127
|
flexDirection: 'column',
|
|
128
128
|
gap: spacingVars['--spacing-1'],
|
|
129
129
|
padding: spacingVars['--spacing-3'],
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
130
|
+
borderInlineEndWidth: borderVars['--border-width'],
|
|
131
|
+
borderInlineEndStyle: 'solid',
|
|
132
|
+
borderInlineEndColor: colorVars['--color-border-emphasized'],
|
|
133
133
|
minWidth: 140,
|
|
134
134
|
},
|
|
135
135
|
presetButton: {
|
|
@@ -330,6 +330,14 @@ export interface DateRangeInputProps extends Omit<
|
|
|
330
330
|
* Status indicator for the input.
|
|
331
331
|
*/
|
|
332
332
|
status?: InputStatus;
|
|
333
|
+
/**
|
|
334
|
+
* How the status message is placed relative to the input.
|
|
335
|
+
* - 'attached': message overlaps directly below the input (bordered treatment)
|
|
336
|
+
* - 'detached': message floats below as a separate element with spacing
|
|
337
|
+
* - 'tooltip': no message box; the status icon becomes a focusable info-tip button that reveals the message on hover, keyboard focus, or tap
|
|
338
|
+
* @default 'attached'
|
|
339
|
+
*/
|
|
340
|
+
statusVariant?: FieldStatusVariant;
|
|
333
341
|
|
|
334
342
|
/**
|
|
335
343
|
* Width of the field. Numbers are treated as pixels, strings are used as-is
|
|
@@ -385,6 +393,7 @@ export function DateRangeInput({
|
|
|
385
393
|
placeholder: placeholderFromProps,
|
|
386
394
|
size: sizeProp,
|
|
387
395
|
status,
|
|
396
|
+
statusVariant = 'attached',
|
|
388
397
|
labelTooltip,
|
|
389
398
|
numberOfMonths = 2,
|
|
390
399
|
width,
|
|
@@ -422,25 +431,19 @@ export function DateRangeInput({
|
|
|
422
431
|
isEnabled: showsDisabledMessage,
|
|
423
432
|
});
|
|
424
433
|
|
|
425
|
-
const
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
const statusIconColorMap: Record<
|
|
432
|
-
InputStatusType,
|
|
433
|
-
'warning' | 'error' | 'success'
|
|
434
|
-
> = {
|
|
435
|
-
warning: 'warning',
|
|
436
|
-
error: 'error',
|
|
437
|
-
success: 'success',
|
|
438
|
-
};
|
|
434
|
+
const {statusIcon, describedBy: statusTooltipDescribedBy} =
|
|
435
|
+
useInputStatusIcon({
|
|
436
|
+
status,
|
|
437
|
+
statusVariant,
|
|
438
|
+
});
|
|
439
439
|
|
|
440
440
|
const ariaDescribedBy =
|
|
441
441
|
[
|
|
442
442
|
description ? descriptionID : null,
|
|
443
|
-
status?.message ? statusMessageID : null,
|
|
443
|
+
statusVariant !== 'tooltip' && status?.message ? statusMessageID : null,
|
|
444
|
+
// The tooltip variant renders no message box; describe the input by the
|
|
445
|
+
// tooltip's content instead so the status is still announced.
|
|
446
|
+
statusTooltipDescribedBy,
|
|
444
447
|
showsDisabledMessage ? disabledMessageTooltip.describedBy : null,
|
|
445
448
|
]
|
|
446
449
|
.filter(Boolean)
|
|
@@ -529,6 +532,7 @@ export function DateRangeInput({
|
|
|
529
532
|
}
|
|
530
533
|
: undefined
|
|
531
534
|
}
|
|
535
|
+
statusVariant={statusVariant}
|
|
532
536
|
labelTooltip={labelTooltip}
|
|
533
537
|
width={width}>
|
|
534
538
|
<div
|
|
@@ -550,7 +554,9 @@ export function DateRangeInput({
|
|
|
550
554
|
sizeStyles[size],
|
|
551
555
|
isEffectivelyDisabled && inputWrapperStyles.disabled,
|
|
552
556
|
status && inputStatusBorderStyles[status.type],
|
|
553
|
-
status &&
|
|
557
|
+
status &&
|
|
558
|
+
!isEffectivelyDisabled &&
|
|
559
|
+
inputStatusHoverShadowStyles[status.type],
|
|
554
560
|
status && inputStatusFocusWithinStyles[status.type],
|
|
555
561
|
xstyle,
|
|
556
562
|
),
|
|
@@ -571,7 +577,14 @@ export function DateRangeInput({
|
|
|
571
577
|
styles.iconButton,
|
|
572
578
|
isEffectivelyDisabled && styles.iconButtonDisabled,
|
|
573
579
|
)}>
|
|
574
|
-
<Icon
|
|
580
|
+
<Icon
|
|
581
|
+
icon="calendar"
|
|
582
|
+
size="sm"
|
|
583
|
+
color="secondary"
|
|
584
|
+
{...themeProps('date-range-input-toggle-icon', {
|
|
585
|
+
state: popover.isOpen ? 'expanded' : 'collapsed',
|
|
586
|
+
})}
|
|
587
|
+
/>
|
|
575
588
|
</button>
|
|
576
589
|
<button
|
|
577
590
|
ref={ref}
|
|
@@ -604,17 +617,16 @@ export function DateRangeInput({
|
|
|
604
617
|
onClick={handleClear}
|
|
605
618
|
aria-label={t('@astryx.dateInput.clear', {label})}
|
|
606
619
|
{...stylex.props(styles.iconButton)}>
|
|
607
|
-
<Icon
|
|
620
|
+
<Icon
|
|
621
|
+
icon="close"
|
|
622
|
+
size="sm"
|
|
623
|
+
color="secondary"
|
|
624
|
+
{...themeProps('date-range-input-clear-icon')}
|
|
625
|
+
/>
|
|
608
626
|
</button>
|
|
609
627
|
)}
|
|
610
628
|
{isBusy && <Spinner size="sm" />}
|
|
611
|
-
{
|
|
612
|
-
<Icon
|
|
613
|
-
icon={statusIconMap[status.type]}
|
|
614
|
-
size="md"
|
|
615
|
-
color={statusIconColorMap[status.type]}
|
|
616
|
-
/>
|
|
617
|
-
)}
|
|
629
|
+
{statusIcon}
|
|
618
630
|
</div>
|
|
619
631
|
{popover.render(
|
|
620
632
|
<div {...stylex.props(styles.popoverLayout)}>
|
|
@@ -173,6 +173,12 @@ export const docs = {
|
|
|
173
173
|
description: 'Number of months displayed simultaneously in the calendar.',
|
|
174
174
|
default: '1',
|
|
175
175
|
},
|
|
176
|
+
{
|
|
177
|
+
name: 'width',
|
|
178
|
+
type: 'SizeValue',
|
|
179
|
+
description:
|
|
180
|
+
'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
|
|
181
|
+
},
|
|
176
182
|
{
|
|
177
183
|
name: 'xstyle',
|
|
178
184
|
type: 'StyleXStyles',
|
|
@@ -183,6 +189,14 @@ export const docs = {
|
|
|
183
189
|
theming: {
|
|
184
190
|
targets: [
|
|
185
191
|
{className: 'astryx-date-time-input', visualProps: ['size', 'status']},
|
|
192
|
+
{
|
|
193
|
+
className: 'astryx-date-time-input-date-segment',
|
|
194
|
+
visualProps: ['size', 'status'],
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
className: 'astryx-date-time-input-time-segment',
|
|
198
|
+
visualProps: ['size', 'status'],
|
|
199
|
+
},
|
|
186
200
|
],
|
|
187
201
|
},
|
|
188
202
|
usage: {
|
|
@@ -469,11 +483,18 @@ export const docsZh = {
|
|
|
469
483
|
description:
|
|
470
484
|
'用于布局自定义的 StyleX 样式。必须是 stylex.create() 的值。',
|
|
471
485
|
},
|
|
472
|
-
|
|
473
486
|
],
|
|
474
487
|
theming: {
|
|
475
488
|
targets: [
|
|
476
489
|
{className: 'astryx-date-time-input', visualProps: ['size', 'status']},
|
|
490
|
+
{
|
|
491
|
+
className: 'astryx-date-time-input-date-segment',
|
|
492
|
+
visualProps: ['size', 'status'],
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
className: 'astryx-date-time-input-time-segment',
|
|
496
|
+
visualProps: ['size', 'status'],
|
|
497
|
+
},
|
|
477
498
|
],
|
|
478
499
|
},
|
|
479
500
|
};
|
|
@@ -15,6 +15,8 @@ import userEvent from '@testing-library/user-event';
|
|
|
15
15
|
import {getButton, queryButton} from '../__tests__/fastRoleQueries';
|
|
16
16
|
import {DateTimeInput} from './DateTimeInput';
|
|
17
17
|
import type {ISODateTimeString} from './DateTimeInput';
|
|
18
|
+
import {defineTheme} from '../theme/defineTheme';
|
|
19
|
+
import {generateThemeCSSFlat} from '../theme/generateThemeRules';
|
|
18
20
|
|
|
19
21
|
describe('DateTimeInput', () => {
|
|
20
22
|
it('renders with label', () => {
|
|
@@ -814,4 +816,114 @@ describe('DateTimeInput', () => {
|
|
|
814
816
|
expect(onChange.mock.calls[0][0]).toContain('14:31');
|
|
815
817
|
});
|
|
816
818
|
});
|
|
819
|
+
// ===========================================================================
|
|
820
|
+
// Segment theme targets (#4075)
|
|
821
|
+
// ===========================================================================
|
|
822
|
+
|
|
823
|
+
describe('segment theme targets', () => {
|
|
824
|
+
// The root only publishes `astryx-date-time-input`; the date and time
|
|
825
|
+
// wrappers were anonymous nodes carrying hashed atomic classes only, so a
|
|
826
|
+
// theme that restyles input geometry through the text-input/date-input/
|
|
827
|
+
// time-input targets could not reach them and DateTimeInput rendered
|
|
828
|
+
// shorter than every other input under that theme.
|
|
829
|
+
|
|
830
|
+
it('renders the date segment target on the date wrapper', () => {
|
|
831
|
+
render(<DateTimeInput label="Meeting" onChange={() => {}} />);
|
|
832
|
+
const wrapper = screen
|
|
833
|
+
.getByLabelText('Meeting')
|
|
834
|
+
.closest('.astryx-date-time-input-date-segment');
|
|
835
|
+
|
|
836
|
+
expect(wrapper).not.toBeNull();
|
|
837
|
+
// The wrapper is the input's own container, not an ancestor further up.
|
|
838
|
+
expect(wrapper).toBe(screen.getByLabelText('Meeting').parentElement);
|
|
839
|
+
});
|
|
840
|
+
|
|
841
|
+
it('renders the time segment target on the time wrapper', () => {
|
|
842
|
+
render(<DateTimeInput label="Meeting" onChange={() => {}} />);
|
|
843
|
+
const wrapper = screen
|
|
844
|
+
.getByLabelText('Meeting time')
|
|
845
|
+
.closest('.astryx-date-time-input-time-segment');
|
|
846
|
+
|
|
847
|
+
expect(wrapper).not.toBeNull();
|
|
848
|
+
expect(wrapper).toBe(screen.getByLabelText('Meeting time').parentElement);
|
|
849
|
+
});
|
|
850
|
+
|
|
851
|
+
it('reflects size on both segments so themes can restyle geometry', () => {
|
|
852
|
+
render(<DateTimeInput label="Meeting" size="lg" onChange={() => {}} />);
|
|
853
|
+
|
|
854
|
+
const date = screen
|
|
855
|
+
.getByLabelText('Meeting')
|
|
856
|
+
.closest('.astryx-date-time-input-date-segment');
|
|
857
|
+
const time = screen
|
|
858
|
+
.getByLabelText('Meeting time')
|
|
859
|
+
.closest('.astryx-date-time-input-time-segment');
|
|
860
|
+
|
|
861
|
+
expect(date).toHaveAttribute('data-size', 'lg');
|
|
862
|
+
expect(date).toHaveClass('lg');
|
|
863
|
+
expect(time).toHaveAttribute('data-size', 'lg');
|
|
864
|
+
expect(time).toHaveClass('lg');
|
|
865
|
+
});
|
|
866
|
+
|
|
867
|
+
it('reflects status on both segments, mirroring the root', () => {
|
|
868
|
+
render(
|
|
869
|
+
<DateTimeInput
|
|
870
|
+
label="Meeting"
|
|
871
|
+
status={{type: 'error', message: 'Required'}}
|
|
872
|
+
onChange={() => {}}
|
|
873
|
+
/>,
|
|
874
|
+
);
|
|
875
|
+
|
|
876
|
+
const date = screen
|
|
877
|
+
.getByLabelText('Meeting')
|
|
878
|
+
.closest('.astryx-date-time-input-date-segment');
|
|
879
|
+
const time = screen
|
|
880
|
+
.getByLabelText('Meeting time')
|
|
881
|
+
.closest('.astryx-date-time-input-time-segment');
|
|
882
|
+
|
|
883
|
+
expect(date).toHaveAttribute('data-status', 'error');
|
|
884
|
+
expect(time).toHaveAttribute('data-status', 'error');
|
|
885
|
+
});
|
|
886
|
+
|
|
887
|
+
it('omits data-status when there is no status, like the root does', () => {
|
|
888
|
+
render(<DateTimeInput label="Meeting" onChange={() => {}} />);
|
|
889
|
+
|
|
890
|
+
const date = screen
|
|
891
|
+
.getByLabelText('Meeting')
|
|
892
|
+
.closest('.astryx-date-time-input-date-segment');
|
|
893
|
+
|
|
894
|
+
expect(date).not.toHaveAttribute('data-status');
|
|
895
|
+
});
|
|
896
|
+
|
|
897
|
+
it('keeps the root target intact', () => {
|
|
898
|
+
const {container} = render(
|
|
899
|
+
<DateTimeInput label="Meeting" onChange={() => {}} />,
|
|
900
|
+
);
|
|
901
|
+
// Additive change — the existing root target still renders.
|
|
902
|
+
expect(container.querySelector('.astryx-date-time-input')).not.toBeNull();
|
|
903
|
+
});
|
|
904
|
+
|
|
905
|
+
it('exposes both segments as themeable defineTheme targets', () => {
|
|
906
|
+
// jsdom cannot resolve the @layer cascade, so the generated CSS is what
|
|
907
|
+
// proves a theme can actually reach these nodes.
|
|
908
|
+
const theme = defineTheme({
|
|
909
|
+
name: 'date-time-input-segments-test',
|
|
910
|
+
components: {
|
|
911
|
+
'date-time-input-date-segment': {
|
|
912
|
+
base: {blockSize: 'var(--size-element-lg)'},
|
|
913
|
+
lg: {paddingInline: 'var(--spacing-4)'},
|
|
914
|
+
},
|
|
915
|
+
'date-time-input-time-segment': {
|
|
916
|
+
base: {blockSize: 'var(--size-element-lg)'},
|
|
917
|
+
},
|
|
918
|
+
},
|
|
919
|
+
});
|
|
920
|
+
const css = generateThemeCSSFlat(theme);
|
|
921
|
+
|
|
922
|
+
expect(css).toContain('.astryx-date-time-input-date-segment {');
|
|
923
|
+
expect(css).toContain('.astryx-date-time-input-date-segment.lg');
|
|
924
|
+
expect(css).toContain('.astryx-date-time-input-time-segment {');
|
|
925
|
+
expect(css).toContain('block-size: var(--size-element-lg)');
|
|
926
|
+
expect(css).toContain('padding-inline: var(--spacing-4)');
|
|
927
|
+
});
|
|
928
|
+
});
|
|
817
929
|
});
|
|
@@ -27,7 +27,6 @@ import {
|
|
|
27
27
|
type KeyboardEvent,
|
|
28
28
|
} from 'react';
|
|
29
29
|
import * as stylex from '@stylexjs/stylex';
|
|
30
|
-
import type {IconName} from '../Icon';
|
|
31
30
|
import {
|
|
32
31
|
colorVars,
|
|
33
32
|
sizeVars,
|
|
@@ -40,7 +39,6 @@ import {
|
|
|
40
39
|
import {
|
|
41
40
|
Field,
|
|
42
41
|
type InputStatus,
|
|
43
|
-
type InputStatusType,
|
|
44
42
|
inputWrapperStyles,
|
|
45
43
|
inputStatusBorderStyles,
|
|
46
44
|
inputStatusHoverShadowStyles,
|
|
@@ -54,6 +52,7 @@ import {useCalendarConstraints} from '../Calendar/hooks';
|
|
|
54
52
|
import {usePopover} from '../Popover';
|
|
55
53
|
import {useTooltip} from '../Tooltip';
|
|
56
54
|
import {useInputContainer} from '../hooks/useInputContainer';
|
|
55
|
+
import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
|
|
57
56
|
import {
|
|
58
57
|
type ISOTimeString,
|
|
59
58
|
parseDateInput,
|
|
@@ -470,25 +469,21 @@ export function DateTimeInput({
|
|
|
470
469
|
isEnabled: showsDisabledMessage,
|
|
471
470
|
});
|
|
472
471
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
> = {
|
|
483
|
-
warning: 'warning',
|
|
484
|
-
error: 'error',
|
|
485
|
-
success: 'success',
|
|
486
|
-
};
|
|
472
|
+
// DateTimeInput fixes its status presentation to the detached message box,
|
|
473
|
+
// so the shared helper suppresses the on-field icon (the message box carries
|
|
474
|
+
// its own leading glyph). Routed through the helper for consistency with the
|
|
475
|
+
// rest of the bordered input family.
|
|
476
|
+
const {statusIcon, describedBy: statusTooltipDescribedBy} =
|
|
477
|
+
useInputStatusIcon({
|
|
478
|
+
status,
|
|
479
|
+
statusVariant: 'detached',
|
|
480
|
+
});
|
|
487
481
|
|
|
488
482
|
const ariaDescribedBy =
|
|
489
483
|
[
|
|
490
484
|
description ? descriptionID : null,
|
|
491
485
|
status?.message ? statusMessageID : null,
|
|
486
|
+
statusTooltipDescribedBy,
|
|
492
487
|
showsDisabledMessage ? disabledMessageTooltip.describedBy : null,
|
|
493
488
|
]
|
|
494
489
|
.filter(Boolean)
|
|
@@ -890,14 +885,22 @@ export function DateTimeInput({
|
|
|
890
885
|
{/* Date input */}
|
|
891
886
|
<div
|
|
892
887
|
ref={popover.triggerRef}
|
|
893
|
-
{...
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
888
|
+
{...mergeProps(
|
|
889
|
+
themeProps('date-time-input-date-segment', {
|
|
890
|
+
size,
|
|
891
|
+
status: status?.type ?? null,
|
|
892
|
+
}),
|
|
893
|
+
stylex.props(
|
|
894
|
+
inputWrapperStyles.base,
|
|
895
|
+
sizeStyles[size],
|
|
896
|
+
styles.dateWrapper,
|
|
897
|
+
isEffectivelyDisabled && inputWrapperStyles.disabled,
|
|
898
|
+
status && inputStatusBorderStyles[status.type],
|
|
899
|
+
status &&
|
|
900
|
+
!isEffectivelyDisabled &&
|
|
901
|
+
inputStatusHoverShadowStyles[status.type],
|
|
902
|
+
status && inputStatusFocusWithinStyles[status.type],
|
|
903
|
+
),
|
|
901
904
|
)}>
|
|
902
905
|
<button
|
|
903
906
|
type="button"
|
|
@@ -968,13 +971,7 @@ export function DateTimeInput({
|
|
|
968
971
|
</button>
|
|
969
972
|
)}
|
|
970
973
|
{isBusy && <Spinner size="sm" />}
|
|
971
|
-
{
|
|
972
|
-
<Icon
|
|
973
|
-
icon={statusIconMap[status.type]}
|
|
974
|
-
size="md"
|
|
975
|
-
color={statusIconColorMap[status.type]}
|
|
976
|
-
/>
|
|
977
|
-
)}
|
|
974
|
+
{statusIcon}
|
|
978
975
|
</div>
|
|
979
976
|
|
|
980
977
|
{/* Time input */}
|
|
@@ -982,14 +979,22 @@ export function DateTimeInput({
|
|
|
982
979
|
ref={timeContainerRef}
|
|
983
980
|
onClick={handleTimeWrapperClick}
|
|
984
981
|
onMouseUp={handleTimeWrapperMouseUp}
|
|
985
|
-
{...
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
982
|
+
{...mergeProps(
|
|
983
|
+
themeProps('date-time-input-time-segment', {
|
|
984
|
+
size,
|
|
985
|
+
status: status?.type ?? null,
|
|
986
|
+
}),
|
|
987
|
+
stylex.props(
|
|
988
|
+
inputWrapperStyles.base,
|
|
989
|
+
sizeStyles[size],
|
|
990
|
+
styles.timeWrapper,
|
|
991
|
+
isEffectivelyDisabled && inputWrapperStyles.disabled,
|
|
992
|
+
status && inputStatusBorderStyles[status.type],
|
|
993
|
+
status &&
|
|
994
|
+
!isEffectivelyDisabled &&
|
|
995
|
+
inputStatusHoverShadowStyles[status.type],
|
|
996
|
+
status && inputStatusFocusWithinStyles[status.type],
|
|
997
|
+
),
|
|
993
998
|
)}>
|
|
994
999
|
<div {...stylex.props(styles.icon)}>
|
|
995
1000
|
<Icon icon="clock" size="sm" color="secondary" />
|
|
@@ -89,25 +89,49 @@ describe('Divider', () => {
|
|
|
89
89
|
|
|
90
90
|
it('renders vertical divider with label', () => {
|
|
91
91
|
render(
|
|
92
|
-
<Divider
|
|
93
|
-
orientation="vertical"
|
|
94
|
-
label="Vertical"
|
|
95
|
-
data-testid="divider"
|
|
96
|
-
/>,
|
|
92
|
+
<Divider orientation="vertical" label="Vertical" data-testid="divider" />,
|
|
97
93
|
);
|
|
98
94
|
const divider = screen.getByTestId('divider');
|
|
99
95
|
expect(divider).toHaveAttribute('aria-orientation', 'vertical');
|
|
100
96
|
expect(screen.getByText('Vertical')).toBeInTheDocument();
|
|
101
97
|
});
|
|
102
98
|
|
|
103
|
-
it('
|
|
99
|
+
it('exposes the label as the accessible name of the separator', () => {
|
|
100
|
+
render(<Divider label="Section" data-testid="divider" />);
|
|
101
|
+
const divider = screen.getByTestId('divider');
|
|
102
|
+
expect(divider).toHaveAttribute('aria-labelledby');
|
|
103
|
+
expect(divider).toHaveAccessibleName('Section');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('names the separator from a ReactNode label via aria-labelledby', () => {
|
|
107
|
+
render(<Divider label={<span>Custom</span>} data-testid="divider" />);
|
|
108
|
+
expect(screen.getByTestId('divider')).toHaveAccessibleName('Custom');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('does not set aria-labelledby without a label', () => {
|
|
112
|
+
render(<Divider data-testid="divider" />);
|
|
113
|
+
expect(screen.getByTestId('divider')).not.toHaveAttribute(
|
|
114
|
+
'aria-labelledby',
|
|
115
|
+
);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('prefers an explicit aria-label over the rendered label', () => {
|
|
104
119
|
render(
|
|
105
120
|
<Divider
|
|
106
|
-
|
|
107
|
-
|
|
121
|
+
label="Section"
|
|
122
|
+
aria-label="Custom name"
|
|
108
123
|
data-testid="divider"
|
|
109
124
|
/>,
|
|
110
125
|
);
|
|
126
|
+
const divider = screen.getByTestId('divider');
|
|
127
|
+
expect(divider).toHaveAccessibleName('Custom name');
|
|
128
|
+
expect(divider).not.toHaveAttribute('aria-labelledby');
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('renders astryx-* class names for theme targeting', () => {
|
|
132
|
+
render(
|
|
133
|
+
<Divider variant="strong" orientation="vertical" data-testid="divider" />,
|
|
134
|
+
);
|
|
111
135
|
const root = screen.getByTestId('divider');
|
|
112
136
|
expect(root.className).toContain('astryx-divider');
|
|
113
137
|
expect(root.className).toContain('strong');
|