@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052
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 +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +58 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +240 -53
- package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- 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.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
- package/dist/Breadcrumbs/index.d.ts +6 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +10 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +80 -11
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +3 -3
- 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.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +46 -16
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +4 -2
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +27 -11
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +5 -5
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- 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/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +22 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +2 -2
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +45 -4
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +14 -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 +56 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -21
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- 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 +33 -19
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- 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 +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
- 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 +6 -4
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- 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 +18 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +60 -6
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +54 -35
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +17 -6
- package/dist/Icon/Icon.d.ts +22 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -13
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +104 -50
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- 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.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- 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/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.js +4 -4
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +65 -19
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- 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/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- 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/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +106 -36
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +160 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +33 -6
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/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 +36 -26
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +7 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- 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.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +32 -21
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Token/Token.d.ts +30 -3
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +17 -2
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -6
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +18 -10
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +59 -21
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -1
- 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 +61 -39
- package/dist/astryx.umd.js +53 -53
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- 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/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +158 -0
- 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/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- 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/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- 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/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +65 -3
- 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/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +104 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +78 -0
- package/package.json +6 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +64 -5
- package/src/Avatar/Avatar.test.tsx +374 -1
- package/src/Avatar/Avatar.tsx +367 -69
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +180 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
- package/src/Breadcrumbs/index.ts +31 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +362 -19
- package/src/Calendar/Calendar.tsx +111 -32
- package/src/Calendar/dayCellUtils.test.ts +23 -18
- package/src/Calendar/dayCellUtils.ts +3 -3
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +59 -10
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +11 -2
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +33 -5
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +5 -5
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- 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/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +45 -10
- 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.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +44 -3
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +235 -0
- package/src/ContextMenu/ContextMenu.tsx +13 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +41 -0
- package/src/DateInput/DateInput.test.tsx +338 -0
- package/src/DateInput/DateInput.tsx +119 -32
- package/src/DateInput/index.ts +1 -0
- 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 +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +58 -41
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -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.test.tsx +57 -12
- package/src/Field/Field.tsx +20 -14
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +69 -5
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +65 -51
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +39 -5
- package/src/Icon/Icon.doc.mjs +16 -2
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +58 -5
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +15 -7
- package/src/List/List.test.tsx +9 -8
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
- package/src/MultiSelector/MultiSelector.test.tsx +498 -3
- package/src/MultiSelector/MultiSelector.tsx +149 -65
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +36 -28
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +4 -4
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +417 -0
- package/src/Selector/Selector.tsx +86 -21
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +15 -8
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +10 -4
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +314 -13
- package/src/Slider/Slider.tsx +117 -28
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +54 -1
- package/src/Switch/Switch.tsx +90 -33
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +37 -7
- 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/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/types.ts +33 -0
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- 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 +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +43 -31
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Token/Token.test.tsx +21 -15
- package/src/Token/Token.tsx +31 -14
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +30 -6
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +28 -0
- package/src/TreeList/TreeList.test.tsx +272 -0
- package/src/TreeList/TreeList.tsx +23 -2
- package/src/TreeList/TreeListBranches.tsx +24 -8
- package/src/TreeList/TreeListItem.tsx +84 -22
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +11 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/authoring/doc.ts +1 -3
- package/src/doc-mjs.d.ts +19 -0
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +8 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- 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/useInputStatusIcon.test.tsx +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -0
- 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/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- 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/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/plainDate.test.ts +46 -6
- package/src/utils/plainDate.ts +69 -3
- package/src/utils/rtlStyles.ts +27 -0
- package/src/utils/types.ts +14 -0
|
@@ -26,9 +26,9 @@ export const docs = {
|
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
name: 'format',
|
|
29
|
-
type: "'relative' | 'auto' | 'date' | 'date_time' | 'time' | 'system_date' | 'system_date_time' | 'system_time'",
|
|
29
|
+
type: "'relative' | 'auto' | 'date' | 'date_long' | 'date_weekday' | 'date_time' | 'time' | 'system_date' | 'system_date_time' | 'system_time'",
|
|
30
30
|
description:
|
|
31
|
-
"Display format. 'relative' shows '2 hours ago', 'date' shows 'Mar 21, 2025', 'date_time' shows 'Mar 21, 2025, 2:51 PM', 'time' shows '2:51 PM', 'system_*' variants use ISO-style formatting, 'auto' switches from relative to date_time based on recency.",
|
|
31
|
+
"Display format. 'relative' shows '2 hours ago', 'date' shows 'Mar 21, 2025', 'date_long' shows 'March 21, 2025', 'date_weekday' shows 'Wed, Mar 21, 2025', 'date_time' shows 'Mar 21, 2025, 2:51 PM', 'time' shows '2:51 PM', 'system_*' variants use ISO-style formatting, 'auto' switches from relative to date_time based on recency.",
|
|
32
32
|
default: "'auto'",
|
|
33
33
|
},
|
|
34
34
|
{
|
|
@@ -110,7 +110,7 @@ export const docs = {
|
|
|
110
110
|
export const docsZh = {
|
|
111
111
|
propDescriptions: {
|
|
112
112
|
value: '\u8981\u663e\u793a\u7684\u65e5\u671f/\u65f6\u95f4\u3002\u63a5\u53d7 Unix \u65f6\u95f4\u6233\uff08\u79d2\uff09\u6216 ISO 8601 \u5b57\u7b26\u4e32\u3002',
|
|
113
|
-
format: "\u663e\u793a\u683c\u5f0f\u3002'relative' \u663e\u793a '2\u5c0f\u65f6\u524d'\uff0c'date' \u663e\u793a\u65e5\u671f\uff0c'auto' \u6839\u636e\u65f6\u95f4\u8fdc\u8fd1\u81ea\u52a8\u5207\u6362\u3002",
|
|
113
|
+
format: "\u663e\u793a\u683c\u5f0f\u3002'relative' \u663e\u793a '2\u5c0f\u65f6\u524d'\uff0c'date' \u663e\u793a\u65e5\u671f\uff0c'date_long' \u663e\u793a\u957f\u6708\u4efd\u65e5\u671f\uff0c'date_weekday' \u663e\u793a\u661f\u671f+\u65e5\u671f\uff0c'auto' \u6839\u636e\u65f6\u95f4\u8fdc\u8fd1\u81ea\u52a8\u5207\u6362\u3002",
|
|
114
114
|
autoThreshold: "auto \u683c\u5f0f\u4ece\u76f8\u5bf9\u65f6\u95f4\u5207\u6362\u5230 date_time \u7684\u9608\u503c\u79d2\u6570\u3002",
|
|
115
115
|
hasTooltip: '\u60ac\u505c\u65f6\u662f\u5426\u663e\u793a\u5305\u542b\u5b8c\u6574\u65e5\u671f/\u65f6\u95f4\u7684\u5de5\u5177\u63d0\u793a\uff08\u76f8\u5bf9\u65f6\u95f4\u6a21\u5f0f\uff09\u3002',
|
|
116
116
|
isTimezoneShown: '\u662f\u5426\u9644\u52a0\u65f6\u533a\u7f29\u5199\u3002',
|
|
@@ -157,7 +157,7 @@ export const docsDense = {
|
|
|
157
157
|
},
|
|
158
158
|
propDescriptions: {
|
|
159
159
|
value: 'date/time as unix seconds or ISO string',
|
|
160
|
-
format: "display mode: 'relative', 'auto', 'date', 'date_time', 'time', 'system_date', 'system_date_time', 'system_time'",
|
|
160
|
+
format: "display mode: 'relative', 'auto', 'date', 'date_long', 'date_weekday', 'date_time', 'time', 'system_date', 'system_date_time', 'system_time'",
|
|
161
161
|
autoThreshold: 'seconds threshold for auto relative\u2192date_time switch',
|
|
162
162
|
hasTooltip: 'show full time tooltip on hover (relative mode)',
|
|
163
163
|
isTimezoneShown: 'append timezone abbreviation',
|
|
@@ -99,6 +99,38 @@ describe('Timestamp', () => {
|
|
|
99
99
|
expect(el.textContent).not.toContain(':');
|
|
100
100
|
});
|
|
101
101
|
|
|
102
|
+
it('renders date_weekday format with a weekday prefix', () => {
|
|
103
|
+
render(
|
|
104
|
+
<Timestamp
|
|
105
|
+
value="2026-02-19T17:00:00Z"
|
|
106
|
+
format="date_weekday"
|
|
107
|
+
data-testid="ts"
|
|
108
|
+
/>,
|
|
109
|
+
);
|
|
110
|
+
const el = screen.getByTestId('ts');
|
|
111
|
+
// Includes the year and a leading weekday abbreviation, no time portion.
|
|
112
|
+
expect(el.textContent).toContain('2026');
|
|
113
|
+
expect(el.textContent).not.toContain(':');
|
|
114
|
+
// en-US short weekday for 2026-02-19 is "Thu"; assert a weekday word is
|
|
115
|
+
// present without over-fitting the exact locale punctuation.
|
|
116
|
+
expect(el.textContent).toMatch(/Mon|Tue|Wed|Thu|Fri|Sat|Sun/);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('renders date_long format with a full month name', () => {
|
|
120
|
+
render(
|
|
121
|
+
<Timestamp
|
|
122
|
+
value="2026-02-19T17:00:00Z"
|
|
123
|
+
format="date_long"
|
|
124
|
+
data-testid="ts"
|
|
125
|
+
/>,
|
|
126
|
+
);
|
|
127
|
+
const el = screen.getByTestId('ts');
|
|
128
|
+
// Long-month shape: full month name, year, no time portion.
|
|
129
|
+
expect(el.textContent).toContain('February');
|
|
130
|
+
expect(el.textContent).toContain('2026');
|
|
131
|
+
expect(el.textContent).not.toContain(':');
|
|
132
|
+
});
|
|
133
|
+
|
|
102
134
|
it('renders date_time format', () => {
|
|
103
135
|
render(
|
|
104
136
|
<Timestamp
|
|
@@ -21,9 +21,11 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
21
21
|
import {Text} from '../Text';
|
|
22
22
|
import type {TextType, TextSize, TextColor, TextWeight} from '../theme/types';
|
|
23
23
|
import {mergeProps, mergeRefs} from '../utils';
|
|
24
|
+
import {useDevWarning} from '../hooks/useDevWarning';
|
|
24
25
|
import type {BaseProps} from '../BaseProps';
|
|
25
26
|
import {themeProps} from '../utils/themeProps';
|
|
26
27
|
import {colorVars} from '../theme/tokens.stylex';
|
|
28
|
+
import {SHARED_DATE_FORMAT_OPTIONS} from '../utils/plainDate';
|
|
27
29
|
|
|
28
30
|
const LazyXDSTooltip = lazy(async () =>
|
|
29
31
|
import('../Tooltip/Tooltip').then(mod => ({default: mod.Tooltip})),
|
|
@@ -37,6 +39,8 @@ export type TimestampFormat =
|
|
|
37
39
|
| 'relative'
|
|
38
40
|
| 'auto'
|
|
39
41
|
| 'date'
|
|
42
|
+
| 'date_long'
|
|
43
|
+
| 'date_weekday'
|
|
40
44
|
| 'date_time'
|
|
41
45
|
| 'time'
|
|
42
46
|
| 'system_date'
|
|
@@ -53,6 +57,8 @@ export interface TimestampProps extends BaseProps<HTMLTimeElement> {
|
|
|
53
57
|
* - `'relative'`: "2 hours ago", "yesterday", "now"
|
|
54
58
|
* - `'auto'`: Relative for recent times, `date_time` for older
|
|
55
59
|
* - `'date'`: "Mar 21, 2025"
|
|
60
|
+
* - `'date_long'`: "March 21, 2025"
|
|
61
|
+
* - `'date_weekday'`: "Wed, Mar 21, 2025"
|
|
56
62
|
* - `'date_time'`: "Mar 21, 2025, 2:51 PM"
|
|
57
63
|
* - `'time'`: "2:51 PM"
|
|
58
64
|
* - `'system_date'`: "2025-03-21"
|
|
@@ -249,11 +255,22 @@ function formatTimestamp(
|
|
|
249
255
|
): string {
|
|
250
256
|
switch (format) {
|
|
251
257
|
case 'date':
|
|
252
|
-
return new Intl.DateTimeFormat(
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
258
|
+
return new Intl.DateTimeFormat(
|
|
259
|
+
undefined,
|
|
260
|
+
SHARED_DATE_FORMAT_OPTIONS.date,
|
|
261
|
+
).format(date);
|
|
262
|
+
|
|
263
|
+
case 'date_long':
|
|
264
|
+
return new Intl.DateTimeFormat(
|
|
265
|
+
undefined,
|
|
266
|
+
SHARED_DATE_FORMAT_OPTIONS.date_long,
|
|
267
|
+
).format(date);
|
|
268
|
+
|
|
269
|
+
case 'date_weekday':
|
|
270
|
+
return new Intl.DateTimeFormat(
|
|
271
|
+
undefined,
|
|
272
|
+
SHARED_DATE_FORMAT_OPTIONS.date_weekday,
|
|
273
|
+
).format(date);
|
|
257
274
|
|
|
258
275
|
case 'date_time':
|
|
259
276
|
return new Intl.DateTimeFormat(undefined, {
|
|
@@ -415,11 +432,14 @@ export function Timestamp({
|
|
|
415
432
|
return () => clearInterval(timer);
|
|
416
433
|
}, [isLive, isValidDate, effectiveFormat, diffSeconds]);
|
|
417
434
|
|
|
435
|
+
useDevWarning(
|
|
436
|
+
'Timestamp',
|
|
437
|
+
`could not parse value ${JSON.stringify(value)} as a date. Rendering nothing.`,
|
|
438
|
+
!isValidDate,
|
|
439
|
+
);
|
|
440
|
+
|
|
418
441
|
// Placed after all hooks so the hook order stays stable across renders.
|
|
419
442
|
if (!isValidDate) {
|
|
420
|
-
console.warn(
|
|
421
|
-
`Timestamp: could not parse value ${JSON.stringify(value)} as a date. Rendering nothing.`,
|
|
422
|
-
);
|
|
423
443
|
return null;
|
|
424
444
|
}
|
|
425
445
|
|
package/src/Toast/useToast.tsx
CHANGED
|
@@ -7,6 +7,7 @@ import {createRoot} from 'react-dom/client';
|
|
|
7
7
|
import {dataAttr} from '../naming';
|
|
8
8
|
import {ToastContext, type ToastContextValue} from './ToastContext';
|
|
9
9
|
import {ToastViewport} from './ToastViewport';
|
|
10
|
+
import {warnOnce} from '../utils/devWarning';
|
|
10
11
|
import type {
|
|
11
12
|
ToastOptions,
|
|
12
13
|
ToastDismissFn,
|
|
@@ -17,7 +18,6 @@ import type {
|
|
|
17
18
|
// Fallback singleton
|
|
18
19
|
let fallbackContext: ToastContextValue | null = null;
|
|
19
20
|
let fallbackRoot: ReturnType<typeof createRoot> | null = null;
|
|
20
|
-
let fallbackWarned = false;
|
|
21
21
|
|
|
22
22
|
const ROOT_THEME_ATTRS = ['data-theme', dataAttr('theme')] as const;
|
|
23
23
|
|
|
@@ -70,13 +70,12 @@ function getFallbackContext(): ToastContextValue {
|
|
|
70
70
|
);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
73
|
+
warnOnce(
|
|
74
|
+
'toast-fallback-viewport',
|
|
75
|
+
'useToast',
|
|
76
|
+
'No LayerProvider found. Using fallback viewport. ' +
|
|
77
|
+
'Wrap your app with <LayerProvider> or <AppShell> for full control.',
|
|
78
|
+
);
|
|
80
79
|
|
|
81
80
|
const container = document.createElement('div');
|
|
82
81
|
container.setAttribute('data-astryx-toast-fallback', '');
|
|
@@ -41,7 +41,7 @@ interface ToggleButtonGroupContextValue {
|
|
|
41
41
|
isDisabled?: boolean;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
const ToggleButtonGroupContext =
|
|
45
45
|
createContext<ToggleButtonGroupContextValue | null>(null);
|
|
46
46
|
ToggleButtonGroupContext.displayName = 'ToggleButtonGroupContext';
|
|
47
47
|
|
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) {
|
|
@@ -355,11 +365,7 @@ describe('Token focus outline', () => {
|
|
|
355
365
|
it('invisible button does not show its own focus outline', async () => {
|
|
356
366
|
const user = userEvent.setup();
|
|
357
367
|
render(
|
|
358
|
-
<Token
|
|
359
|
-
label="Focusable"
|
|
360
|
-
onClick={() => {}}
|
|
361
|
-
data-testid="focus-token"
|
|
362
|
-
/>,
|
|
368
|
+
<Token label="Focusable" onClick={() => {}} data-testid="focus-token" />,
|
|
363
369
|
);
|
|
364
370
|
const button = screen.getByRole('button', {name: 'Focusable'});
|
|
365
371
|
await user.tab();
|
package/src/Token/Token.tsx
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
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:
|
|
@@ -41,20 +41,37 @@ import {useTranslator} from '../i18n';
|
|
|
41
41
|
// =============================================================================
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* Extensible color map for Token.
|
|
45
|
+
*
|
|
46
|
+
* Theme packages can add custom colors via TypeScript module augmentation:
|
|
47
|
+
* @example
|
|
48
|
+
* ```
|
|
49
|
+
* declare module '@astryxdesign/core/Token' {
|
|
50
|
+
* interface TokenColorMap {
|
|
51
|
+
* brand: true;
|
|
52
|
+
* }
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export interface TokenColorMap {
|
|
57
|
+
default: true;
|
|
58
|
+
red: true;
|
|
59
|
+
orange: true;
|
|
60
|
+
yellow: true;
|
|
61
|
+
green: true;
|
|
62
|
+
teal: true;
|
|
63
|
+
cyan: true;
|
|
64
|
+
blue: true;
|
|
65
|
+
purple: true;
|
|
66
|
+
pink: true;
|
|
67
|
+
gray: true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Token color type derived from TokenColorMap.
|
|
72
|
+
* Extensible via module augmentation of TokenColorMap.
|
|
45
73
|
*/
|
|
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';
|
|
74
|
+
export type TokenColor = keyof TokenColorMap;
|
|
58
75
|
|
|
59
76
|
export type TokenSize = 'sm' | 'md' | 'lg';
|
|
60
77
|
|
package/src/Token/index.ts
CHANGED
|
@@ -31,7 +31,7 @@ export const docs = {
|
|
|
31
31
|
name: 'onChange',
|
|
32
32
|
type: '(items: T[], change: TokenizerChange<T>) => void',
|
|
33
33
|
description:
|
|
34
|
-
"Called when selection changes. The change argument includes the affected item and type ('add' | 'create' | 'remove' | 'reorder').",
|
|
34
|
+
"Called when selection changes. The change argument includes the affected item and type ('add' | 'create' | 'remove' | 'reorder'). Additions and removals (including Backspace on an empty input) are announced to screen readers via a polite live region.",
|
|
35
35
|
required: true,
|
|
36
36
|
},
|
|
37
37
|
{
|
|
@@ -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',
|
|
@@ -165,6 +172,13 @@ export const docs = {
|
|
|
165
172
|
type: '(query: string) => void',
|
|
166
173
|
description: 'Callback fired when the search query text changes.',
|
|
167
174
|
},
|
|
175
|
+
{
|
|
176
|
+
name: 'startIcon',
|
|
177
|
+
type: 'ReactNode | IconType',
|
|
178
|
+
description:
|
|
179
|
+
'Icon to display at the start of the input, before any tokens. Accepts a semantic icon name, an SVG icon component, or a ReactNode directly.',
|
|
180
|
+
slotElements: [{__element: 'Icon', props: {icon: 'search', size: 'sm'}}],
|
|
181
|
+
},
|
|
168
182
|
{
|
|
169
183
|
name: 'endContent',
|
|
170
184
|
type: 'ReactNode',
|
|
@@ -178,7 +192,14 @@ export const docs = {
|
|
|
178
192
|
{
|
|
179
193
|
name: 'handleRef',
|
|
180
194
|
type: 'React.Ref<TokenizerHandle>',
|
|
181
|
-
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.',
|
|
182
203
|
},
|
|
183
204
|
{
|
|
184
205
|
name: 'xstyle',
|
|
@@ -300,6 +321,13 @@ export const docsZh = {
|
|
|
300
321
|
description:
|
|
301
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',
|
|
302
323
|
},
|
|
324
|
+
{
|
|
325
|
+
name: 'statusVariant',
|
|
326
|
+
type: "'attached' | 'detached'",
|
|
327
|
+
description:
|
|
328
|
+
'状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距。',
|
|
329
|
+
default: "'attached'",
|
|
330
|
+
},
|
|
303
331
|
{
|
|
304
332
|
name: 'isLabelHidden',
|
|
305
333
|
type: 'boolean',
|
|
@@ -370,6 +398,12 @@ export const docsZh = {
|
|
|
370
398
|
type: '(query: string) => void',
|
|
371
399
|
description: '\u641c\u7d22\u67e5\u8be2\u6587\u672c\u53d8\u66f4\u65f6\u89e6\u53d1\u7684\u56de\u8c03\u3002',
|
|
372
400
|
},
|
|
401
|
+
{
|
|
402
|
+
name: 'startIcon',
|
|
403
|
+
type: 'ReactNode | IconType',
|
|
404
|
+
description:
|
|
405
|
+
'\u5728\u8f93\u5165\u6846\u5f00\u5934\uff08token \u4e4b\u524d\uff09\u663e\u793a\u7684\u56fe\u6807\u3002\u63a5\u53d7\u8bed\u4e49\u56fe\u6807\u540d\u79f0\u3001SVG \u56fe\u6807\u7ec4\u4ef6\u6216\u76f4\u63a5\u4f20\u5165 ReactNode\u3002',
|
|
406
|
+
},
|
|
373
407
|
{
|
|
374
408
|
name: 'endContent',
|
|
375
409
|
type: 'ReactNode',
|
|
@@ -448,6 +482,7 @@ export const docsDense = {
|
|
|
448
482
|
isDisabled: 'Disables input+all token interactions.',
|
|
449
483
|
htmlName: 'HTML name attr; one hidden input per selected item id.',
|
|
450
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.',
|
|
451
486
|
isLabelHidden: 'Visually hides label; keeps a11y.',
|
|
452
487
|
description: 'Helper text below label.',
|
|
453
488
|
isRequired: 'Marks field required.',
|
|
@@ -460,6 +495,7 @@ export const docsDense = {
|
|
|
460
495
|
size: 'Input+token size.',
|
|
461
496
|
debounceMs: 'Search debounce delay ms. 0 for sync sources.',
|
|
462
497
|
onChangeQuery: 'Fired on search query text change.',
|
|
498
|
+
startIcon: 'Icon at input start, before tokens. Icon name, SVG component, or ReactNode.',
|
|
463
499
|
endContent: 'Content at input row end. For buttons, counts, controls.',
|
|
464
500
|
handleRef: 'Imperative handle for focus() and blur() control.',
|
|
465
501
|
xstyle: 'StyleX layout styles (margins, positioning). Must be stylex.create() value.',
|
|
@@ -9,11 +9,17 @@
|
|
|
9
9
|
* SYNC: When Tokenizer.tsx changes, update tests to match
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import {describe, it, expect, vi, beforeAll, afterAll} from 'vitest';
|
|
12
|
+
import {describe, it, expect, vi, beforeAll, afterAll, afterEach} from 'vitest';
|
|
13
13
|
import {render, screen, fireEvent, act, waitFor} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {Tokenizer} from './Tokenizer';
|
|
16
|
+
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
16
17
|
import type {SearchSource, SearchableItem} from '../Typeahead/types';
|
|
18
|
+
import {TestIcon} from '../__tests__/TestIcon';
|
|
19
|
+
|
|
20
|
+
function politeRegion(): HTMLElement | null {
|
|
21
|
+
return document.querySelector('[data-astryx-live-region="polite"]');
|
|
22
|
+
}
|
|
17
23
|
|
|
18
24
|
// Store original matches to restore later
|
|
19
25
|
const originalMatches = HTMLElement.prototype.matches;
|
|
@@ -60,6 +66,10 @@ afterAll(() => {
|
|
|
60
66
|
(HTMLElement.prototype as any).matches = originalMatches;
|
|
61
67
|
});
|
|
62
68
|
|
|
69
|
+
afterEach(() => {
|
|
70
|
+
__resetLiveRegionsForTest();
|
|
71
|
+
});
|
|
72
|
+
|
|
63
73
|
// Test data
|
|
64
74
|
const users: SearchableItem[] = [
|
|
65
75
|
{id: '1', label: 'Alice'},
|
|
@@ -818,6 +828,51 @@ describe('Tokenizer', () => {
|
|
|
818
828
|
});
|
|
819
829
|
});
|
|
820
830
|
|
|
831
|
+
describe('startIcon', () => {
|
|
832
|
+
it('does not render a start icon when omitted', () => {
|
|
833
|
+
render(
|
|
834
|
+
<Tokenizer
|
|
835
|
+
label="Members"
|
|
836
|
+
searchSource={userSource}
|
|
837
|
+
value={[]}
|
|
838
|
+
onChange={() => {}}
|
|
839
|
+
/>,
|
|
840
|
+
);
|
|
841
|
+
expect(document.querySelector('svg')).not.toBeInTheDocument();
|
|
842
|
+
});
|
|
843
|
+
|
|
844
|
+
it('renders a ReactNode start icon before the tokens', () => {
|
|
845
|
+
render(
|
|
846
|
+
<Tokenizer
|
|
847
|
+
label="Members"
|
|
848
|
+
searchSource={userSource}
|
|
849
|
+
value={[{id: '1', label: 'Alice'}]}
|
|
850
|
+
onChange={() => {}}
|
|
851
|
+
startIcon={<TestIcon data-testid="start-icon" />}
|
|
852
|
+
/>,
|
|
853
|
+
);
|
|
854
|
+
const icon = screen.getByTestId('start-icon');
|
|
855
|
+
const token = screen.getByText('Alice');
|
|
856
|
+
expect(icon).toBeInTheDocument();
|
|
857
|
+
expect(
|
|
858
|
+
icon.compareDocumentPosition(token) & Node.DOCUMENT_POSITION_FOLLOWING,
|
|
859
|
+
).toBeTruthy();
|
|
860
|
+
});
|
|
861
|
+
|
|
862
|
+
it('renders an IconType (SVG component) start icon', () => {
|
|
863
|
+
render(
|
|
864
|
+
<Tokenizer
|
|
865
|
+
label="Members"
|
|
866
|
+
searchSource={userSource}
|
|
867
|
+
value={[]}
|
|
868
|
+
onChange={() => {}}
|
|
869
|
+
startIcon={TestIcon}
|
|
870
|
+
/>,
|
|
871
|
+
);
|
|
872
|
+
expect(document.querySelector('svg')).toBeInTheDocument();
|
|
873
|
+
});
|
|
874
|
+
});
|
|
875
|
+
|
|
821
876
|
describe('disabledMessage', () => {
|
|
822
877
|
const h = {hidden: true} as const;
|
|
823
878
|
const isOpen = (el: Element) => el.matches(':popover-open');
|
|
@@ -921,6 +976,130 @@ describe('Tokenizer', () => {
|
|
|
921
976
|
expect(screen.getByRole('combobox')).toBeDisabled();
|
|
922
977
|
});
|
|
923
978
|
});
|
|
979
|
+
describe('announcements', () => {
|
|
980
|
+
it('announces removal politely on Backspace with an empty input', async () => {
|
|
981
|
+
const onChange = vi.fn();
|
|
982
|
+
render(
|
|
983
|
+
<Tokenizer
|
|
984
|
+
label="Members"
|
|
985
|
+
searchSource={userSource}
|
|
986
|
+
value={[users[0], users[1]]}
|
|
987
|
+
onChange={onChange}
|
|
988
|
+
/>,
|
|
989
|
+
);
|
|
990
|
+
const input = screen.getByRole('combobox');
|
|
991
|
+
fireEvent.keyDown(input, {key: 'Backspace'});
|
|
992
|
+
expect(onChange).toHaveBeenCalledWith([users[0]], {
|
|
993
|
+
item: users[1],
|
|
994
|
+
type: 'remove',
|
|
995
|
+
});
|
|
996
|
+
await waitFor(() => {
|
|
997
|
+
expect(politeRegion()).toHaveTextContent('Removed Bob');
|
|
998
|
+
});
|
|
999
|
+
});
|
|
1000
|
+
|
|
1001
|
+
it("announces removal politely when clicking a token's remove button", async () => {
|
|
1002
|
+
render(
|
|
1003
|
+
<Tokenizer
|
|
1004
|
+
label="Members"
|
|
1005
|
+
searchSource={userSource}
|
|
1006
|
+
value={[users[0], users[1]]}
|
|
1007
|
+
onChange={() => {}}
|
|
1008
|
+
/>,
|
|
1009
|
+
);
|
|
1010
|
+
fireEvent.click(screen.getByRole('button', {name: 'Remove Alice'}));
|
|
1011
|
+
await waitFor(() => {
|
|
1012
|
+
expect(politeRegion()).toHaveTextContent('Removed Alice');
|
|
1013
|
+
});
|
|
1014
|
+
});
|
|
1015
|
+
|
|
1016
|
+
it('announces addition politely when selecting a search result', async () => {
|
|
1017
|
+
render(
|
|
1018
|
+
<Tokenizer
|
|
1019
|
+
label="Members"
|
|
1020
|
+
searchSource={userSource}
|
|
1021
|
+
value={[]}
|
|
1022
|
+
onChange={() => {}}
|
|
1023
|
+
hasEntriesOnFocus
|
|
1024
|
+
debounceMs={0}
|
|
1025
|
+
/>,
|
|
1026
|
+
);
|
|
1027
|
+
const input = screen.getByRole('combobox');
|
|
1028
|
+
fireEvent.focus(input);
|
|
1029
|
+
await act(async () => {
|
|
1030
|
+
await new Promise(r => setTimeout(r, 50));
|
|
1031
|
+
});
|
|
1032
|
+
fireEvent.click(screen.getByText('Alice'));
|
|
1033
|
+
await waitFor(() => {
|
|
1034
|
+
expect(politeRegion()).toHaveTextContent('Added Alice');
|
|
1035
|
+
});
|
|
1036
|
+
});
|
|
1037
|
+
|
|
1038
|
+
it('announces addition politely when creating a token with hasCreate', async () => {
|
|
1039
|
+
const emptySource: SearchSource = {
|
|
1040
|
+
search: () => [],
|
|
1041
|
+
bootstrap: () => [],
|
|
1042
|
+
};
|
|
1043
|
+
render(
|
|
1044
|
+
<Tokenizer
|
|
1045
|
+
label="Tags"
|
|
1046
|
+
searchSource={emptySource}
|
|
1047
|
+
value={[]}
|
|
1048
|
+
onChange={() => {}}
|
|
1049
|
+
hasCreate
|
|
1050
|
+
debounceMs={0}
|
|
1051
|
+
/>,
|
|
1052
|
+
);
|
|
1053
|
+
const input = screen.getByRole('combobox');
|
|
1054
|
+
await act(async () => {
|
|
1055
|
+
fireEvent.change(input, {target: {value: 'new-tag'}});
|
|
1056
|
+
});
|
|
1057
|
+
await act(async () => {
|
|
1058
|
+
await new Promise(r => setTimeout(r, 50));
|
|
1059
|
+
});
|
|
1060
|
+
fireEvent.click(screen.getByText('Create "new-tag"'));
|
|
1061
|
+
await waitFor(() => {
|
|
1062
|
+
expect(politeRegion()).toHaveTextContent('Added new-tag');
|
|
1063
|
+
});
|
|
1064
|
+
});
|
|
1065
|
+
|
|
1066
|
+
it('does not announce on mount', () => {
|
|
1067
|
+
render(
|
|
1068
|
+
<Tokenizer
|
|
1069
|
+
label="Members"
|
|
1070
|
+
searchSource={userSource}
|
|
1071
|
+
value={[users[0]]}
|
|
1072
|
+
onChange={() => {}}
|
|
1073
|
+
/>,
|
|
1074
|
+
);
|
|
1075
|
+
// The live regions are created lazily on first announce, so a mount
|
|
1076
|
+
// with pre-selected tokens must not create (or speak through) one.
|
|
1077
|
+
expect(politeRegion()).toBeNull();
|
|
1078
|
+
});
|
|
1079
|
+
|
|
1080
|
+
it('does not announce add/remove while typing', async () => {
|
|
1081
|
+
render(
|
|
1082
|
+
<Tokenizer
|
|
1083
|
+
label="Members"
|
|
1084
|
+
searchSource={userSource}
|
|
1085
|
+
value={[]}
|
|
1086
|
+
onChange={() => {}}
|
|
1087
|
+
debounceMs={0}
|
|
1088
|
+
/>,
|
|
1089
|
+
);
|
|
1090
|
+
const input = screen.getByRole('combobox');
|
|
1091
|
+
await act(async () => {
|
|
1092
|
+
fireEvent.change(input, {target: {value: 'Ali'}});
|
|
1093
|
+
});
|
|
1094
|
+
await act(async () => {
|
|
1095
|
+
await new Promise(r => setTimeout(r, 50));
|
|
1096
|
+
});
|
|
1097
|
+
// BaseTypeahead announces result counts while typing (existing
|
|
1098
|
+
// behavior); typing alone must not produce add/remove announcements.
|
|
1099
|
+
expect(politeRegion()?.textContent ?? '').not.toMatch(/Added|Removed/);
|
|
1100
|
+
});
|
|
1101
|
+
});
|
|
1102
|
+
|
|
924
1103
|
describe('form participation', () => {
|
|
925
1104
|
it('submits one entry per token id under htmlName', () => {
|
|
926
1105
|
const {container} = render(
|
|
@@ -951,7 +1130,32 @@ describe('Tokenizer', () => {
|
|
|
951
1130
|
/>
|
|
952
1131
|
</form>,
|
|
953
1132
|
);
|
|
954
|
-
expect([
|
|
1133
|
+
expect([
|
|
1134
|
+
...new FormData(container.querySelector('form')!).keys(),
|
|
1135
|
+
]).toEqual([]);
|
|
955
1136
|
});
|
|
956
1137
|
});
|
|
957
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
|
+
});
|