@astryxdesign/core 0.1.4-canary.ff77e1c → 0.1.4
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/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +18 -20
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
- package/dist/AppShell/AppShell.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +53 -55
- package/dist/AspectRatio/AspectRatio.d.ts +10 -48
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +12 -33
- package/dist/AspectRatio/index.d.ts +1 -1
- package/dist/AspectRatio/index.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +25 -27
- package/dist/Avatar/AvatarStatusDot.js +5 -5
- package/dist/AvatarGroup/AvatarGroup.js +5 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
- package/dist/Badge/Badge.js +3 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +25 -32
- package/dist/Blockquote/Blockquote.js +7 -7
- package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
- package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
- package/dist/Button/Button.js +19 -19
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +48 -68
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +2 -2
- package/dist/Card/Card.d.ts +2 -4
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +10 -18
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +21 -24
- package/dist/Carousel/carousel.markers.stylex.d.ts +7 -0
- package/dist/Carousel/carousel.markers.stylex.d.ts.map +1 -0
- package/dist/Carousel/carousel.markers.stylex.js +12 -0
- package/dist/Center/Center.js +3 -3
- package/dist/Chat/ChatComposer.js +23 -23
- package/dist/Chat/ChatComposerDrawer.js +14 -14
- package/dist/Chat/ChatComposerInput.d.ts +1 -1
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +15 -27
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +11 -13
- package/dist/Chat/ChatLayout.js +17 -17
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +10 -12
- package/dist/Chat/ChatMessage.js +12 -12
- package/dist/Chat/ChatMessageBubble.js +7 -7
- package/dist/Chat/ChatMessageList.js +14 -14
- package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +12 -14
- package/dist/Chat/ChatPastedTextToken.js +13 -13
- package/dist/Chat/ChatSendButton.js +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +17 -17
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +15 -24
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +74 -81
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +23 -25
- package/dist/CheckboxList/CheckboxList.js +9 -9
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +6 -8
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +9 -32
- package/dist/Code/Code.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts +1 -10
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +52 -88
- package/dist/Collapsible/Collapsible.d.ts +3 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +22 -110
- package/dist/Collapsible/CollapsibleGroup.d.ts +7 -39
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +12 -73
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +0 -31
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +3 -33
- package/dist/Collapsible/index.d.ts +0 -1
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +1 -4
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +6 -20
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +34 -36
- package/dist/CommandPalette/CommandPaletteEmpty.js +3 -3
- package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
- package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
- package/dist/CommandPalette/CommandPaletteInput.js +13 -13
- package/dist/CommandPalette/CommandPaletteItem.js +3 -3
- package/dist/CommandPalette/CommandPaletteList.js +3 -3
- package/dist/ContextMenu/ContextMenu.d.ts +2 -7
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +43 -76
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +21 -21
- package/dist/DateTimeInput/DateTimeInput.d.ts +2 -5
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +26 -30
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -9
- package/dist/Dialog/DialogHeader.js +16 -16
- package/dist/Dialog/useImperativeDialog.js +3 -3
- package/dist/Divider/Divider.js +7 -7
- package/dist/DropdownMenu/DropdownMenu.js +10 -10
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +17 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
- package/dist/DropdownMenu/renderDropdownItems.js +10 -10
- package/dist/EmptyState/EmptyState.js +9 -9
- package/dist/Field/Field.js +17 -17
- package/dist/Field/FieldLabel.js +15 -15
- package/dist/Field/InputClearButton.js +5 -5
- package/dist/FieldStatus/FieldStatus.js +3 -3
- package/dist/FileInput/FileInput.js +29 -29
- package/dist/FormLayout/FormLayout.js +5 -5
- package/dist/Grid/Grid.d.ts +3 -4
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +12 -29
- package/dist/Grid/GridSpan.js +3 -3
- package/dist/HStack/HStack.js +3 -3
- package/dist/Heading/Heading.js +10 -10
- package/dist/HoverCard/HoverCard.js +9 -9
- package/dist/HoverCard/useHoverCard.d.ts +1 -5
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +12 -16
- package/dist/Icon/defaultIcons.js +116 -116
- package/dist/IconButton/IconButton.js +3 -3
- package/dist/InputGroup/InputGroup.js +11 -11
- package/dist/InputGroup/InputGroupText.js +3 -3
- package/dist/Item/Item.js +18 -18
- package/dist/Kbd/Kbd.js +5 -5
- package/dist/Layer/LayerProvider.js +7 -7
- package/dist/Layer/useLayer.d.ts +2 -29
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +31 -44
- package/dist/Layout/Layout.js +21 -21
- package/dist/Layout/LayoutContent.js +3 -3
- package/dist/Layout/LayoutFooter.js +5 -5
- package/dist/Layout/LayoutHeader.js +5 -5
- package/dist/Layout/LayoutPanel.js +3 -3
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +31 -55
- package/dist/Lightbox/useLightbox.js +3 -3
- package/dist/Link/Link.js +15 -15
- package/dist/Link/LinkProvider.js +3 -3
- package/dist/Link/useLinkify.js +3 -3
- package/dist/List/List.js +11 -11
- package/dist/List/ListItem.js +11 -11
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +102 -102
- package/dist/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.d.ts +1 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +23 -26
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.js +56 -56
- package/dist/NavIcon/NavIcon.js +3 -3
- package/dist/NavMenu/NavHeadingMenu.js +5 -5
- package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +32 -48
- package/dist/Outline/Outline.js +15 -15
- package/dist/OverflowList/OverflowList.js +8 -8
- package/dist/Overlay/Overlay.js +3 -3
- package/dist/Overlay/OverlayScrim.js +5 -5
- package/dist/Overlay/useOverlay.js +3 -3
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +72 -125
- package/dist/Popover/Popover.js +16 -16
- package/dist/Popover/usePopover.js +7 -7
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +92 -110
- package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
- package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
- package/dist/PowerSearch/PowerSearchToken.js +5 -5
- package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -25
- package/dist/RadioList/RadioList.js +7 -7
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +21 -24
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +10 -28
- package/dist/Section/Section.js +5 -5
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +10 -32
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +12 -18
- package/dist/SelectableCard/SelectableCard.js +5 -5
- package/dist/Selector/Selector.js +46 -46
- package/dist/Selector/SelectorOption.js +3 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +34 -38
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +6 -8
- package/dist/SideNav/SideNavHeading.js +87 -87
- package/dist/SideNav/SideNavItem.js +42 -42
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.d.ts.map +1 -1
- package/dist/SideNav/SideNavSection.js +16 -18
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.js +23 -23
- package/dist/Spinner/Spinner.js +9 -9
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +4 -8
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +29 -34
- package/dist/TabList/Tab.js +18 -18
- package/dist/TabList/TabList.js +5 -5
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +30 -57
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +39 -50
- package/dist/Table/Table.js +7 -7
- package/dist/Table/TableBody.d.ts +1 -1
- package/dist/Table/TableBody.d.ts.map +1 -1
- package/dist/Table/TableBody.js +5 -9
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts.map +1 -1
- package/dist/Table/TableFooter.js +5 -9
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +5 -9
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +11 -14
- package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +1 -5
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +22 -22
- package/dist/Table/plugins/selection/useTableSelection.js +18 -18
- package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelectionState.js +1 -11
- package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
- package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortableState.js +4 -8
- package/dist/Table/tableContextMenu.js +9 -9
- package/dist/Text/Text.js +10 -10
- package/dist/TextArea/TextArea.js +14 -14
- package/dist/TextInput/TextInput.js +15 -15
- package/dist/Thumbnail/Thumbnail.d.ts +2 -3
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +29 -30
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +21 -26
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +26 -37
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +17 -25
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +11 -23
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +4 -44
- package/dist/ToggleButton/ToggleButton.js +12 -12
- package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
- package/dist/Token/Token.js +21 -21
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +34 -36
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.d.ts +1 -5
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +3 -3
- package/dist/TopNav/TopNav.js +32 -32
- package/dist/TopNav/TopNavHeading.js +67 -67
- package/dist/TopNav/TopNavItem.js +5 -5
- package/dist/TopNav/TopNavMegaMenu.js +30 -30
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +14 -25
- package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
- package/dist/TopNav/TopNavMenu.js +32 -32
- package/dist/TreeList/TreeList.js +8 -8
- package/dist/TreeList/TreeListBranches.js +11 -11
- package/dist/TreeList/TreeListItem.js +30 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -23
- package/dist/Typeahead/Typeahead.js +12 -12
- package/dist/Typeahead/TypeaheadItem.js +10 -10
- package/dist/VStack/VStack.js +3 -3
- package/dist/astryx.css +0 -7
- package/dist/astryx.umd.js +59 -59
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +2 -8
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.d.ts +1 -1
- package/dist/hooks/focusableSelector.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.js +1 -1
- package/dist/hooks/index.d.ts +0 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +0 -1
- package/dist/hooks/useFocusTrap.d.ts +0 -3
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +1 -38
- package/dist/hooks/useInteractiveRole.d.ts +2 -6
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +2 -6
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +1 -3
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +5 -14
- package/dist/theme/MediaTheme.js +3 -3
- package/dist/theme/Theme.js +7 -7
- package/dist/theme/defineTheme.d.ts +1 -1
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +3 -10
- package/dist/theme/hct.d.ts +15 -0
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +9 -9
- package/dist/theme/syntax/SyntaxTheme.js +5 -5
- package/dist/theme/tokens.d.ts +2 -10
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +4 -220
- package/dist/theme/useTheme.d.ts +2 -3
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +6 -73
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -3
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +5 -8
- package/package.json +3 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +0 -4
- package/src/AlertDialog/AlertDialog.tsx +0 -2
- package/src/AppShell/AppShell.tsx +0 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -28
- package/src/AspectRatio/AspectRatio.test.tsx +1 -142
- package/src/AspectRatio/AspectRatio.tsx +10 -70
- package/src/AspectRatio/index.ts +1 -5
- package/src/Avatar/Avatar.doc.mjs +0 -11
- package/src/Avatar/Avatar.test.tsx +1 -32
- package/src/Avatar/Avatar.tsx +20 -12
- package/src/AvatarGroup/AvatarGroup.doc.mjs +0 -1
- package/src/Banner/Banner.doc.mjs +0 -8
- package/src/Banner/Banner.test.tsx +0 -38
- package/src/Banner/Banner.tsx +1 -8
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +17 -122
- package/src/Calendar/Calendar.tsx +5 -26
- package/src/Calendar/dayCellUtils.ts +1 -3
- package/src/Calendar/styles.ts +2 -12
- package/src/Card/Card.doc.mjs +1 -1
- package/src/Card/Card.tsx +6 -16
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +0 -13
- package/src/Carousel/Carousel.tsx +2 -4
- package/src/Carousel/carousel.markers.stylex.ts +10 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +1 -27
- package/src/Chat/ChatComposerInput.tsx +15 -20
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.tsx +1 -3
- package/src/Chat/ChatMessageMetadata.tsx +6 -4
- package/src/Chat/ChatSystemMessage.test.tsx +11 -26
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +16 -29
- package/src/Chat/ChatTokenizedText.tsx +8 -15
- package/src/Chat/ChatToolCalls.test.tsx +0 -55
- package/src/Chat/ChatToolCalls.tsx +12 -10
- package/src/Chat/index.ts +4 -1
- package/src/Chat/useTriggerMenu.tsx +4 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +4 -71
- package/src/CheckboxInput/CheckboxInput.tsx +0 -2
- package/src/CheckboxList/CheckboxList.test.tsx +0 -19
- package/src/CheckboxList/CheckboxListItem.tsx +2 -11
- package/src/Citation/Citation.doc.mjs +0 -5
- package/src/ClickableCard/ClickableCard.tsx +2 -45
- package/src/CodeBlock/CodeBlock.doc.mjs +2 -7
- package/src/CodeBlock/CodeBlock.test.tsx +3 -122
- package/src/CodeBlock/CodeBlock.tsx +4 -62
- package/src/Collapsible/Collapsible.doc.mjs +4 -8
- package/src/Collapsible/Collapsible.tsx +10 -86
- package/src/Collapsible/CollapsibleGroup.doc.mjs +3 -27
- package/src/Collapsible/CollapsibleGroup.test.tsx +0 -318
- package/src/Collapsible/CollapsibleGroup.tsx +9 -107
- package/src/Collapsible/CollapsibleGroupContext.tsx +2 -42
- package/src/Collapsible/index.ts +0 -4
- package/src/Collapsible/useCollapsible.ts +6 -20
- package/src/CommandPalette/CommandPalette.doc.mjs +0 -5
- package/src/CommandPalette/CommandPalette.tsx +3 -5
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +0 -5
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +0 -10
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +0 -6
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +0 -6
- package/src/CommandPalette/CommandPaletteList.doc.mjs +0 -9
- package/src/ContextMenu/ContextMenu.doc.mjs +0 -15
- package/src/ContextMenu/ContextMenu.test.tsx +0 -87
- package/src/ContextMenu/ContextMenu.tsx +28 -87
- package/src/ContextMenu/ContextMenuItem.doc.mjs +0 -6
- package/src/DateInput/DateInput.test.tsx +20 -11
- package/src/DateRangeInput/DateRangeInput.test.tsx +44 -31
- package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +16 -118
- package/src/DateTimeInput/DateTimeInput.tsx +2 -8
- package/src/DateTimeInput/index.ts +0 -1
- package/src/Dialog/Dialog.doc.mjs +0 -4
- package/src/Dialog/DialogHeader.doc.mjs +0 -45
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +2 -22
- package/src/DropdownMenu/DropdownMenuItem.tsx +17 -5
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.test.tsx +4 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +3 -0
- package/src/Grid/Grid.test.tsx +18 -43
- package/src/Grid/Grid.tsx +9 -26
- package/src/HoverCard/HoverCard.doc.mjs +6 -6
- package/src/HoverCard/useHoverCard.doc.mjs +5 -5
- package/src/HoverCard/useHoverCard.tsx +2 -9
- package/src/Icon/Icon.test.tsx +29 -41
- package/src/Icon/Icon.tsx +2 -6
- package/src/InputGroup/InputGroup.doc.mjs +0 -1
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/Item/Item.tsx +1 -1
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +2 -221
- package/src/Layer/useLayer.tsx +30 -69
- package/src/Layout/LayoutContent.doc.mjs +0 -12
- package/src/Layout/LayoutPanel.doc.mjs +0 -40
- package/src/Lightbox/Lightbox.doc.mjs +0 -5
- package/src/Lightbox/Lightbox.test.tsx +2 -123
- package/src/Lightbox/Lightbox.tsx +1 -29
- package/src/Markdown/Markdown.tsx +7 -9
- package/src/Markdown/parser.perf.test.ts +12 -34
- package/src/MobileNav/MobileNav.test.tsx +0 -56
- package/src/MobileNav/MobileNav.tsx +8 -13
- package/src/NavMenu/NavMenu.doc.mjs +0 -15
- package/src/NumberInput/NumberInput.test.tsx +3 -48
- package/src/NumberInput/NumberInput.tsx +15 -32
- package/src/Outline/Outline.doc.mjs +0 -2
- package/src/Overlay/Overlay.doc.mjs +0 -6
- package/src/Pagination/Pagination.test.tsx +0 -162
- package/src/Pagination/Pagination.tsx +26 -80
- package/src/Popover/Popover.doc.mjs +6 -6
- package/src/Popover/Popover.test.tsx +0 -65
- package/src/Popover/usePopover.doc.mjs +1 -1
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearch.test.tsx +1 -109
- package/src/PowerSearch/PowerSearch.tsx +16 -37
- package/src/ProgressBar/ProgressBar.doc.mjs +0 -2
- package/src/ProgressBar/ProgressBar.test.tsx +0 -30
- package/src/ProgressBar/ProgressBar.tsx +5 -12
- package/src/RadioList/RadioList.test.tsx +0 -19
- package/src/RadioList/RadioListItem.tsx +4 -9
- package/src/Resizable/ResizeHandle.tsx +4 -22
- package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
- package/src/SegmentedControl/SegmentedControl.test.tsx +0 -192
- package/src/SegmentedControl/SegmentedControl.tsx +5 -27
- package/src/SegmentedControl/SegmentedControlItem.tsx +4 -9
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.test.tsx +1 -27
- package/src/SideNav/SideNav.doc.mjs +1 -7
- package/src/SideNav/SideNav.test.tsx +0 -66
- package/src/SideNav/SideNav.tsx +2 -6
- package/src/SideNav/SideNavCollapseButton.tsx +3 -4
- package/src/SideNav/SideNavSection.tsx +4 -6
- package/src/Switch/Switch.doc.mjs +7 -7
- package/src/Switch/Switch.test.tsx +3 -102
- package/src/Switch/Switch.tsx +7 -20
- package/src/TabList/TabList.test.tsx +1 -185
- package/src/TabList/TabMenu.tsx +9 -45
- package/src/Table/BaseTable.tsx +2 -13
- package/src/Table/Table.doc.mjs +0 -5
- package/src/Table/Table.test.tsx +0 -87
- package/src/Table/TableBody.tsx +2 -15
- package/src/Table/TableFooter.tsx +2 -15
- package/src/Table/TableHeader.tsx +2 -15
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +0 -13
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +1 -3
- package/src/Table/plugins/pagination/paginateData.ts +1 -5
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +0 -13
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +0 -23
- package/src/Table/plugins/selection/useTableSelectionState.tsx +6 -11
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +1 -35
- package/src/Table/plugins/sortable/useTableSortableState.tsx +4 -8
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +2 -36
- package/src/Thumbnail/Thumbnail.tsx +2 -4
- package/src/TimeInput/TimeInput.test.tsx +0 -37
- package/src/TimeInput/TimeInput.tsx +1 -11
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +0 -52
- package/src/Timestamp/Timestamp.tsx +16 -30
- package/src/Toast/Toast.tsx +3 -11
- package/src/Toast/ToastViewport.test.tsx +0 -64
- package/src/Toast/ToastViewport.tsx +0 -12
- package/src/Toast/useToast.tsx +0 -41
- package/src/ToggleButton/ToggleButton.doc.mjs +0 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +0 -54
- package/src/Tokenizer/Tokenizer.tsx +4 -5
- package/src/Tooltip/Tooltip.doc.mjs +6 -6
- package/src/Tooltip/useTooltip.doc.mjs +5 -5
- package/src/Tooltip/useTooltip.tsx +2 -12
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +7 -23
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +2 -9
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +0 -19
- package/src/Typeahead/BaseTypeahead.tsx +2 -5
- package/src/Typeahead/Typeahead.doc.mjs +1 -1
- package/src/Typeahead/Typeahead.test.tsx +1 -45
- package/src/docs-types.ts +1 -9
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +0 -3
- package/src/hooks/useFocusTrap.doc.mjs +2 -4
- package/src/hooks/useFocusTrap.test.tsx +1 -149
- package/src/hooks/useFocusTrap.ts +1 -50
- package/src/hooks/useInteractiveRole.ts +4 -12
- package/src/hooks/useStreamingText.test.ts +19 -54
- package/src/hooks/useStreamingText.ts +5 -16
- package/src/hooks/useTreeFocus.test.tsx +3 -1
- package/src/reset.css +0 -29
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +13 -4
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +0 -29
- package/src/theme/expandColorScale.ts +6 -11
- package/src/theme/hct.ts +17 -9
- package/src/theme/tokens.test.ts +9 -182
- package/src/theme/tokens.ts +4 -239
- package/src/theme/useTheme.test.tsx +2 -126
- package/src/theme/useTheme.ts +6 -87
- package/src/utils/index.ts +0 -4
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +0 -13
- package/src/utils/timeParser.ts +5 -8
- package/dist/hooks/useHotkeys.d.ts +0 -51
- package/dist/hooks/useHotkeys.d.ts.map +0 -1
- package/dist/hooks/useHotkeys.js +0 -160
- package/dist/utils/color.d.ts +0 -42
- package/dist/utils/color.d.ts.map +0 -1
- package/dist/utils/color.js +0 -150
- package/dist/utils/composeEventHandlers.d.ts +0 -30
- package/dist/utils/composeEventHandlers.d.ts.map +0 -1
- package/dist/utils/composeEventHandlers.js +0 -40
- package/src/Chat/ChatDictationButton.test.tsx +0 -43
- package/src/Chat/ChatLayoutScrollButton.test.tsx +0 -33
- package/src/Chat/ChatMessageMetadata.test.tsx +0 -32
- package/src/Collapsible/Collapsible.test.tsx +0 -405
- package/src/FieldStatus/FieldStatus.test.tsx +0 -282
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +0 -185
- package/src/Layout/Layout.test.tsx +0 -285
- package/src/Layout/LayoutSlots.test.tsx +0 -364
- package/src/Outline/parseOutlineFromMarkdown.test.ts +0 -80
- package/src/OverflowList/OverflowList.test.tsx +0 -416
- package/src/Overlay/Overlay.test.tsx +0 -356
- package/src/Resizable/ResizeHandle.test.tsx +0 -218
- package/src/SizeContext/SizeContext.test.tsx +0 -226
- package/src/Toast/useToast.test.tsx +0 -258
- package/src/__tests__/TestIcon.tsx +0 -26
- package/src/__tests__/fastRoleQueries.ts +0 -66
- package/src/docPropReferences.test.ts +0 -178
- package/src/hooks/useHotkeys.doc.mjs +0 -52
- package/src/hooks/useHotkeys.test.ts +0 -245
- package/src/hooks/useHotkeys.ts +0 -203
- package/src/theme/themingTargets.test.ts +0 -353
- package/src/utils/color.test.ts +0 -133
- package/src/utils/color.ts +0 -148
- package/src/utils/composeEventHandlers.test.ts +0 -71
- package/src/utils/composeEventHandlers.ts +0 -44
- package/src/utils/mergeProps.test.ts +0 -166
package/src/Toast/Toast.tsx
CHANGED
|
@@ -121,14 +121,8 @@ export function Toast({
|
|
|
121
121
|
// Will be initialized by startTimer when actually used
|
|
122
122
|
const startTimeRef = useRef<number | null>(null);
|
|
123
123
|
|
|
124
|
-
// Read onDismiss through a ref: the viewport re-creates it on every render
|
|
125
|
-
// (another toast arriving/exiting), and a startTimer that depends on it
|
|
126
|
-
// would restart — and un-pause — this toast's timer on unrelated renders.
|
|
127
|
-
const onDismissRef = useRef(onDismiss);
|
|
128
|
-
onDismissRef.current = onDismiss;
|
|
129
|
-
|
|
130
124
|
const startTimer = useCallback(() => {
|
|
131
|
-
if (!isAutoHide
|
|
125
|
+
if (!isAutoHide) {
|
|
132
126
|
return;
|
|
133
127
|
}
|
|
134
128
|
if (timerRef.current) {
|
|
@@ -136,9 +130,9 @@ export function Toast({
|
|
|
136
130
|
}
|
|
137
131
|
startTimeRef.current = Date.now();
|
|
138
132
|
timerRef.current = setTimeout(() => {
|
|
139
|
-
|
|
133
|
+
onDismiss('auto');
|
|
140
134
|
}, remainingRef.current);
|
|
141
|
-
}, [isAutoHide]);
|
|
135
|
+
}, [isAutoHide, onDismiss]);
|
|
142
136
|
|
|
143
137
|
const pauseTimer = useCallback(() => {
|
|
144
138
|
if (!isAutoHide || isPausedRef.current) {
|
|
@@ -171,8 +165,6 @@ export function Toast({
|
|
|
171
165
|
clearTimeout(timerRef.current);
|
|
172
166
|
}
|
|
173
167
|
};
|
|
174
|
-
// startTimer's identity is stable per isAutoHide, so this runs on mount
|
|
175
|
-
// and on a genuine duration change — not on unrelated viewport renders.
|
|
176
168
|
}, [autoHideDuration, startTimer]);
|
|
177
169
|
|
|
178
170
|
// Pause the auto-hide timer while the window is not focused, so a toast
|
|
@@ -212,67 +212,3 @@ describe('ToastViewport region ARIA', () => {
|
|
|
212
212
|
expect(region).not.toHaveAttribute('aria-modal');
|
|
213
213
|
});
|
|
214
214
|
});
|
|
215
|
-
|
|
216
|
-
describe('toast timer lifecycle (#3589)', () => {
|
|
217
|
-
it('fires onHide exactly once when dismissed twice during the exit window', () => {
|
|
218
|
-
const onHide = vi.fn();
|
|
219
|
-
renderViewport(
|
|
220
|
-
<ShowToastButton options={{body: 'Once', onHide}} triggerLabel="Show" />,
|
|
221
|
-
);
|
|
222
|
-
act(() => {
|
|
223
|
-
fireEvent.click(screen.getByText('Show'));
|
|
224
|
-
});
|
|
225
|
-
const dismiss = screen.getByRole('button', {name: 'Dismiss notification'});
|
|
226
|
-
act(() => {
|
|
227
|
-
fireEvent.click(dismiss);
|
|
228
|
-
});
|
|
229
|
-
// The toast stays mounted during its exit transition; a second click
|
|
230
|
-
// lands on the same still-mounted button.
|
|
231
|
-
act(() => {
|
|
232
|
-
fireEvent.click(dismiss);
|
|
233
|
-
});
|
|
234
|
-
expect(onHide).toHaveBeenCalledTimes(1);
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
it('keeps a window-blur pause alive when another toast arrives', () => {
|
|
238
|
-
vi.useFakeTimers();
|
|
239
|
-
try {
|
|
240
|
-
const onHide = vi.fn();
|
|
241
|
-
renderViewport(
|
|
242
|
-
<>
|
|
243
|
-
<ShowToastButton
|
|
244
|
-
options={{body: 'Paused', autoHideDuration: 3000, onHide}}
|
|
245
|
-
triggerLabel="Show A"
|
|
246
|
-
/>
|
|
247
|
-
<ShowToastButton options={INFO_B} triggerLabel="Show B" />
|
|
248
|
-
</>,
|
|
249
|
-
);
|
|
250
|
-
act(() => {
|
|
251
|
-
fireEvent.click(screen.getByText('Show A'));
|
|
252
|
-
});
|
|
253
|
-
act(() => {
|
|
254
|
-
fireEvent.blur(window);
|
|
255
|
-
});
|
|
256
|
-
// A second toast arriving re-renders the viewport; the paused timer
|
|
257
|
-
// must not silently restart.
|
|
258
|
-
act(() => {
|
|
259
|
-
fireEvent.click(screen.getByText('Show B'));
|
|
260
|
-
});
|
|
261
|
-
act(() => {
|
|
262
|
-
vi.advanceTimersByTime(60_000);
|
|
263
|
-
});
|
|
264
|
-
expect(onHide).not.toHaveBeenCalled();
|
|
265
|
-
// Focus returns: the remaining time resumes and completes normally.
|
|
266
|
-
act(() => {
|
|
267
|
-
fireEvent.focus(window);
|
|
268
|
-
});
|
|
269
|
-
act(() => {
|
|
270
|
-
vi.advanceTimersByTime(60_000);
|
|
271
|
-
});
|
|
272
|
-
expect(onHide).toHaveBeenCalledTimes(1);
|
|
273
|
-
expect(onHide).toHaveBeenCalledWith('auto');
|
|
274
|
-
} finally {
|
|
275
|
-
vi.useRealTimers();
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
});
|
|
@@ -114,9 +114,6 @@ export function ToastViewport({
|
|
|
114
114
|
|
|
115
115
|
// Show the popover on mount so it enters the top layer.
|
|
116
116
|
const viewportRef = useRef<HTMLDivElement>(null);
|
|
117
|
-
// Toast ids whose exit has begun — guards onHide from double-firing (see
|
|
118
|
-
// removeToast). Mirrors exitingIds state, readable synchronously.
|
|
119
|
-
const exitingIdsRef = useRef<Set<string>>(new Set());
|
|
120
117
|
// The element that was focused before the user jumped into the viewport
|
|
121
118
|
// (via F6). Used to restore focus once all toasts are dismissed so focus
|
|
122
119
|
// never falls to <body>.
|
|
@@ -174,14 +171,6 @@ export function ToastViewport({
|
|
|
174
171
|
}, []);
|
|
175
172
|
|
|
176
173
|
const removeToast = useCallback((id: string, reason: ToastDismissReason) => {
|
|
177
|
-
// An exiting toast stays in toastsRef until its exit transition ends, so
|
|
178
|
-
// a second dismissal inside that window (double-click, auto-timer plus
|
|
179
|
-
// manual dismiss()) would re-fire onHide. Track exiting ids in a ref —
|
|
180
|
-
// the exitingIds state dedupe below runs too late to protect onHide.
|
|
181
|
-
if (exitingIdsRef.current.has(id)) {
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
exitingIdsRef.current.add(id);
|
|
185
174
|
const entry = toastsRef.current.find(t => t.id === id);
|
|
186
175
|
if (entry) {
|
|
187
176
|
entry.options.onHide?.(reason);
|
|
@@ -221,7 +210,6 @@ export function ToastViewport({
|
|
|
221
210
|
}, []);
|
|
222
211
|
|
|
223
212
|
const handleExited = useCallback((id: string) => {
|
|
224
|
-
exitingIdsRef.current.delete(id);
|
|
225
213
|
setExitingIds(prev => {
|
|
226
214
|
if (!prev.has(id)) {
|
|
227
215
|
return prev;
|
package/src/Toast/useToast.tsx
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
|
|
5
5
|
import {useCallback, use, useEffect, useRef} from 'react';
|
|
6
6
|
import {createRoot} from 'react-dom/client';
|
|
7
|
-
import {dataAttr} from '../naming';
|
|
8
7
|
import {ToastContext, type ToastContextValue} from './ToastContext';
|
|
9
8
|
import {ToastViewport} from './ToastViewport';
|
|
10
9
|
import type {
|
|
@@ -19,45 +18,6 @@ let fallbackContext: ToastContextValue | null = null;
|
|
|
19
18
|
let fallbackRoot: ReturnType<typeof createRoot> | null = null;
|
|
20
19
|
let fallbackWarned = false;
|
|
21
20
|
|
|
22
|
-
const ROOT_THEME_ATTRS = ['data-theme', dataAttr('theme')] as const;
|
|
23
|
-
|
|
24
|
-
// The fallback container is a detached tree with no ThemeContext, so this
|
|
25
|
-
// mirrors <html>'s theme attributes onto it directly (live via
|
|
26
|
-
// MutationObserver) for the theme's @scope'd CSS to reach it. It's a
|
|
27
|
-
// lifetime-of-app singleton that's never torn down, so there's nothing to
|
|
28
|
-
// disconnect — this returns void.
|
|
29
|
-
function syncRootThemeAttrs(container: HTMLElement): void {
|
|
30
|
-
const sync = () => {
|
|
31
|
-
let mirroredMode: string | null = null;
|
|
32
|
-
for (const attr of ROOT_THEME_ATTRS) {
|
|
33
|
-
const value = document.documentElement.getAttribute(attr);
|
|
34
|
-
if (value == null) {
|
|
35
|
-
container.removeAttribute(attr);
|
|
36
|
-
} else {
|
|
37
|
-
container.setAttribute(attr, value);
|
|
38
|
-
if (attr === 'data-theme') {
|
|
39
|
-
mirroredMode = value;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// Pages whose built theme CSS pins color-scheme unconditionally (#3658)
|
|
44
|
-
// would otherwise resolve light-dark() tokens by OS preference while the
|
|
45
|
-
// mirrored mode above follows the app theme; the inline style wins over
|
|
46
|
-
// that CSS.
|
|
47
|
-
if (mirroredMode === 'light' || mirroredMode === 'dark') {
|
|
48
|
-
container.style.colorScheme = mirroredMode;
|
|
49
|
-
} else {
|
|
50
|
-
container.style.removeProperty('color-scheme');
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
sync();
|
|
54
|
-
const observer = new MutationObserver(sync);
|
|
55
|
-
observer.observe(document.documentElement, {
|
|
56
|
-
attributes: true,
|
|
57
|
-
attributeFilter: [...ROOT_THEME_ATTRS],
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
|
|
61
21
|
function getFallbackContext(): ToastContextValue {
|
|
62
22
|
if (fallbackContext) {
|
|
63
23
|
return fallbackContext;
|
|
@@ -81,7 +41,6 @@ function getFallbackContext(): ToastContextValue {
|
|
|
81
41
|
const container = document.createElement('div');
|
|
82
42
|
container.setAttribute('data-astryx-toast-fallback', '');
|
|
83
43
|
document.body.appendChild(container);
|
|
84
|
-
syncRootThemeAttrs(container);
|
|
85
44
|
|
|
86
45
|
let resolveCtx: ((ctx: ToastContextValue) => void) | undefined;
|
|
87
46
|
const ctxReady = new Promise<ToastContextValue>(r => {
|
|
@@ -17,7 +17,6 @@ export const docs = {
|
|
|
17
17
|
theming: {
|
|
18
18
|
targets: [
|
|
19
19
|
{className: 'astryx-toggle-button-group'},
|
|
20
|
-
{className: 'astryx-toggle-button', states: ['isPressed']},
|
|
21
20
|
],
|
|
22
21
|
},
|
|
23
22
|
description: 'A button that toggles between pressed and unpressed states. Thin wrapper over Button with controlled toggle pattern, icon swap, and font weight emphasis.',
|
|
@@ -189,7 +189,7 @@ export const docs = {
|
|
|
189
189
|
],
|
|
190
190
|
theming: {
|
|
191
191
|
targets: [
|
|
192
|
-
{className: 'astryx-tokenizer', visualProps: ['size'
|
|
192
|
+
{className: 'astryx-tokenizer', visualProps: ['size']},
|
|
193
193
|
],
|
|
194
194
|
},
|
|
195
195
|
usage: {
|
|
@@ -390,7 +390,7 @@ export const docsZh = {
|
|
|
390
390
|
],
|
|
391
391
|
theming: {
|
|
392
392
|
targets: [
|
|
393
|
-
{className: 'astryx-tokenizer', visualProps: ['size'
|
|
393
|
+
{className: 'astryx-tokenizer', visualProps: ['size']},
|
|
394
394
|
],
|
|
395
395
|
},
|
|
396
396
|
usage: {
|
|
@@ -479,60 +479,6 @@ describe('Tokenizer', () => {
|
|
|
479
479
|
expect(screen.getByText('Charlie')).toBeInTheDocument();
|
|
480
480
|
});
|
|
481
481
|
|
|
482
|
-
it('unfocusedLayer: RTL emits no justify-self into the inset-positioned popover', () => {
|
|
483
|
-
// The popover positions itself with explicit anchor() insets
|
|
484
|
-
// (positioning: 'custom'), so none of useLayer's placement-derived
|
|
485
|
-
// styles may reach it — an RTL justify-self with insets and no
|
|
486
|
-
// position-area would re-align the box inside the inset-modified
|
|
487
|
-
// containing block instead of hugging the anchor.
|
|
488
|
-
const original = window.getComputedStyle;
|
|
489
|
-
let root: HTMLElement | null = null;
|
|
490
|
-
const spy = vi
|
|
491
|
-
.spyOn(window, 'getComputedStyle')
|
|
492
|
-
.mockImplementation((el, pseudo) => {
|
|
493
|
-
const style = original(el, pseudo);
|
|
494
|
-
if (root && el instanceof Element && root.contains(el)) {
|
|
495
|
-
Object.defineProperty(style, 'direction', {
|
|
496
|
-
value: 'rtl',
|
|
497
|
-
configurable: true,
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
return style;
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
try {
|
|
504
|
-
const {container} = render(
|
|
505
|
-
<div style={{direction: 'rtl'}}>
|
|
506
|
-
<Tokenizer
|
|
507
|
-
label="Members"
|
|
508
|
-
searchSource={userSource}
|
|
509
|
-
value={[users[0], users[1], users[2]]}
|
|
510
|
-
onChange={() => {}}
|
|
511
|
-
tokenOverflowBehavior="unfocusedLayer"
|
|
512
|
-
data-testid="tokenizer"
|
|
513
|
-
/>
|
|
514
|
-
</div>,
|
|
515
|
-
);
|
|
516
|
-
root = container.firstElementChild as HTMLElement;
|
|
517
|
-
|
|
518
|
-
fireEvent.focusIn(screen.getByTestId('tokenizer'));
|
|
519
|
-
expect(HTMLElement.prototype.showPopover).toHaveBeenCalled();
|
|
520
|
-
|
|
521
|
-
const popover = container.querySelector('[popover]');
|
|
522
|
-
const style = popover?.getAttribute('style') ?? '';
|
|
523
|
-
// jsdom drops anchor() values for known properties (top/left), so
|
|
524
|
-
// anchor the positive check on position-anchor instead. The negative
|
|
525
|
-
// checks are meaningful: jsdom serializes both justify-self and
|
|
526
|
-
// position-area when emitted (the DropdownMenu RTL test relies on it).
|
|
527
|
-
expect(style).toContain('position-anchor');
|
|
528
|
-
expect(style).not.toContain('justify-self');
|
|
529
|
-
expect(style).not.toContain('position-area');
|
|
530
|
-
expect(style).not.toContain('position-try-fallbacks');
|
|
531
|
-
} finally {
|
|
532
|
-
spy.mockRestore();
|
|
533
|
-
}
|
|
534
|
-
});
|
|
535
|
-
|
|
536
482
|
it('unfocusedLayer: collapses on blur', () => {
|
|
537
483
|
const {container} = render(
|
|
538
484
|
<Tokenizer
|
|
@@ -684,11 +684,9 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
684
684
|
);
|
|
685
685
|
});
|
|
686
686
|
|
|
687
|
-
// Self-authored position styles (positioning: 'custom' below): explicit
|
|
688
|
-
// anchor() insets pin the expanded layer over the field itself.
|
|
689
|
-
// `left` is physical, so this popover does not yet mirror in RTL —
|
|
690
|
-
// known follow-up from #3389.
|
|
691
687
|
const popoverOverrideStyle: React.CSSProperties = {
|
|
688
|
+
positionArea: undefined,
|
|
689
|
+
positionTryFallbacks: undefined,
|
|
692
690
|
top: 'anchor(top)',
|
|
693
691
|
left: 'anchor(start)',
|
|
694
692
|
};
|
|
@@ -848,7 +846,8 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
848
846
|
{wrapperContent}
|
|
849
847
|
</div>,
|
|
850
848
|
{
|
|
851
|
-
|
|
849
|
+
placement: 'below',
|
|
850
|
+
alignment: 'start',
|
|
852
851
|
xstyle: styles.layerPopover,
|
|
853
852
|
style: popoverOverrideStyle,
|
|
854
853
|
},
|
|
@@ -39,13 +39,13 @@ export const docs = {
|
|
|
39
39
|
{
|
|
40
40
|
name: 'placement',
|
|
41
41
|
type: "'above' | 'below' | 'start' | 'end'",
|
|
42
|
-
description:
|
|
42
|
+
description: 'Position relative to the anchor element.',
|
|
43
43
|
default: "'above'",
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
name: 'alignment',
|
|
47
47
|
type: "'start' | 'center' | 'end'",
|
|
48
|
-
description:
|
|
48
|
+
description: 'Alignment along the placement axis.',
|
|
49
49
|
default: "'center'",
|
|
50
50
|
},
|
|
51
51
|
{
|
|
@@ -138,13 +138,13 @@ export const docsZh = {
|
|
|
138
138
|
{
|
|
139
139
|
name: 'placement',
|
|
140
140
|
type: "'above' | 'below' | 'start' | 'end'",
|
|
141
|
-
description: '
|
|
141
|
+
description: '相对于锚点元素的位置。',
|
|
142
142
|
default: "'above'",
|
|
143
143
|
},
|
|
144
144
|
{
|
|
145
145
|
name: 'alignment',
|
|
146
146
|
type: "'start' | 'center' | 'end'",
|
|
147
|
-
description: '
|
|
147
|
+
description: '沿放置轴的对齐方式。',
|
|
148
148
|
default: "'center'",
|
|
149
149
|
},
|
|
150
150
|
{
|
|
@@ -230,8 +230,8 @@ export const docsDense = {
|
|
|
230
230
|
children: 'Trigger element(s) that activate tooltip.',
|
|
231
231
|
anchorRef: 'External anchor ref for sibling mode.',
|
|
232
232
|
content: 'Tooltip content, typically short text.',
|
|
233
|
-
placement: 'Position relative to anchor.
|
|
234
|
-
alignment: 'Alignment along placement axis.
|
|
233
|
+
placement: 'Position relative to anchor.',
|
|
234
|
+
alignment: 'Alignment along placement axis.',
|
|
235
235
|
delay: 'Show delay in ms.',
|
|
236
236
|
hideDelay: 'Hide delay in ms.',
|
|
237
237
|
focusTrigger: 'Controls when focus events trigger tooltip.',
|
|
@@ -7,8 +7,8 @@ export const docs = {
|
|
|
7
7
|
group: 'Tooltip',
|
|
8
8
|
keywords: ['tooltip', 'hint', 'label', 'hover', 'info', 'title', 'floating'],
|
|
9
9
|
params: [
|
|
10
|
-
{name: 'placement', type: "'above' | 'below' | 'start' | 'end'", description:
|
|
11
|
-
{name: 'alignment', type: "'start' | 'center' | 'end'", description:
|
|
10
|
+
{name: 'placement', type: "'above' | 'below' | 'start' | 'end'", description: 'Position relative to the trigger.', default: "'above'"},
|
|
11
|
+
{name: 'alignment', type: "'start' | 'center' | 'end'", description: 'Alignment along the placement axis.', default: "'center'"},
|
|
12
12
|
{name: 'delay', type: 'number', description: 'Delay before showing on hover, in milliseconds.', default: '200'},
|
|
13
13
|
{name: 'hideDelay', type: 'number', description: 'Delay before hiding after mouse or focus leaves, in milliseconds.', default: '0'},
|
|
14
14
|
{name: 'focusTrigger', type: "'auto' | 'always' | 'never'", description: 'When focus should open the tooltip. auto only attaches focus listeners to naturally focusable elements.', default: "'auto'"},
|
|
@@ -24,7 +24,7 @@ export const docs = {
|
|
|
24
24
|
{name: 'interactionRef', type: 'RefCallback<HTMLElement>', description: 'Ref for the hover/focus interaction element.'},
|
|
25
25
|
{name: 'anchorId', type: 'string', description: 'CSS anchor name for advanced positioning cases.'},
|
|
26
26
|
{name: 'describedBy', type: 'string', description: 'ID to compose into aria-describedby on the trigger.'},
|
|
27
|
-
{name: 'renderTooltip', type:
|
|
27
|
+
{name: 'renderTooltip', type: '(children: ReactNode, props?: ContextRenderProps) => ReactNode', description: 'Render function for the anchor-positioned tooltip content.'},
|
|
28
28
|
],
|
|
29
29
|
usage: {
|
|
30
30
|
description: 'Headless hook for hover/focus-triggered tooltips. Builds on useLayer with hover intent, keyboard focus handling, and accessible aria-describedby linking. Use for custom trigger elements that need tooltip behavior without the wrapper component.',
|
|
@@ -44,8 +44,8 @@ export const docs = {
|
|
|
44
44
|
export const docsDense = {
|
|
45
45
|
description: 'Headless hover/focus tooltip hook. Builds on useLayer w/ hover intent, keyboard focus handling, aria-describedby. Use for custom triggers without wrapper component.',
|
|
46
46
|
paramDescriptions: {
|
|
47
|
-
placement: 'position relative to trigger.
|
|
48
|
-
alignment: 'alignment along placement axis.
|
|
47
|
+
placement: 'position relative to trigger.',
|
|
48
|
+
alignment: 'alignment along placement axis.',
|
|
49
49
|
delay: 'show delay in ms.',
|
|
50
50
|
hideDelay: 'hide delay after mouse/focus leave in ms.',
|
|
51
51
|
focusTrigger: 'when focus opens tooltip; auto = naturally focusable elements only.',
|
|
@@ -190,15 +190,8 @@ export interface TooltipReturn {
|
|
|
190
190
|
/**
|
|
191
191
|
* Render function for tooltip content.
|
|
192
192
|
* Returns anchor-positioned popover element.
|
|
193
|
-
*
|
|
194
|
-
* `positioning` is excluded: the tooltip always derives its position from
|
|
195
|
-
* placement/alignment, so accepting the custom opt-out here would be a
|
|
196
|
-
* silent no-op.
|
|
197
193
|
*/
|
|
198
|
-
renderTooltip: (
|
|
199
|
-
children: ReactNode,
|
|
200
|
-
props?: Omit<ContextRenderProps, 'positioning'>,
|
|
201
|
-
) => ReactNode;
|
|
194
|
+
renderTooltip: (children: ReactNode, props?: ContextRenderProps) => ReactNode;
|
|
202
195
|
}
|
|
203
196
|
|
|
204
197
|
/**
|
|
@@ -470,10 +463,7 @@ export function useTooltip(options: TooltipOptions = {}): TooltipReturn {
|
|
|
470
463
|
|
|
471
464
|
// Render function that wraps layer.render with tooltip styling
|
|
472
465
|
const renderTooltip = useCallback(
|
|
473
|
-
(
|
|
474
|
-
children: ReactNode,
|
|
475
|
-
props?: Omit<ContextRenderProps, 'positioning'>,
|
|
476
|
-
): ReactNode => {
|
|
466
|
+
(children: ReactNode, props?: ContextRenderProps): ReactNode => {
|
|
477
467
|
const renderPlacement = props?.placement ?? placement;
|
|
478
468
|
const renderProps = {
|
|
479
469
|
placement: renderPlacement,
|
|
@@ -17,7 +17,7 @@ export const docs = {
|
|
|
17
17
|
theming: {
|
|
18
18
|
targets: [
|
|
19
19
|
{className: 'astryx-top-nav', states: ['mode']},
|
|
20
|
-
{className: 'astryx-top-nav-item', states: ['mode'
|
|
20
|
+
{className: 'astryx-top-nav-item', states: ['mode']},
|
|
21
21
|
{className: 'astryx-top-nav-heading'},
|
|
22
22
|
{className: 'astryx-top-nav-mega-menu', states: ['mode']},
|
|
23
23
|
{className: 'astryx-top-nav-mega-menu-item', states: ['mode']},
|
|
@@ -16,7 +16,6 @@ import {TopNav} from './TopNav';
|
|
|
16
16
|
import {TopNavHeading} from './TopNavHeading';
|
|
17
17
|
import {NavIcon} from '../NavIcon';
|
|
18
18
|
import {TopNavItem} from './TopNavItem';
|
|
19
|
-
import {TopNavMegaMenuFeaturedCard} from './TopNavMegaMenuFeaturedCard';
|
|
20
19
|
import {LinkProvider} from '../Link/LinkProvider';
|
|
21
20
|
|
|
22
21
|
function CustomLink({
|
|
@@ -46,7 +45,9 @@ describe('TopNav', () => {
|
|
|
46
45
|
});
|
|
47
46
|
|
|
48
47
|
it('renders heading slot content', () => {
|
|
49
|
-
render(
|
|
48
|
+
render(
|
|
49
|
+
<TopNav heading={<span data-testid="title-content">Logo</span>} />,
|
|
50
|
+
);
|
|
50
51
|
expect(screen.getByTestId('title-content')).toBeInTheDocument();
|
|
51
52
|
});
|
|
52
53
|
|
|
@@ -241,9 +242,7 @@ describe('TopNavHeading', () => {
|
|
|
241
242
|
});
|
|
242
243
|
|
|
243
244
|
it('names a logo-only link via logoLabel', () => {
|
|
244
|
-
render(
|
|
245
|
-
<TopNavHeading logo={logo} headingHref="/home" logoLabel="Home" />,
|
|
246
|
-
);
|
|
245
|
+
render(<TopNavHeading logo={logo} headingHref="/home" logoLabel="Home" />);
|
|
247
246
|
expect(screen.getByRole('link', {name: 'Home'})).toHaveAttribute(
|
|
248
247
|
'href',
|
|
249
248
|
'/home',
|
|
@@ -295,7 +294,9 @@ describe('TopNavItem', () => {
|
|
|
295
294
|
});
|
|
296
295
|
|
|
297
296
|
it('renders children instead of label when provided', () => {
|
|
298
|
-
render(
|
|
297
|
+
render(
|
|
298
|
+
<TopNavItem label="Accessible name">Custom content</TopNavItem>,
|
|
299
|
+
);
|
|
299
300
|
expect(screen.getByText('Custom content')).toBeInTheDocument();
|
|
300
301
|
});
|
|
301
302
|
|
|
@@ -397,21 +398,4 @@ describe('TopNavItem', () => {
|
|
|
397
398
|
expect(link).toHaveAttribute('data-custom-link');
|
|
398
399
|
expect(link).not.toHaveAttribute('data-another-link');
|
|
399
400
|
});
|
|
400
|
-
|
|
401
|
-
describe('TopNavMegaMenuFeaturedCard rest forwarding', () => {
|
|
402
|
-
it('forwards data-testid, id, and aria-* to the root element', () => {
|
|
403
|
-
render(
|
|
404
|
-
<TopNavMegaMenuFeaturedCard
|
|
405
|
-
title="What's new"
|
|
406
|
-
description="Details"
|
|
407
|
-
data-testid="featured-card"
|
|
408
|
-
id="card-1"
|
|
409
|
-
aria-label="Featured"
|
|
410
|
-
/>,
|
|
411
|
-
);
|
|
412
|
-
const card = screen.getByTestId('featured-card');
|
|
413
|
-
expect(card).toHaveAttribute('id', 'card-1');
|
|
414
|
-
expect(card).toHaveAttribute('aria-label', 'Featured');
|
|
415
|
-
});
|
|
416
|
-
});
|
|
417
401
|
});
|
|
@@ -132,10 +132,6 @@ export function TopNavMegaMenuFeaturedCard({
|
|
|
132
132
|
linkLabel,
|
|
133
133
|
linkHref,
|
|
134
134
|
children,
|
|
135
|
-
xstyle,
|
|
136
|
-
className,
|
|
137
|
-
style,
|
|
138
|
-
...rest
|
|
139
135
|
}: TopNavMegaMenuFeaturedCardProps) {
|
|
140
136
|
const LinkComponent = useLinkComponent();
|
|
141
137
|
return (
|
|
@@ -143,11 +139,8 @@ export function TopNavMegaMenuFeaturedCard({
|
|
|
143
139
|
ref={ref}
|
|
144
140
|
{...mergeProps(
|
|
145
141
|
themeProps('top-nav-mega-menu-featured-card'),
|
|
146
|
-
stylex.props(styles.root
|
|
147
|
-
|
|
148
|
-
style,
|
|
149
|
-
)}
|
|
150
|
-
{...rest}>
|
|
142
|
+
stylex.props(styles.root),
|
|
143
|
+
)}>
|
|
151
144
|
{image && (
|
|
152
145
|
<img src={image} alt={imageAlt ?? ''} {...stylex.props(styles.image)} />
|
|
153
146
|
)}
|
|
@@ -25,7 +25,7 @@ export const docs = {
|
|
|
25
25
|
theming: {
|
|
26
26
|
targets: [
|
|
27
27
|
{className: 'astryx-tree-list', visualProps: ['density']},
|
|
28
|
-
{className: 'astryx-tree-list-item',
|
|
28
|
+
{className: 'astryx-tree-list-item', states: ['selected', 'disabled']},
|
|
29
29
|
],
|
|
30
30
|
},
|
|
31
31
|
components: [
|
|
@@ -89,7 +89,7 @@ export const docsZh = {
|
|
|
89
89
|
theming: {
|
|
90
90
|
targets: [
|
|
91
91
|
{className: 'astryx-tree-list', visualProps: ['density']},
|
|
92
|
-
{className: 'astryx-tree-list-item',
|
|
92
|
+
{className: 'astryx-tree-list-item', states: ['selected', 'disabled']},
|
|
93
93
|
],
|
|
94
94
|
},
|
|
95
95
|
components: [
|
|
@@ -8,16 +8,6 @@ export const docs = {
|
|
|
8
8
|
displayName: 'Base Typeahead',
|
|
9
9
|
isHiddenFromOverview: true,
|
|
10
10
|
description: 'Unstyled combobox engine providing input, search, keyboard navigation, and dropdown. No wrapper div, no border styling, no token rendering. Used by Typeahead and Tokenizer for custom compositions.',
|
|
11
|
-
usage: {
|
|
12
|
-
description: 'Unstyled combobox engine providing input, search, keyboard navigation, and dropdown. No wrapper div, no border styling, no token rendering. Used by Typeahead and Tokenizer for custom compositions.',
|
|
13
|
-
bestPractices: [
|
|
14
|
-
{ guidance: true, description: 'Use Typeahead or Tokenizer for standard fields; they wrap BaseTypeahead with the wrapper div, border styling, and token rendering it intentionally omits.' },
|
|
15
|
-
{ guidance: true, description: 'Provide your own wrapper div with border and layout when composing directly, since BaseTypeahead renders no visual chrome of its own.' },
|
|
16
|
-
{ guidance: true, description: 'Pass anchorRef pointing to your wrapper so the dropdown positions against your custom input chrome, not just the bare input element.' },
|
|
17
|
-
{ guidance: false, description: 'Expect a wrapper div, border, or token rendering. BaseTypeahead is an engine only; all visual chrome is the caller\'s responsibility.' },
|
|
18
|
-
{ guidance: false, description: 'Use BaseTypeahead when Typeahead or Tokenizer would suffice; the extra wrapper and styling work is only justified for truly custom compositions.' },
|
|
19
|
-
],
|
|
20
|
-
},
|
|
21
11
|
props: [
|
|
22
12
|
{
|
|
23
13
|
name: 'searchSource',
|
|
@@ -236,15 +226,6 @@ export const docsDense = {
|
|
|
236
226
|
isHiddenFromOverview: true,
|
|
237
227
|
displayName: 'Base Typeahead',
|
|
238
228
|
description: 'Unstyled combobox engine; input+search+keyboard nav+dropdown. No wrapper/border/token. Used by Typeahead+Tokenizer.',
|
|
239
|
-
usage: {
|
|
240
|
-
bestPractices: [
|
|
241
|
-
{ guidance: true, description: 'Use Typeahead or Tokenizer for standard fields; they add the wrapper, border, and token rendering BaseTypeahead omits.' },
|
|
242
|
-
{ guidance: true, description: 'Provide your own wrapper div with border and layout when composing directly; BaseTypeahead renders no chrome.' },
|
|
243
|
-
{ guidance: true, description: 'Pass anchorRef to your wrapper so the dropdown positions against your input chrome, not the bare input.' },
|
|
244
|
-
{ guidance: false, description: 'Expect wrapper, border, or token rendering. Engine only; chrome is the caller\'s job.' },
|
|
245
|
-
{ guidance: false, description: 'Use BaseTypeahead when Typeahead or Tokenizer suffice; extra work only pays off for custom compositions.' },
|
|
246
|
-
],
|
|
247
|
-
},
|
|
248
229
|
propDescriptions: {
|
|
249
230
|
searchSource: 'Data source w/ search+bootstrap methods.',
|
|
250
231
|
value: 'Currently selected item.',
|
|
@@ -410,10 +410,7 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
410
410
|
const performSearch = useCallback(
|
|
411
411
|
async (searchQuery: string) => {
|
|
412
412
|
searchSource.cancel?.();
|
|
413
|
-
|
|
414
|
-
// in-flight response for an older query fails the gen check below
|
|
415
|
-
// instead of overwriting the newer results.
|
|
416
|
-
const gen = ++searchGenRef.current;
|
|
413
|
+
const gen = searchGenRef.current;
|
|
417
414
|
setIsLoading(true);
|
|
418
415
|
setHasSearched(true);
|
|
419
416
|
try {
|
|
@@ -454,7 +451,7 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
454
451
|
|
|
455
452
|
// Perform bootstrap
|
|
456
453
|
const performBootstrap = useCallback(async () => {
|
|
457
|
-
const gen =
|
|
454
|
+
const gen = searchGenRef.current;
|
|
458
455
|
setIsLoading(true);
|
|
459
456
|
try {
|
|
460
457
|
const bootstrapResults = await searchSource.bootstrap();
|
|
@@ -168,7 +168,7 @@ export const docs = {
|
|
|
168
168
|
components: [{name: 'BaseTypeahead'}, {name: 'TypeaheadItem'}],
|
|
169
169
|
theming: {
|
|
170
170
|
targets: [
|
|
171
|
-
{className: 'astryx-typeahead', visualProps: ['status'
|
|
171
|
+
{className: 'astryx-typeahead', visualProps: ['status']},
|
|
172
172
|
{className: 'astryx-typeahead-dropdown'},
|
|
173
173
|
{className: 'astryx-typeahead-item'},
|
|
174
174
|
],
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
afterAll,
|
|
19
19
|
beforeEach,
|
|
20
20
|
} from 'vitest';
|
|
21
|
-
import {render, screen, fireEvent, waitFor
|
|
21
|
+
import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
22
22
|
import userEvent from '@testing-library/user-event';
|
|
23
23
|
import {Typeahead} from './Typeahead';
|
|
24
24
|
import {BaseTypeahead} from './BaseTypeahead';
|
|
@@ -314,50 +314,6 @@ describe('BaseTypeahead focus-out', () => {
|
|
|
314
314
|
});
|
|
315
315
|
|
|
316
316
|
describe('Typeahead', () => {
|
|
317
|
-
describe('out-of-order async results', () => {
|
|
318
|
-
it('discards a stale response that resolves after a newer query', async () => {
|
|
319
|
-
const resolvers = new Map<string, (items: SearchableItem[]) => void>();
|
|
320
|
-
const rawSource: SearchSource = {
|
|
321
|
-
search: async (query: string) =>
|
|
322
|
-
new Promise<SearchableItem[]>(resolve => {
|
|
323
|
-
resolvers.set(query, resolve);
|
|
324
|
-
}),
|
|
325
|
-
bootstrap: () => [],
|
|
326
|
-
};
|
|
327
|
-
|
|
328
|
-
render(
|
|
329
|
-
<Typeahead
|
|
330
|
-
label="Fruit"
|
|
331
|
-
searchSource={rawSource}
|
|
332
|
-
value={null}
|
|
333
|
-
onChange={() => {}}
|
|
334
|
-
debounceMs={0}
|
|
335
|
-
/>,
|
|
336
|
-
);
|
|
337
|
-
|
|
338
|
-
const input = screen.getByRole('combobox');
|
|
339
|
-
fireEvent.change(input, {target: {value: 'a'}});
|
|
340
|
-
fireEvent.change(input, {target: {value: 'ap'}});
|
|
341
|
-
|
|
342
|
-
// The newer query resolves first…
|
|
343
|
-
await act(async () => {
|
|
344
|
-
resolvers.get('ap')!([{id: 'apple', label: 'Apple'}]);
|
|
345
|
-
});
|
|
346
|
-
expect(screen.getByText('Apple')).toBeInTheDocument();
|
|
347
|
-
|
|
348
|
-
// …then the abandoned query's slow response arrives and must be
|
|
349
|
-
// discarded rather than overwriting the current results.
|
|
350
|
-
await act(async () => {
|
|
351
|
-
resolvers.get('a')!([
|
|
352
|
-
{id: 'avocado', label: 'Avocado'},
|
|
353
|
-
{id: 'apricot', label: 'Apricot'},
|
|
354
|
-
]);
|
|
355
|
-
});
|
|
356
|
-
expect(screen.getByText('Apple')).toBeInTheDocument();
|
|
357
|
-
expect(screen.queryByText('Avocado')).not.toBeInTheDocument();
|
|
358
|
-
});
|
|
359
|
-
});
|
|
360
|
-
|
|
361
317
|
it('renders with label', () => {
|
|
362
318
|
render(
|
|
363
319
|
<Typeahead
|