@astryxdesign/core 0.2.0 → 0.3.0
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 +110 -0
- package/README.md +5 -3
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.js +1 -1
- package/dist/AppShell/AppShell.d.ts +2 -20
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +25 -18
- package/dist/AppShell/index.d.ts +20 -1
- package/dist/AppShell/index.d.ts.map +1 -1
- package/dist/AppShell/index.js +14 -0
- package/dist/AspectRatio/AspectRatio.d.ts +1 -1
- package/dist/AspectRatio/AspectRatio.js +1 -1
- package/dist/Avatar/Avatar.d.ts +1 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +4 -4
- package/dist/Avatar/AvatarStatusDot.d.ts +2 -26
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +1 -22
- package/dist/Avatar/index.d.ts +26 -1
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +21 -0
- package/dist/AvatarGroup/AvatarGroup.d.ts +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +4 -8
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +2 -2
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -3
- package/dist/Badge/Badge.d.ts +2 -30
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +2 -17
- package/dist/Badge/index.d.ts +31 -2
- package/dist/Badge/index.d.ts.map +1 -1
- package/dist/Badge/index.js +15 -1
- package/dist/Banner/Banner.d.ts +2 -37
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +6 -34
- package/dist/Banner/index.d.ts +37 -1
- package/dist/Banner/index.d.ts.map +1 -1
- package/dist/Banner/index.js +27 -0
- package/dist/Blockquote/Blockquote.d.ts +1 -1
- package/dist/Blockquote/Blockquote.js +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +4 -3
- package/dist/Breadcrumbs/Breadcrumbs.d.ts +2 -18
- package/dist/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/Breadcrumbs/Breadcrumbs.js +1 -15
- package/dist/Breadcrumbs/index.d.ts +18 -1
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +14 -0
- package/dist/Button/Button.d.ts +3 -21
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +6 -19
- package/dist/Button/index.d.ts +21 -3
- package/dist/Button/index.d.ts.map +1 -1
- package/dist/Button/index.js +15 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/Calendar/Calendar.js +1 -1
- package/dist/Calendar/index.d.ts +1 -1
- package/dist/Calendar/index.d.ts.map +1 -1
- package/dist/Calendar/index.js +1 -1
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.js +2 -2
- package/dist/Calendar/utils.d.ts +0 -4
- package/dist/Calendar/utils.d.ts.map +1 -1
- package/dist/Calendar/utils.js +1 -8
- package/dist/Card/Card.d.ts +1 -1
- package/dist/Card/Card.js +1 -1
- package/dist/Carousel/Carousel.d.ts +54 -3
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +82 -15
- package/dist/Carousel/index.d.ts +1 -1
- package/dist/Carousel/index.d.ts.map +1 -1
- package/dist/Center/Center.d.ts +21 -4
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +11 -3
- package/dist/Chat/ChatComposer.d.ts +1 -1
- package/dist/Chat/ChatComposer.js +9 -9
- package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
- package/dist/Chat/ChatComposerDrawer.js +5 -5
- package/dist/Chat/ChatComposerInput.d.ts +1 -1
- package/dist/Chat/ChatComposerInput.js +1 -1
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.js +1 -1
- package/dist/Chat/ChatLayout.d.ts +8 -1
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +15 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +1 -1
- package/dist/Chat/ChatMessage.d.ts +1 -1
- package/dist/Chat/ChatMessage.js +1 -1
- package/dist/Chat/ChatMessageBubble.d.ts +1 -1
- package/dist/Chat/ChatMessageBubble.js +1 -1
- package/dist/Chat/ChatMessageList.d.ts +1 -1
- package/dist/Chat/ChatMessageList.js +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +4 -2
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.js +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +3 -3
- package/dist/CheckboxList/CheckboxList.d.ts +1 -1
- package/dist/CheckboxList/CheckboxList.js +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +20 -5
- package/dist/Citation/Citation.d.ts +1 -1
- package/dist/Citation/Citation.js +1 -1
- package/dist/ClickableCard/ClickableCard.d.ts +3 -3
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/Code/Code.d.ts +2 -2
- package/dist/Code/Code.js +2 -2
- package/dist/CodeBlock/CodeBlock.js +2 -2
- package/dist/Collapsible/Collapsible.d.ts +1 -1
- package/dist/Collapsible/Collapsible.js +3 -3
- package/dist/Collapsible/CollapsibleGroup.d.ts +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.js +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +1 -1
- package/dist/CommandPalette/CommandPaletteFooter.js +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +1 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts +2 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +4 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/CommandPalette/CommandPaletteList.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts +108 -0
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -0
- package/dist/ComplexSelector/ComplexSelector.js +316 -0
- package/dist/ComplexSelector/index.d.ts +7 -0
- package/dist/ComplexSelector/index.d.ts.map +1 -0
- package/dist/ComplexSelector/index.js +10 -0
- package/dist/ContextMenu/ContextMenu.d.ts +2 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +24 -6
- package/dist/DateInput/DateInput.js +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +1 -1
- package/dist/Dialog/Dialog.d.ts +33 -24
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +47 -31
- package/dist/Dialog/DialogHeader.d.ts +1 -1
- package/dist/Dialog/DialogHeader.js +1 -1
- package/dist/Dialog/index.d.ts +18 -1
- package/dist/Dialog/index.d.ts.map +1 -1
- package/dist/Dialog/index.js +14 -0
- package/dist/Divider/Divider.d.ts +2 -18
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +1 -15
- package/dist/Divider/index.d.ts +18 -1
- package/dist/Divider/index.d.ts.map +1 -1
- package/dist/Divider/index.js +14 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts +9 -3
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +23 -19
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +18 -12
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +38 -63
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +3 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +6 -2
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +14 -6
- package/dist/DropdownMenu/menuItemHover.d.ts +1 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemHover.js +1 -0
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +6 -4
- package/dist/EmptyState/EmptyState.d.ts +1 -1
- package/dist/EmptyState/EmptyState.js +1 -1
- package/dist/Field/Field.d.ts +1 -1
- package/dist/Field/Field.js +1 -1
- package/dist/Field/FieldLabel.d.ts +4 -3
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +48 -5
- package/dist/FieldStatus/FieldStatus.d.ts +1 -18
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +13 -17
- package/dist/FieldStatus/index.d.ts +19 -1
- package/dist/FieldStatus/index.d.ts.map +1 -1
- package/dist/FieldStatus/index.js +14 -0
- package/dist/FileInput/FileInput.js +1 -1
- package/dist/FormLayout/FormLayout.d.ts +1 -1
- package/dist/FormLayout/FormLayout.d.ts.map +1 -1
- package/dist/FormLayout/FormLayout.js +1 -1
- package/dist/Grid/Grid.d.ts +2 -10
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +1 -10
- package/dist/Grid/GridSpan.d.ts +1 -1
- package/dist/Grid/GridSpan.js +1 -1
- package/dist/HStack/HStack.d.ts +1 -1
- package/dist/HStack/HStack.js +1 -1
- package/dist/Heading/Heading.d.ts +2 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +5 -4
- package/dist/HoverCard/HoverCard.d.ts +1 -1
- package/dist/HoverCard/HoverCard.js +1 -1
- package/dist/Icon/Icon.d.ts +1 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +4 -2
- package/dist/Icon/defaultIcons.d.ts.map +1 -1
- package/dist/Icon/defaultIcons.js +14 -0
- package/dist/Icon/globalIconRegistry.d.ts +48 -6
- package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
- package/dist/Icon/globalIconRegistry.js +74 -7
- package/dist/Icon/index.d.ts +4 -3
- package/dist/Icon/index.d.ts.map +1 -1
- package/dist/Icon/index.js +2 -1
- package/dist/Icon/useIcon.d.ts +14 -0
- package/dist/Icon/useIcon.d.ts.map +1 -0
- package/dist/Icon/useIcon.js +21 -0
- package/dist/IconButton/IconButton.d.ts +1 -1
- package/dist/IconButton/IconButton.js +1 -1
- package/dist/InputGroup/InputGroup.d.ts +1 -1
- package/dist/InputGroup/InputGroup.js +1 -1
- package/dist/InputGroup/InputGroupText.d.ts +1 -1
- package/dist/InputGroup/InputGroupText.js +1 -1
- package/dist/Item/Item.d.ts +17 -4
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +32 -7
- package/dist/Kbd/Kbd.d.ts +1 -1
- package/dist/Kbd/Kbd.js +1 -1
- package/dist/Layout/Layout.d.ts +1 -1
- package/dist/Layout/Layout.js +1 -1
- package/dist/Layout/LayoutContent.d.ts +1 -1
- package/dist/Layout/LayoutContent.js +1 -1
- package/dist/Layout/LayoutFooter.d.ts +1 -1
- package/dist/Layout/LayoutFooter.js +1 -1
- package/dist/Layout/LayoutHeader.d.ts +1 -1
- package/dist/Layout/LayoutHeader.js +1 -1
- package/dist/Layout/LayoutPanel.d.ts +1 -1
- package/dist/Layout/LayoutPanel.js +1 -1
- package/dist/Lightbox/Lightbox.d.ts +6 -4
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +117 -26
- package/dist/Link/Link.d.ts +1 -1
- package/dist/Link/Link.js +1 -1
- package/dist/Link/LinkProvider.d.ts +2 -2
- package/dist/Link/LinkProvider.js +2 -2
- package/dist/List/List.d.ts +1 -1
- package/dist/List/List.js +1 -1
- package/dist/List/ListItem.d.ts +12 -2
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +3 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +35 -13
- package/dist/MetadataList/MetadataList.d.ts +2 -2
- package/dist/MetadataList/MetadataList.d.ts.map +1 -1
- package/dist/MetadataList/MetadataList.js +38 -12
- package/dist/MetadataList/MetadataListItem.d.ts +1 -1
- package/dist/MetadataList/MetadataListItem.js +1 -1
- package/dist/MobileNav/MobileNav.d.ts +1 -1
- package/dist/MobileNav/MobileNav.js +1 -1
- package/dist/MoreMenu/MoreMenu.d.ts +1 -1
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.d.ts +13 -4
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +118 -24
- package/dist/NavIcon/NavIcon.d.ts +1 -1
- package/dist/NavIcon/NavIcon.js +1 -1
- package/dist/NavMenu/index.d.ts +0 -2
- package/dist/NavMenu/index.d.ts.map +1 -1
- package/dist/NavMenu/index.js +1 -3
- package/dist/NumberInput/NumberInput.d.ts +1 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +16 -5
- package/dist/Outline/Outline.js +1 -1
- package/dist/OverflowList/OverflowList.d.ts +1 -1
- package/dist/OverflowList/OverflowList.js +1 -1
- package/dist/Pagination/Pagination.d.ts +26 -21
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +169 -41
- package/dist/Pagination/index.d.ts +22 -1
- package/dist/Pagination/index.d.ts.map +1 -1
- package/dist/Pagination/index.js +14 -0
- package/dist/Popover/Popover.d.ts +20 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +5 -1
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +14 -3
- package/dist/PowerSearch/PowerSearch.d.ts +1 -1
- package/dist/PowerSearch/PowerSearch.js +1 -1
- package/dist/ProgressBar/ProgressBar.d.ts +49 -22
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +79 -22
- package/dist/ProgressBar/ProgressBarMarkTooltip.d.ts +27 -0
- package/dist/ProgressBar/ProgressBarMarkTooltip.d.ts.map +1 -0
- package/dist/ProgressBar/ProgressBarMarkTooltip.js +35 -0
- package/dist/ProgressBar/index.d.ts +21 -1
- package/dist/ProgressBar/index.d.ts.map +1 -1
- package/dist/ProgressBar/index.js +14 -0
- package/dist/RadioList/RadioList.d.ts +1 -1
- package/dist/RadioList/RadioList.js +1 -1
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +2 -2
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +15 -11
- package/dist/Section/Section.d.ts +2 -19
- package/dist/Section/Section.d.ts.map +1 -1
- package/dist/Section/Section.js +1 -15
- package/dist/Section/index.d.ts +19 -1
- package/dist/Section/index.d.ts.map +1 -1
- package/dist/Section/index.js +14 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +4 -3
- package/dist/SelectableCard/SelectableCard.d.ts +4 -3
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +15 -3
- package/dist/Selector/Selector.d.ts +12 -3
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +109 -21
- package/dist/SideNav/SideNav.d.ts +1 -1
- package/dist/SideNav/SideNav.js +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts +1 -1
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts +2 -2
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +6 -7
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.js +1 -1
- package/dist/Skeleton/Skeleton.d.ts +1 -1
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +78 -68
- package/dist/Spinner/Spinner.d.ts +1 -1
- package/dist/Spinner/Spinner.js +1 -1
- package/dist/Stack/Stack.d.ts +1 -1
- package/dist/Stack/Stack.js +1 -1
- package/dist/Stack/StackItem.d.ts +1 -1
- package/dist/Stack/StackItem.js +1 -1
- package/dist/StatusDot/StatusDot.d.ts +1 -20
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +2 -17
- package/dist/StatusDot/index.d.ts +21 -1
- package/dist/StatusDot/index.d.ts.map +1 -1
- package/dist/StatusDot/index.js +14 -0
- package/dist/Switch/Switch.d.ts +2 -6
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +18 -10
- package/dist/TabList/Tab.d.ts +1 -1
- package/dist/TabList/Tab.js +1 -1
- package/dist/TabList/TabList.d.ts +1 -1
- package/dist/TabList/TabList.js +1 -1
- package/dist/TabList/TabMenu.d.ts +1 -1
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +11 -3
- package/dist/Table/BaseTable.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +4 -7
- package/dist/Table/Table.d.ts +1 -1
- package/dist/Table/Table.js +1 -1
- package/dist/Table/TableCell.d.ts +1 -1
- package/dist/Table/TableCell.js +4 -2
- package/dist/Table/TableHeaderCell.d.ts +1 -1
- package/dist/Table/TableHeaderCell.js +4 -2
- package/dist/Table/TableRow.d.ts +1 -1
- package/dist/Table/TableRow.js +1 -1
- package/dist/Table/index.d.ts +1 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +18 -3
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +22 -4
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +11 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +36 -2
- package/dist/Table/types.d.ts +0 -9
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Text/Text.d.ts +11 -2
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +26 -3
- package/dist/Text/index.d.ts +31 -1
- package/dist/Text/index.d.ts.map +1 -1
- package/dist/Text/index.js +23 -0
- package/dist/TextArea/TextArea.d.ts +1 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +107 -39
- package/dist/TextInput/TextInput.d.ts +1 -1
- package/dist/TextInput/TextInput.js +1 -1
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +52 -46
- package/dist/TimeInput/TimeInput.js +1 -1
- package/dist/Timestamp/Timestamp.d.ts +26 -12
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +128 -65
- package/dist/Timestamp/TimestampHoverCard.d.ts +45 -0
- package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -0
- package/dist/Timestamp/TimestampHoverCard.js +228 -0
- package/dist/Timestamp/formatInstant.d.ts +3 -3
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +7 -2
- package/dist/Timestamp/tooltipEntries.d.ts +17 -2
- package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
- package/dist/Timestamp/tooltipEntries.js +4 -2
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +61 -9
- package/dist/ToggleButton/ToggleButton.d.ts +1 -1
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +4 -2
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Token/Token.d.ts +6 -28
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +69 -58
- package/dist/Token/TokenLink.d.ts +62 -0
- package/dist/Token/TokenLink.d.ts.map +1 -0
- package/dist/Token/TokenLink.js +76 -0
- package/dist/Token/index.d.ts +27 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Token/index.js +14 -0
- package/dist/Tokenizer/Tokenizer.d.ts +1 -1
- package/dist/Tokenizer/Tokenizer.js +1 -1
- package/dist/Toolbar/Toolbar.d.ts +1 -1
- package/dist/Toolbar/Toolbar.js +1 -1
- package/dist/Tooltip/Tooltip.d.ts +1 -1
- package/dist/Tooltip/Tooltip.js +1 -1
- package/dist/TopNav/TopNav.d.ts +1 -1
- package/dist/TopNav/TopNav.js +1 -1
- package/dist/TopNav/TopNavHeading.d.ts +2 -8
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +8 -10
- package/dist/TopNav/TopNavItem.d.ts +1 -1
- package/dist/TopNav/TopNavItem.js +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +15 -7
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +1 -1
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +5 -4
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.js +1 -1
- package/dist/TreeList/TreeListBranches.js +1 -1
- package/dist/TreeList/TreeListItem.d.ts +1 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +4 -3
- package/dist/TreeList/TreeListTypes.d.ts +1 -17
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +18 -1
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/TreeList/index.js +14 -0
- package/dist/Typeahead/BaseTypeahead.d.ts +10 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +3 -1
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +9 -2
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.js +1 -1
- package/dist/VStack/VStack.d.ts +1 -1
- package/dist/VStack/VStack.js +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +1 -1
- package/dist/astryx.css +111 -33
- package/dist/astryx.umd.js +50 -54
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.pool.stylex.d.ts +303 -0
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.pool.stylex.js +292 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/useContainerReveal.d.ts +83 -0
- package/dist/hooks/useContainerReveal.d.ts.map +1 -0
- package/dist/hooks/useContainerReveal.js +123 -0
- package/dist/hooks/useGridFocus.d.ts +8 -6
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useInputContainer.d.ts.map +1 -1
- package/dist/hooks/useInputContainer.js +29 -1
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +11 -0
- package/dist/hooks/useKeyboardHint.d.ts +2 -2
- package/dist/hooks/useKeyboardHint.d.ts.map +1 -1
- package/dist/hooks/useKeyboardHint.js +5 -3
- package/dist/hooks/useListFocus.d.ts +8 -7
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +13 -2
- package/dist/i18n/InternationalizationProvider.d.ts +6 -0
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/useDirection.d.ts.map +1 -1
- package/dist/i18n/useDirection.js +6 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/contrast.d.ts +45 -0
- package/dist/theme/contrast.d.ts.map +1 -0
- package/dist/theme/contrast.js +88 -0
- package/dist/theme/defineTheme.d.ts +9 -3
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +6 -4
- package/dist/theme/expandColorScale.d.ts +29 -2
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +91 -12
- package/dist/theme/generateThemeRules.d.ts +0 -6
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +0 -15
- package/dist/theme/index.d.ts +9 -7
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +4 -3
- package/dist/theme/themeRegistry.d.ts +32 -0
- package/dist/theme/themeRegistry.d.ts.map +1 -0
- package/dist/theme/themeRegistry.js +49 -0
- package/dist/theme/tokens.stylex.d.ts +0 -17
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +0 -22
- package/dist/theme/types.d.ts +10 -2
- package/dist/theme/types.d.ts.map +1 -1
- package/dist/theme/useTheme.d.ts +9 -0
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +82 -27
- package/dist/utils/rtlStyles.d.ts +21 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -1
- package/dist/utils/rtlStyles.js +26 -1
- package/groups.doc.mjs +2 -2
- package/locales/en.json +124 -0
- package/locales/pseudo.json +93 -0
- package/package.json +10 -14
- package/src/AlertDialog/AlertDialog.doc.mjs +3 -3
- package/src/AlertDialog/AlertDialog.tsx +1 -1
- package/src/AlertDialog/useImperativeAlertDialog.doc.mjs +1 -1
- package/src/AppShell/AppShell.doc.mjs +3 -3
- package/src/AppShell/AppShell.test.tsx +55 -0
- package/src/AppShell/AppShell.tsx +27 -22
- package/src/AppShell/index.ts +20 -1
- package/src/AppShell/useAppShellMobile.doc.mjs +2 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
- package/src/AspectRatio/AspectRatio.tsx +1 -1
- package/src/Avatar/Avatar.doc.mjs +3 -3
- package/src/Avatar/Avatar.tsx +8 -3
- package/src/Avatar/AvatarStatusDot.doc.mjs +1 -1
- package/src/Avatar/AvatarStatusDot.tsx +2 -27
- package/src/Avatar/index.ts +26 -1
- package/src/AvatarGroup/AvatarGroup.doc.mjs +3 -3
- package/src/AvatarGroup/AvatarGroup.test.tsx +21 -1
- package/src/AvatarGroup/AvatarGroup.tsx +3 -7
- package/src/AvatarGroup/AvatarGroupOverflow.doc.mjs +1 -1
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +5 -3
- package/src/Badge/Badge.doc.mjs +3 -3
- package/src/Badge/Badge.tsx +2 -31
- package/src/Badge/index.ts +32 -6
- package/src/Banner/Banner.doc.mjs +3 -3
- package/src/Banner/Banner.tsx +8 -45
- package/src/Banner/index.ts +39 -7
- package/src/Blockquote/Blockquote.doc.mjs +3 -3
- package/src/Blockquote/Blockquote.tsx +1 -1
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +1 -1
- package/src/Breadcrumbs/BreadcrumbItem.tsx +5 -3
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +3 -3
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +1 -1
- package/src/Breadcrumbs/Breadcrumbs.tsx +2 -19
- package/src/Breadcrumbs/index.ts +19 -5
- package/src/Button/Button.doc.mjs +3 -3
- package/src/Button/Button.test.tsx +16 -0
- package/src/Button/Button.tsx +6 -23
- package/src/Button/index.ts +22 -7
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -3
- package/src/ButtonGroup/ButtonGroup.tsx +1 -1
- package/src/Calendar/Calendar.doc.mjs +3 -3
- package/src/Calendar/Calendar.test.tsx +22 -6
- package/src/Calendar/Calendar.tsx +1 -1
- package/src/Calendar/index.ts +1 -6
- package/src/Calendar/styles.ts +2 -2
- package/src/Calendar/utils.ts +0 -11
- package/src/Card/Card.doc.mjs +3 -3
- package/src/Card/Card.tsx +1 -1
- package/src/Carousel/Carousel.doc.mjs +10 -3
- package/src/Carousel/Carousel.test.tsx +232 -1
- package/src/Carousel/Carousel.tsx +144 -21
- package/src/Carousel/index.ts +1 -1
- package/src/Center/Center.doc.mjs +41 -3
- package/src/Center/Center.test.tsx +75 -0
- package/src/Center/Center.tsx +38 -3
- package/src/Chat/Chat.doc.mjs +3 -3
- package/src/Chat/ChatComposer.doc.mjs +1 -1
- package/src/Chat/ChatComposer.tsx +5 -5
- package/src/Chat/ChatComposerDrawer.doc.mjs +1 -1
- package/src/Chat/ChatComposerDrawer.tsx +5 -5
- package/src/Chat/ChatComposerInput.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.tsx +1 -1
- package/src/Chat/ChatComposerTokenElement.doc.mjs +1 -1
- package/src/Chat/ChatDictationButton.doc.mjs +3 -3
- package/src/Chat/ChatDictationButton.tsx +1 -1
- package/src/Chat/ChatLayout.doc.mjs +1 -1
- package/src/Chat/ChatLayout.test.tsx +57 -0
- package/src/Chat/ChatLayout.tsx +23 -2
- package/src/Chat/ChatLayoutScrollButton.doc.mjs +1 -1
- package/src/Chat/ChatLayoutScrollButton.tsx +1 -1
- package/src/Chat/ChatMessage.doc.mjs +1 -1
- package/src/Chat/ChatMessage.tsx +1 -1
- package/src/Chat/ChatMessageBubble.doc.mjs +1 -1
- package/src/Chat/ChatMessageBubble.tsx +1 -1
- package/src/Chat/ChatMessageList.doc.mjs +1 -1
- package/src/Chat/ChatMessageList.tsx +1 -1
- package/src/Chat/ChatMessageMetadata.doc.mjs +1 -1
- package/src/Chat/ChatSendButton.doc.mjs +1 -1
- package/src/Chat/ChatSendButton.tsx +5 -3
- package/src/Chat/ChatSystemMessage.doc.mjs +1 -1
- package/src/Chat/ChatSystemMessage.tsx +1 -1
- package/src/Chat/ChatTokenizedText.doc.mjs +1 -1
- package/src/Chat/ChatTokenizedText.tsx +1 -1
- package/src/Chat/ChatToolCalls.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +56 -0
- package/src/CheckboxInput/CheckboxInput.tsx +18 -3
- package/src/CheckboxList/CheckboxList.doc.mjs +3 -3
- package/src/CheckboxList/CheckboxList.test.tsx +94 -3
- package/src/CheckboxList/CheckboxList.tsx +1 -1
- package/src/CheckboxList/CheckboxListItem.doc.mjs +1 -1
- package/src/CheckboxList/CheckboxListItem.tsx +18 -11
- package/src/Citation/Citation.doc.mjs +2 -2
- package/src/Citation/Citation.tsx +1 -1
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -3
- package/src/Code/Code.tsx +2 -2
- package/src/CodeBlock/Code.doc.mjs +1 -1
- package/src/CodeBlock/CodeBlock.doc.mjs +3 -3
- package/src/CodeBlock/CodeBlock.test.tsx +17 -0
- package/src/CodeBlock/CodeBlock.tsx +2 -2
- package/src/Collapsible/Collapsible.doc.mjs +3 -3
- package/src/Collapsible/Collapsible.tsx +3 -3
- package/src/Collapsible/CollapsibleGroup.doc.mjs +1 -1
- package/src/Collapsible/CollapsibleGroup.tsx +1 -1
- package/src/Collapsible/CollapsibleGroupContext.tsx +1 -1
- package/src/Collapsible/useCollapsible.doc.mjs +2 -2
- package/src/CommandPalette/CommandPalette.doc.mjs +4 -4
- package/src/CommandPalette/CommandPalette.tsx +1 -1
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteEmpty.tsx +1 -1
- package/src/CommandPalette/CommandPaletteFooter.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteFooter.tsx +1 -1
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +6 -2
- package/src/CommandPalette/CommandPaletteGroup.tsx +1 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteInput.tsx +5 -1
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/CommandPalette/CommandPaletteList.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteList.tsx +1 -1
- package/src/ComplexSelector/ComplexSelector.doc.mjs +179 -0
- package/src/ComplexSelector/ComplexSelector.test.tsx +156 -0
- package/src/ComplexSelector/ComplexSelector.tsx +429 -0
- package/src/ComplexSelector/index.ts +17 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +3 -3
- package/src/ContextMenu/ContextMenu.test.tsx +17 -2
- package/src/ContextMenu/ContextMenu.tsx +27 -6
- package/src/ContextMenu/ContextMenuItem.doc.mjs +1 -1
- package/src/DateInput/DateInput.doc.mjs +3 -3
- package/src/DateInput/DateInput.test.tsx +7 -3
- package/src/DateInput/DateInput.tsx +1 -1
- package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +7 -2
- package/src/DateRangeInput/DateRangeInput.tsx +1 -1
- package/src/DateTimeInput/DateTimeInput.doc.mjs +3 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +6 -2
- package/src/DateTimeInput/DateTimeInput.tsx +1 -1
- package/src/Dialog/Dialog.doc.mjs +7 -5
- package/src/Dialog/Dialog.test.tsx +46 -3
- package/src/Dialog/Dialog.tsx +61 -44
- package/src/Dialog/DialogHeader.doc.mjs +1 -1
- package/src/Dialog/DialogHeader.tsx +1 -1
- package/src/Dialog/index.ts +18 -1
- package/src/Dialog/useImperativeDialog.doc.mjs +1 -1
- package/src/Divider/Divider.doc.mjs +3 -3
- package/src/Divider/Divider.tsx +2 -19
- package/src/Divider/index.ts +19 -5
- package/src/DropdownMenu/DropdownMenu.doc.mjs +20 -5
- package/src/DropdownMenu/DropdownMenu.test.tsx +122 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -20
- package/src/DropdownMenu/DropdownMenuCheckboxItem.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +41 -64
- package/src/DropdownMenu/DropdownMenuItem.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenuItem.tsx +1 -1
- package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +5 -13
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +9 -10
- package/src/DropdownMenu/DropdownMenuRadioItem.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +11 -2
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +84 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +46 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +24 -8
- package/src/DropdownMenu/menuItemHover.ts +1 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +14 -2
- package/src/EmptyState/EmptyState.doc.mjs +3 -3
- package/src/EmptyState/EmptyState.tsx +1 -1
- package/src/Field/Field.doc.mjs +7 -3
- package/src/Field/Field.tsx +1 -1
- package/src/Field/FieldLabel.doc.mjs +1 -1
- package/src/Field/FieldLabel.test.tsx +103 -0
- package/src/Field/FieldLabel.tsx +61 -5
- package/src/FieldStatus/FieldStatus.doc.mjs +3 -2
- package/src/FieldStatus/FieldStatus.test.tsx +61 -0
- package/src/FieldStatus/FieldStatus.tsx +16 -23
- package/src/FieldStatus/index.ts +20 -5
- package/src/FileInput/FileInput.doc.mjs +3 -3
- package/src/FileInput/FileInput.tsx +1 -1
- package/src/FormLayout/FormLayout.doc.mjs +3 -3
- package/src/FormLayout/FormLayout.tsx +2 -5
- package/src/Grid/Grid.doc.mjs +3 -8
- package/src/Grid/Grid.tsx +1 -25
- package/src/Grid/GridSpan.doc.mjs +1 -1
- package/src/Grid/GridSpan.tsx +1 -1
- package/src/HStack/HStack.tsx +1 -1
- package/src/Heading/Heading.tsx +4 -3
- package/src/HoverCard/HoverCard.doc.mjs +3 -3
- package/src/HoverCard/HoverCard.tsx +1 -1
- package/src/HoverCard/useHoverCard.doc.mjs +2 -2
- package/src/Icon/Icon.doc.mjs +7 -6
- package/src/Icon/Icon.test.tsx +23 -0
- package/src/Icon/Icon.tsx +4 -2
- package/src/Icon/defaultIcons.tsx +14 -0
- package/src/Icon/globalIconRegistry.test.tsx +87 -1
- package/src/Icon/globalIconRegistry.tsx +111 -9
- package/src/Icon/index.ts +9 -7
- package/src/Icon/useIcon.ts +23 -0
- package/src/IconButton/IconButton.doc.mjs +2 -2
- package/src/IconButton/IconButton.tsx +1 -1
- package/src/InputGroup/InputGroup.doc.mjs +2 -2
- package/src/InputGroup/InputGroup.tsx +1 -1
- package/src/InputGroup/InputGroupText.doc.mjs +1 -1
- package/src/InputGroup/InputGroupText.tsx +1 -1
- package/src/Item/Item.doc.mjs +8 -3
- package/src/Item/Item.test.tsx +88 -0
- package/src/Item/Item.tsx +58 -12
- package/src/Kbd/Kbd.doc.mjs +3 -3
- package/src/Kbd/Kbd.tsx +1 -1
- package/src/Layer/Layer.doc.mjs +2 -2
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layout/Layout.doc.mjs +3 -3
- package/src/Layout/Layout.tsx +1 -1
- package/src/Layout/LayoutContent.doc.mjs +1 -1
- package/src/Layout/LayoutContent.tsx +1 -1
- package/src/Layout/LayoutFooter.doc.mjs +1 -1
- package/src/Layout/LayoutFooter.tsx +1 -1
- package/src/Layout/LayoutHeader.doc.mjs +1 -1
- package/src/Layout/LayoutHeader.tsx +1 -1
- package/src/Layout/LayoutPanel.doc.mjs +1 -1
- package/src/Layout/LayoutPanel.tsx +1 -1
- package/src/Lightbox/Lightbox.doc.mjs +5 -5
- package/src/Lightbox/Lightbox.test.tsx +211 -0
- package/src/Lightbox/Lightbox.tsx +109 -22
- package/src/Link/Link.doc.mjs +3 -3
- package/src/Link/Link.tsx +1 -1
- package/src/Link/LinkProvider.doc.mjs +2 -2
- package/src/Link/LinkProvider.tsx +2 -2
- package/src/List/List.doc.mjs +3 -3
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.doc.mjs +13 -1
- package/src/List/ListItem.tsx +14 -1
- package/src/Markdown/Markdown.doc.mjs +81 -1
- package/src/Markdown/Markdown.test.tsx +92 -0
- package/src/Markdown/Markdown.tsx +96 -68
- package/src/Markdown/parser.perf.test.ts +47 -35
- package/src/MetadataList/MetadataList.doc.mjs +3 -3
- package/src/MetadataList/MetadataList.test.tsx +82 -0
- package/src/MetadataList/MetadataList.tsx +45 -20
- package/src/MetadataList/MetadataListItem.doc.mjs +1 -1
- package/src/MetadataList/MetadataListItem.tsx +1 -1
- package/src/MobileNav/MobileNav.doc.mjs +3 -3
- package/src/MobileNav/MobileNav.tsx +1 -1
- package/src/MoreMenu/MoreMenu.doc.mjs +3 -3
- package/src/MoreMenu/MoreMenu.tsx +3 -3
- package/src/MultiSelector/MultiSelector.doc.mjs +35 -10
- package/src/MultiSelector/MultiSelector.test.tsx +303 -3
- package/src/MultiSelector/MultiSelector.tsx +223 -58
- package/src/NavIcon/NavIcon.doc.mjs +3 -3
- package/src/NavIcon/NavIcon.tsx +1 -1
- package/src/NavMenu/NavHeadingMenu.test.tsx +0 -16
- package/src/NavMenu/NavMenu.doc.mjs +2 -2
- package/src/NavMenu/index.ts +0 -4
- package/src/NumberInput/NumberInput.doc.mjs +3 -6
- package/src/NumberInput/NumberInput.test.tsx +38 -3
- package/src/NumberInput/NumberInput.tsx +24 -1
- package/src/Outline/Outline.doc.mjs +3 -3
- package/src/Outline/Outline.tsx +1 -1
- package/src/OverflowList/OverflowList.doc.mjs +3 -3
- package/src/OverflowList/OverflowList.tsx +1 -1
- package/src/Overlay/Overlay.doc.mjs +2 -2
- package/src/Pagination/Pagination.doc.mjs +55 -8
- package/src/Pagination/Pagination.test.tsx +567 -0
- package/src/Pagination/Pagination.tsx +223 -41
- package/src/Pagination/index.ts +22 -1
- package/src/Popover/Popover.doc.mjs +31 -3
- package/src/Popover/Popover.test.tsx +41 -0
- package/src/Popover/Popover.tsx +25 -2
- package/src/Popover/usePopover.doc.mjs +2 -2
- package/src/Popover/usePopover.tsx +10 -4
- package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
- package/src/PowerSearch/PowerSearch.tsx +1 -1
- package/src/ProgressBar/ProgressBar.doc.mjs +18 -3
- package/src/ProgressBar/ProgressBar.test.tsx +340 -2
- package/src/ProgressBar/ProgressBar.tsx +153 -25
- package/src/ProgressBar/ProgressBarMarkTooltip.tsx +43 -0
- package/src/ProgressBar/index.ts +22 -1
- package/src/RadioList/RadioList.doc.mjs +3 -3
- package/src/RadioList/RadioList.test.tsx +26 -4
- package/src/RadioList/RadioList.tsx +1 -1
- package/src/RadioList/RadioListItem.doc.mjs +1 -1
- package/src/RadioList/RadioListItem.tsx +9 -2
- package/src/Resizable/Resizable.doc.mjs +2 -2
- package/src/Resizable/ResizeHandle.test.tsx +52 -3
- package/src/Resizable/ResizeHandle.tsx +25 -13
- package/src/Resizable/useResizable.doc.mjs +2 -2
- package/src/Section/Section.doc.mjs +3 -3
- package/src/Section/Section.tsx +2 -20
- package/src/Section/index.ts +20 -5
- package/src/SegmentedControl/SegmentedControl.doc.mjs +3 -3
- package/src/SegmentedControl/SegmentedControl.test.tsx +28 -0
- package/src/SegmentedControl/SegmentedControl.tsx +1 -1
- package/src/SegmentedControl/SegmentedControlItem.doc.mjs +1 -1
- package/src/SegmentedControl/SegmentedControlItem.tsx +21 -3
- package/src/SelectableCard/SelectableCard.doc.mjs +4 -2
- package/src/SelectableCard/SelectableCard.test.tsx +55 -0
- package/src/SelectableCard/SelectableCard.tsx +19 -3
- package/src/Selector/Selector.doc.mjs +28 -8
- package/src/Selector/Selector.test.tsx +222 -3
- package/src/Selector/Selector.tsx +202 -52
- package/src/Selector/SelectorOption.doc.mjs +1 -1
- package/src/SideNav/SideNav.doc.mjs +3 -3
- package/src/SideNav/SideNav.tsx +1 -1
- package/src/SideNav/SideNavCollapseButton.doc.mjs +1 -1
- package/src/SideNav/SideNavCollapseButton.tsx +4 -3
- package/src/SideNav/SideNavHeading.doc.mjs +1 -1
- package/src/SideNav/SideNavHeading.tsx +8 -9
- package/src/SideNav/SideNavItem.doc.mjs +1 -1
- package/src/SideNav/SideNavItem.tsx +5 -6
- package/src/SideNav/SideNavSection.doc.mjs +1 -1
- package/src/SideNav/SideNavSection.tsx +1 -1
- package/src/Skeleton/Skeleton.doc.mjs +3 -3
- package/src/Skeleton/Skeleton.test.tsx +16 -0
- package/src/Skeleton/Skeleton.tsx +14 -2
- package/src/Slider/Slider.doc.mjs +3 -3
- package/src/Slider/Slider.tsx +9 -13
- package/src/Spinner/Spinner.doc.mjs +3 -3
- package/src/Spinner/Spinner.tsx +1 -1
- package/src/Stack/Stack.doc.mjs +3 -3
- package/src/Stack/Stack.tsx +1 -1
- package/src/Stack/StackItem.tsx +1 -1
- package/src/StatusDot/StatusDot.doc.mjs +3 -3
- package/src/StatusDot/StatusDot.tsx +2 -22
- package/src/StatusDot/index.ts +22 -5
- package/src/Switch/Switch.doc.mjs +5 -5
- package/src/Switch/Switch.test.tsx +71 -25
- package/src/Switch/Switch.tsx +56 -18
- package/src/TabList/Tab.doc.mjs +1 -1
- package/src/TabList/Tab.tsx +1 -1
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +21 -18
- package/src/TabList/TabList.tsx +1 -1
- package/src/TabList/TabMenu.doc.mjs +1 -1
- package/src/TabList/TabMenu.tsx +11 -3
- package/src/Table/BaseTable.tsx +4 -5
- package/src/Table/Table.doc.mjs +5 -5
- package/src/Table/Table.test.tsx +27 -49
- package/src/Table/Table.tsx +1 -1
- package/src/Table/TableCell.doc.mjs +1 -1
- package/src/Table/TableCell.tsx +2 -2
- package/src/Table/TableHeaderCell.doc.mjs +1 -1
- package/src/Table/TableHeaderCell.tsx +2 -2
- package/src/Table/TableRow.doc.mjs +1 -1
- package/src/Table/TableRow.tsx +1 -1
- package/src/Table/index.ts +1 -1
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +1 -1
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +19 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -4
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +161 -2
- package/src/Table/plugins/tree/useTableTreeData.tsx +54 -1
- package/src/Table/types.ts +0 -9
- package/src/Table/useTableColumnResize.doc.mjs +1 -1
- package/src/Table/useTableColumnSettings.doc.mjs +1 -1
- package/src/Table/useTableFilterState.doc.mjs +1 -1
- package/src/Table/useTableFiltering.doc.mjs +1 -1
- package/src/Table/useTableGroupedRows.doc.mjs +2 -2
- package/src/Table/useTablePagination.doc.mjs +1 -1
- package/src/Table/useTableRowExpansion.doc.mjs +57 -4
- package/src/Table/useTableRowIndex.doc.mjs +2 -2
- package/src/Table/useTableRowStatus.doc.mjs +3 -3
- package/src/Table/useTableSelection.doc.mjs +1 -1
- package/src/Table/useTableSelectionState.doc.mjs +1 -1
- package/src/Table/useTableSortable.doc.mjs +1 -1
- package/src/Table/useTableStickyColumns.doc.mjs +1 -1
- package/src/Table/useTableTreeData.doc.mjs +10 -1
- package/src/Table/useTableTreeState.doc.mjs +1 -1
- package/src/Text/Heading.doc.mjs +4 -4
- package/src/Text/Text.doc.mjs +4 -4
- package/src/Text/Text.test.tsx +42 -0
- package/src/Text/Text.tsx +26 -2
- package/src/Text/index.ts +32 -6
- package/src/TextArea/TextArea.doc.mjs +5 -5
- package/src/TextArea/TextArea.test.tsx +112 -7
- package/src/TextArea/TextArea.tsx +143 -50
- package/src/TextInput/TextInput.doc.mjs +3 -3
- package/src/TextInput/TextInput.tsx +1 -1
- package/src/Thumbnail/Thumbnail.doc.mjs +2 -2
- package/src/Thumbnail/Thumbnail.test.tsx +24 -1
- package/src/Thumbnail/Thumbnail.tsx +28 -35
- package/src/TimeInput/TimeInput.doc.mjs +3 -3
- package/src/TimeInput/TimeInput.tsx +1 -1
- package/src/Timestamp/Timestamp.doc.mjs +29 -24
- package/src/Timestamp/Timestamp.test.tsx +438 -107
- package/src/Timestamp/Timestamp.tsx +167 -103
- package/src/Timestamp/TimestampHoverCard.tsx +283 -0
- package/src/Timestamp/formatInstant.ts +9 -4
- package/src/Timestamp/tooltipEntries.test.ts +9 -0
- package/src/Timestamp/tooltipEntries.ts +18 -2
- package/src/Toast/Toast.doc.mjs +3 -3
- package/src/Toast/ToastViewport.test.tsx +218 -8
- package/src/Toast/ToastViewport.tsx +71 -12
- package/src/Toast/useToast.doc.mjs +2 -2
- package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
- package/src/ToggleButton/ToggleButton.test.tsx +24 -0
- package/src/ToggleButton/ToggleButton.tsx +20 -2
- package/src/ToggleButton/ToggleButtonGroup.doc.mjs +1 -1
- package/src/ToggleButton/ToggleButtonGroup.tsx +3 -6
- package/src/Token/Token.doc.mjs +3 -3
- package/src/Token/Token.test.tsx +145 -0
- package/src/Token/Token.tsx +75 -61
- package/src/Token/TokenLink.tsx +107 -0
- package/src/Token/index.ts +28 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +3 -3
- package/src/Tokenizer/Tokenizer.tsx +1 -1
- package/src/Toolbar/Toolbar.doc.mjs +3 -3
- package/src/Toolbar/Toolbar.tsx +1 -1
- package/src/Tooltip/Tooltip.doc.mjs +3 -3
- package/src/Tooltip/Tooltip.tsx +1 -1
- package/src/Tooltip/useTooltip.doc.mjs +2 -2
- package/src/TopNav/TopNav.doc.mjs +3 -3
- package/src/TopNav/TopNav.test.tsx +2 -2
- package/src/TopNav/TopNav.tsx +1 -1
- package/src/TopNav/TopNavHeading.doc.mjs +1 -12
- package/src/TopNav/TopNavHeading.tsx +8 -18
- package/src/TopNav/TopNavItem.doc.mjs +1 -1
- package/src/TopNav/TopNavItem.tsx +1 -1
- package/src/TopNav/TopNavMegaMenu.doc.mjs +1 -1
- package/src/TopNav/TopNavMegaMenu.tsx +32 -6
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +1 -1
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +1 -1
- package/src/TopNav/TopNavMegaMenuItem.doc.mjs +1 -1
- package/src/TopNav/TopNavMegaMenuItem.tsx +1 -1
- package/src/TopNav/TopNavMenu.doc.mjs +1 -1
- package/src/TopNav/TopNavMenu.tsx +5 -4
- package/src/TreeList/TreeList.doc.mjs +3 -3
- package/src/TreeList/TreeList.test.tsx +10 -6
- package/src/TreeList/TreeList.tsx +1 -1
- package/src/TreeList/TreeListBranches.tsx +1 -1
- package/src/TreeList/TreeListItem.tsx +4 -3
- package/src/TreeList/TreeListTypes.ts +1 -18
- package/src/TreeList/index.ts +19 -1
- package/src/Typeahead/BaseTypeahead.doc.mjs +1 -1
- package/src/Typeahead/BaseTypeahead.tsx +13 -1
- package/src/Typeahead/Typeahead.doc.mjs +3 -3
- package/src/Typeahead/Typeahead.test.tsx +62 -0
- package/src/Typeahead/Typeahead.tsx +7 -1
- package/src/Typeahead/TypeaheadItem.doc.mjs +1 -1
- package/src/Typeahead/TypeaheadItem.tsx +1 -1
- package/src/VStack/VStack.tsx +1 -1
- package/src/VisuallyHidden/VisuallyHidden.doc.mjs +3 -3
- package/src/VisuallyHidden/VisuallyHidden.tsx +1 -1
- package/src/__tests__/babelPluginAddExtensions.test.ts +190 -0
- package/src/__tests__/forcedColors.ts +60 -0
- package/src/__tests__/inputWidthContract.test.tsx +8 -1
- package/src/doc-mjs.d.ts +5 -2
- package/src/docPropLiterals.test.ts +1 -1
- package/src/docPropReferences.test.ts +1 -1
- package/src/hooks/containerReveal.pool.stylex.ts +571 -0
- package/src/hooks/index.ts +7 -0
- package/src/hooks/useClickableContainer.doc.mjs +2 -2
- package/src/hooks/useContainerReveal.doc.mjs +75 -0
- package/src/hooks/useContainerReveal.test.tsx +116 -0
- package/src/hooks/useContainerReveal.ts +181 -0
- package/src/hooks/useEntryAnimation.doc.mjs +2 -2
- package/src/hooks/useFocusTrap.doc.mjs +2 -2
- package/src/hooks/useGridFocus.doc.mjs +2 -2
- package/src/hooks/useGridFocus.ts +8 -6
- package/src/hooks/useHotkeys.doc.mjs +2 -2
- package/src/hooks/useImageMode.doc.mjs +2 -2
- package/src/hooks/useInputContainer.doc.mjs +2 -2
- package/src/hooks/useInputContainer.test.tsx +180 -0
- package/src/hooks/useInputContainer.ts +36 -1
- package/src/hooks/useInputStatusIcon.test.tsx +59 -0
- package/src/hooks/useInputStatusIcon.tsx +12 -1
- package/src/hooks/useKeyboardHint.doc.mjs +2 -2
- package/src/hooks/useKeyboardHint.test.tsx +22 -0
- package/src/hooks/useKeyboardHint.tsx +7 -3
- package/src/hooks/useListFocus.doc.mjs +2 -2
- package/src/hooks/useListFocus.ts +8 -7
- package/src/hooks/useMediaQuery.doc.mjs +2 -2
- package/src/hooks/useOverflow.doc.mjs +2 -2
- package/src/hooks/useScrollLock.doc.mjs +2 -2
- package/src/hooks/useScrollOverflow.doc.mjs +2 -2
- package/src/hooks/useStreamingText.doc.mjs +2 -2
- package/src/hooks/useTreeFocus.doc.mjs +2 -2
- package/src/hooks/useTreeFocus.test.tsx +53 -1
- package/src/hooks/useTreeFocus.ts +13 -2
- package/src/i18n/InternationalizationProvider.doc.mjs +14 -2
- package/src/i18n/InternationalizationProvider.tsx +6 -0
- package/src/i18n/useDirection.ts +6 -3
- package/src/i18n/useTranslator.doc.mjs +2 -2
- package/src/index.ts +2 -18
- package/src/theme/MediaTheme.doc.mjs +2 -2
- package/src/theme/SyntaxTheme.doc.mjs +2 -2
- package/src/theme/Theme.doc.mjs +2 -2
- package/src/theme/Theme.tsx +3 -7
- package/src/theme/contrast.test.ts +94 -0
- package/src/theme/contrast.ts +99 -0
- package/src/theme/defineTheme.test.ts +29 -30
- package/src/theme/defineTheme.ts +11 -5
- package/src/theme/expandColorScale.test.ts +387 -1
- package/src/theme/expandColorScale.ts +126 -17
- package/src/theme/generateThemeRules.ts +0 -15
- package/src/theme/index.ts +11 -13
- package/src/theme/themeRegistry.test.ts +59 -0
- package/src/theme/themeRegistry.ts +53 -0
- package/src/theme/tokens.stylex.ts +0 -19
- package/src/theme/types.ts +14 -13
- package/src/theme/useTheme.doc.mjs +2 -2
- package/src/theme/useTheme.test.tsx +48 -3
- package/src/theme/useTheme.ts +100 -29
- package/src/utils/rtlStyles.ts +22 -0
- package/dist/NavMenu/NavMenuItem.d.ts +0 -13
- package/dist/NavMenu/NavMenuItem.d.ts.map +0 -1
- package/dist/NavMenu/NavMenuItem.js +0 -16
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +0 -9
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +0 -1
- package/dist/Thumbnail/thumbnail.markers.stylex.js +0 -14
- package/dist/authoring/doc.d.ts +0 -145
- package/dist/authoring/doc.d.ts.map +0 -1
- package/dist/authoring/doc.js +0 -100
- package/dist/authoring/index.d.ts +0 -29
- package/dist/authoring/index.d.ts.map +0 -1
- package/dist/authoring/index.js +0 -28
- package/dist/authoring/integration.d.ts +0 -35
- package/dist/authoring/integration.d.ts.map +0 -1
- package/dist/authoring/integration.js +0 -30
- package/dist/authoring/template.d.ts +0 -66
- package/dist/authoring/template.d.ts.map +0 -1
- package/dist/authoring/template.js +0 -55
- package/dist/config.d.ts +0 -80
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -40
- package/dist/docs-types.d.ts +0 -969
- package/dist/docs-types.d.ts.map +0 -1
- package/dist/docs-types.js +0 -1
- package/src/NavMenu/NavMenuItem.tsx +0 -19
- package/src/Thumbnail/thumbnail.markers.stylex.ts +0 -12
- package/src/authoring/doc.ts +0 -164
- package/src/authoring/index.test.ts +0 -52
- package/src/authoring/index.ts +0 -50
- package/src/authoring/integration.ts +0 -42
- package/src/authoring/template.ts +0 -74
- package/src/config.test.ts +0 -16
- package/src/config.ts +0 -92
- package/src/docs-types.ts +0 -1108
|
@@ -1,12 +1,30 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
describe,
|
|
5
|
+
it,
|
|
6
|
+
expect,
|
|
7
|
+
vi,
|
|
8
|
+
beforeAll,
|
|
9
|
+
beforeEach,
|
|
10
|
+
afterEach,
|
|
11
|
+
} from 'vitest';
|
|
12
|
+
import {render, screen, act, waitFor, fireEvent} from '@testing-library/react';
|
|
5
13
|
import userEvent from '@testing-library/user-event';
|
|
6
14
|
import {Timestamp} from './Timestamp';
|
|
7
15
|
import {formatTooltipLines} from './tooltipEntries';
|
|
16
|
+
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
17
|
+
import {InternationalizationProvider} from '../i18n';
|
|
8
18
|
|
|
9
19
|
describe('Timestamp', () => {
|
|
20
|
+
// The hover card is loaded lazily (React.lazy + Suspense), so its chunk
|
|
21
|
+
// resolves asynchronously the first time a card renders. Warm the module
|
|
22
|
+
// cache once up front so findByRole('dialog') never races the cold import's
|
|
23
|
+
// resolution against its default 1s timeout.
|
|
24
|
+
beforeAll(async () => {
|
|
25
|
+
await import('./TimestampHoverCard');
|
|
26
|
+
});
|
|
27
|
+
|
|
10
28
|
beforeEach(() => {
|
|
11
29
|
vi.useFakeTimers();
|
|
12
30
|
vi.setSystemTime(new Date('2026-03-25T12:00:00Z'));
|
|
@@ -88,6 +106,137 @@ describe('Timestamp', () => {
|
|
|
88
106
|
expect(screen.getByText('yesterday')).toBeInTheDocument();
|
|
89
107
|
});
|
|
90
108
|
|
|
109
|
+
// --- relative_short format ---
|
|
110
|
+
|
|
111
|
+
describe('relative_short format', () => {
|
|
112
|
+
it('renders "now" for very recent times', () => {
|
|
113
|
+
render(
|
|
114
|
+
<Timestamp value={Date.now() / 1000 - 5} format="relative_short" />,
|
|
115
|
+
);
|
|
116
|
+
expect(screen.getByText('now')).toBeInTheDocument();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('abbreviates each past tier (s/m/h/d/mo/y)', () => {
|
|
120
|
+
const {rerender} = render(
|
|
121
|
+
<Timestamp value={Date.now() / 1000 - 30} format="relative_short" />,
|
|
122
|
+
);
|
|
123
|
+
expect(screen.getByText('30s ago')).toBeInTheDocument();
|
|
124
|
+
|
|
125
|
+
rerender(
|
|
126
|
+
<Timestamp
|
|
127
|
+
value={Date.now() / 1000 - 5 * 60}
|
|
128
|
+
format="relative_short"
|
|
129
|
+
/>,
|
|
130
|
+
);
|
|
131
|
+
expect(screen.getByText('5m ago')).toBeInTheDocument();
|
|
132
|
+
|
|
133
|
+
rerender(
|
|
134
|
+
<Timestamp
|
|
135
|
+
value={Date.now() / 1000 - 2 * 3600}
|
|
136
|
+
format="relative_short"
|
|
137
|
+
/>,
|
|
138
|
+
);
|
|
139
|
+
expect(screen.getByText('2h ago')).toBeInTheDocument();
|
|
140
|
+
|
|
141
|
+
rerender(
|
|
142
|
+
<Timestamp
|
|
143
|
+
value={Date.now() / 1000 - 3 * 86400}
|
|
144
|
+
format="relative_short"
|
|
145
|
+
/>,
|
|
146
|
+
);
|
|
147
|
+
expect(screen.getByText('3d ago')).toBeInTheDocument();
|
|
148
|
+
|
|
149
|
+
rerender(
|
|
150
|
+
<Timestamp
|
|
151
|
+
value={Date.now() / 1000 - 90 * 86400}
|
|
152
|
+
format="relative_short"
|
|
153
|
+
/>,
|
|
154
|
+
);
|
|
155
|
+
expect(screen.getByText('3mo ago')).toBeInTheDocument();
|
|
156
|
+
|
|
157
|
+
rerender(
|
|
158
|
+
<Timestamp
|
|
159
|
+
value={Date.now() / 1000 - 730 * 86400}
|
|
160
|
+
format="relative_short"
|
|
161
|
+
/>,
|
|
162
|
+
);
|
|
163
|
+
expect(screen.getByText('2y ago')).toBeInTheDocument();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('uses "mo" for months so it never collides with "m" (minutes)', () => {
|
|
167
|
+
// 45 days → months tier. A bare "m" here would be indistinguishable from
|
|
168
|
+
// the minutes unit, so months must render as "mo".
|
|
169
|
+
render(
|
|
170
|
+
<Timestamp
|
|
171
|
+
value={Date.now() / 1000 - 45 * 86400}
|
|
172
|
+
format="relative_short"
|
|
173
|
+
/>,
|
|
174
|
+
);
|
|
175
|
+
expect(screen.getByText('1mo ago')).toBeInTheDocument();
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('renders a single day as "1d ago" (no "yesterday" idiom in short form)', () => {
|
|
179
|
+
render(
|
|
180
|
+
<Timestamp
|
|
181
|
+
value={Date.now() / 1000 - 100000}
|
|
182
|
+
format="relative_short"
|
|
183
|
+
/>,
|
|
184
|
+
);
|
|
185
|
+
expect(screen.getByText('1d ago')).toBeInTheDocument();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('renders future times with the "in" prefix and abbreviated units', () => {
|
|
189
|
+
const {rerender} = render(
|
|
190
|
+
<Timestamp
|
|
191
|
+
value={Date.now() / 1000 + 5 * 60}
|
|
192
|
+
format="relative_short"
|
|
193
|
+
/>,
|
|
194
|
+
);
|
|
195
|
+
expect(screen.getByText('in 5m')).toBeInTheDocument();
|
|
196
|
+
|
|
197
|
+
rerender(
|
|
198
|
+
<Timestamp
|
|
199
|
+
value={Date.now() / 1000 + 2 * 3600}
|
|
200
|
+
format="relative_short"
|
|
201
|
+
/>,
|
|
202
|
+
);
|
|
203
|
+
expect(screen.getByText('in 2h')).toBeInTheDocument();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it('does not round a tier up past its own boundary', () => {
|
|
207
|
+
const {rerender} = render(
|
|
208
|
+
<Timestamp value={Date.now() / 1000 - 3599} format="relative_short" />,
|
|
209
|
+
);
|
|
210
|
+
expect(screen.getByText('59m ago')).toBeInTheDocument();
|
|
211
|
+
|
|
212
|
+
rerender(
|
|
213
|
+
<Timestamp value={Date.now() / 1000 - 86399} format="relative_short" />,
|
|
214
|
+
);
|
|
215
|
+
expect(screen.getByText('23h ago')).toBeInTheDocument();
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('treats a hair in the future as "now" (clock skew)', () => {
|
|
219
|
+
render(
|
|
220
|
+
<Timestamp value={Date.now() / 1000 + 2} format="relative_short" />,
|
|
221
|
+
);
|
|
222
|
+
expect(screen.getByText('now')).toBeInTheDocument();
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('keeps the full absolute date as the accessible name', () => {
|
|
226
|
+
render(
|
|
227
|
+
<Timestamp
|
|
228
|
+
value={Date.now() / 1000 - 2 * 3600}
|
|
229
|
+
format="relative_short"
|
|
230
|
+
/>,
|
|
231
|
+
);
|
|
232
|
+
const el = screen.getByText('2h ago');
|
|
233
|
+
// Same a11y contract as the long relative form: the visible short label
|
|
234
|
+
// is backed by the full absolute date for screen readers.
|
|
235
|
+
expect(el).toHaveAttribute('aria-label');
|
|
236
|
+
expect(el.getAttribute('aria-label')).not.toBe('2h ago');
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
|
|
91
240
|
// --- Standard display formats ---
|
|
92
241
|
|
|
93
242
|
it('renders date format', () => {
|
|
@@ -194,6 +343,26 @@ describe('Timestamp', () => {
|
|
|
194
343
|
expect(el.textContent).toMatch(/\d{2}:\d{2}:\d{2}/);
|
|
195
344
|
});
|
|
196
345
|
|
|
346
|
+
it('renders unix_seconds format as whole epoch seconds (zone-independent)', () => {
|
|
347
|
+
// 2026-02-19T17:00:00Z is 1771520400 seconds since the epoch. The value is
|
|
348
|
+
// absolute, so it is the same regardless of the viewer's zone.
|
|
349
|
+
render(
|
|
350
|
+
<Timestamp
|
|
351
|
+
value="2026-02-19T17:00:00Z"
|
|
352
|
+
format="unix_seconds"
|
|
353
|
+
data-testid="ts"
|
|
354
|
+
/>,
|
|
355
|
+
);
|
|
356
|
+
expect(screen.getByTestId('ts').textContent).toBe('1771520400');
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
it('renders unix_seconds from a Unix-seconds value input unchanged', () => {
|
|
360
|
+
render(
|
|
361
|
+
<Timestamp value={1771520400} format="unix_seconds" data-testid="ts" />,
|
|
362
|
+
);
|
|
363
|
+
expect(screen.getByTestId('ts').textContent).toBe('1771520400');
|
|
364
|
+
});
|
|
365
|
+
|
|
197
366
|
// --- Auto format ---
|
|
198
367
|
|
|
199
368
|
it('auto format uses relative for recent times', () => {
|
|
@@ -373,17 +542,17 @@ describe('Timestamp', () => {
|
|
|
373
542
|
}
|
|
374
543
|
});
|
|
375
544
|
|
|
376
|
-
// ---
|
|
545
|
+
// --- Hover card keyboard reachability (WCAG 1.4.13 / 2.1.1) ---
|
|
377
546
|
|
|
378
|
-
describe('
|
|
547
|
+
describe('hover card keyboard reachability', () => {
|
|
379
548
|
const originalMatches = HTMLElement.prototype.matches;
|
|
380
549
|
const originalShowPopover = HTMLElement.prototype.showPopover;
|
|
381
550
|
const originalHidePopover = HTMLElement.prototype.hidePopover;
|
|
382
551
|
|
|
383
552
|
beforeEach(() => {
|
|
384
|
-
// The
|
|
385
|
-
//
|
|
386
|
-
//
|
|
553
|
+
// The card content renders inline in a (mocked) popover; real timers let
|
|
554
|
+
// RTL's findBy* and the async paths resolve (the outer beforeEach
|
|
555
|
+
// installs fake timers, which would stall them).
|
|
387
556
|
vi.useRealTimers();
|
|
388
557
|
|
|
389
558
|
// Mock the Popover API, which jsdom does not implement.
|
|
@@ -391,7 +560,7 @@ describe('Timestamp', () => {
|
|
|
391
560
|
HTMLElement.prototype.hidePopover = vi.fn();
|
|
392
561
|
|
|
393
562
|
// jsdom does not derive :focus-visible from keyboard focus for a <time>
|
|
394
|
-
// element; treat the focused element as focus-visible so the
|
|
563
|
+
// element; treat the focused element as focus-visible so the card's
|
|
395
564
|
// keyboard-focus path can be exercised.
|
|
396
565
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
397
566
|
(HTMLElement.prototype as any).matches = function (
|
|
@@ -411,7 +580,7 @@ describe('Timestamp', () => {
|
|
|
411
580
|
HTMLElement.prototype.hidePopover = originalHidePopover;
|
|
412
581
|
});
|
|
413
582
|
|
|
414
|
-
it('makes the <time> element focusable while the
|
|
583
|
+
it('makes the <time> element focusable while the hover card is attached', () => {
|
|
415
584
|
render(
|
|
416
585
|
<Timestamp
|
|
417
586
|
value={Date.now() / 1000 - 3600}
|
|
@@ -422,7 +591,7 @@ describe('Timestamp', () => {
|
|
|
422
591
|
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
423
592
|
});
|
|
424
593
|
|
|
425
|
-
it('shows the
|
|
594
|
+
it('shows the hover card when the timestamp receives keyboard focus', async () => {
|
|
426
595
|
const user = userEvent.setup();
|
|
427
596
|
render(
|
|
428
597
|
<Timestamp
|
|
@@ -433,13 +602,13 @@ describe('Timestamp', () => {
|
|
|
433
602
|
);
|
|
434
603
|
const el = screen.getByTestId('ts');
|
|
435
604
|
|
|
436
|
-
//
|
|
437
|
-
//
|
|
605
|
+
// The card layer mounts inline and carries the full absolute time (the
|
|
606
|
+
// same string as the aria-label) as its single default copyable row.
|
|
438
607
|
// Compare with normalized whitespace: Intl output can contain narrow
|
|
439
608
|
// no-break spaces that jest-dom's matcher normalization would break on.
|
|
440
|
-
const
|
|
609
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
441
610
|
const normalize = (s: string) => s.replace(/\s+/g, ' ');
|
|
442
|
-
expect(normalize(
|
|
611
|
+
expect(normalize(card.textContent ?? '')).toContain(
|
|
443
612
|
normalize(el.getAttribute('aria-label') ?? '\0'),
|
|
444
613
|
);
|
|
445
614
|
|
|
@@ -451,7 +620,7 @@ describe('Timestamp', () => {
|
|
|
451
620
|
});
|
|
452
621
|
});
|
|
453
622
|
|
|
454
|
-
it('does not add a tab stop when the
|
|
623
|
+
it('does not add a tab stop when the hover card is disabled', () => {
|
|
455
624
|
render(
|
|
456
625
|
<Timestamp
|
|
457
626
|
value={Date.now() / 1000 - 3600}
|
|
@@ -463,7 +632,7 @@ describe('Timestamp', () => {
|
|
|
463
632
|
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
464
633
|
});
|
|
465
634
|
|
|
466
|
-
it('does not add a tab stop for absolute formats (no
|
|
635
|
+
it('does not add a tab stop for absolute formats (no hover card)', () => {
|
|
467
636
|
render(
|
|
468
637
|
<Timestamp
|
|
469
638
|
value="2026-02-19T17:00:00Z"
|
|
@@ -474,7 +643,7 @@ describe('Timestamp', () => {
|
|
|
474
643
|
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
475
644
|
});
|
|
476
645
|
|
|
477
|
-
it('keeps the full absolute aria-label while the
|
|
646
|
+
it('keeps the full absolute aria-label while the hover card is attached', () => {
|
|
478
647
|
render(
|
|
479
648
|
<Timestamp
|
|
480
649
|
value={Date.now() / 1000 - 3600}
|
|
@@ -489,30 +658,33 @@ describe('Timestamp', () => {
|
|
|
489
658
|
});
|
|
490
659
|
});
|
|
491
660
|
|
|
492
|
-
// ---
|
|
493
|
-
|
|
494
|
-
describe('tooltipEntries', () => {
|
|
495
|
-
// A fixed instant that lands on a different calendar day in Tokyo, so a
|
|
496
|
-
// zone-blind implementation is visible in the output.
|
|
497
|
-
const VALUE = '2026-02-19T17:00:00Z';
|
|
661
|
+
// --- Default hover card (no tooltipEntries) ---
|
|
498
662
|
|
|
663
|
+
describe('default hover card (no tooltipEntries)', () => {
|
|
499
664
|
const originalShowPopover = HTMLElement.prototype.showPopover;
|
|
500
665
|
const originalHidePopover = HTMLElement.prototype.hidePopover;
|
|
501
666
|
|
|
502
667
|
beforeEach(() => {
|
|
503
|
-
// The
|
|
504
|
-
// RTL's findBy*
|
|
668
|
+
// The card content renders inline in a (mocked) popover; real timers let
|
|
669
|
+
// RTL's findBy* and the async clipboard write resolve (the outer
|
|
670
|
+
// beforeEach installs fake timers).
|
|
505
671
|
vi.useRealTimers();
|
|
506
672
|
HTMLElement.prototype.showPopover = vi.fn();
|
|
507
673
|
HTMLElement.prototype.hidePopover = vi.fn();
|
|
674
|
+
// jsdom does not implement the async Clipboard API.
|
|
675
|
+
Object.defineProperty(navigator, 'clipboard', {
|
|
676
|
+
value: {writeText: vi.fn().mockResolvedValue(undefined)},
|
|
677
|
+
configurable: true,
|
|
678
|
+
});
|
|
508
679
|
});
|
|
509
680
|
|
|
510
681
|
afterEach(() => {
|
|
511
682
|
HTMLElement.prototype.showPopover = originalShowPopover;
|
|
512
683
|
HTMLElement.prototype.hidePopover = originalHidePopover;
|
|
684
|
+
__resetLiveRegionsForTest();
|
|
513
685
|
});
|
|
514
686
|
|
|
515
|
-
it('
|
|
687
|
+
it('renders the unified copyable card with a single default absolute row', async () => {
|
|
516
688
|
render(
|
|
517
689
|
<Timestamp
|
|
518
690
|
value={Date.now() / 1000 - 3600}
|
|
@@ -520,18 +692,123 @@ describe('Timestamp', () => {
|
|
|
520
692
|
data-testid="ts"
|
|
521
693
|
/>,
|
|
522
694
|
);
|
|
523
|
-
|
|
524
|
-
//
|
|
525
|
-
//
|
|
526
|
-
|
|
695
|
+
// With no entries the hover surface is still the copyable card — one
|
|
696
|
+
// surface, one styling — never the old read-only tooltip. (The copy
|
|
697
|
+
// button carries its own small "Copy" tooltip; that is not the hover
|
|
698
|
+
// surface, so exclude it.)
|
|
699
|
+
expect(
|
|
700
|
+
screen
|
|
701
|
+
.queryAllByRole('tooltip', {hidden: true})
|
|
702
|
+
.filter(el => !/^(Copy|Copied)$/.test(el.textContent?.trim() ?? '')),
|
|
703
|
+
).toHaveLength(0);
|
|
704
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
705
|
+
// The default card is the named details card, exactly as the configured
|
|
706
|
+
// one is.
|
|
707
|
+
expect(card).toHaveAttribute('aria-label', 'Timestamp details');
|
|
708
|
+
// Exactly one row, carrying the full absolute time (the same string as
|
|
709
|
+
// the aria-label) with its own copy button.
|
|
710
|
+
expect(card.querySelectorAll('dd')).toHaveLength(1);
|
|
711
|
+
expect(card.querySelectorAll('button')).toHaveLength(1);
|
|
527
712
|
|
|
528
713
|
const normalize = (s: string) => s.replace(/\s+/g, ' ');
|
|
529
|
-
expect(normalize(
|
|
714
|
+
expect(normalize(card.textContent ?? '')).toContain(
|
|
530
715
|
normalize(screen.getByTestId('ts').getAttribute('aria-label') ?? '\0'),
|
|
531
716
|
);
|
|
532
717
|
});
|
|
533
718
|
|
|
534
|
-
it(
|
|
719
|
+
it("copies the default absolute row's value", async () => {
|
|
720
|
+
render(<Timestamp value={Date.now() / 1000 - 3600} format="relative" />);
|
|
721
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
722
|
+
const rowValue = card.querySelector('dd')?.textContent ?? '';
|
|
723
|
+
expect(rowValue).toBeTruthy();
|
|
724
|
+
fireEvent.click(card.querySelector('button')!);
|
|
725
|
+
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(rowValue);
|
|
726
|
+
// Let the async copy resolve and flip the button into its copied state
|
|
727
|
+
// so the state update settles inside act().
|
|
728
|
+
await waitFor(() => {
|
|
729
|
+
expect(
|
|
730
|
+
screen.getByRole('button', {name: 'Copied', hidden: true}),
|
|
731
|
+
).toBeInTheDocument();
|
|
732
|
+
});
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
it("shows a 'Copy' tooltip on the copy button, flipping to 'Copied' after a copy", async () => {
|
|
736
|
+
render(<Timestamp value={Date.now() / 1000 - 3600} format="relative" />);
|
|
737
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
738
|
+
const button = card.querySelector('button')!;
|
|
739
|
+
// The visible tooltip content defaults to the short imperative 'Copy'
|
|
740
|
+
// (the full "Copy <value>" string stays the button's aria-label).
|
|
741
|
+
await waitFor(() =>
|
|
742
|
+
expect(
|
|
743
|
+
screen.getByText('Copy', {
|
|
744
|
+
selector: '[role="tooltip"] *, [role="tooltip"]',
|
|
745
|
+
}),
|
|
746
|
+
).toBeInTheDocument(),
|
|
747
|
+
);
|
|
748
|
+
fireEvent.click(button);
|
|
749
|
+
// After a successful copy the tooltip content flips to 'Copied' in step
|
|
750
|
+
// with the icon/aria-label.
|
|
751
|
+
await waitFor(() =>
|
|
752
|
+
expect(
|
|
753
|
+
screen.getByText('Copied', {
|
|
754
|
+
selector: '[role="tooltip"] *, [role="tooltip"]',
|
|
755
|
+
}),
|
|
756
|
+
).toBeInTheDocument(),
|
|
757
|
+
);
|
|
758
|
+
});
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
// --- Multi-zone / multi-format copyable hover card (tooltipEntries) ---
|
|
762
|
+
|
|
763
|
+
describe('tooltipEntries copyable hover card', () => {
|
|
764
|
+
// A fixed instant that lands on a different calendar day in Tokyo, so a
|
|
765
|
+
// zone-blind implementation is visible in the output.
|
|
766
|
+
const VALUE = '2026-02-19T17:00:00Z';
|
|
767
|
+
|
|
768
|
+
const originalShowPopover = HTMLElement.prototype.showPopover;
|
|
769
|
+
const originalHidePopover = HTMLElement.prototype.hidePopover;
|
|
770
|
+
|
|
771
|
+
beforeEach(() => {
|
|
772
|
+
// The card content renders inline in a (mocked) popover, so its rows are
|
|
773
|
+
// in the DOM without opening it. Real timers so RTL's findBy* and the
|
|
774
|
+
// async clipboard write resolve (the outer beforeEach installs fake ones).
|
|
775
|
+
vi.useRealTimers();
|
|
776
|
+
HTMLElement.prototype.showPopover = vi.fn();
|
|
777
|
+
HTMLElement.prototype.hidePopover = vi.fn();
|
|
778
|
+
// jsdom does not implement the async Clipboard API.
|
|
779
|
+
Object.defineProperty(navigator, 'clipboard', {
|
|
780
|
+
value: {writeText: vi.fn().mockResolvedValue(undefined)},
|
|
781
|
+
configurable: true,
|
|
782
|
+
});
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
afterEach(() => {
|
|
786
|
+
HTMLElement.prototype.showPopover = originalShowPopover;
|
|
787
|
+
HTMLElement.prototype.hidePopover = originalHidePopover;
|
|
788
|
+
__resetLiveRegionsForTest();
|
|
789
|
+
});
|
|
790
|
+
|
|
791
|
+
it('presents configured entries as a named card, not a read-only tooltip', async () => {
|
|
792
|
+
render(
|
|
793
|
+
<Timestamp
|
|
794
|
+
value={VALUE}
|
|
795
|
+
format="relative"
|
|
796
|
+
tooltipEntries={[{label: 'Local'}, {timezoneID: 'UTC', label: 'UTC'}]}
|
|
797
|
+
/>,
|
|
798
|
+
);
|
|
799
|
+
// Entries present — the surface is the interactive card, never the
|
|
800
|
+
// lightweight read-only tooltip. (The copy button's own "Copy" tooltip
|
|
801
|
+
// is not the hover surface, so exclude it.)
|
|
802
|
+
expect(
|
|
803
|
+
screen
|
|
804
|
+
.queryAllByRole('tooltip', {hidden: true})
|
|
805
|
+
.filter(el => !/^(Copy|Copied)$/.test(el.textContent?.trim() ?? '')),
|
|
806
|
+
).toHaveLength(0);
|
|
807
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
808
|
+
expect(card).toHaveAttribute('aria-label', 'Timestamp details');
|
|
809
|
+
});
|
|
810
|
+
|
|
811
|
+
it('renders one row per configured entry, read-only by default', async () => {
|
|
535
812
|
render(
|
|
536
813
|
<Timestamp
|
|
537
814
|
value={VALUE}
|
|
@@ -543,11 +820,37 @@ describe('Timestamp', () => {
|
|
|
543
820
|
]}
|
|
544
821
|
/>,
|
|
545
822
|
);
|
|
546
|
-
const
|
|
547
|
-
expect(
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
expect(
|
|
823
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
824
|
+
expect(card.querySelectorAll('dd')).toHaveLength(3);
|
|
825
|
+
// Entries are read-only unless they opt in, so no copy buttons and no
|
|
826
|
+
// trailing action column are rendered.
|
|
827
|
+
expect(card.querySelectorAll('button')).toHaveLength(0);
|
|
828
|
+
expect(card.textContent).toContain('Local');
|
|
829
|
+
expect(card.textContent).toContain('UTC');
|
|
830
|
+
expect(card.textContent).toContain('Tokyo');
|
|
831
|
+
});
|
|
832
|
+
|
|
833
|
+
it('renders a copy button only on rows that opt into isCopyable', async () => {
|
|
834
|
+
render(
|
|
835
|
+
<Timestamp
|
|
836
|
+
value={VALUE}
|
|
837
|
+
format="relative"
|
|
838
|
+
tooltipEntries={[
|
|
839
|
+
{label: 'Local'},
|
|
840
|
+
{timezoneID: 'UTC', label: 'UTC'},
|
|
841
|
+
{
|
|
842
|
+
timezoneID: 'UTC',
|
|
843
|
+
format: 'system_date_time',
|
|
844
|
+
label: 'ISO',
|
|
845
|
+
isCopyable: true,
|
|
846
|
+
},
|
|
847
|
+
]}
|
|
848
|
+
/>,
|
|
849
|
+
);
|
|
850
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
851
|
+
// Three rows, but only the opted-in row carries a copy button.
|
|
852
|
+
expect(card.querySelectorAll('dd')).toHaveLength(3);
|
|
853
|
+
expect(card.querySelectorAll('button')).toHaveLength(1);
|
|
551
854
|
});
|
|
552
855
|
|
|
553
856
|
it('renders each entry in the time zone it names', async () => {
|
|
@@ -565,8 +868,8 @@ describe('Timestamp', () => {
|
|
|
565
868
|
]}
|
|
566
869
|
/>,
|
|
567
870
|
);
|
|
568
|
-
const
|
|
569
|
-
const values = Array.from(
|
|
871
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
872
|
+
const values = Array.from(card.querySelectorAll('dd')).map(
|
|
570
873
|
el => el.textContent,
|
|
571
874
|
);
|
|
572
875
|
// Machine formats are locale- and host-timezone-independent, so these
|
|
@@ -574,7 +877,62 @@ describe('Timestamp', () => {
|
|
|
574
877
|
expect(values).toEqual(['2026-02-19 17:00:00', '2026-02-20 02:00:00']);
|
|
575
878
|
});
|
|
576
879
|
|
|
577
|
-
it('
|
|
880
|
+
it("copies an opted-in row's value and flips the button to the copied state", async () => {
|
|
881
|
+
render(
|
|
882
|
+
<Timestamp
|
|
883
|
+
value={VALUE}
|
|
884
|
+
format="relative"
|
|
885
|
+
tooltipEntries={[
|
|
886
|
+
{
|
|
887
|
+
label: 'ISO',
|
|
888
|
+
format: 'system_date_time',
|
|
889
|
+
timezoneID: 'UTC',
|
|
890
|
+
isCopyable: true,
|
|
891
|
+
},
|
|
892
|
+
]}
|
|
893
|
+
/>,
|
|
894
|
+
);
|
|
895
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
896
|
+
const [rowValue] = Array.from(card.querySelectorAll('dd')).map(
|
|
897
|
+
el => el.textContent ?? '',
|
|
898
|
+
);
|
|
899
|
+
const copyButton = card.querySelectorAll('button')[0];
|
|
900
|
+
|
|
901
|
+
fireEvent.click(copyButton);
|
|
902
|
+
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(rowValue);
|
|
903
|
+
|
|
904
|
+
// The button announces and flips its icon/label to the copied state.
|
|
905
|
+
await waitFor(() => {
|
|
906
|
+
expect(
|
|
907
|
+
screen.getByRole('button', {name: 'Copied', hidden: true}),
|
|
908
|
+
).toBeInTheDocument();
|
|
909
|
+
});
|
|
910
|
+
});
|
|
911
|
+
|
|
912
|
+
it('announces the copy to a polite live region through the i18n catalog', async () => {
|
|
913
|
+
render(
|
|
914
|
+
<InternationalizationProvider
|
|
915
|
+
locale="fr"
|
|
916
|
+
overrides={{fr: {'@astryx.timestamp.copied': 'Copié'}}}>
|
|
917
|
+
<Timestamp
|
|
918
|
+
value={VALUE}
|
|
919
|
+
format="relative"
|
|
920
|
+
tooltipEntries={[
|
|
921
|
+
{timezoneID: 'UTC', label: 'UTC', isCopyable: true},
|
|
922
|
+
]}
|
|
923
|
+
/>
|
|
924
|
+
</InternationalizationProvider>,
|
|
925
|
+
);
|
|
926
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
927
|
+
fireEvent.click(card.querySelector('button')!);
|
|
928
|
+
await waitFor(() => {
|
|
929
|
+
expect(
|
|
930
|
+
document.querySelector('[data-astryx-live-region="polite"]'),
|
|
931
|
+
).toHaveTextContent('Copié');
|
|
932
|
+
});
|
|
933
|
+
});
|
|
934
|
+
|
|
935
|
+
it('shows the card for absolute formats once entries are configured', async () => {
|
|
578
936
|
render(
|
|
579
937
|
<Timestamp
|
|
580
938
|
value={VALUE}
|
|
@@ -583,10 +941,10 @@ describe('Timestamp', () => {
|
|
|
583
941
|
data-testid="ts"
|
|
584
942
|
/>,
|
|
585
943
|
);
|
|
586
|
-
// Without entries an absolute format has no
|
|
587
|
-
// entries must not be silently ignored.
|
|
588
|
-
const
|
|
589
|
-
expect(
|
|
944
|
+
// Without entries an absolute format has no hover surface at all;
|
|
945
|
+
// configuring entries must not be silently ignored.
|
|
946
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
947
|
+
expect(card.textContent).toContain('UTC');
|
|
590
948
|
// ...and the anchor becomes keyboard-reachable, as it is for relative.
|
|
591
949
|
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
592
950
|
});
|
|
@@ -600,25 +958,37 @@ describe('Timestamp', () => {
|
|
|
600
958
|
data-testid="ts"
|
|
601
959
|
/>,
|
|
602
960
|
);
|
|
603
|
-
//
|
|
604
|
-
//
|
|
961
|
+
// An empty array is not a way to configure the card — with no lines to
|
|
962
|
+
// show, an absolute format stays surface-less (no tab stop, no card).
|
|
605
963
|
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
964
|
+
expect(screen.queryByRole('dialog', {hidden: true})).toBeNull();
|
|
606
965
|
});
|
|
607
966
|
|
|
608
|
-
it('
|
|
967
|
+
it('stays inert when hasTooltip is false even with entries configured', () => {
|
|
609
968
|
render(
|
|
610
969
|
<Timestamp
|
|
611
970
|
value={VALUE}
|
|
612
|
-
format="
|
|
971
|
+
format="relative"
|
|
613
972
|
hasTooltip={false}
|
|
614
|
-
tooltipEntries={[{timezoneID: 'UTC'}]}
|
|
973
|
+
tooltipEntries={[{timezoneID: 'UTC', label: 'UTC'}]}
|
|
615
974
|
data-testid="ts"
|
|
616
975
|
/>,
|
|
617
976
|
);
|
|
977
|
+
// hasTooltip stays the on/off switch: false suppresses the surface even
|
|
978
|
+
// when entries would otherwise upgrade it to the card.
|
|
979
|
+
expect(screen.queryByRole('dialog', {hidden: true})).toBeNull();
|
|
980
|
+
expect(
|
|
981
|
+
screen
|
|
982
|
+
.queryAllByRole('tooltip', {hidden: true})
|
|
983
|
+
.filter(el => !/^(Copy|Copied)$/.test(el.textContent?.trim() ?? '')),
|
|
984
|
+
).toHaveLength(0);
|
|
618
985
|
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
986
|
+
expect(
|
|
987
|
+
screen.getByTestId('ts').getAttribute('aria-describedby'),
|
|
988
|
+
).toBeNull();
|
|
619
989
|
});
|
|
620
990
|
|
|
621
|
-
it('leaves the accessible name unchanged when entries are configured',
|
|
991
|
+
it('leaves the accessible name unchanged when entries are configured', () => {
|
|
622
992
|
const value = Date.now() / 1000 - 3600;
|
|
623
993
|
const {unmount} = render(
|
|
624
994
|
<Timestamp value={value} format="relative" data-testid="a" />,
|
|
@@ -635,8 +1005,8 @@ describe('Timestamp', () => {
|
|
|
635
1005
|
/>,
|
|
636
1006
|
);
|
|
637
1007
|
// The accessible name stays the canonical absolute time in the viewer's
|
|
638
|
-
// own zone; the extra zones reach assistive tech through the
|
|
639
|
-
//
|
|
1008
|
+
// own zone; the extra zones reach assistive tech through the card, not
|
|
1009
|
+
// by being stuffed into the name.
|
|
640
1010
|
expect(screen.getByTestId('b').getAttribute('aria-label')).toBe(before);
|
|
641
1011
|
});
|
|
642
1012
|
|
|
@@ -661,8 +1031,8 @@ describe('Timestamp', () => {
|
|
|
661
1031
|
tooltipEntries={[{timezoneID: 'UTC', label: 'UTC'}]}
|
|
662
1032
|
/>,
|
|
663
1033
|
);
|
|
664
|
-
// The invalid-value bail-out runs before any
|
|
665
|
-
// no half-rendered
|
|
1034
|
+
// The invalid-value bail-out runs before any hover-surface work, so
|
|
1035
|
+
// there is no half-rendered card anchored to nothing.
|
|
666
1036
|
expect(container).toBeEmptyDOMElement();
|
|
667
1037
|
} finally {
|
|
668
1038
|
warn.mockRestore();
|
|
@@ -682,8 +1052,8 @@ describe('Timestamp', () => {
|
|
|
682
1052
|
/>,
|
|
683
1053
|
);
|
|
684
1054
|
// autoThreshold={0} forces the absolute branch regardless of the clock.
|
|
685
|
-
const
|
|
686
|
-
expect(
|
|
1055
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
1056
|
+
expect(card.textContent).toContain('2026-02-19 17:00:00');
|
|
687
1057
|
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
688
1058
|
});
|
|
689
1059
|
|
|
@@ -697,8 +1067,8 @@ describe('Timestamp', () => {
|
|
|
697
1067
|
]}
|
|
698
1068
|
/>,
|
|
699
1069
|
);
|
|
700
|
-
const
|
|
701
|
-
expect(
|
|
1070
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
1071
|
+
expect(card.textContent).toContain('2026-02-19 17:00:00');
|
|
702
1072
|
});
|
|
703
1073
|
|
|
704
1074
|
it('pairs exactly one label cell with one value cell per entry', async () => {
|
|
@@ -713,12 +1083,12 @@ describe('Timestamp', () => {
|
|
|
713
1083
|
]}
|
|
714
1084
|
/>,
|
|
715
1085
|
);
|
|
716
|
-
const
|
|
717
|
-
// An unlabeled entry still emits its label cell, so the
|
|
718
|
-
//
|
|
719
|
-
expect(
|
|
720
|
-
expect(
|
|
721
|
-
expect(
|
|
1086
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
1087
|
+
// An unlabeled entry still emits its label cell, so the grid stays
|
|
1088
|
+
// aligned and the <dl> stays valid markup.
|
|
1089
|
+
expect(card.querySelectorAll('dt')).toHaveLength(3);
|
|
1090
|
+
expect(card.querySelectorAll('dd')).toHaveLength(3);
|
|
1091
|
+
expect(card.querySelectorAll('dt')[1].textContent).toBe('');
|
|
722
1092
|
});
|
|
723
1093
|
|
|
724
1094
|
it('gives the tab stop back when entries are removed', () => {
|
|
@@ -733,50 +1103,11 @@ describe('Timestamp', () => {
|
|
|
733
1103
|
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
734
1104
|
|
|
735
1105
|
rerender(<Timestamp value={VALUE} format="date_time" data-testid="ts" />);
|
|
736
|
-
// The
|
|
737
|
-
//
|
|
1106
|
+
// The surface is driven purely by entry presence, so dropping the prop
|
|
1107
|
+
// must also drop the tab stop rather than stranding one.
|
|
738
1108
|
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
739
1109
|
});
|
|
740
1110
|
|
|
741
|
-
it('describes an absolute-format timestamp with its tooltip', async () => {
|
|
742
|
-
render(
|
|
743
|
-
<Timestamp
|
|
744
|
-
value={VALUE}
|
|
745
|
-
format="date_time"
|
|
746
|
-
tooltipEntries={[{timezoneID: 'UTC', label: 'UTC'}]}
|
|
747
|
-
data-testid="ts"
|
|
748
|
-
/>,
|
|
749
|
-
);
|
|
750
|
-
const layer = await screen.findByRole('tooltip', {hidden: true});
|
|
751
|
-
const el = screen.getByTestId('ts');
|
|
752
|
-
// An absolute format carries no aria-label, so aria-describedby is the
|
|
753
|
-
// only route the configured zones have to assistive tech.
|
|
754
|
-
expect(el.getAttribute('aria-label')).toBeNull();
|
|
755
|
-
await waitFor(() => {
|
|
756
|
-
expect(el.getAttribute('aria-describedby')).toBe(layer.id);
|
|
757
|
-
});
|
|
758
|
-
expect(layer.id).toBeTruthy();
|
|
759
|
-
});
|
|
760
|
-
|
|
761
|
-
it('leaves no tooltip and no description when hasTooltip is false', () => {
|
|
762
|
-
render(
|
|
763
|
-
<Timestamp
|
|
764
|
-
value={VALUE}
|
|
765
|
-
format="relative"
|
|
766
|
-
hasTooltip={false}
|
|
767
|
-
tooltipEntries={[{timezoneID: 'UTC', label: 'UTC'}]}
|
|
768
|
-
data-testid="ts"
|
|
769
|
-
/>,
|
|
770
|
-
);
|
|
771
|
-
expect(
|
|
772
|
-
screen.queryByRole('tooltip', {hidden: true}),
|
|
773
|
-
).not.toBeInTheDocument();
|
|
774
|
-
// No orphaned reference pointing at a tooltip that was never rendered.
|
|
775
|
-
expect(
|
|
776
|
-
screen.getByTestId('ts').getAttribute('aria-describedby'),
|
|
777
|
-
).toBeNull();
|
|
778
|
-
});
|
|
779
|
-
|
|
780
1111
|
it('does not crash on an unknown time zone', async () => {
|
|
781
1112
|
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
782
1113
|
try {
|
|
@@ -790,8 +1121,8 @@ describe('Timestamp', () => {
|
|
|
790
1121
|
]}
|
|
791
1122
|
/>,
|
|
792
1123
|
);
|
|
793
|
-
const
|
|
794
|
-
const values = Array.from(
|
|
1124
|
+
const card = await screen.findByRole('dialog', {hidden: true});
|
|
1125
|
+
const values = Array.from(card.querySelectorAll('dd')).map(
|
|
795
1126
|
el => el.textContent,
|
|
796
1127
|
);
|
|
797
1128
|
expect(values).toHaveLength(2);
|