@astryxdesign/core 0.1.9 → 0.2.0-canary.136a00f
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 +427 -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 +23 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +33 -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 +39 -3
- 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/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 +19 -13
- 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 +80 -42
- 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/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +18 -19
- 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.js +2 -2
- 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 +47 -76
- 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/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 +70 -30
- package/dist/astryx.umd.js +51 -51
- package/dist/astryx.umd.js.map +4 -4
- 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/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/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 +158 -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/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 +112 -0
- package/locales/pseudo.json +84 -0
- package/package.json +6 -1
- 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 +635 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +39 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- 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.test.tsx +72 -0
- package/src/FieldStatus/FieldStatus.tsx +48 -2
- 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/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.tsx +15 -7
- 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 +120 -59
- 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/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +23 -0
- package/src/TextArea/TextArea.tsx +27 -26
- 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.tsx +1 -1
- 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/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__/forcedColors.ts +60 -0
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/doc-mjs.d.ts +19 -0
- package/src/hooks/index.ts +6 -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/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 +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -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/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
|
@@ -86,7 +86,7 @@ describe('Outline', () => {
|
|
|
86
86
|
render(<Outline items={items} activeId="install" />);
|
|
87
87
|
expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
|
|
88
88
|
'aria-current',
|
|
89
|
-
'
|
|
89
|
+
'location',
|
|
90
90
|
);
|
|
91
91
|
expect(
|
|
92
92
|
screen.getByRole('link', {name: 'Introduction'}),
|
|
@@ -111,7 +111,7 @@ describe('Outline', () => {
|
|
|
111
111
|
// so it has not moved to the clicked item yet.
|
|
112
112
|
expect(
|
|
113
113
|
screen.getByRole('link', {name: 'Installation'}),
|
|
114
|
-
).not.toHaveAttribute('aria-current', '
|
|
114
|
+
).not.toHaveAttribute('aria-current', 'location');
|
|
115
115
|
|
|
116
116
|
// When the scroll settles, the indicator lands on the clicked item.
|
|
117
117
|
act(() => {
|
|
@@ -120,7 +120,7 @@ describe('Outline', () => {
|
|
|
120
120
|
expect(onActiveIdChange).toHaveBeenCalledWith('install');
|
|
121
121
|
expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
|
|
122
122
|
'aria-current',
|
|
123
|
-
'
|
|
123
|
+
'location',
|
|
124
124
|
);
|
|
125
125
|
|
|
126
126
|
document.body.removeChild(target);
|
|
@@ -224,7 +224,7 @@ describe('Outline', () => {
|
|
|
224
224
|
|
|
225
225
|
expect(screen.getByRole('link', {name: 'Introduction'})).toHaveAttribute(
|
|
226
226
|
'aria-current',
|
|
227
|
-
'
|
|
227
|
+
'location',
|
|
228
228
|
);
|
|
229
229
|
|
|
230
230
|
// Controlled active id is driven entirely by the prop.
|
|
@@ -237,7 +237,7 @@ describe('Outline', () => {
|
|
|
237
237
|
);
|
|
238
238
|
expect(screen.getByRole('link', {name: 'API'})).toHaveAttribute(
|
|
239
239
|
'aria-current',
|
|
240
|
-
'
|
|
240
|
+
'location',
|
|
241
241
|
);
|
|
242
242
|
expect(
|
|
243
243
|
screen.getByRole('link', {name: 'Introduction'}),
|
|
@@ -277,7 +277,7 @@ describe('Outline', () => {
|
|
|
277
277
|
|
|
278
278
|
expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
|
|
279
279
|
'aria-current',
|
|
280
|
-
'
|
|
280
|
+
'location',
|
|
281
281
|
);
|
|
282
282
|
expect(onActiveIdChange).toHaveBeenCalledWith('install');
|
|
283
283
|
|
|
@@ -493,7 +493,7 @@ describe('Outline keyboard navigation', () => {
|
|
|
493
493
|
expect(onNavigateEnd).toHaveBeenCalledTimes(1);
|
|
494
494
|
expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
|
|
495
495
|
'aria-current',
|
|
496
|
-
'
|
|
496
|
+
'location',
|
|
497
497
|
);
|
|
498
498
|
|
|
499
499
|
cleanup();
|
|
@@ -764,7 +764,7 @@ describe('Outline scroll scoping', () => {
|
|
|
764
764
|
expect(onNavigateEnd).toHaveBeenCalledWith('install');
|
|
765
765
|
expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
|
|
766
766
|
'aria-current',
|
|
767
|
-
'
|
|
767
|
+
'location',
|
|
768
768
|
);
|
|
769
769
|
|
|
770
770
|
cleanup();
|
|
@@ -797,7 +797,7 @@ describe('Outline scroll scoping', () => {
|
|
|
797
797
|
// has not reached it, so `intro` stays active.
|
|
798
798
|
expect(screen.getByRole('link', {name: 'Introduction'})).toHaveAttribute(
|
|
799
799
|
'aria-current',
|
|
800
|
-
'
|
|
800
|
+
'location',
|
|
801
801
|
);
|
|
802
802
|
|
|
803
803
|
rerender(<Outline items={items} offset={64} />);
|
|
@@ -806,7 +806,7 @@ describe('Outline scroll scoping', () => {
|
|
|
806
806
|
});
|
|
807
807
|
expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
|
|
808
808
|
'aria-current',
|
|
809
|
-
'
|
|
809
|
+
'location',
|
|
810
810
|
);
|
|
811
811
|
|
|
812
812
|
cleanup();
|
|
@@ -930,7 +930,7 @@ describe('Outline scroll scoping', () => {
|
|
|
930
930
|
|
|
931
931
|
expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
|
|
932
932
|
'aria-current',
|
|
933
|
-
'
|
|
933
|
+
'location',
|
|
934
934
|
);
|
|
935
935
|
expect(screen.getByRole('link', {name: 'API'})).not.toHaveAttribute(
|
|
936
936
|
'aria-current',
|
|
@@ -981,7 +981,7 @@ describe('Outline scroll scoping', () => {
|
|
|
981
981
|
|
|
982
982
|
expect(screen.getByRole('link', {name: 'Installation'})).toHaveAttribute(
|
|
983
983
|
'aria-current',
|
|
984
|
-
'
|
|
984
|
+
'location',
|
|
985
985
|
);
|
|
986
986
|
|
|
987
987
|
pane.remove();
|
package/src/Outline/Outline.tsx
CHANGED
|
@@ -372,7 +372,7 @@ export function Outline({
|
|
|
372
372
|
}
|
|
373
373
|
const links = Array.from(list.querySelectorAll<HTMLElement>('a[href]'));
|
|
374
374
|
const active = links.find(
|
|
375
|
-
link => link.getAttribute('aria-current') === '
|
|
375
|
+
link => link.getAttribute('aria-current') === 'location',
|
|
376
376
|
);
|
|
377
377
|
if (active == null) {
|
|
378
378
|
return;
|
|
@@ -465,7 +465,7 @@ export function Outline({
|
|
|
465
465
|
<li key={item.id} {...stylex.props(styles.item)} role="listitem">
|
|
466
466
|
<LinkComponent
|
|
467
467
|
href={`#${item.id}`}
|
|
468
|
-
aria-current={isActive ? '
|
|
468
|
+
aria-current={isActive ? 'location' : undefined}
|
|
469
469
|
onClick={handleClick(item.id)}
|
|
470
470
|
onKeyDown={handleKeyDown(item.id)}
|
|
471
471
|
{...mergeProps(
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Pagination.tsx
|
|
7
|
-
* @input Uses React, StyleX, Button, Icon, Selector, Text; page number buttons delegate to Button
|
|
7
|
+
* @input Uses React, StyleX, Button, Icon, Selector, Text; page number buttons delegate to Button.
|
|
8
|
+
* Reads i18n direction via useDirection() to flip the prev/next chevrons under RTL.
|
|
8
9
|
* @output Exports Pagination component, PaginationProps, PaginationVariant, PaginationSize types
|
|
9
10
|
* @position Core implementation; consumed by index.ts, tested by Pagination.test.tsx
|
|
10
11
|
*
|
|
@@ -40,6 +41,7 @@ import {mergeProps} from '../utils';
|
|
|
40
41
|
import type {BaseProps} from '../BaseProps';
|
|
41
42
|
import {themeProps} from '../utils/themeProps';
|
|
42
43
|
import {useTranslator} from '../i18n/useTranslator';
|
|
44
|
+
import {useDirection} from '../i18n/useDirection';
|
|
43
45
|
|
|
44
46
|
// =============================================================================
|
|
45
47
|
// Types
|
|
@@ -360,6 +362,12 @@ export function Pagination({
|
|
|
360
362
|
const label = labelFromProps ?? t('@astryx.pagination.label');
|
|
361
363
|
const previousLabel = t('@astryx.pagination.previous');
|
|
362
364
|
const nextLabel = t('@astryx.pagination.next');
|
|
365
|
+
|
|
366
|
+
// Directional icons: under RTL, the "previous" control points right and the
|
|
367
|
+
// "next" control points left. aria-labels stay semantic (unchanged).
|
|
368
|
+
const direction = useDirection();
|
|
369
|
+
const previousIcon = direction === 'rtl' ? 'chevronRight' : 'chevronLeft';
|
|
370
|
+
const nextIcon = direction === 'rtl' ? 'chevronLeft' : 'chevronRight';
|
|
363
371
|
const pageIndicatorsLabel = t('@astryx.pagination.pageIndicators');
|
|
364
372
|
const itemsPerPageLabel = t('@astryx.pagination.itemsPerPage');
|
|
365
373
|
|
|
@@ -663,7 +671,7 @@ export function Pagination({
|
|
|
663
671
|
label={previousLabel}
|
|
664
672
|
variant="ghost"
|
|
665
673
|
size={buttonSize}
|
|
666
|
-
icon={<Icon icon=
|
|
674
|
+
icon={<Icon icon={previousIcon} size={isSm ? 'sm' : 'md'} />}
|
|
667
675
|
onClick={handlePrevious}
|
|
668
676
|
isDisabled={isDisabled || !hasPrevious}
|
|
669
677
|
isIconOnly
|
|
@@ -675,7 +683,7 @@ export function Pagination({
|
|
|
675
683
|
label={nextLabel}
|
|
676
684
|
variant="ghost"
|
|
677
685
|
size={buttonSize}
|
|
678
|
-
icon={<Icon icon=
|
|
686
|
+
icon={<Icon icon={nextIcon} size={isSm ? 'sm' : 'md'} />}
|
|
679
687
|
onClick={handleNext}
|
|
680
688
|
isDisabled={isDisabled || !hasNext}
|
|
681
689
|
isIconOnly
|
|
@@ -90,6 +90,13 @@ export const docs = {
|
|
|
90
90
|
'Icon to display at the start of the input, before any filter tokens. Forwarded to the internal Tokenizer. Accepts a semantic icon name, an SVG icon component, or a ReactNode directly.',
|
|
91
91
|
slotElements: [{__element: 'Icon', props: {icon: 'search', size: 'sm'}}],
|
|
92
92
|
},
|
|
93
|
+
{
|
|
94
|
+
name: 'statusVariant',
|
|
95
|
+
type: "'attached' | 'detached'",
|
|
96
|
+
description:
|
|
97
|
+
'How the status message is placed relative to the input. attached overlaps directly below the input (bordered treatment); detached floats below as a separate element with spacing.',
|
|
98
|
+
default: "'attached'",
|
|
99
|
+
},
|
|
93
100
|
{
|
|
94
101
|
name: 'maxTokenLength',
|
|
95
102
|
type: 'number',
|
|
@@ -248,6 +255,13 @@ export const docsZh = {
|
|
|
248
255
|
description:
|
|
249
256
|
'在输入框开头(筛选 token 之前)显示的图标,转发给内部的 Tokenizer。接受语义图标名称、SVG 图标组件或直接传入 ReactNode。',
|
|
250
257
|
},
|
|
258
|
+
{
|
|
259
|
+
name: 'statusVariant',
|
|
260
|
+
type: "'attached' | 'detached'",
|
|
261
|
+
description:
|
|
262
|
+
'状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距。',
|
|
263
|
+
default: "'attached'",
|
|
264
|
+
},
|
|
251
265
|
{
|
|
252
266
|
name: 'maxTokenLength',
|
|
253
267
|
type: 'number',
|
|
@@ -332,6 +346,7 @@ export const docsDense = {
|
|
|
332
346
|
isDisabled: 'Disables entire component.',
|
|
333
347
|
status: 'Validation status object w/ type + optional message.',
|
|
334
348
|
startIcon: 'Icon at input start, before filter tokens. Forwarded to internal Tokenizer.',
|
|
349
|
+
statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing.',
|
|
335
350
|
maxTokenLength: 'Max char length for filter value display in tokens.',
|
|
336
351
|
popoverSaveButtonLabel: 'Label for save button in edit popover.',
|
|
337
352
|
timezoneID: 'Timezone ID for date formatting (e.g. "America/New_York").',
|
|
@@ -424,3 +424,26 @@ describe('PowerSearch', () => {
|
|
|
424
424
|
});
|
|
425
425
|
});
|
|
426
426
|
});
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
describe('PowerSearch statusVariant forwarding', () => {
|
|
430
|
+
it('defaults to attached (status renders with data-variant="attached")', () => {
|
|
431
|
+
const {container} = render(
|
|
432
|
+
<PowerSearch config={config} filters={[]} onChange={() => {}} status={{type: 'error', message: 'Required'}} />,
|
|
433
|
+
);
|
|
434
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
435
|
+
'data-variant',
|
|
436
|
+
'attached',
|
|
437
|
+
);
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
it('forwards statusVariant="detached" to the underlying Field status', () => {
|
|
441
|
+
const {container} = render(
|
|
442
|
+
<PowerSearch config={config} filters={[]} onChange={() => {}} status={{type: 'error', message: 'Required'}} statusVariant="detached" />,
|
|
443
|
+
);
|
|
444
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
445
|
+
'data-variant',
|
|
446
|
+
'detached',
|
|
447
|
+
);
|
|
448
|
+
});
|
|
449
|
+
});
|
|
@@ -37,7 +37,7 @@ import {layerAnimations} from '../Layer/layerAnimations.stylex';
|
|
|
37
37
|
import {Icon} from '../Icon';
|
|
38
38
|
import type {IconType} from '../Icon';
|
|
39
39
|
import type {IconName} from '../Icon/globalIconRegistry';
|
|
40
|
-
import type {InputStatus} from '../Field';
|
|
40
|
+
import type {InputStatus, FieldStatusVariant} from '../Field';
|
|
41
41
|
import {usePopover} from '../Popover/usePopover';
|
|
42
42
|
import {useAnnounce} from '../hooks/useAnnounce';
|
|
43
43
|
import {
|
|
@@ -383,6 +383,13 @@ export interface PowerSearchProps extends Omit<
|
|
|
383
383
|
onBlur?: (e: React.FocusEvent) => void;
|
|
384
384
|
/** Validation status. */
|
|
385
385
|
status?: InputStatus;
|
|
386
|
+
/**
|
|
387
|
+
* How the status message is placed relative to the input.
|
|
388
|
+
* - 'attached': message overlaps directly below the input (bordered treatment)
|
|
389
|
+
* - 'detached': message floats below as a separate element with spacing
|
|
390
|
+
* @default 'attached'
|
|
391
|
+
*/
|
|
392
|
+
statusVariant?: FieldStatusVariant;
|
|
386
393
|
/** Max width for dropdown menu. */
|
|
387
394
|
menuWidth?: number;
|
|
388
395
|
/** Max display length for filter token values. @default 40 */
|
|
@@ -527,6 +534,7 @@ export function PowerSearch({
|
|
|
527
534
|
onFocus,
|
|
528
535
|
onBlur,
|
|
529
536
|
status,
|
|
537
|
+
statusVariant = 'attached',
|
|
530
538
|
maxTokenLength = 40,
|
|
531
539
|
popoverSaveButtonLabel: popoverSaveButtonLabelFromProps,
|
|
532
540
|
timezoneID,
|
|
@@ -1033,6 +1041,7 @@ export function PowerSearch({
|
|
|
1033
1041
|
hasEntriesOnFocus
|
|
1034
1042
|
debounceMs={0}
|
|
1035
1043
|
status={status}
|
|
1044
|
+
statusVariant={statusVariant}
|
|
1036
1045
|
onFocus={onFocus}
|
|
1037
1046
|
onBlur={onBlur}
|
|
1038
1047
|
xstyle={xstyle}
|
|
@@ -242,5 +242,39 @@ describe('ProgressBar', () => {
|
|
|
242
242
|
unmount();
|
|
243
243
|
}
|
|
244
244
|
});
|
|
245
|
+
|
|
246
|
+
it('drives a direction-aware indeterminate slide (mirrored keyframe under RTL)', () => {
|
|
247
|
+
// StyleX injects the keyframes + the atomic rule that swaps the
|
|
248
|
+
// animation-name under `[dir="rtl"]`. Scan the injected CSS so we can
|
|
249
|
+
// assert the RTL branch exists without relying on jsdom animation.
|
|
250
|
+
function injectedCss(): string {
|
|
251
|
+
let out = '';
|
|
252
|
+
for (const sheet of Array.from(document.styleSheets)) {
|
|
253
|
+
try {
|
|
254
|
+
for (const rule of Array.from(sheet.cssRules)) {
|
|
255
|
+
out += rule.cssText + '\n';
|
|
256
|
+
}
|
|
257
|
+
} catch {
|
|
258
|
+
// ignore cross-origin sheets
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
out += Array.from(document.querySelectorAll('style'))
|
|
262
|
+
.map(s => s.textContent || '')
|
|
263
|
+
.join('\n');
|
|
264
|
+
return out;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
render(<ProgressBar isIndeterminate label="Loading" />);
|
|
268
|
+
const css = injectedCss();
|
|
269
|
+
// LTR keyframe slides physically left → right (−100% → 250%).
|
|
270
|
+
expect(css).toMatch(/translateX\(-100%\)/);
|
|
271
|
+
expect(css).toMatch(/translateX\(250%\)/);
|
|
272
|
+
// RTL keyframe mirrors it (100% → −250%) so the bar travels along the
|
|
273
|
+
// reading flow (inline-start → inline-end, i.e. right → left).
|
|
274
|
+
expect(css).toMatch(/translateX\(100%\)/);
|
|
275
|
+
expect(css).toMatch(/translateX\(-250%\)/);
|
|
276
|
+
// The animation-name is swapped specifically under `[dir="rtl"]`.
|
|
277
|
+
expect(css).toMatch(/:is\(\[dir="rtl"\][^)]*\)[^{]*\{\s*animation-name:/);
|
|
278
|
+
});
|
|
245
279
|
});
|
|
246
280
|
});
|
|
@@ -132,6 +132,18 @@ const indeterminateSlide = stylex.keyframes({
|
|
|
132
132
|
},
|
|
133
133
|
});
|
|
134
134
|
|
|
135
|
+
// RTL: mirror the slide so the indeterminate bar travels along the reading
|
|
136
|
+
// flow (inline-start → inline-end, i.e. right → left) instead of always
|
|
137
|
+
// physically left → right. The magnitudes mirror the LTR keyframe.
|
|
138
|
+
const indeterminateSlideRtl = stylex.keyframes({
|
|
139
|
+
'0%': {
|
|
140
|
+
transform: 'translateX(100%)',
|
|
141
|
+
},
|
|
142
|
+
'100%': {
|
|
143
|
+
transform: 'translateX(-250%)',
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
|
|
135
147
|
// =============================================================================
|
|
136
148
|
// Styles
|
|
137
149
|
// =============================================================================
|
|
@@ -196,7 +208,10 @@ const styles = stylex.create({
|
|
|
196
208
|
height: '100%',
|
|
197
209
|
width: '40%',
|
|
198
210
|
borderRadius: radiusVars['--radius-full'],
|
|
199
|
-
animationName:
|
|
211
|
+
animationName: {
|
|
212
|
+
default: indeterminateSlide,
|
|
213
|
+
':is([dir="rtl"] *)': indeterminateSlideRtl,
|
|
214
|
+
},
|
|
200
215
|
animationDuration: {
|
|
201
216
|
default: '1.5s',
|
|
202
217
|
'@media (prefers-reduced-motion: reduce)': '3s',
|
|
@@ -114,6 +114,12 @@ export const docs = {
|
|
|
114
114
|
type: 'string',
|
|
115
115
|
description: 'Tooltip text for an info icon next to the label.',
|
|
116
116
|
},
|
|
117
|
+
{
|
|
118
|
+
name: 'width',
|
|
119
|
+
type: 'SizeValue',
|
|
120
|
+
description:
|
|
121
|
+
'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.',
|
|
122
|
+
},
|
|
117
123
|
{
|
|
118
124
|
name: 'xstyle',
|
|
119
125
|
type: 'StyleXStyles',
|
|
@@ -14,6 +14,7 @@ import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {RadioList} from './RadioList';
|
|
16
16
|
import {RadioListItem} from './RadioListItem';
|
|
17
|
+
import {getForcedColorsRules} from '../__tests__/forcedColors';
|
|
17
18
|
|
|
18
19
|
// Mock showPopover/hidePopover (not implemented in jsdom) so the tooltip layer
|
|
19
20
|
// reflects its open state via a `popover-open` attribute the tests can assert.
|
|
@@ -580,7 +581,11 @@ describe('RadioList', () => {
|
|
|
580
581
|
it('submits the selected value under htmlName', () => {
|
|
581
582
|
const {container} = render(
|
|
582
583
|
<form>
|
|
583
|
-
<RadioList
|
|
584
|
+
<RadioList
|
|
585
|
+
label="Preference"
|
|
586
|
+
htmlName="pref"
|
|
587
|
+
value="b"
|
|
588
|
+
onChange={() => {}}>
|
|
584
589
|
<RadioListItem label="Option A" value="a" />
|
|
585
590
|
<RadioListItem label="Option B" value="b" />
|
|
586
591
|
</RadioList>
|
|
@@ -599,13 +604,14 @@ describe('RadioList', () => {
|
|
|
599
604
|
value="a"
|
|
600
605
|
onChange={() => {}}
|
|
601
606
|
isDisabled
|
|
602
|
-
disabledMessage="Locked"
|
|
603
|
-
>
|
|
607
|
+
disabledMessage="Locked">
|
|
604
608
|
<RadioListItem label="Option A" value="a" />
|
|
605
609
|
</RadioList>
|
|
606
610
|
</form>,
|
|
607
611
|
);
|
|
608
|
-
expect([
|
|
612
|
+
expect([
|
|
613
|
+
...new FormData(container.querySelector('form')!).keys(),
|
|
614
|
+
]).toEqual([]);
|
|
609
615
|
});
|
|
610
616
|
|
|
611
617
|
it('keeps working as an isolated group when htmlName is omitted', () => {
|
|
@@ -642,3 +648,19 @@ describe('RadioList', () => {
|
|
|
642
648
|
});
|
|
643
649
|
});
|
|
644
650
|
});
|
|
651
|
+
|
|
652
|
+
// jsdom cannot emulate forced-colors rendering, so this asserts that the
|
|
653
|
+
// compiled output includes the forced-colors rule; visual behavior needs
|
|
654
|
+
// manual verification under Windows High Contrast.
|
|
655
|
+
describe('forced colors (WCAG 1.4.11)', () => {
|
|
656
|
+
it('compiles a forced-colors fill so the selected dot survives Windows High Contrast', () => {
|
|
657
|
+
render(
|
|
658
|
+
<RadioList label="Preference" value="a" onChange={() => {}}>
|
|
659
|
+
<RadioListItem label="Option A" value="a" />
|
|
660
|
+
</RadioList>,
|
|
661
|
+
);
|
|
662
|
+
// The painted inner dot would be stripped to Canvas (invisible), making
|
|
663
|
+
// checked and unchecked radios identical; CanvasText keeps it perceivable.
|
|
664
|
+
expect(getForcedColorsRules()).toContain('background-color: canvastext;');
|
|
665
|
+
});
|
|
666
|
+
});
|
|
@@ -146,8 +146,8 @@ export interface RadioListProps extends Omit<
|
|
|
146
146
|
status?: InputStatus;
|
|
147
147
|
/**
|
|
148
148
|
* The size of the radio controls.
|
|
149
|
-
* - 'sm': Compact size (
|
|
150
|
-
* - 'md': Default size (
|
|
149
|
+
* - 'sm': Compact size (20px radio)
|
|
150
|
+
* - 'md': Default size (24px radio)
|
|
151
151
|
* @default 'md'
|
|
152
152
|
*/
|
|
153
153
|
size?: RadioListSize;
|
|
@@ -119,7 +119,14 @@ const styles = stylex.create({
|
|
|
119
119
|
},
|
|
120
120
|
innerDot: {
|
|
121
121
|
borderRadius: '50%',
|
|
122
|
-
backgroundColor:
|
|
122
|
+
backgroundColor: {
|
|
123
|
+
default: colorVars['--color-on-accent'],
|
|
124
|
+
// Forced colors (Windows High Contrast) strips painted backgrounds,
|
|
125
|
+
// which would make the selected dot invisible — checked and unchecked
|
|
126
|
+
// radios would look identical. CanvasText keeps the dot perceivable on
|
|
127
|
+
// the Canvas circle fill (WCAG 1.4.11).
|
|
128
|
+
'@media (forced-colors: active)': 'CanvasText',
|
|
129
|
+
},
|
|
123
130
|
},
|
|
124
131
|
labelDisabled: {
|
|
125
132
|
color: colorVars['--color-text-disabled'],
|
|
@@ -140,12 +147,12 @@ const wrapperSizeStyles = stylex.create({
|
|
|
140
147
|
|
|
141
148
|
const radioSizeStyles = stylex.create({
|
|
142
149
|
sm: {
|
|
143
|
-
width:
|
|
144
|
-
height:
|
|
150
|
+
width: 20,
|
|
151
|
+
height: 20,
|
|
145
152
|
},
|
|
146
153
|
md: {
|
|
147
|
-
width:
|
|
148
|
-
height:
|
|
154
|
+
width: 24,
|
|
155
|
+
height: 24,
|
|
149
156
|
},
|
|
150
157
|
});
|
|
151
158
|
|
|
@@ -201,6 +201,100 @@ describe('ResizeHandle', () => {
|
|
|
201
201
|
expect(document.body.style.userSelect).toBe('');
|
|
202
202
|
});
|
|
203
203
|
|
|
204
|
+
// --- RTL pointer-drag direction ---
|
|
205
|
+
|
|
206
|
+
it('drives the region with the raw pointer delta under LTR', () => {
|
|
207
|
+
const resizable: ResizableProps = {
|
|
208
|
+
_size: 200,
|
|
209
|
+
_isCollapsed: false,
|
|
210
|
+
_onResizeStart: vi.fn(),
|
|
211
|
+
_onResizeMove: vi.fn(),
|
|
212
|
+
_onResizeEnd: vi.fn(),
|
|
213
|
+
_minSizePx: 100,
|
|
214
|
+
_maxSizePx: 400,
|
|
215
|
+
_snaps: [],
|
|
216
|
+
_collapsedSize: 40,
|
|
217
|
+
_collapsible: false,
|
|
218
|
+
_isResizableProps: true,
|
|
219
|
+
};
|
|
220
|
+
render(<ResizeHandle resizable={resizable} label="Resize" />);
|
|
221
|
+
const hitArea = screen.getByRole('separator')
|
|
222
|
+
.firstElementChild as HTMLElement;
|
|
223
|
+
|
|
224
|
+
fireEvent.pointerDown(hitArea, {clientX: 0, clientY: 0});
|
|
225
|
+
// Pointer moves +40px to the right → panel grows by +40 under LTR.
|
|
226
|
+
fireEvent.pointerMove(window, {clientX: 40, clientY: 0});
|
|
227
|
+
expect(resizable._onResizeMove).toHaveBeenLastCalledWith(40);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it('inverts the pointer delta under RTL so dragging resizes intuitively', () => {
|
|
231
|
+
const resizable: ResizableProps = {
|
|
232
|
+
_size: 200,
|
|
233
|
+
_isCollapsed: false,
|
|
234
|
+
_onResizeStart: vi.fn(),
|
|
235
|
+
_onResizeMove: vi.fn(),
|
|
236
|
+
_onResizeEnd: vi.fn(),
|
|
237
|
+
_minSizePx: 100,
|
|
238
|
+
_maxSizePx: 400,
|
|
239
|
+
_snaps: [],
|
|
240
|
+
_collapsedSize: 40,
|
|
241
|
+
_collapsible: false,
|
|
242
|
+
_isResizableProps: true,
|
|
243
|
+
};
|
|
244
|
+
// Under RTL the start panel sits on the RIGHT, so a pointer move to the
|
|
245
|
+
// right (+clientX) must SHRINK it — the delta is inverted. The handle reads
|
|
246
|
+
// its own computed `direction` via getRTLMultiplier(); jsdom doesn't resolve
|
|
247
|
+
// inherited `direction`, so force it on the separator (the handle element),
|
|
248
|
+
// mirroring the Slider RTL pointer-mapping test precedent.
|
|
249
|
+
render(<ResizeHandle resizable={resizable} label="Resize" />);
|
|
250
|
+
const separator = screen.getByRole('separator');
|
|
251
|
+
const hitArea = separator.firstElementChild as HTMLElement;
|
|
252
|
+
|
|
253
|
+
const realGetComputedStyle = window.getComputedStyle;
|
|
254
|
+
const gcsSpy = vi
|
|
255
|
+
.spyOn(window, 'getComputedStyle')
|
|
256
|
+
.mockImplementation((el: Element, pseudo?: string | null) => {
|
|
257
|
+
if (el === separator) {
|
|
258
|
+
return {direction: 'rtl'} as CSSStyleDeclaration;
|
|
259
|
+
}
|
|
260
|
+
return realGetComputedStyle(el, pseudo ?? undefined);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
fireEvent.pointerDown(hitArea, {clientX: 0, clientY: 0});
|
|
264
|
+
// Same +40px physical move as LTR, but mirrored → −40 delta under RTL.
|
|
265
|
+
fireEvent.pointerMove(window, {clientX: 40, clientY: 0});
|
|
266
|
+
expect(resizable._onResizeMove).toHaveBeenLastCalledWith(-40);
|
|
267
|
+
|
|
268
|
+
gcsSpy.mockRestore();
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// --- Hit-area geometry (grab zone tracks the visible pill) ---
|
|
272
|
+
|
|
273
|
+
it('anchors the biased grab zone with the pill offset and a dir-flipped centering shift', () => {
|
|
274
|
+
// For an off-center pill the hit area must reuse the pill's physical offset
|
|
275
|
+
// construction (anchored at insetInlineStart:0) rather than a divider-
|
|
276
|
+
// relative 50% anchor + percentage bias, so the two stay aligned in LTR and
|
|
277
|
+
// RTL. The half-width-difference centering shift (6.5px) is inline, so it
|
|
278
|
+
// flips physical sign under RTL: `- 6.5px` (LTR) vs `+ 6.5px` (RTL). See the
|
|
279
|
+
// Playwright measurement (hitArea.center === pill.center, 0px offset in both
|
|
280
|
+
// directions) for the geometric proof; here we lock the transform shape.
|
|
281
|
+
render(<Harness handleProps={{pillPlacement: 'start'}} />);
|
|
282
|
+
const hitArea = getSeparator().firstElementChild as HTMLElement;
|
|
283
|
+
expect(hitArea.className).toContain('hitAreaOffsetX');
|
|
284
|
+
const style = hitArea.getAttribute('style') ?? '';
|
|
285
|
+
// LTR (default) branch subtracts the centering shift; RTL branch adds it.
|
|
286
|
+
expect(style).toContain('- 6.5px');
|
|
287
|
+
expect(style).toContain('+ 6.5px');
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it('centers the grab zone on the divider when the pill is centered (no bias)', () => {
|
|
291
|
+
render(<Harness handleProps={{pillPlacement: 'center'}} />);
|
|
292
|
+
const hitArea = getSeparator().firstElementChild as HTMLElement;
|
|
293
|
+
// No physical offset — a plain logical centering class, no biased transform.
|
|
294
|
+
expect(hitArea.className).toContain('hitAreaCenteredX');
|
|
295
|
+
expect(hitArea.className).not.toContain('hitAreaOffsetX');
|
|
296
|
+
});
|
|
297
|
+
|
|
204
298
|
// --- Prop composition (ordering choice: handler sits after {...props}) ---
|
|
205
299
|
|
|
206
300
|
it('runs a consumer onKeyDown alongside keyboard resizing', () => {
|