@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
package/src/Token/Token.test.tsx
CHANGED
|
@@ -13,6 +13,7 @@ import {describe, it, expect, vi} from 'vitest';
|
|
|
13
13
|
import {render, screen, fireEvent} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {Token} from './Token';
|
|
16
|
+
import type {TokenColor} from './Token';
|
|
16
17
|
|
|
17
18
|
describe('Token', () => {
|
|
18
19
|
it('renders with label', () => {
|
|
@@ -51,6 +52,23 @@ describe('Token', () => {
|
|
|
51
52
|
}
|
|
52
53
|
});
|
|
53
54
|
|
|
55
|
+
it('reflects a custom (theme-augmented) color as a class and data attribute', () => {
|
|
56
|
+
// Themes extend TokenColorMap via module augmentation and supply the
|
|
57
|
+
// styling through generated theme CSS; the runtime just forwards the
|
|
58
|
+
// value as the stable class + data-color reflection so the theme
|
|
59
|
+
// selector can match. Cast simulates a consumer-augmented color.
|
|
60
|
+
render(
|
|
61
|
+
<Token
|
|
62
|
+
label="Brand"
|
|
63
|
+
color={'brand' as TokenColor}
|
|
64
|
+
data-testid="token-custom"
|
|
65
|
+
/>,
|
|
66
|
+
);
|
|
67
|
+
const token = screen.getByTestId('token-custom');
|
|
68
|
+
expect(token).toHaveClass('astryx-token', 'brand');
|
|
69
|
+
expect(token).toHaveAttribute('data-color', 'brand');
|
|
70
|
+
});
|
|
71
|
+
|
|
54
72
|
it('renders as a span with invisible button when onClick is provided', () => {
|
|
55
73
|
const handleClick = vi.fn();
|
|
56
74
|
render(
|
|
@@ -135,10 +153,7 @@ describe('Token', () => {
|
|
|
135
153
|
|
|
136
154
|
it('renders endContent', () => {
|
|
137
155
|
render(
|
|
138
|
-
<Token
|
|
139
|
-
label="Token"
|
|
140
|
-
endContent={<span data-testid="end">End</span>}
|
|
141
|
-
/>,
|
|
156
|
+
<Token label="Token" endContent={<span data-testid="end">End</span>} />,
|
|
142
157
|
);
|
|
143
158
|
expect(screen.getByTestId('end')).toBeInTheDocument();
|
|
144
159
|
expect(screen.getByText('End')).toBeInTheDocument();
|
|
@@ -241,12 +256,7 @@ describe('Token accessibility', () => {
|
|
|
241
256
|
|
|
242
257
|
it('disables both buttons when isDisabled is true', () => {
|
|
243
258
|
render(
|
|
244
|
-
<Token
|
|
245
|
-
label="Token"
|
|
246
|
-
onClick={() => {}}
|
|
247
|
-
onRemove={() => {}}
|
|
248
|
-
isDisabled
|
|
249
|
-
/>,
|
|
259
|
+
<Token label="Token" onClick={() => {}} onRemove={() => {}} isDisabled />,
|
|
250
260
|
);
|
|
251
261
|
const buttons = screen.getAllByRole('button');
|
|
252
262
|
for (const button of buttons) {
|
|
@@ -320,6 +330,151 @@ describe('Token accessibility', () => {
|
|
|
320
330
|
});
|
|
321
331
|
});
|
|
322
332
|
|
|
333
|
+
describe('Token link with remove button', () => {
|
|
334
|
+
it('does not nest the remove button inside the link', () => {
|
|
335
|
+
render(<Token label="Tag" href="/test" onRemove={() => {}} />);
|
|
336
|
+
const link = screen.getByRole('link', {name: 'Tag'});
|
|
337
|
+
const removeButton = screen.getByRole('button', {name: 'Remove Tag'});
|
|
338
|
+
expect(link.contains(removeButton)).toBe(false);
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
it('keeps the link keyboard-focusable and fires onRemove from the sibling button', async () => {
|
|
342
|
+
const user = userEvent.setup();
|
|
343
|
+
const handleRemove = vi.fn();
|
|
344
|
+
render(<Token label="Tag" href="/test" onRemove={handleRemove} />);
|
|
345
|
+
|
|
346
|
+
const link = screen.getByRole('link', {name: 'Tag'});
|
|
347
|
+
expect(link.tagName).toBe('A');
|
|
348
|
+
expect(link).toHaveAttribute('href', '/test');
|
|
349
|
+
|
|
350
|
+
// Tab reaches the link first, then the remove button
|
|
351
|
+
await user.tab();
|
|
352
|
+
expect(link).toHaveFocus();
|
|
353
|
+
await user.tab();
|
|
354
|
+
const removeButton = screen.getByRole('button', {name: 'Remove Tag'});
|
|
355
|
+
expect(removeButton).toHaveFocus();
|
|
356
|
+
|
|
357
|
+
// Activating the remove button fires onRemove without involving the link
|
|
358
|
+
await user.keyboard('{Enter}');
|
|
359
|
+
expect(handleRemove).toHaveBeenCalledTimes(1);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
it('wrapper structure matches the onClick branch pattern', () => {
|
|
363
|
+
render(
|
|
364
|
+
<Token
|
|
365
|
+
label="Tag"
|
|
366
|
+
href="/test"
|
|
367
|
+
onRemove={() => {}}
|
|
368
|
+
data-testid="link-token"
|
|
369
|
+
/>,
|
|
370
|
+
);
|
|
371
|
+
render(
|
|
372
|
+
<Token
|
|
373
|
+
label="Tag"
|
|
374
|
+
onClick={() => {}}
|
|
375
|
+
onRemove={() => {}}
|
|
376
|
+
data-testid="click-token"
|
|
377
|
+
/>,
|
|
378
|
+
);
|
|
379
|
+
|
|
380
|
+
const linkRoot = screen.getByTestId('link-token');
|
|
381
|
+
const clickRoot = screen.getByTestId('click-token');
|
|
382
|
+
|
|
383
|
+
// Both render a <span> container with the same visual classes
|
|
384
|
+
expect(linkRoot.tagName).toBe('SPAN');
|
|
385
|
+
expect(linkRoot.className).toBe(clickRoot.className);
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
it('clicking the container activates the link', () => {
|
|
389
|
+
render(
|
|
390
|
+
<Token
|
|
391
|
+
label="Tag"
|
|
392
|
+
href="/test"
|
|
393
|
+
onRemove={() => {}}
|
|
394
|
+
icon={<span data-testid="icon">★</span>}
|
|
395
|
+
data-testid="link-token"
|
|
396
|
+
/>,
|
|
397
|
+
);
|
|
398
|
+
const link = screen.getByRole('link', {name: 'Tag'});
|
|
399
|
+
const handleLinkClick = vi.fn((e: MouseEvent) => e.preventDefault());
|
|
400
|
+
link.addEventListener('click', handleLinkClick);
|
|
401
|
+
|
|
402
|
+
// Clicking outside the anchor (e.g. the icon) still activates the link
|
|
403
|
+
fireEvent.click(screen.getByTestId('icon'));
|
|
404
|
+
expect(handleLinkClick).toHaveBeenCalledTimes(1);
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
it('clicking the remove button does not activate the link', () => {
|
|
408
|
+
const handleRemove = vi.fn();
|
|
409
|
+
render(<Token label="Tag" href="/test" onRemove={handleRemove} />);
|
|
410
|
+
const link = screen.getByRole('link', {name: 'Tag'});
|
|
411
|
+
const handleLinkClick = vi.fn((e: MouseEvent) => e.preventDefault());
|
|
412
|
+
link.addEventListener('click', handleLinkClick);
|
|
413
|
+
|
|
414
|
+
fireEvent.click(screen.getByRole('button', {name: 'Remove Tag'}));
|
|
415
|
+
expect(handleRemove).toHaveBeenCalledTimes(1);
|
|
416
|
+
expect(handleLinkClick).not.toHaveBeenCalled();
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
it('cmd/ctrl+click on the container opens the link in a new tab', () => {
|
|
420
|
+
const openSpy = vi.spyOn(window, 'open').mockImplementation(() => null);
|
|
421
|
+
render(
|
|
422
|
+
<Token
|
|
423
|
+
label="Tag"
|
|
424
|
+
href="/test"
|
|
425
|
+
onRemove={() => {}}
|
|
426
|
+
icon={<span data-testid="icon">★</span>}
|
|
427
|
+
/>,
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
// Clicking the surface (not the anchor) with a modifier opens a new tab
|
|
431
|
+
// rather than navigating in place — provided by useClickableContainer.
|
|
432
|
+
fireEvent.click(screen.getByTestId('icon'), {metaKey: true});
|
|
433
|
+
expect(openSpy).toHaveBeenCalledWith('/test', '_blank', 'noopener');
|
|
434
|
+
openSpy.mockRestore();
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
it('middle-click on the container opens the link in a new tab', () => {
|
|
438
|
+
const openSpy = vi.spyOn(window, 'open').mockImplementation(() => null);
|
|
439
|
+
render(
|
|
440
|
+
<Token
|
|
441
|
+
label="Tag"
|
|
442
|
+
href="/test"
|
|
443
|
+
onRemove={() => {}}
|
|
444
|
+
icon={<span data-testid="icon">★</span>}
|
|
445
|
+
/>,
|
|
446
|
+
);
|
|
447
|
+
|
|
448
|
+
fireEvent.mouseUp(screen.getByTestId('icon'), {button: 1});
|
|
449
|
+
expect(openSpy).toHaveBeenCalledWith('/test', '_blank', 'noopener');
|
|
450
|
+
openSpy.mockRestore();
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
it('a modified click that opens a new tab does not fire onRemove', () => {
|
|
454
|
+
const openSpy = vi.spyOn(window, 'open').mockImplementation(() => null);
|
|
455
|
+
const handleRemove = vi.fn();
|
|
456
|
+
render(
|
|
457
|
+
<Token
|
|
458
|
+
label="Tag"
|
|
459
|
+
href="/test"
|
|
460
|
+
onRemove={handleRemove}
|
|
461
|
+
icon={<span data-testid="icon">★</span>}
|
|
462
|
+
/>,
|
|
463
|
+
);
|
|
464
|
+
|
|
465
|
+
fireEvent.click(screen.getByTestId('icon'), {metaKey: true});
|
|
466
|
+
fireEvent.mouseUp(screen.getByTestId('icon'), {button: 1});
|
|
467
|
+
expect(handleRemove).not.toHaveBeenCalled();
|
|
468
|
+
expect(openSpy).toHaveBeenCalledTimes(2);
|
|
469
|
+
openSpy.mockRestore();
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
it('link without onRemove still renders the anchor as the root', () => {
|
|
473
|
+
const {container} = render(<Token label="Link" href="/test" />);
|
|
474
|
+
expect(container.firstElementChild?.tagName).toBe('A');
|
|
475
|
+
});
|
|
476
|
+
});
|
|
477
|
+
|
|
323
478
|
describe('Token text overflow', () => {
|
|
324
479
|
it('label element has overflow hidden and text-overflow ellipsis styles', () => {
|
|
325
480
|
const {container} = render(<Token label="A very long label text" />);
|
|
@@ -355,11 +510,7 @@ describe('Token focus outline', () => {
|
|
|
355
510
|
it('invisible button does not show its own focus outline', async () => {
|
|
356
511
|
const user = userEvent.setup();
|
|
357
512
|
render(
|
|
358
|
-
<Token
|
|
359
|
-
label="Focusable"
|
|
360
|
-
onClick={() => {}}
|
|
361
|
-
data-testid="focus-token"
|
|
362
|
-
/>,
|
|
513
|
+
<Token label="Focusable" onClick={() => {}} data-testid="focus-token" />,
|
|
363
514
|
);
|
|
364
515
|
const button = screen.getByRole('button', {name: 'Focusable'});
|
|
365
516
|
await user.tab();
|
package/src/Token/Token.tsx
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Token.tsx
|
|
7
7
|
* @input Uses React, ReactNode, StyleXStyles
|
|
8
|
-
* @output Exports Token component, TokenProps, TokenColor types
|
|
8
|
+
* @output Exports Token component, TokenProps, TokenColor, TokenColorMap types
|
|
9
9
|
* @position Core implementation; consumed by index.ts, tested by Token.test.tsx
|
|
10
10
|
*
|
|
11
11
|
* SYNC: When modified, update these files to stay in sync:
|
|
12
|
+
* - /packages/core/src/Token/TokenLink.tsx (interactive wrapper for href+onRemove)
|
|
12
13
|
* - /packages/core/src/Token/Token.doc.mjs (props table, features, implementation notes)
|
|
13
14
|
* - /packages/core/src/Token/Token.test.tsx (tests for new/changed behavior)
|
|
14
15
|
* - /packages/core/src/Token/index.ts (exports if types change)
|
|
@@ -32,6 +33,7 @@ import {Icon} from '../Icon';
|
|
|
32
33
|
import {mergeProps} from '../utils';
|
|
33
34
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
34
35
|
import {useInteractiveRole} from '../hooks/useInteractiveRole';
|
|
36
|
+
import {TokenLink} from './TokenLink';
|
|
35
37
|
import type {BaseProps} from '../BaseProps';
|
|
36
38
|
import {themeProps} from '../utils/themeProps';
|
|
37
39
|
import {useTranslator} from '../i18n';
|
|
@@ -41,20 +43,37 @@ import {useTranslator} from '../i18n';
|
|
|
41
43
|
// =============================================================================
|
|
42
44
|
|
|
43
45
|
/**
|
|
44
|
-
*
|
|
46
|
+
* Extensible color map for Token.
|
|
47
|
+
*
|
|
48
|
+
* Theme packages can add custom colors via TypeScript module augmentation:
|
|
49
|
+
* @example
|
|
50
|
+
* ```
|
|
51
|
+
* declare module '@astryxdesign/core/Token' {
|
|
52
|
+
* interface TokenColorMap {
|
|
53
|
+
* brand: true;
|
|
54
|
+
* }
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export interface TokenColorMap {
|
|
59
|
+
default: true;
|
|
60
|
+
red: true;
|
|
61
|
+
orange: true;
|
|
62
|
+
yellow: true;
|
|
63
|
+
green: true;
|
|
64
|
+
teal: true;
|
|
65
|
+
cyan: true;
|
|
66
|
+
blue: true;
|
|
67
|
+
purple: true;
|
|
68
|
+
pink: true;
|
|
69
|
+
gray: true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Token color type derived from TokenColorMap.
|
|
74
|
+
* Extensible via module augmentation of TokenColorMap.
|
|
45
75
|
*/
|
|
46
|
-
export type TokenColor =
|
|
47
|
-
| 'default'
|
|
48
|
-
| 'red'
|
|
49
|
-
| 'orange'
|
|
50
|
-
| 'yellow'
|
|
51
|
-
| 'green'
|
|
52
|
-
| 'teal'
|
|
53
|
-
| 'cyan'
|
|
54
|
-
| 'blue'
|
|
55
|
-
| 'purple'
|
|
56
|
-
| 'pink'
|
|
57
|
-
| 'gray';
|
|
76
|
+
export type TokenColor = keyof TokenColorMap;
|
|
58
77
|
|
|
59
78
|
export type TokenSize = 'sm' | 'md' | 'lg';
|
|
60
79
|
|
|
@@ -296,7 +315,9 @@ const colorStyles = stylex.create({
|
|
|
296
315
|
* `<span>` container with an invisible `<button>` when `onClick` is provided.
|
|
297
316
|
* The invisible button pattern provides real button semantics for accessibility
|
|
298
317
|
* while the container uses `:focus-within` to show focus outlines around the
|
|
299
|
-
* entire token.
|
|
318
|
+
* entire token. When both `href` and `onRemove` are provided, the same
|
|
319
|
+
* container pattern is used with an invisible `<a>` so the remove `<button>`
|
|
320
|
+
* renders as a sibling of the link rather than nested inside it.
|
|
300
321
|
*
|
|
301
322
|
* @example
|
|
302
323
|
* ```
|
|
@@ -333,6 +354,20 @@ export function Token({
|
|
|
333
354
|
// if onClick was provided — the popover attaches its own handler.
|
|
334
355
|
const effectiveOnClick = onClick ?? (role === 'button' ? () => {} : null);
|
|
335
356
|
|
|
357
|
+
const removeButton = onRemove != null && (
|
|
358
|
+
<button
|
|
359
|
+
type="button"
|
|
360
|
+
aria-label={t('@astryx.token.remove', {label})}
|
|
361
|
+
onClick={e => {
|
|
362
|
+
e.stopPropagation();
|
|
363
|
+
onRemove(e);
|
|
364
|
+
}}
|
|
365
|
+
disabled={isDisabled}
|
|
366
|
+
{...stylex.props(styles.removeButton)}>
|
|
367
|
+
<Icon icon="close" size="xsm" color="inherit" />
|
|
368
|
+
</button>
|
|
369
|
+
);
|
|
370
|
+
|
|
336
371
|
const content = (
|
|
337
372
|
<>
|
|
338
373
|
{icon}
|
|
@@ -341,19 +376,7 @@ export function Token({
|
|
|
341
376
|
{label}
|
|
342
377
|
</span>
|
|
343
378
|
{endContent}
|
|
344
|
-
{
|
|
345
|
-
<button
|
|
346
|
-
type="button"
|
|
347
|
-
aria-label={t('@astryx.token.remove', {label})}
|
|
348
|
-
onClick={e => {
|
|
349
|
-
e.stopPropagation();
|
|
350
|
-
onRemove(e);
|
|
351
|
-
}}
|
|
352
|
-
disabled={isDisabled}
|
|
353
|
-
{...stylex.props(styles.removeButton)}>
|
|
354
|
-
<Icon icon="close" size="xsm" color="inherit" />
|
|
355
|
-
</button>
|
|
356
|
-
)}
|
|
379
|
+
{removeButton}
|
|
357
380
|
</>
|
|
358
381
|
);
|
|
359
382
|
|
|
@@ -364,11 +387,57 @@ export function Token({
|
|
|
364
387
|
};
|
|
365
388
|
|
|
366
389
|
if (role === 'link') {
|
|
390
|
+
if (onRemove == null) {
|
|
391
|
+
return (
|
|
392
|
+
<LinkComponent
|
|
393
|
+
ref={ref as React.Ref<HTMLAnchorElement>}
|
|
394
|
+
href={href as string}
|
|
395
|
+
aria-disabled={isDisabled || undefined}
|
|
396
|
+
{...sharedProps}
|
|
397
|
+
{...mergeProps(
|
|
398
|
+
themeProps('token', {color, size}),
|
|
399
|
+
stylex.props(
|
|
400
|
+
styles.base,
|
|
401
|
+
sizeStyles[size],
|
|
402
|
+
colorStyles[color],
|
|
403
|
+
styles.interactive,
|
|
404
|
+
isDisabled && styles.disabled,
|
|
405
|
+
xstyle,
|
|
406
|
+
),
|
|
407
|
+
className,
|
|
408
|
+
style,
|
|
409
|
+
)}>
|
|
410
|
+
{content}
|
|
411
|
+
</LinkComponent>
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// With a remove button, the link cannot be the root — nesting a <button>
|
|
416
|
+
// inside an <a> is invalid HTML (WCAG 4.1.2). Delegate to TokenLink, a
|
|
417
|
+
// non-presentational wrapper that renders a <span> container with the link
|
|
418
|
+
// and the remove button as siblings and wires up useClickableContainer so
|
|
419
|
+
// the whole token surface activates the link (including middle-click and
|
|
420
|
+
// cmd/ctrl-click to open in a new tab). Token itself stays presentational
|
|
421
|
+
// (no refs/effects) per the @astryx/presentational-component rule.
|
|
367
422
|
return (
|
|
368
|
-
<
|
|
369
|
-
ref={ref
|
|
423
|
+
<TokenLink
|
|
424
|
+
ref={ref}
|
|
370
425
|
href={href as string}
|
|
371
|
-
|
|
426
|
+
isDisabled={isDisabled}
|
|
427
|
+
LinkComponent={LinkComponent}
|
|
428
|
+
icon={icon}
|
|
429
|
+
endContent={endContent}
|
|
430
|
+
removeButton={removeButton}
|
|
431
|
+
linkStyleProps={stylex.props(styles.invisibleButton)}
|
|
432
|
+
labelContent={
|
|
433
|
+
<span
|
|
434
|
+
{...stylex.props(
|
|
435
|
+
styles.label,
|
|
436
|
+
isLabelHidden && styles.labelHidden,
|
|
437
|
+
)}>
|
|
438
|
+
{label}
|
|
439
|
+
</span>
|
|
440
|
+
}
|
|
372
441
|
{...sharedProps}
|
|
373
442
|
{...mergeProps(
|
|
374
443
|
themeProps('token', {color, size}),
|
|
@@ -377,14 +446,14 @@ export function Token({
|
|
|
377
446
|
sizeStyles[size],
|
|
378
447
|
colorStyles[color],
|
|
379
448
|
styles.interactive,
|
|
449
|
+
styles.focusVisibleOutline,
|
|
380
450
|
isDisabled && styles.disabled,
|
|
381
451
|
xstyle,
|
|
382
452
|
),
|
|
383
453
|
className,
|
|
384
454
|
style,
|
|
385
|
-
)}
|
|
386
|
-
|
|
387
|
-
</LinkComponent>
|
|
455
|
+
)}
|
|
456
|
+
/>
|
|
388
457
|
);
|
|
389
458
|
}
|
|
390
459
|
|
|
@@ -431,19 +500,7 @@ export function Token({
|
|
|
431
500
|
</span>
|
|
432
501
|
</button>
|
|
433
502
|
{endContent}
|
|
434
|
-
{
|
|
435
|
-
<button
|
|
436
|
-
type="button"
|
|
437
|
-
aria-label={t('@astryx.token.remove', {label})}
|
|
438
|
-
onClick={e => {
|
|
439
|
-
e.stopPropagation();
|
|
440
|
-
onRemove(e);
|
|
441
|
-
}}
|
|
442
|
-
disabled={isDisabled}
|
|
443
|
-
{...stylex.props(styles.removeButton)}>
|
|
444
|
-
<Icon icon="close" size="xsm" color="inherit" />
|
|
445
|
-
</button>
|
|
446
|
-
)}
|
|
503
|
+
{removeButton}
|
|
447
504
|
</span>
|
|
448
505
|
);
|
|
449
506
|
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file TokenLink.tsx
|
|
7
|
+
* @input Rendered token pieces (icon, label, endContent, remove button) plus
|
|
8
|
+
* container/link styling props and the resolved LinkComponent
|
|
9
|
+
* @output Exports TokenLink, the interactive container for the href+onRemove Token variant
|
|
10
|
+
* @position Internal to Token; keeps Token.tsx presentational
|
|
11
|
+
*
|
|
12
|
+
* Token is a presentational component (see
|
|
13
|
+
* /internal/eslint-plugin-astryx/presentational-component.js) and must not use
|
|
14
|
+
* refs or effects. When a Token has both `href` and `onRemove`, the remove
|
|
15
|
+
* <button> must be a sibling of the link (nesting a button inside an anchor is
|
|
16
|
+
* invalid HTML — WCAG 4.1.2), so the surface becomes a clickable container that
|
|
17
|
+
* delegates to an inner link. That delegation needs refs, so it lives here.
|
|
18
|
+
*
|
|
19
|
+
* useClickableContainer gives the container middle-click and cmd/ctrl-click
|
|
20
|
+
* open-in-new-tab behavior for the link, ignores clicks on nested interactive
|
|
21
|
+
* elements (the remove button), and skips activation during text selection.
|
|
22
|
+
*
|
|
23
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
24
|
+
* - /packages/core/src/Token/Token.tsx (renders TokenLink for the href+onRemove case)
|
|
25
|
+
* - /packages/core/src/Token/Token.test.tsx (tests for delegated behavior)
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import type {ReactNode, CSSProperties, Ref, HTMLAttributes} from 'react';
|
|
29
|
+
import {useRef} from 'react';
|
|
30
|
+
import {mergeRefs} from '../utils';
|
|
31
|
+
import {useClickableContainer} from '../hooks/useClickableContainer';
|
|
32
|
+
import type {LinkComponentType} from '../Link/types';
|
|
33
|
+
|
|
34
|
+
export interface TokenLinkProps extends HTMLAttributes<HTMLElement> {
|
|
35
|
+
/** Ref forwarded to the container element. */
|
|
36
|
+
ref?: Ref<HTMLElement>;
|
|
37
|
+
/** Link URL. */
|
|
38
|
+
href: string;
|
|
39
|
+
/** Whether the token is disabled. */
|
|
40
|
+
isDisabled: boolean;
|
|
41
|
+
/** Resolved link component (native `<a>` or a router link). */
|
|
42
|
+
LinkComponent: LinkComponentType;
|
|
43
|
+
/** `stylex.props()` output applied to the invisible inner link. */
|
|
44
|
+
linkStyleProps: {className?: string; style?: CSSProperties};
|
|
45
|
+
/** Visible (or visually hidden) label node rendered inside the link. */
|
|
46
|
+
labelContent: ReactNode;
|
|
47
|
+
/** Optional leading icon. */
|
|
48
|
+
icon?: ReactNode;
|
|
49
|
+
/** Content rendered after the label, before the remove button. */
|
|
50
|
+
endContent?: ReactNode;
|
|
51
|
+
/** The remove button node, rendered as a sibling of the link. */
|
|
52
|
+
removeButton: ReactNode;
|
|
53
|
+
/** Allow data-* attributes (e.g. data-testid, theme targets) on the container. */
|
|
54
|
+
[dataAttr: `data-${string}`]: unknown;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Interactive container for a Token that is both a link and removable.
|
|
59
|
+
*
|
|
60
|
+
* Renders a `<span>` wrapping an invisible inner link and the remove button as
|
|
61
|
+
* siblings. useClickableContainer delegates clicks on the surface to the link
|
|
62
|
+
* (including middle-click / cmd+click to open in a new tab) while the remove
|
|
63
|
+
* button keeps handling its own clicks.
|
|
64
|
+
*/
|
|
65
|
+
export function TokenLink({
|
|
66
|
+
ref,
|
|
67
|
+
href,
|
|
68
|
+
isDisabled,
|
|
69
|
+
LinkComponent,
|
|
70
|
+
linkStyleProps,
|
|
71
|
+
labelContent,
|
|
72
|
+
icon,
|
|
73
|
+
endContent,
|
|
74
|
+
removeButton,
|
|
75
|
+
...containerProps
|
|
76
|
+
}: TokenLinkProps) {
|
|
77
|
+
const containerRef = useRef<HTMLElement | null>(null);
|
|
78
|
+
const linkRef = useRef<HTMLElement | null>(null);
|
|
79
|
+
|
|
80
|
+
const {onClick, onMouseUp} = useClickableContainer({
|
|
81
|
+
containerRef,
|
|
82
|
+
interactiveRef: linkRef,
|
|
83
|
+
href,
|
|
84
|
+
disabled: isDisabled,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<span
|
|
89
|
+
ref={mergeRefs(ref, containerRef)}
|
|
90
|
+
onClick={isDisabled ? undefined : onClick}
|
|
91
|
+
onMouseUp={isDisabled ? undefined : onMouseUp}
|
|
92
|
+
{...containerProps}>
|
|
93
|
+
{icon}
|
|
94
|
+
<LinkComponent
|
|
95
|
+
ref={linkRef as Ref<HTMLAnchorElement>}
|
|
96
|
+
href={href}
|
|
97
|
+
aria-disabled={isDisabled || undefined}
|
|
98
|
+
{...linkStyleProps}>
|
|
99
|
+
{labelContent}
|
|
100
|
+
</LinkComponent>
|
|
101
|
+
{endContent}
|
|
102
|
+
{removeButton}
|
|
103
|
+
</span>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
TokenLink.displayName = 'TokenLink';
|
package/src/Token/index.ts
CHANGED
|
@@ -88,6 +88,13 @@ export const docs = {
|
|
|
88
88
|
description:
|
|
89
89
|
'Validation status object with type and message for error/warning/success states.',
|
|
90
90
|
},
|
|
91
|
+
{
|
|
92
|
+
name: 'statusVariant',
|
|
93
|
+
type: "'attached' | 'detached'",
|
|
94
|
+
description:
|
|
95
|
+
'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.',
|
|
96
|
+
default: "'attached'",
|
|
97
|
+
},
|
|
91
98
|
{
|
|
92
99
|
name: 'isLabelHidden',
|
|
93
100
|
type: 'boolean',
|
|
@@ -185,7 +192,14 @@ export const docs = {
|
|
|
185
192
|
{
|
|
186
193
|
name: 'handleRef',
|
|
187
194
|
type: 'React.Ref<TokenizerHandle>',
|
|
188
|
-
description:
|
|
195
|
+
description:
|
|
196
|
+
'Imperative handle exposing focusInput(), focusFirstToken(), focusLastToken(), clearInput(), and selectAll().',
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: 'width',
|
|
200
|
+
type: 'SizeValue',
|
|
201
|
+
description:
|
|
202
|
+
'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.',
|
|
189
203
|
},
|
|
190
204
|
{
|
|
191
205
|
name: 'xstyle',
|
|
@@ -307,6 +321,13 @@ export const docsZh = {
|
|
|
307
321
|
description:
|
|
308
322
|
'\u9a8c\u8bc1\u72b6\u6001\u5bf9\u8c61\uff0c\u5305\u542b\u7c7b\u578b\u548c\u6d88\u606f\uff0c\u7528\u4e8e\u9519\u8bef/\u8b66\u544a/\u6210\u529f\u72b6\u6001\u3002',
|
|
309
323
|
},
|
|
324
|
+
{
|
|
325
|
+
name: 'statusVariant',
|
|
326
|
+
type: "'attached' | 'detached'",
|
|
327
|
+
description:
|
|
328
|
+
'状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距。',
|
|
329
|
+
default: "'attached'",
|
|
330
|
+
},
|
|
310
331
|
{
|
|
311
332
|
name: 'isLabelHidden',
|
|
312
333
|
type: 'boolean',
|
|
@@ -461,6 +482,7 @@ export const docsDense = {
|
|
|
461
482
|
isDisabled: 'Disables input+all token interactions.',
|
|
462
483
|
htmlName: 'HTML name attr; one hidden input per selected item id.',
|
|
463
484
|
status: 'Validation status w/ type+message for error/warning/success.',
|
|
485
|
+
statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing.',
|
|
464
486
|
isLabelHidden: 'Visually hides label; keeps a11y.',
|
|
465
487
|
description: 'Helper text below label.',
|
|
466
488
|
isRequired: 'Marks field required.',
|
|
@@ -1136,3 +1136,26 @@ describe('Tokenizer', () => {
|
|
|
1136
1136
|
});
|
|
1137
1137
|
});
|
|
1138
1138
|
});
|
|
1139
|
+
|
|
1140
|
+
|
|
1141
|
+
describe('Tokenizer statusVariant forwarding', () => {
|
|
1142
|
+
it('defaults to attached (status renders with data-variant="attached")', () => {
|
|
1143
|
+
const {container} = render(
|
|
1144
|
+
<Tokenizer label="Members" searchSource={userSource} value={[]} onChange={() => {}} status={{type: 'error', message: 'Required'}} />,
|
|
1145
|
+
);
|
|
1146
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
1147
|
+
'data-variant',
|
|
1148
|
+
'attached',
|
|
1149
|
+
);
|
|
1150
|
+
});
|
|
1151
|
+
|
|
1152
|
+
it('forwards statusVariant="detached" to the underlying Field status', () => {
|
|
1153
|
+
const {container} = render(
|
|
1154
|
+
<Tokenizer label="Members" searchSource={userSource} value={[]} onChange={() => {}} status={{type: 'error', message: 'Required'}} statusVariant="detached" />,
|
|
1155
|
+
);
|
|
1156
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
1157
|
+
'data-variant',
|
|
1158
|
+
'detached',
|
|
1159
|
+
);
|
|
1160
|
+
});
|
|
1161
|
+
});
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
inputStatusBorderStyles,
|
|
38
38
|
inputStatusHoverShadowStyles,
|
|
39
39
|
inputStatusFocusWithinStyles,
|
|
40
|
+
type FieldStatusVariant,
|
|
40
41
|
} from '../Field';
|
|
41
42
|
import {Token} from '../Token';
|
|
42
43
|
import {renderIconSlot, type IconType} from '../Icon';
|
|
@@ -111,6 +112,13 @@ export interface TokenizerProps<T extends SearchableItem> extends Omit<
|
|
|
111
112
|
isOptional?: boolean;
|
|
112
113
|
/** Validation status. */
|
|
113
114
|
status?: InputStatus;
|
|
115
|
+
/**
|
|
116
|
+
* How the status message is placed relative to the input.
|
|
117
|
+
* - 'attached': message overlaps directly below the input (bordered treatment)
|
|
118
|
+
* - 'detached': message floats below as a separate element with spacing
|
|
119
|
+
* @default 'attached'
|
|
120
|
+
*/
|
|
121
|
+
statusVariant?: FieldStatusVariant;
|
|
114
122
|
/**
|
|
115
123
|
* Icon to display at the start of the input.
|
|
116
124
|
* Accepts a ReactNode (e.g. `<Icon icon={SearchIcon} />`) or an SVG icon component directly.
|
|
@@ -370,6 +378,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
370
378
|
isRequired = false,
|
|
371
379
|
isOptional = false,
|
|
372
380
|
status,
|
|
381
|
+
statusVariant = 'attached',
|
|
373
382
|
startIcon,
|
|
374
383
|
labelTooltip,
|
|
375
384
|
searchSource,
|
|
@@ -730,7 +739,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
730
739
|
isTruncated && styles.truncatedWrapper,
|
|
731
740
|
isDisabled && inputWrapperStyles.disabled,
|
|
732
741
|
status && inputStatusBorderStyles[status.type],
|
|
733
|
-
status && inputStatusHoverShadowStyles[status.type],
|
|
742
|
+
status && !isDisabled && inputStatusHoverShadowStyles[status.type],
|
|
734
743
|
status && inputStatusFocusWithinStyles[status.type],
|
|
735
744
|
),
|
|
736
745
|
)}>
|
|
@@ -828,7 +837,9 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
828
837
|
isTruncated && styles.truncatedWrapper,
|
|
829
838
|
isDisabled && inputWrapperStyles.disabled,
|
|
830
839
|
status && inputStatusBorderStyles[status.type],
|
|
831
|
-
status &&
|
|
840
|
+
status &&
|
|
841
|
+
!isDisabled &&
|
|
842
|
+
inputStatusHoverShadowStyles[status.type],
|
|
832
843
|
status && inputStatusFocusWithinStyles[status.type],
|
|
833
844
|
),
|
|
834
845
|
)}>
|
|
@@ -891,6 +902,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
891
902
|
}
|
|
892
903
|
: undefined
|
|
893
904
|
}
|
|
905
|
+
statusVariant={statusVariant}
|
|
894
906
|
labelTooltip={labelTooltip}
|
|
895
907
|
width={width}
|
|
896
908
|
xstyle={xstyle}
|