@astryxdesign/core 0.7.6-canary.f73623d → 0.7.6-canary.f77aaf2
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/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +0 -6
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +2 -1
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +6 -2
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +36 -9
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +1 -1
- package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
- package/dist/BottomSheet/useMobileKeyboard.js +44 -8
- package/dist/BottomSheet/useSheetGestures.d.ts +36 -6
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +67 -10
- package/dist/Breadcrumbs/BreadcrumbItem.js +4 -2
- package/dist/Center/Center.d.ts +1 -1
- package/dist/Center/Center.js +1 -1
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +10 -5
- package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
- package/dist/Chat/ChatComposerDrawer.js +1 -1
- package/dist/Chat/ChatComposerInput.d.ts +1 -1
- package/dist/Chat/ChatComposerInput.js +1 -1
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +1 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +3 -1
- package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
- package/dist/Chat/ChatPastedTextToken.js +15 -4
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +2 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +5 -2
- package/dist/CheckboxList/CheckboxListContext.d.ts +8 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +5 -2
- package/dist/Code/Code.d.ts +1 -1
- package/dist/Code/Code.js +1 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +8 -5
- package/dist/ComplexSelector/ComplexSelector.d.ts +2 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +7 -2
- package/dist/DateInput/DateInput.d.ts +3 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +17 -18
- package/dist/DateRangeInput/DateRangeInput.d.ts +3 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +8 -4
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +10 -15
- package/dist/Drawer/Drawer.d.ts +1 -1
- package/dist/Drawer/Drawer.js +1 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +19 -8
- package/dist/DropdownMenu/DropdownMenuGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuGroup.js +2 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +9 -3
- package/dist/Field/Field.d.ts +2 -2
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +19 -2
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +10 -5
- package/dist/Field/fieldStatusPlacement.d.ts +15 -0
- package/dist/Field/fieldStatusPlacement.d.ts.map +1 -0
- package/dist/Field/fieldStatusPlacement.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +16 -28
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +25 -3
- package/dist/FieldStatus/index.d.ts +7 -0
- package/dist/FieldStatus/index.d.ts.map +1 -1
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +86 -35
- package/dist/Item/Item.js +5 -5
- package/dist/Item/ItemSwipeLayer.d.ts.map +1 -1
- package/dist/Item/ItemSwipeLayer.js +8 -2
- package/dist/Layer/useTouchTrigger.d.ts +35 -3
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +80 -11
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +10 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +1 -0
- package/dist/MetadataList/MetadataList.d.ts.map +1 -1
- package/dist/MetadataList/MetadataList.js +2 -1
- package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
- package/dist/MetadataList/MetadataListItem.js +2 -1
- package/dist/MultiSelector/MultiSelector.d.ts +2 -2
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +35 -25
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +4 -2
- package/dist/NumberInput/NumberInput.d.ts +3 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +11 -15
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +2 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Popover/Popover.js +2 -2
- package/dist/Popover/usePopover.d.ts +7 -1
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts +3 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +4 -2
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +7 -2
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +8 -2
- package/dist/RadioList/RadioListReasonContext.d.ts +2 -0
- package/dist/RadioList/RadioListReasonContext.d.ts.map +1 -0
- package/dist/RadioList/RadioListReasonContext.js +22 -0
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +53 -10
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +22 -5
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +6 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +16 -3
- package/dist/Selector/Selector.d.ts +3 -3
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +14 -8
- package/dist/Selector/hooks.js +2 -2
- package/dist/Selector/useSelectorPresentation.d.ts +7 -1
- package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
- package/dist/Selector/useSelectorPresentation.js +2 -1
- package/dist/SideNav/railMotion.d.ts +5 -5
- package/dist/SideNav/railMotion.d.ts.map +1 -1
- package/dist/SideNav/railMotion.js +69 -177
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +100 -17
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +7 -6
- package/dist/Table/glidingDivider.d.ts +8 -1
- package/dist/Table/glidingDivider.d.ts.map +1 -1
- package/dist/Table/glidingDivider.js +8 -3
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -2
- package/dist/TextArea/TextArea.d.ts +2 -2
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextInput/TextInput.d.ts +3 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.d.ts +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/Timer/Timer.js +1 -1
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +8 -2
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +11 -3
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +15 -0
- package/dist/Tokenizer/Tokenizer.d.ts +3 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +73 -50
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +9 -15
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +4 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +6 -3
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +4 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +4 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +262 -43
- package/dist/Typeahead/Typeahead.d.ts +3 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +36 -10
- package/dist/Typeahead/index.d.ts +1 -1
- package/dist/Typeahead/index.d.ts.map +1 -1
- package/dist/Typeahead/types.d.ts +26 -3
- package/dist/Typeahead/types.d.ts.map +1 -1
- package/dist/astryx.css +1 -2
- package/dist/gestures/haptics.d.ts.map +1 -1
- package/dist/gestures/haptics.js +1 -5
- package/dist/hooks/menuPressMarker.d.ts +13 -0
- package/dist/hooks/menuPressMarker.d.ts.map +1 -0
- package/dist/hooks/menuPressMarker.js +15 -0
- package/dist/hooks/useClickableContainer.d.ts +24 -4
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +41 -14
- package/dist/hooks/useFocusReturnVisibility.d.ts +8 -1
- package/dist/hooks/useFocusReturnVisibility.d.ts.map +1 -1
- package/dist/hooks/useFocusReturnVisibility.js +14 -8
- package/dist/hooks/useInputStatusIcon.d.ts +2 -2
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +1 -2
- package/dist/hooks/useListFocus.d.ts +19 -0
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +26 -1
- package/dist/hooks/useMenuPress.d.ts +2 -2
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +5 -6
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +13 -5
- package/dist/hooks/useTypeahead.d.ts +3 -1
- package/dist/hooks/useTypeahead.d.ts.map +1 -1
- package/dist/hooks/useTypeahead.js +21 -15
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +6 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +6 -0
- package/dist/i18n/useListFormatter.d.ts +9 -0
- package/dist/i18n/useListFormatter.d.ts.map +1 -0
- package/dist/i18n/useListFormatter.js +41 -0
- package/dist/motion/animatedLayout.d.ts +130 -5
- package/dist/motion/animatedLayout.d.ts.map +1 -1
- package/dist/motion/animatedLayout.js +771 -44
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +38 -2
- package/dist/privateAttributes/segmentDisabled.stylex.d.ts +5 -0
- package/dist/privateAttributes/segmentDisabled.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/segmentDisabled.stylex.js +28 -0
- package/dist/theme/Theme.d.ts +10 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +8 -4
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +7 -1
- package/dist/utils/focusReturn.d.ts +5 -3
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +6 -4
- package/dist/utils/getNodeText.d.ts.map +1 -1
- package/dist/utils/getNodeText.js +2 -1
- package/dist/utils/interactionModality.d.ts +78 -7
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +125 -42
- package/dist/utils/pressDisabled.d.ts +21 -0
- package/dist/utils/pressDisabled.d.ts.map +1 -0
- package/dist/utils/pressDisabled.js +32 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +5 -3
- package/dist/utils/typeaheadMatch.d.ts +24 -0
- package/dist/utils/typeaheadMatch.d.ts.map +1 -0
- package/dist/utils/typeaheadMatch.js +112 -0
- package/locales/en.json +25 -1
- package/locales/pseudo.json +18 -0
- package/package.json +19 -5
- package/src/AppShell/AppShell.tsx +0 -9
- package/src/Badge/Badge.tsx +2 -1
- package/src/BottomSheet/BottomSheet.tsx +4 -2
- package/src/BottomSheet/BottomSheetPanel.tsx +39 -8
- package/src/BottomSheet/BottomSheetSwitcher.tsx +1 -1
- package/src/BottomSheet/useMobileKeyboard.ts +51 -10
- package/src/BottomSheet/useSheetGestures.ts +92 -15
- package/src/Breadcrumbs/BreadcrumbItem.tsx +2 -1
- package/src/Center/Center.tsx +1 -1
- package/src/Chat/ChatComposer.tsx +7 -10
- package/src/Chat/ChatComposerDrawer.tsx +1 -1
- package/src/Chat/ChatComposerInput.tsx +1 -1
- package/src/Chat/ChatLayout.tsx +1 -6
- package/src/Chat/ChatMessageList.tsx +1 -0
- package/src/Chat/ChatPastedTextToken.tsx +14 -4
- package/src/Chat/ChatSystemMessage.tsx +4 -1
- package/src/Chat/ChatToolCalls.tsx +5 -0
- package/src/CheckboxList/CheckboxList.tsx +7 -1
- package/src/CheckboxList/CheckboxListContext.tsx +8 -0
- package/src/CheckboxList/CheckboxListItem.tsx +8 -2
- package/src/Code/Code.tsx +1 -1
- package/src/CommandPalette/CommandPaletteInput.tsx +5 -8
- package/src/ComplexSelector/ComplexSelector.tsx +22 -4
- package/src/DateInput/DateInput.tsx +2 -2
- package/src/DateInput/MonthScroller.tsx +15 -17
- package/src/DateRangeInput/DateRangeInput.tsx +20 -5
- package/src/Dialog/Dialog.tsx +9 -25
- package/src/Drawer/Drawer.tsx +1 -1
- package/src/DropdownMenu/DropdownMenu.tsx +24 -9
- package/src/DropdownMenu/DropdownMenuGroup.tsx +2 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +3 -1
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -3
- package/src/Field/Field.doc.mjs +2 -1
- package/src/Field/Field.tsx +2 -2
- package/src/Field/FieldLabel.doc.mjs +4 -2
- package/src/Field/FieldLabel.tsx +18 -2
- package/src/Field/PanelSearchInput.tsx +7 -8
- package/src/Field/fieldStatusPlacement.ts +18 -0
- package/src/FieldStatus/FieldStatus.tsx +33 -3
- package/src/FieldStatus/index.ts +7 -0
- package/src/FileInput/FileInput.doc.mjs +3 -3
- package/src/FileInput/FileInput.tsx +103 -36
- package/src/HoverCard/HoverCard.doc.mjs +3 -3
- package/src/HoverCard/useHoverCard.doc.mjs +1 -1
- package/src/Item/Item.tsx +5 -5
- package/src/Item/ItemSwipeLayer.tsx +8 -1
- package/src/Layer/useTouchTrigger.ts +107 -18
- package/src/Link/Link.tsx +9 -2
- package/src/Markdown/Markdown.tsx +1 -0
- package/src/MetadataList/MetadataList.tsx +4 -2
- package/src/MetadataList/MetadataListItem.tsx +2 -1
- package/src/MultiSelector/MultiSelector.tsx +57 -36
- package/src/MultiSelector/hooks.ts +7 -5
- package/src/NumberInput/NumberInput.tsx +13 -20
- package/src/OverflowList/OverflowList.tsx +2 -1
- package/src/Pagination/Pagination.tsx +1 -0
- package/src/Popover/Popover.tsx +2 -2
- package/src/Popover/usePopover.tsx +7 -2
- package/src/PowerSearch/PowerSearch.tsx +4 -2
- package/src/RadioList/RadioList.tsx +13 -2
- package/src/RadioList/RadioListItem.tsx +9 -1
- package/src/RadioList/RadioListReasonContext.ts +25 -0
- package/src/Resizable/useResizable.ts +50 -7
- package/src/SegmentedControl/SegmentedControl.tsx +43 -8
- package/src/SegmentedControl/SegmentedControlContext.ts +6 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +12 -1
- package/src/Selector/Selector.tsx +23 -9
- package/src/Selector/hooks.ts +2 -2
- package/src/Selector/useSelectorPresentation.ts +8 -1
- package/src/SideNav/railMotion.ts +73 -179
- package/src/Slider/Slider.tsx +116 -19
- package/src/Table/BaseTable.tsx +10 -6
- package/src/Table/glidingDivider.ts +8 -3
- package/src/Table/plugins/sortable/useTableSortable.tsx +2 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/TextArea/TextArea.tsx +3 -2
- package/src/TextInput/TextInput.tsx +2 -2
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timer/Timer.tsx +1 -1
- package/src/Toast/useToast.tsx +8 -3
- package/src/ToggleButton/ToggleButton.tsx +10 -3
- package/src/Token/Token.tsx +15 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +12 -8
- package/src/Tokenizer/Tokenizer.tsx +81 -53
- package/src/Tokenizer/TokenizerBottomSheet.tsx +9 -15
- package/src/Tooltip/Tooltip.doc.mjs +3 -3
- package/src/Tooltip/useTooltip.doc.mjs +1 -1
- package/src/TopNav/TopNavMegaMenu.tsx +4 -3
- package/src/TreeList/TreeList.tsx +6 -3
- package/src/TreeList/TreeListItem.tsx +5 -3
- package/src/Typeahead/BaseTypeahead.doc.mjs +7 -4
- package/src/Typeahead/BaseTypeahead.tsx +314 -40
- package/src/Typeahead/Typeahead.doc.mjs +21 -4
- package/src/Typeahead/Typeahead.tsx +42 -11
- package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
- package/src/Typeahead/index.ts +1 -1
- package/src/Typeahead/types.ts +27 -3
- package/src/gestures/haptics.ts +1 -8
- package/src/hooks/menuPressMarker.ts +15 -0
- package/src/hooks/useClickableContainer.ts +48 -17
- package/src/hooks/useFocusReturnVisibility.ts +15 -12
- package/src/hooks/useInputStatusIcon.tsx +2 -2
- package/src/hooks/useListFocus.ts +38 -1
- package/src/hooks/useMenuPress.ts +5 -5
- package/src/hooks/useTreeFocus.doc.mjs +2 -2
- package/src/hooks/useTreeFocus.ts +16 -10
- package/src/hooks/useTypeahead.doc.mjs +2 -2
- package/src/hooks/useTypeahead.ts +21 -20
- package/src/i18n/generated-locales/en.generated.ts +8 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +8 -0
- package/src/i18n/useListFormatter.ts +42 -0
- package/src/motion/animatedLayout.ts +977 -45
- package/src/motion/animator.ts +55 -2
- package/src/privateAttributes/segmentDisabled.stylex.ts +28 -0
- package/src/theme/Theme.tsx +8 -4
- package/src/theme/useTheme.ts +6 -1
- package/src/utils/focusReturn.ts +6 -4
- package/src/utils/getNodeText.ts +2 -1
- package/src/utils/interactionModality.ts +165 -44
- package/src/utils/pressDisabled.ts +32 -0
- package/src/utils/pressFeedback.ts +5 -3
- package/src/utils/typeaheadMatch.ts +141 -0
- package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.d.ts +0 -2
- package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.js +0 -132
- package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.d.ts +0 -2
- package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.js +0 -78
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.d.ts +0 -2
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +0 -66
- package/dist/List/ListMarkers.a11y.chromium.spec.d.ts +0 -2
- package/dist/List/ListMarkers.a11y.chromium.spec.js +0 -677
- package/dist/Markdown/Markdown.fr23.bench.d.ts +0 -2
- package/dist/Markdown/Markdown.fr23.bench.d.ts.map +0 -1
- package/dist/Markdown/Markdown.fr23.bench.js +0 -152
- package/dist/Markdown/MarkdownTable.a11y.chromium.spec.d.ts +0 -2
- package/dist/Markdown/MarkdownTable.a11y.chromium.spec.js +0 -590
- package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.d.ts +0 -2
- package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +0 -657
- package/dist/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.d.ts +0 -2
- package/dist/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.js +0 -153
- package/dist/MultiSelector/CreateRow.a11y.chromium.spec.d.ts +0 -2
- package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +0 -117
- package/dist/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.d.ts +0 -2
- package/dist/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.js +0 -49
- package/dist/MultiSelector/OptionActions.a11y.chromium.spec.d.ts +0 -2
- package/dist/MultiSelector/OptionActions.a11y.chromium.spec.js +0 -273
- package/dist/Outline/OutlineFocus.a11y.chromium.spec.d.ts +0 -2
- package/dist/Outline/OutlineFocus.a11y.chromium.spec.js +0 -421
- package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.d.ts +0 -2
- package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.js +0 -118
- package/dist/reset.a11y.chromium.spec.d.ts +0 -2
- package/dist/reset.a11y.chromium.spec.js +0 -231
- package/dist/reset.until-found.a11y.browser.spec.d.ts +0 -2
- package/dist/reset.until-found.a11y.browser.spec.js +0 -72
- package/src/AlertDialog/AlertDialog.spec.md +0 -259
- package/src/AlertDialog/AlertDialog.test.tsx +0 -519
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +0 -128
- package/src/AlertDialog/__tests__/AlertDialog.a11y.renders.tsx +0 -52
- package/src/AlertDialog/__tests__/AlertDialog.a11y.states.ts +0 -68
- package/src/AlertDialog/__tests__/AlertDialog.a11y.test.tsx +0 -144
- package/src/AlertDialog/useImperativeAlertDialog.test.tsx +0 -163
- package/src/AppShell/AppShell.spec.md +0 -331
- package/src/AppShell/AppShell.test.tsx +0 -1310
- package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +0 -534
- package/src/AppShell/observeMainOverflow.test.ts +0 -173
- package/src/AspectRatio/AspectRatio.spec.md +0 -179
- package/src/AspectRatio/AspectRatio.test.tsx +0 -398
- package/src/AspectRatio/__tests__/AspectRatioFitLayers.a11y.browser.spec.ts +0 -158
- package/src/Avatar/Avatar.spec.md +0 -253
- package/src/Avatar/Avatar.test.tsx +0 -867
- package/src/Avatar/AvatarStatusDot.spec.md +0 -208
- package/src/Avatar/AvatarStatusDot.test.tsx +0 -306
- package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +0 -126
- package/src/AvatarGroup/AvatarGroup.spec.md +0 -205
- package/src/AvatarGroup/AvatarGroup.test.tsx +0 -313
- package/src/AvatarGroup/AvatarGroupOverflow.spec.md +0 -210
- package/src/AvatarGroup/AvatarGroupOverflow.test.tsx +0 -263
- package/src/Badge/Badge.spec.md +0 -207
- package/src/Badge/Badge.test.tsx +0 -125
- package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +0 -260
- package/src/Banner/Banner.spec.md +0 -282
- package/src/Banner/Banner.test.tsx +0 -879
- package/src/Blockquote/Blockquote.spec.md +0 -171
- package/src/Blockquote/Blockquote.test.tsx +0 -121
- package/src/BottomSheet/BottomSheet.spec.md +0 -457
- package/src/BottomSheet/BottomSheet.test.tsx +0 -3154
- package/src/BottomSheet/BottomSheetEdgeTint.test.tsx +0 -248
- package/src/BottomSheet/BottomSheetKeyboard.test.tsx +0 -195
- package/src/BottomSheet/BottomSheetPanel.test.tsx +0 -549
- package/src/BottomSheet/BottomSheetReplace.test.tsx +0 -1638
- package/src/BottomSheet/BottomSheetStacking.announce.test.tsx +0 -246
- package/src/BottomSheet/BottomSheetStacking.test.tsx +0 -3184
- package/src/BottomSheet/BottomSheetSwitcher.spec.md +0 -367
- package/src/BottomSheet/BottomSheetSwitcher.test.tsx +0 -2010
- package/src/BottomSheet/__tests__/BottomSheetDrag.a11y.chromium.spec.ts +0 -129
- package/src/BottomSheet/__tests__/BottomSheetFocusReturn.a11y.browser.spec.ts +0 -97
- package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +0 -415
- package/src/BottomSheet/__tests__/BottomSheetNativeModal.a11y.browser.spec.ts +0 -462
- package/src/BottomSheet/__tests__/BottomSheetPinchZoom.a11y.chromium.spec.ts +0 -247
- package/src/BottomSheet/__tests__/BottomSheetToastOutlet.a11y.chromium.spec.ts +0 -83
- package/src/BottomSheet/snapOffsets.test.ts +0 -254
- package/src/BottomSheet/useSheetGestures.test.ts +0 -1690
- package/src/Breadcrumbs/BreadcrumbItem.spec.md +0 -269
- package/src/Breadcrumbs/Breadcrumbs.spec.md +0 -165
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +0 -921
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +0 -132
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.renders.tsx +0 -45
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.states.ts +0 -81
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.test.tsx +0 -125
- package/src/Button/Button.spec.md +0 -322
- package/src/Button/Button.test.tsx +0 -864
- package/src/Button/__tests__/Button.a11y.chromium.spec.ts +0 -355
- package/src/Button/__tests__/Button.a11y.harnesses.tsx +0 -47
- package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -25
- package/src/Button/__tests__/Button.a11y.renders.tsx +0 -139
- package/src/Button/__tests__/Button.a11y.states.ts +0 -317
- package/src/Button/__tests__/Button.a11y.test.tsx +0 -187
- package/src/ButtonGroup/ButtonGroup.spec.md +0 -220
- package/src/ButtonGroup/ButtonGroup.test.tsx +0 -1025
- package/src/Calendar/Calendar.spec.md +0 -248
- package/src/Calendar/Calendar.test.tsx +0 -2186
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +0 -141
- package/src/Calendar/__tests__/Calendar.a11y.known-failures.ts +0 -12
- package/src/Calendar/__tests__/Calendar.a11y.renders.tsx +0 -57
- package/src/Calendar/__tests__/Calendar.a11y.states.ts +0 -139
- package/src/Calendar/__tests__/Calendar.a11y.test.tsx +0 -137
- package/src/Calendar/dayCellUtils.test.ts +0 -520
- package/src/Calendar/getInitialFocusDate.test.ts +0 -94
- package/src/Calendar/getStandaloneShortWeekdayNames.test.ts +0 -54
- package/src/Calendar/hooks/useCalendarConstraints.test.ts +0 -153
- package/src/Calendar/hooks/useCalendarDays.test.ts +0 -265
- package/src/Calendar/hooks/useCalendarNavigation.test.ts +0 -252
- package/src/Card/Card.spec.md +0 -205
- package/src/Card/Card.test.tsx +0 -202
- package/src/Carousel/Carousel.spec.md +0 -146
- package/src/Carousel/Carousel.test.tsx +0 -1036
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +0 -207
- package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +0 -12
- package/src/Carousel/__tests__/Carousel.a11y.renders.tsx +0 -39
- package/src/Carousel/__tests__/Carousel.a11y.states.ts +0 -139
- package/src/Carousel/__tests__/Carousel.a11y.test.tsx +0 -127
- package/src/Center/Center.spec.md +0 -205
- package/src/Center/Center.test.tsx +0 -406
- package/src/Chat/ChatComposer.spec.md +0 -246
- package/src/Chat/ChatComposer.test.tsx +0 -364
- package/src/Chat/ChatComposerDrawer.spec.md +0 -267
- package/src/Chat/ChatComposerDrawer.test.tsx +0 -130
- package/src/Chat/ChatComposerInput.spec.md +0 -224
- package/src/Chat/ChatComposerInput.test.tsx +0 -2136
- package/src/Chat/ChatComposerTokenElement.spec.md +0 -164
- package/src/Chat/ChatComposerTokenElement.test.tsx +0 -85
- package/src/Chat/ChatDictationButton.spec.md +0 -205
- package/src/Chat/ChatDictationButton.test.tsx +0 -108
- package/src/Chat/ChatLayout.spec.md +0 -276
- package/src/Chat/ChatLayout.test.tsx +0 -311
- package/src/Chat/ChatLayoutScrollButton.spec.md +0 -322
- package/src/Chat/ChatLayoutScrollButton.test.tsx +0 -99
- package/src/Chat/ChatMessage.spec.md +0 -265
- package/src/Chat/ChatMessage.test.tsx +0 -344
- package/src/Chat/ChatMessageBubble.spec.md +0 -263
- package/src/Chat/ChatMessageBubble.test.tsx +0 -294
- package/src/Chat/ChatMessageList.spec.md +0 -222
- package/src/Chat/ChatMessageList.test.tsx +0 -198
- package/src/Chat/ChatMessageMetadata.spec.md +0 -220
- package/src/Chat/ChatMessageMetadata.test.tsx +0 -66
- package/src/Chat/ChatPastedTextToken.test.tsx +0 -71
- package/src/Chat/ChatSendButton.spec.md +0 -238
- package/src/Chat/ChatSendButton.test.tsx +0 -309
- package/src/Chat/ChatSystemMessage.spec.md +0 -224
- package/src/Chat/ChatSystemMessage.test.tsx +0 -189
- package/src/Chat/ChatTokenizedText.spec.md +0 -190
- package/src/Chat/ChatTokenizedText.test.tsx +0 -163
- package/src/Chat/ChatToolCalls.spec.md +0 -194
- package/src/Chat/ChatToolCalls.test.tsx +0 -413
- package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +0 -577
- package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +0 -740
- package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +0 -457
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +0 -91
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +0 -91
- package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +0 -465
- package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +0 -416
- package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +0 -1523
- package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +0 -1004
- package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +0 -574
- package/src/Chat/__tests__/useChatStreamScroll.a11y.chromium.spec.ts +0 -263
- package/src/Chat/__tests__/useChatStreamScroll.fixture.tsx +0 -61
- package/src/Chat/useChatDictation.test.tsx +0 -369
- package/src/Chat/useChatNewMessages.test.tsx +0 -209
- package/src/Chat/useChatPasteAsToken.test.ts +0 -191
- package/src/Chat/useChatStreamScroll.test.tsx +0 -381
- package/src/Chat/useTriggerMenu.test.tsx +0 -994
- package/src/CheckboxInput/CheckboxInput.spec.md +0 -218
- package/src/CheckboxInput/CheckboxInput.test.tsx +0 -926
- package/src/CheckboxInput/__tests__/Checkbox.a11y.chromium.spec.ts +0 -354
- package/src/CheckboxInput/__tests__/Checkbox.a11y.known-failures.ts +0 -54
- package/src/CheckboxInput/__tests__/Checkbox.a11y.renders.tsx +0 -310
- package/src/CheckboxInput/__tests__/Checkbox.a11y.states.ts +0 -404
- package/src/CheckboxInput/__tests__/Checkbox.a11y.test.tsx +0 -128
- package/src/CheckboxList/CheckboxList.fr10.test.tsx +0 -51
- package/src/CheckboxList/CheckboxList.spec.md +0 -332
- package/src/CheckboxList/CheckboxList.test.tsx +0 -1159
- package/src/CheckboxList/CheckboxListItem.spec.md +0 -302
- package/src/CheckboxList/__tests__/CheckboxList.a11y.chromium.spec.ts +0 -1998
- package/src/Citation/Citation.spec.md +0 -179
- package/src/Citation/Citation.test.tsx +0 -361
- package/src/ClickableCard/ClickableCard.spec.md +0 -241
- package/src/ClickableCard/ClickableCard.test.tsx +0 -382
- package/src/Code/Code.spec.md +0 -170
- package/src/Code/Code.test.tsx +0 -75
- package/src/CodeBlock/CodeBlock.highlightStyles.test.tsx +0 -87
- package/src/CodeBlock/CodeBlock.spec.md +0 -243
- package/src/CodeBlock/CodeBlock.test.tsx +0 -752
- package/src/CodeBlock/CodeLanguage.test.tsx +0 -173
- package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +0 -325
- package/src/CodeBlock/__tests__/CodeBlockLanguages.a11y.chromium.spec.ts +0 -64
- package/src/CodeBlock/__tests__/CodeBlockOverflowStop.a11y.chromium.spec.ts +0 -126
- package/src/CodeBlock/__tests__/DiffRowPaint.a11y.chromium.spec.ts +0 -94
- package/src/CodeBlock/highlightRanges.test.ts +0 -253
- package/src/CodeBlock/languages.test.ts +0 -402
- package/src/CodeBlock/tokenizer.test.ts +0 -280
- package/src/CodeBlock/tokenizerBudget.test.ts +0 -112
- package/src/Collapsible/Collapsible.spec.md +0 -247
- package/src/Collapsible/Collapsible.test.tsx +0 -620
- package/src/Collapsible/CollapsibleGroup.spec.md +0 -229
- package/src/Collapsible/CollapsibleGroup.test.tsx +0 -656
- package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +0 -194
- package/src/Collapsible/__tests__/Collapsible.a11y.states.ts +0 -117
- package/src/Collapsible/__tests__/Collapsible.a11y.test.tsx +0 -140
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.chromium.spec.ts +0 -559
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.renders.tsx +0 -45
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.states.ts +0 -139
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.test.tsx +0 -135
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +0 -141
- package/src/Collapsible/useCollapsible.test.tsx +0 -236
- package/src/CommandPalette/CommandPalette.perf.test.ts +0 -100
- package/src/CommandPalette/CommandPalette.spec.md +0 -278
- package/src/CommandPalette/CommandPalette.test.tsx +0 -750
- package/src/CommandPalette/CommandPaletteEmpty.spec.md +0 -190
- package/src/CommandPalette/CommandPaletteEmpty.test.tsx +0 -101
- package/src/CommandPalette/CommandPaletteFooter.test.tsx +0 -122
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +0 -129
- package/src/CommandPalette/CommandPaletteInput.spec.md +0 -215
- package/src/CommandPalette/CommandPaletteInput.test.tsx +0 -539
- package/src/CommandPalette/CommandPaletteItem.spec.md +0 -223
- package/src/CommandPalette/CommandPaletteItem.test.tsx +0 -417
- package/src/CommandPalette/CommandPaletteList.spec.md +0 -194
- package/src/CommandPalette/CommandPaletteList.test.tsx +0 -184
- package/src/CommandPalette/__tests__/CommandPalette.a11y.chromium.spec.ts +0 -600
- package/src/CommandPalette/__tests__/CommandPaletteEmptyAudit.a11y.chromium.spec.ts +0 -715
- package/src/CommandPalette/__tests__/CommandPaletteFooter.a11y.chromium.spec.ts +0 -582
- package/src/CommandPalette/__tests__/CommandPaletteInputAudit.a11y.chromium.spec.ts +0 -336
- package/src/CommandPalette/__tests__/CommandPaletteItemAudit.a11y.chromium.spec.ts +0 -523
- package/src/ComplexSelector/ComplexSelector.focusableDisabled.test.tsx +0 -76
- package/src/ComplexSelector/ComplexSelector.fr10.test.tsx +0 -262
- package/src/ComplexSelector/ComplexSelector.spec.md +0 -266
- package/src/ComplexSelector/ComplexSelector.test.tsx +0 -1171
- package/src/ComplexSelector/__tests__/ComplexSelector.a11y.chromium.spec.ts +0 -965
- package/src/ContextMenu/ContextMenu.spec.md +0 -279
- package/src/ContextMenu/ContextMenu.test.tsx +0 -1617
- package/src/ContextMenu/ContextMenu.triggerProps.test.tsx +0 -54
- package/src/ContextMenu/ContextMenuItem.spec.md +0 -132
- package/src/ContextMenu/__tests__/ContextMenuAudit.a11y.chromium.spec.ts +0 -439
- package/src/ContextMenu/__tests__/ContextMenuCursorAnchor.a11y.browser.spec.ts +0 -154
- package/src/ContextMenu/__tests__/ContextMenuLongPress.a11y.chromium.spec.ts +0 -117
- package/src/DateInput/DateInput.fr10.test.tsx +0 -283
- package/src/DateInput/DateInput.spec.md +0 -319
- package/src/DateInput/DateInput.test.tsx +0 -1571
- package/src/DateInput/DateInputTouch.test.tsx +0 -2948
- package/src/DateInput/MonthScrollerSettle.test.tsx +0 -165
- package/src/DateInput/NativeDateField.test.tsx +0 -741
- package/src/DateInput/Presentation.test.tsx +0 -121
- package/src/DateInput/__tests__/DateInputAudit.a11y.chromium.spec.ts +0 -577
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +0 -312
- package/src/DateInput/__tests__/WheelPinchZoom.a11y.chromium.spec.ts +0 -171
- package/src/DateRangeInput/DateRangeInput.fr10.test.tsx +0 -165
- package/src/DateRangeInput/DateRangeInput.spec.md +0 -203
- package/src/DateRangeInput/DateRangeInput.test.tsx +0 -1151
- package/src/DateTimeInput/DateTimeInput.fr10.test.tsx +0 -319
- package/src/DateTimeInput/DateTimeInput.spec.md +0 -270
- package/src/DateTimeInput/DateTimeInput.test.tsx +0 -2656
- package/src/DateTimeInput/DateTimeInputTouch.test.tsx +0 -1071
- package/src/DateTimeInput/NativePickerSegments.test.tsx +0 -657
- package/src/DateTimeInput/Presentation.test.tsx +0 -89
- package/src/Dialog/Dialog.source-build.test.mjs +0 -43
- package/src/Dialog/Dialog.spec.md +0 -189
- package/src/Dialog/Dialog.test.tsx +0 -1599
- package/src/Dialog/DialogHeader.test.tsx +0 -477
- package/src/Dialog/__tests__/Dialog.a11y.browser.spec.ts +0 -111
- package/src/Dialog/__tests__/Dialog.a11y.chromium.spec.ts +0 -218
- package/src/Dialog/__tests__/Dialog.a11y.known-failures.ts +0 -28
- package/src/Dialog/__tests__/Dialog.a11y.renders.tsx +0 -107
- package/src/Dialog/__tests__/Dialog.a11y.states.ts +0 -104
- package/src/Dialog/__tests__/Dialog.a11y.test.tsx +0 -102
- package/src/Dialog/__tests__/Dialog.reduced-motion.a11y.browser.spec.ts +0 -252
- package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +0 -202
- package/src/Dialog/modules/DialogHeader.spec.md +0 -211
- package/src/Dialog/useImperativeDialog.test.tsx +0 -78
- package/src/Divider/Divider.spec.md +0 -252
- package/src/Divider/Divider.test.tsx +0 -155
- package/src/Drawer/Drawer.spec.md +0 -388
- package/src/Drawer/Drawer.test.tsx +0 -1335
- package/src/Drawer/DrawerDirection.test.tsx +0 -127
- package/src/Drawer/DrawerHeader.spec.md +0 -181
- package/src/Drawer/DrawerHeader.test.tsx +0 -102
- package/src/Drawer/__tests__/DrawerAudit.a11y.chromium.spec.ts +0 -402
- package/src/Drawer/__tests__/DrawerHeaderAudit.a11y.chromium.spec.ts +0 -298
- package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +0 -267
- package/src/DropdownMenu/DropdownMenu.spec.md +0 -562
- package/src/DropdownMenu/DropdownMenu.ssr.test.tsx +0 -93
- package/src/DropdownMenu/DropdownMenu.test.tsx +0 -4498
- package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +0 -192
- package/src/DropdownMenu/DropdownMenuContext.public.test.ts +0 -22
- package/src/DropdownMenu/DropdownMenuDivider.spec.md +0 -186
- package/src/DropdownMenu/DropdownMenuGroup.spec.md +0 -145
- package/src/DropdownMenu/DropdownMenuItem.spec.md +0 -215
- package/src/DropdownMenu/DropdownMenuLazySheet.test.tsx +0 -126
- package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +0 -187
- package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +0 -227
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +0 -635
- package/src/DropdownMenu/DropdownMenuSheetFirstOpen.test.tsx +0 -72
- package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +0 -231
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +0 -2442
- package/src/DropdownMenu/__tests__/DropdownMenuDividerAudit.a11y.chromium.spec.ts +0 -281
- package/src/DropdownMenu/__tests__/DropdownMenuDrillIn.a11y.chromium.spec.ts +0 -175
- package/src/DropdownMenu/__tests__/DropdownMenuFocusReturn.a11y.browser.spec.ts +0 -74
- package/src/DropdownMenu/__tests__/DropdownMenuGroupAudit.a11y.chromium.spec.ts +0 -335
- package/src/DropdownMenu/__tests__/DropdownMenuItemAudit.a11y.chromium.spec.ts +0 -367
- package/src/DropdownMenu/__tests__/DropdownMenuRadioGroupAudit.a11y.chromium.spec.ts +0 -328
- package/src/DropdownMenu/__tests__/DropdownMenuRadioItemAudit.a11y.chromium.spec.ts +0 -540
- package/src/DropdownMenu/__tests__/DropdownMenuSubMenuAudit.a11y.chromium.spec.ts +0 -671
- package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +0 -158
- package/src/DropdownMenu/__tests__/Menu.a11y.known-failures.ts +0 -26
- package/src/DropdownMenu/__tests__/Menu.a11y.renders.tsx +0 -65
- package/src/DropdownMenu/__tests__/Menu.a11y.states.ts +0 -138
- package/src/DropdownMenu/__tests__/Menu.a11y.test.tsx +0 -136
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +0 -149
- package/src/DropdownMenu/__tests__/MenuButton.a11y.known-failures.ts +0 -12
- package/src/DropdownMenu/__tests__/MenuButton.a11y.renders.tsx +0 -67
- package/src/DropdownMenu/__tests__/MenuButton.a11y.states.ts +0 -141
- package/src/DropdownMenu/__tests__/MenuButton.a11y.test.tsx +0 -138
- package/src/DropdownMenu/__tests__/MenuHeaderFooter.a11y.chromium.spec.ts +0 -231
- package/src/DropdownMenu/__tests__/MenuHoverFocus.a11y.chromium.spec.ts +0 -238
- package/src/DropdownMenu/__tests__/MenuPinchZoom.a11y.chromium.spec.ts +0 -173
- package/src/DropdownMenu/__tests__/MenuPress.a11y.chromium.spec.ts +0 -503
- package/src/DropdownMenu/__tests__/SubMenuHeaderFooter.a11y.chromium.spec.ts +0 -268
- package/src/DropdownMenu/__tests__/warmMenuBottomSheet.tsx +0 -43
- package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +0 -60
- package/src/DropdownMenu/modules/useMenuHover.spec.md +0 -283
- package/src/DropdownMenu/modules/useMenuPress.spec.md +0 -348
- package/src/EmptyState/EmptyState.announce.test.tsx +0 -227
- package/src/EmptyState/EmptyState.spec.md +0 -203
- package/src/EmptyState/EmptyState.test.tsx +0 -284
- package/src/Field/Field.spec.md +0 -226
- package/src/Field/Field.test.tsx +0 -800
- package/src/Field/FieldLabel.spec.md +0 -183
- package/src/Field/FieldLabel.test.tsx +0 -244
- package/src/Field/InputClearButton.test.tsx +0 -395
- package/src/Field/__tests__/FieldLabelAudit.a11y.chromium.spec.ts +0 -297
- package/src/Field/fieldInputFamily.test.tsx +0 -160
- package/src/FieldStatus/FieldStatus.spec.md +0 -224
- package/src/FieldStatus/FieldStatus.test.tsx +0 -482
- package/src/FieldStatus/__tests__/StatusMessage.a11y.chromium.spec.ts +0 -206
- package/src/FieldStatus/__tests__/StatusMessage.a11y.known-failures.ts +0 -13
- package/src/FieldStatus/__tests__/StatusMessage.a11y.renders.tsx +0 -287
- package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +0 -302
- package/src/FieldStatus/__tests__/StatusMessage.a11y.test.tsx +0 -154
- package/src/FileInput/FileInput.fr10.test.tsx +0 -21
- package/src/FileInput/FileInput.spec.md +0 -199
- package/src/FileInput/FileInput.test.tsx +0 -1291
- package/src/FormLayout/FormLayout.spec.md +0 -209
- package/src/FormLayout/FormLayout.test.tsx +0 -444
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -46
- package/src/Grid/Grid.spec.md +0 -193
- package/src/Grid/Grid.test.tsx +0 -509
- package/src/Grid/GridSpan.spec.md +0 -158
- package/src/HStack/HStack.test.tsx +0 -129
- package/src/Heading/Heading.spec.md +0 -198
- package/src/Heading/Heading.test.tsx +0 -328
- package/src/HoverCard/HoverCard.spec.md +0 -244
- package/src/HoverCard/HoverCard.test.tsx +0 -1339
- package/src/Icon/Icon.spec.md +0 -244
- package/src/Icon/Icon.test.tsx +0 -990
- package/src/Icon/globalIconRegistry.test.tsx +0 -613
- package/src/IconButton/IconButton.spec.md +0 -197
- package/src/IconButton/IconButton.test.tsx +0 -156
- package/src/Indicator/CheckIndicator.spec.md +0 -164
- package/src/Indicator/CheckboxIndicator.spec.md +0 -164
- package/src/Indicator/Indicator.spec.md +0 -188
- package/src/Indicator/Indicator.test.tsx +0 -389
- package/src/Indicator/indicatorRegistry.test.tsx +0 -106
- package/src/InputGroup/InputGroup.spec.md +0 -199
- package/src/InputGroup/InputGroup.test.tsx +0 -502
- package/src/InputGroup/InputGroupText.spec.md +0 -139
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +0 -185
- package/src/Item/Item.source-build.test.mjs +0 -88
- package/src/Item/Item.spec.md +0 -226
- package/src/Item/Item.swipeLayer.test.tsx +0 -74
- package/src/Item/Item.test.tsx +0 -1515
- package/src/Item/ItemMarkerColumns.a11y.chromium.spec.ts +0 -211
- package/src/Item/__tests__/ItemSwipeActions.a11y.chromium.spec.ts +0 -337
- package/src/Item/__tests__/ItemSwipePinchZoom.a11y.chromium.spec.ts +0 -186
- package/src/Kbd/Kbd.spec.md +0 -185
- package/src/Kbd/Kbd.test.tsx +0 -299
- package/src/Layer/LayerProvider.spec.md +0 -149
- package/src/Layer/LayerProvider.test.tsx +0 -143
- package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +0 -126
- package/src/Layer/__tests__/LayerReducedMotion.a11y.chromium.spec.ts +0 -176
- package/src/Layer/__tests__/TouchTrigger.a11y.chromium.spec.ts +0 -200
- package/src/Layer/anchorName.test.ts +0 -146
- package/src/Layer/layerDismissalFamilies.test.tsx +0 -487
- package/src/Layer/layerDismissalInvariants.test.tsx +0 -501
- package/src/Layer/layerHost.test.ts +0 -117
- package/src/Layer/layerScopedContext.test.tsx +0 -499
- package/src/Layer/layerViewportInset.source-build.test.mjs +0 -90
- package/src/Layer/layerViewportInset.test.ts +0 -120
- package/src/Layer/popoverOperations.test.ts +0 -205
- package/src/Layer/useLayer.test.tsx +0 -2845
- package/src/Layer/useLayerDismissal.test.tsx +0 -580
- package/src/Layer/useTouchTrigger.test.ts +0 -70
- package/src/Layout/Layout.spec.md +0 -243
- package/src/Layout/Layout.test.tsx +0 -375
- package/src/Layout/LayoutContent.spec.md +0 -205
- package/src/Layout/LayoutFooter.spec.md +0 -190
- package/src/Layout/LayoutHeader.spec.md +0 -193
- package/src/Layout/LayoutPanel.spec.md +0 -194
- package/src/Layout/LayoutSlots.test.tsx +0 -376
- package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +0 -134
- package/src/Layout/__tests__/Layout.a11y.renders.tsx +0 -110
- package/src/Layout/__tests__/Layout.a11y.states.ts +0 -93
- package/src/Layout/__tests__/Layout.a11y.test.tsx +0 -142
- package/src/Layout/__tests__/childrenAsContent.test.tsx +0 -59
- package/src/Layout/__tests__/contentWidth.test.tsx +0 -303
- package/src/Layout/__tests__/edgeCompensation.test.tsx +0 -191
- package/src/Layout/__tests__/nestedPadding.test.tsx +0 -264
- package/src/Layout/overlayPaddingReset.test.tsx +0 -224
- package/src/Lightbox/Lightbox.spec.md +0 -199
- package/src/Lightbox/Lightbox.test.tsx +0 -837
- package/src/Lightbox/LightboxKeyboard.a11y.browser.spec.ts +0 -78
- package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +0 -74
- package/src/Lightbox/useLightbox.test.tsx +0 -263
- package/src/Link/Link.spec.md +0 -230
- package/src/Link/Link.test.tsx +0 -457
- package/src/Link/LinkProvider.spec.md +0 -167
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +0 -153
- package/src/Link/__tests__/Link.a11y.renders.tsx +0 -97
- package/src/Link/__tests__/Link.a11y.states.ts +0 -104
- package/src/Link/__tests__/Link.a11y.test.tsx +0 -127
- package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +0 -262
- package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +0 -58
- package/src/Link/useLinkComponent.test.tsx +0 -572
- package/src/Link/useLinkify.test.tsx +0 -146
- package/src/List/List.spec.md +0 -336
- package/src/List/List.test.tsx +0 -1052
- package/src/List/ListItem.source-build.test.mjs +0 -41
- package/src/List/ListItem.spec.md +0 -205
- package/src/List/ListMarkers.a11y.chromium.spec.ts +0 -904
- package/src/Markdown/Markdown.codeLanguages.test.tsx +0 -137
- package/src/Markdown/Markdown.fr23.bench.ts +0 -176
- package/src/Markdown/Markdown.fr23.perf.test.ts +0 -484
- package/src/Markdown/Markdown.helpers.perf.test.ts +0 -495
- package/src/Markdown/Markdown.public.test.ts +0 -309
- package/src/Markdown/Markdown.renderBoundary.test.tsx +0 -72
- package/src/Markdown/Markdown.rerender.test.tsx +0 -143
- package/src/Markdown/Markdown.spec.md +0 -595
- package/src/Markdown/Markdown.test.tsx +0 -1383
- package/src/Markdown/MarkdownTable.a11y.chromium.spec.ts +0 -727
- package/src/Markdown/__tests__/MarkdownNesting.a11y.chromium.spec.ts +0 -102
- package/src/Markdown/angleDestinations.test.tsx +0 -104
- package/src/Markdown/ast.test.ts +0 -374
- package/src/Markdown/atxHeadingIndentation.test.tsx +0 -53
- package/src/Markdown/blockNesting.test.tsx +0 -124
- package/src/Markdown/blockquoteMarkers.test.tsx +0 -69
- package/src/Markdown/characterReferences.test.ts +0 -47
- package/src/Markdown/codeSpans.test.tsx +0 -65
- package/src/Markdown/emphasis.test.tsx +0 -214
- package/src/Markdown/fenceInfo.test.tsx +0 -47
- package/src/Markdown/imageAlt.test.tsx +0 -84
- package/src/Markdown/incremental.test.ts +0 -1198
- package/src/Markdown/incrementalIndentation.test.tsx +0 -36
- package/src/Markdown/indentedFences.test.tsx +0 -374
- package/src/Markdown/indentedTables.test.tsx +0 -53
- package/src/Markdown/linkBrackets.test.tsx +0 -116
- package/src/Markdown/linkDestinationLinear.test.tsx +0 -54
- package/src/Markdown/linkDestinations.test.tsx +0 -127
- package/src/Markdown/linkTextCode.test.tsx +0 -65
- package/src/Markdown/listBullets.test.tsx +0 -55
- package/src/Markdown/listContinuation.test.tsx +0 -94
- package/src/Markdown/listThematicBreak.test.tsx +0 -49
- package/src/Markdown/longLinkLabels.test.tsx +0 -49
- package/src/Markdown/modules/headingLinks.spec.md +0 -262
- package/src/Markdown/modules/remark.spec.md +0 -269
- package/src/Markdown/modules/softBreaks.spec.md +0 -137
- package/src/Markdown/modules/sourceLines.spec.md +0 -162
- package/src/Markdown/openFenceFinalNewline.test.tsx +0 -85
- package/src/Markdown/parser.perf.test.ts +0 -398
- package/src/Markdown/parser.public.test.ts +0 -144
- package/src/Markdown/parser.test.ts +0 -1925
- package/src/Markdown/plugin-renderer/MarkdownPluginNodeRenderer.test.tsx +0 -300
- package/src/Markdown/plugins/frontmatter.test.tsx +0 -150
- package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +0 -856
- package/src/Markdown/plugins/headingLinks.ssr.test.tsx +0 -143
- package/src/Markdown/plugins/headingLinks.test.tsx +0 -637
- package/src/Markdown/plugins/protocol.test.tsx +0 -1083
- package/src/Markdown/plugins/semanticFence.test.tsx +0 -655
- package/src/Markdown/plugins/softBreaks.test.tsx +0 -172
- package/src/Markdown/plugins/sourceDecoration.test.tsx +0 -799
- package/src/Markdown/plugins/sourceLines.test.tsx +0 -715
- package/src/Markdown/plugins/textTransform.test.ts +0 -467
- package/src/Markdown/remark.test.tsx +0 -1877
- package/src/Markdown/streaming.test.ts +0 -148
- package/src/Markdown/streamingListShapes.test.tsx +0 -93
- package/src/Markdown/trailingSpaces.test.tsx +0 -45
- package/src/MetadataList/MetadataList.spec.md +0 -187
- package/src/MetadataList/MetadataList.test.tsx +0 -383
- package/src/MetadataList/MetadataListItem.spec.md +0 -165
- package/src/MobileNav/MobileNav.spec.md +0 -306
- package/src/MobileNav/MobileNav.test.tsx +0 -296
- package/src/MobileNav/MobileNavCloseEdgeCases.test.tsx +0 -584
- package/src/MobileNav/MobileNavCloseTiming.test.ts +0 -58
- package/src/MobileNav/MobileNavCloseVisibility.test.tsx +0 -172
- package/src/MobileNav/MobileNavEntryAnimation.test.tsx +0 -212
- package/src/MobileNav/MobileNavFocus.test.tsx +0 -553
- package/src/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.ts +0 -147
- package/src/MobileNav/MobileNavReopen.test.tsx +0 -118
- package/src/MobileNav/MobileNavScrollbarGutter.test.tsx +0 -109
- package/src/MobileNav/MobileNavToggle.test.tsx +0 -179
- package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +0 -89
- package/src/MobileNav/__tests__/MobileNavWidth.a11y.chromium.spec.ts +0 -103
- package/src/MoreMenu/MoreMenu.spec.md +0 -268
- package/src/MoreMenu/MoreMenu.test.tsx +0 -367
- package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +0 -148
- package/src/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.ts +0 -72
- package/src/MultiSelector/MultiSelector.focusableDisabled.test.tsx +0 -121
- package/src/MultiSelector/MultiSelector.fr10.test.tsx +0 -221
- package/src/MultiSelector/MultiSelector.spec.md +0 -357
- package/src/MultiSelector/MultiSelector.test.tsx +0 -4971
- package/src/MultiSelector/OptionActions.a11y.chromium.spec.ts +0 -310
- package/src/MultiSelector/__tests__/MultiSelector.a11y.chromium.spec.ts +0 -46
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +0 -135
- package/src/NavIcon/NavIcon.spec.md +0 -158
- package/src/NavIcon/NavIcon.test.tsx +0 -41
- package/src/NavMenu/NavHeadingMenu.spec.md +0 -264
- package/src/NavMenu/NavHeadingMenu.test.tsx +0 -714
- package/src/NavMenu/__tests__/NavMenusSlideSelection.a11y.chromium.spec.ts +0 -137
- package/src/NumberInput/NumberInput.fr10.test.tsx +0 -21
- package/src/NumberInput/NumberInput.spec.md +0 -270
- package/src/NumberInput/NumberInput.test.tsx +0 -2697
- package/src/NumberInput/__tests__/NumberInput.a11y.chromium.spec.ts +0 -124
- package/src/NumberInput/__tests__/NumberInput.a11y.known-failures.ts +0 -26
- package/src/NumberInput/__tests__/NumberInput.a11y.renders.tsx +0 -77
- package/src/NumberInput/__tests__/NumberInput.a11y.states.ts +0 -116
- package/src/NumberInput/__tests__/NumberInput.a11y.test.tsx +0 -154
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +0 -102
- package/src/NumberInput/numberInputCommit.test.ts +0 -72
- package/src/NumberInput/numberParser.docblock.test.ts +0 -234
- package/src/NumberInput/numberParser.test.ts +0 -222
- package/src/Outline/Outline.spec.md +0 -258
- package/src/Outline/Outline.test.tsx +0 -1134
- package/src/Outline/OutlineFocus.a11y.chromium.spec.ts +0 -551
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +0 -150
- package/src/Outline/parseOutlineFromMarkdown.test.ts +0 -104
- package/src/OverflowList/OverflowList.spec.md +0 -204
- package/src/OverflowList/OverflowList.test.tsx +0 -1073
- package/src/Overlay/Overlay.spec.md +0 -304
- package/src/Overlay/Overlay.test.tsx +0 -424
- package/src/Pagination/Pagination.spec.md +0 -300
- package/src/Pagination/Pagination.test.tsx +0 -1754
- package/src/Popover/Popover.spec.md +0 -525
- package/src/Popover/Popover.test.tsx +0 -1508
- package/src/Popover/PopoverPresentation.test.tsx +0 -952
- package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +0 -267
- package/src/PowerSearch/PowerSearch.spec.md +0 -661
- package/src/PowerSearch/PowerSearch.test.tsx +0 -1027
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +0 -1190
- package/src/PowerSearch/PowerSearchFilterEditor.test.tsx +0 -377
- package/src/PowerSearch/PowerSearchToken.test.tsx +0 -230
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +0 -754
- package/src/PowerSearch/formatFilterValue.test.ts +0 -339
- package/src/PowerSearch/resolveDateTimeRangePart.test.ts +0 -40
- package/src/PowerSearch/usePowerSearchConfig.test.ts +0 -832
- package/src/PowerSearch/usePowerSearchSource.test.ts +0 -621
- package/src/ProgressBar/ProgressBar.spec.md +0 -261
- package/src/ProgressBar/ProgressBar.test.tsx +0 -928
- package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +0 -127
- package/src/ProgressBar/__tests__/ProgressBar.a11y.known-failures.ts +0 -12
- package/src/ProgressBar/__tests__/ProgressBar.a11y.renders.tsx +0 -38
- package/src/ProgressBar/__tests__/ProgressBar.a11y.states.ts +0 -123
- package/src/ProgressBar/__tests__/ProgressBar.a11y.test.tsx +0 -107
- package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +0 -831
- package/src/RadioList/RadioList.fr10.test.tsx +0 -67
- package/src/RadioList/RadioList.spec.md +0 -227
- package/src/RadioList/RadioList.test.tsx +0 -1051
- package/src/RadioList/RadioListItem.press.source-build.test.mjs +0 -80
- package/src/RadioList/RadioListItem.spec.md +0 -223
- package/src/RadioList/__tests__/RadioGroup.a11y.chromium.spec.ts +0 -274
- package/src/RadioList/__tests__/RadioGroup.a11y.known-failures.ts +0 -12
- package/src/RadioList/__tests__/RadioGroup.a11y.renders.tsx +0 -232
- package/src/RadioList/__tests__/RadioGroup.a11y.states.ts +0 -503
- package/src/RadioList/__tests__/RadioGroup.a11y.test.tsx +0 -217
- package/src/Resizable/Resizable.spec.md +0 -298
- package/src/Resizable/ResizeHandle.test.tsx +0 -1067
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +0 -127
- package/src/Resizable/__tests__/ResizeHandle.a11y.known-failures.ts +0 -39
- package/src/Resizable/__tests__/ResizeHandle.a11y.renders.tsx +0 -80
- package/src/Resizable/__tests__/ResizeHandle.a11y.states.ts +0 -197
- package/src/Resizable/__tests__/ResizeHandle.a11y.test.tsx +0 -123
- package/src/Resizable/shippedDirections.test.ts +0 -462
- package/src/Resizable/useResizable.test.ts +0 -1725
- package/src/Resizable/utils.test.ts +0 -74
- package/src/ScrollableArea/ScrollableArea.spec.md +0 -190
- package/src/ScrollableArea/ScrollableArea.test.tsx +0 -304
- package/src/ScrollableArea/modules/useScrollableArea.spec.md +0 -149
- package/src/Section/Section.spec.md +0 -197
- package/src/Section/Section.test.tsx +0 -376
- package/src/SegmentedControl/SegmentedControl.spec.md +0 -261
- package/src/SegmentedControl/SegmentedControl.test.tsx +0 -981
- package/src/SegmentedControl/SegmentedControlItem.spec.md +0 -206
- package/src/SelectableCard/SelectableCard.spec.md +0 -230
- package/src/SelectableCard/SelectableCard.test.tsx +0 -216
- package/src/Selector/Selector.focusableDisabled.test.tsx +0 -127
- package/src/Selector/Selector.fr10.test.tsx +0 -149
- package/src/Selector/Selector.sheetActiveDescendant.test.tsx +0 -95
- package/src/Selector/Selector.source-build.test.mjs +0 -79
- package/src/Selector/Selector.spec.md +0 -379
- package/src/Selector/Selector.test.tsx +0 -5117
- package/src/Selector/__tests__/Combobox.a11y.known-failures.ts +0 -27
- package/src/Selector/__tests__/Combobox.a11y.states.ts +0 -145
- package/src/Selector/__tests__/ComboboxField.a11y.chromium.spec.ts +0 -458
- package/src/Selector/__tests__/EmptyStateAnnouncement.a11y.chromium.spec.ts +0 -91
- package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +0 -131
- package/src/Selector/__tests__/Listbox.a11y.dom.ts +0 -38
- package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +0 -63
- package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +0 -12
- package/src/Selector/__tests__/Listbox.a11y.states.ts +0 -232
- package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +0 -46
- package/src/Selector/__tests__/Selector.combobox.a11y.chromium.spec.ts +0 -109
- package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +0 -133
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +0 -128
- package/src/Selector/useCombobox.public.test.tsx +0 -89
- package/src/Selector/useCombobox.test.tsx +0 -444
- package/src/SideNav/SideNav.spec.md +0 -247
- package/src/SideNav/SideNav.test.tsx +0 -4275
- package/src/SideNav/SideNavCollapseButton.spec.md +0 -161
- package/src/SideNav/SideNavHeading.spec.md +0 -226
- package/src/SideNav/SideNavItem.spec.md +0 -236
- package/src/SideNav/SideNavRailMotion.test.tsx +0 -620
- package/src/SideNav/SideNavSection.spec.md +0 -153
- package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +0 -542
- package/src/SizeContext/SizeContext.test.tsx +0 -226
- package/src/Skeleton/Skeleton.spec.md +0 -184
- package/src/Skeleton/Skeleton.test.tsx +0 -148
- package/src/Slider/Slider.fr10.test.tsx +0 -93
- package/src/Slider/Slider.spec.md +0 -285
- package/src/Slider/Slider.test.tsx +0 -1661
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +0 -125
- package/src/Slider/__tests__/Slider.a11y.known-failures.ts +0 -12
- package/src/Slider/__tests__/Slider.a11y.renders.tsx +0 -42
- package/src/Slider/__tests__/Slider.a11y.states.ts +0 -106
- package/src/Slider/__tests__/Slider.a11y.test.tsx +0 -105
- package/src/Spinner/Spinner.spec.md +0 -231
- package/src/Spinner/Spinner.test.tsx +0 -484
- package/src/Stack/Stack.spec.md +0 -203
- package/src/Stack/Stack.test.tsx +0 -473
- package/src/Stack/StackItem.test.tsx +0 -105
- package/src/StatusDot/StatusDot.spec.md +0 -224
- package/src/StatusDot/StatusDot.test.tsx +0 -213
- package/src/Stepper/Step.spec.md +0 -200
- package/src/Stepper/Stepper.public.test.ts +0 -91
- package/src/Stepper/Stepper.spec.md +0 -327
- package/src/Stepper/Stepper.test.tsx +0 -2130
- package/src/Switch/Switch.focusRing.source-build.test.mjs +0 -81
- package/src/Switch/Switch.spec.md +0 -277
- package/src/Switch/Switch.test.tsx +0 -1136
- package/src/Switch/__tests__/Switch.a11y.chromium.spec.ts +0 -211
- package/src/Switch/__tests__/Switch.a11y.known-failures.ts +0 -28
- package/src/Switch/__tests__/Switch.a11y.states.ts +0 -275
- package/src/Switch/__tests__/Switch.a11y.test.tsx +0 -144
- package/src/TabList/Tab.spec.md +0 -201
- package/src/TabList/TabList.spec.md +0 -217
- package/src/TabList/TabList.test.tsx +0 -1755
- package/src/TabList/TabMenu.spec.md +0 -198
- package/src/TabList/__tests__/TabListOverflow.interaction.browser.spec.ts +0 -99
- package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +0 -163
- package/src/TabList/__tests__/Tabs.a11y.chromium.spec.ts +0 -199
- package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +0 -12
- package/src/TabList/__tests__/Tabs.a11y.renders.tsx +0 -92
- package/src/TabList/__tests__/Tabs.a11y.states.ts +0 -247
- package/src/TabList/__tests__/Tabs.a11y.test.tsx +0 -153
- package/src/Table/Table.perf.test.tsx +0 -569
- package/src/Table/Table.spec.md +0 -395
- package/src/Table/Table.test.tsx +0 -1883
- package/src/Table/TableHeaderCell.test.tsx +0 -291
- package/src/Table/TableSelectionToolbar.test.tsx +0 -109
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +0 -141
- package/src/Table/__tests__/Table.a11y.contracts.ts +0 -35
- package/src/Table/__tests__/Table.a11y.renders.tsx +0 -112
- package/src/Table/__tests__/Table.a11y.states.ts +0 -136
- package/src/Table/__tests__/Table.a11y.test.tsx +0 -198
- package/src/Table/__tests__/TableMinWidth.a11y.chromium.spec.ts +0 -75
- package/src/Table/__tests__/TableRowGlide.a11y.browser.spec.ts +0 -382
- package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +0 -138
- package/src/Table/__tests__/TableStickyDividers.a11y.browser.spec.ts +0 -560
- package/src/Table/plugins/activation/useTableActivation.spec.md +0 -254
- package/src/Table/plugins/columnResize/useTableColumnResize.spec.md +0 -373
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +0 -941
- package/src/Table/plugins/columnSettings/useTableColumnSettings.test.tsx +0 -175
- package/src/Table/plugins/columnSettings/useTableColumnSettingsState.test.tsx +0 -296
- package/src/Table/plugins/filtering/useTableFilterState.test.tsx +0 -143
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +0 -357
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +0 -112
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +0 -409
- package/src/Table/plugins/infiniteScroll/useTableInfiniteScroll.spec.md +0 -244
- package/src/Table/plugins/pagination/useTablePagination-perf.test.tsx +0 -232
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +0 -666
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.glide.test.tsx +0 -280
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +0 -681
- package/src/Table/plugins/rowIndex/useTableRowIndex.test.tsx +0 -132
- package/src/Table/plugins/rowStatus/useTableRowStatus.public.test.ts +0 -92
- package/src/Table/plugins/rowStatus/useTableRowStatus.spec.md +0 -355
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +0 -519
- package/src/Table/plugins/selection/useTableSelection-perf.test.tsx +0 -258
- package/src/Table/plugins/selection/useTableSelection.test.tsx +0 -424
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +0 -451
- package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.test.tsx +0 -174
- package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.ts +0 -86
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +0 -786
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +0 -580
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +0 -334
- package/src/Table/plugins/tree/useTableTreeData-perf.test.tsx +0 -163
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +0 -992
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +0 -740
- package/src/Table/plugins/virtualization/useTableVirtualization.spec.md +0 -266
- package/src/Table/tableContextMenu.test.tsx +0 -208
- package/src/Text/Text.spec.md +0 -193
- package/src/Text/Text.test.tsx +0 -405
- package/src/Text/useTruncation.test.tsx +0 -196
- package/src/TextArea/TextArea.fr10.test.tsx +0 -21
- package/src/TextArea/TextArea.spec.md +0 -300
- package/src/TextArea/TextArea.test.tsx +0 -1317
- package/src/TextInput/TextInput.fr10.test.tsx +0 -21
- package/src/TextInput/TextInput.spec.md +0 -260
- package/src/TextInput/TextInput.test.tsx +0 -1280
- package/src/TextInput/__tests__/TextInput.a11y.chromium.spec.ts +0 -214
- package/src/TextInput/__tests__/TextInput.a11y.known-failures.ts +0 -40
- package/src/TextInput/__tests__/TextInput.a11y.renders.tsx +0 -202
- package/src/TextInput/__tests__/TextInput.a11y.states.ts +0 -384
- package/src/TextInput/__tests__/TextInput.a11y.test.tsx +0 -130
- package/src/Thumbnail/Thumbnail.spec.md +0 -244
- package/src/Thumbnail/Thumbnail.test.tsx +0 -384
- package/src/TimeInput/NativeTimeInput.test.tsx +0 -343
- package/src/TimeInput/Presentation.test.tsx +0 -192
- package/src/TimeInput/TimeInput.fr10.test.tsx +0 -312
- package/src/TimeInput/TimeInput.spec.md +0 -270
- package/src/TimeInput/TimeInput.test.tsx +0 -907
- package/src/Timer/Timer.spec.md +0 -215
- package/src/Timer/Timer.test.tsx +0 -302
- package/src/Timestamp/Timestamp.spec.md +0 -246
- package/src/Timestamp/Timestamp.test.tsx +0 -1661
- package/src/Timestamp/tooltipEntries.test.ts +0 -566
- package/src/Toast/Toast.spec.md +0 -291
- package/src/Toast/ToastViewport.modalHost.test.tsx +0 -891
- package/src/Toast/ToastViewport.test.tsx +0 -3130
- package/src/Toast/useToast.test.tsx +0 -258
- package/src/ToggleButton/ToggleButton.spec.md +0 -256
- package/src/ToggleButton/ToggleButton.test.tsx +0 -1000
- package/src/ToggleButton/ToggleButtonGroup.spec.md +0 -195
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +0 -177
- package/src/ToggleButton/__tests__/ToggleButton.a11y.renders.tsx +0 -133
- package/src/ToggleButton/__tests__/ToggleButton.a11y.states.ts +0 -167
- package/src/ToggleButton/__tests__/ToggleButton.a11y.test.tsx +0 -103
- package/src/Token/Token.spec.md +0 -261
- package/src/Token/Token.test.tsx +0 -707
- package/src/Token/__tests__/TokenRemoveTarget.a11y.chromium.spec.ts +0 -87
- package/src/Tokenizer/Tokenizer.fr10.test.tsx +0 -28
- package/src/Tokenizer/Tokenizer.props-type.test.tsx +0 -126
- package/src/Tokenizer/Tokenizer.spec.md +0 -615
- package/src/Tokenizer/Tokenizer.ssr.test.tsx +0 -196
- package/src/Tokenizer/Tokenizer.test.tsx +0 -2216
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +0 -2738
- package/src/Tokenizer/__tests__/TokenizerEndLane.a11y.chromium.spec.ts +0 -505
- package/src/Toolbar/Toolbar.spec.md +0 -227
- package/src/Toolbar/Toolbar.test.tsx +0 -600
- package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +0 -176
- package/src/Toolbar/__tests__/Toolbar.a11y.renders.tsx +0 -63
- package/src/Toolbar/__tests__/Toolbar.a11y.states.ts +0 -142
- package/src/Toolbar/__tests__/Toolbar.a11y.test.tsx +0 -126
- package/src/Tooltip/Tooltip.spec.md +0 -267
- package/src/Tooltip/Tooltip.test.tsx +0 -819
- package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +0 -141
- package/src/Tooltip/__tests__/Tooltip.a11y.renders.tsx +0 -86
- package/src/Tooltip/__tests__/Tooltip.a11y.states.ts +0 -132
- package/src/Tooltip/__tests__/Tooltip.a11y.test.tsx +0 -126
- package/src/Tooltip/__tests__/TooltipFocusReturn.a11y.chromium.spec.ts +0 -130
- package/src/Tooltip/__tests__/TooltipHoverBridge.a11y.chromium.spec.ts +0 -75
- package/src/Tooltip/__tests__/TooltipTallContent.a11y.browser.spec.ts +0 -673
- package/src/Tooltip/__tests__/TooltipTallContentTracking.a11y.browser.spec.ts +0 -1162
- package/src/Tooltip/useTooltip.test.tsx +0 -483
- package/src/TopNav/TopNav.spec.md +0 -190
- package/src/TopNav/TopNav.test.tsx +0 -863
- package/src/TopNav/TopNavHeading.spec.md +0 -211
- package/src/TopNav/TopNavItem.spec.md +0 -189
- package/src/TopNav/TopNavMegaMenu.reduced-motion.source-build.test.mjs +0 -83
- package/src/TopNav/TopNavMegaMenu.spec.md +0 -190
- package/src/TopNav/TopNavMegaMenu.test.tsx +0 -1153
- package/src/TopNav/TopNavMegaMenuFeaturedCard.spec.md +0 -150
- package/src/TopNav/TopNavMegaMenuItem.spec.md +0 -155
- package/src/TopNav/TopNavMenu.spec.md +0 -202
- package/src/TopNav/TopNavMenu.test.tsx +0 -502
- package/src/TopNav/__tests__/TopNavMobileLongHeading.a11y.chromium.spec.ts +0 -75
- package/src/TreeList/TreeList.spec.md +0 -328
- package/src/TreeList/TreeList.test.tsx +0 -1737
- package/src/TreeList/__tests__/TreeList.a11y.chromium.spec.ts +0 -138
- package/src/TreeList/__tests__/TreeList.a11y.renders.tsx +0 -44
- package/src/TreeList/__tests__/TreeList.a11y.states.ts +0 -164
- package/src/TreeList/__tests__/TreeList.a11y.test.tsx +0 -138
- package/src/TreeList/__tests__/TreeListGuideAlignment.interaction.browser.spec.ts +0 -127
- package/src/TreeList/__tests__/TreeListRowNames.a11y.chromium.spec.ts +0 -83
- package/src/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.ts +0 -138
- package/src/Typeahead/BaseTypeahead.spec.md +0 -270
- package/src/Typeahead/BaseTypeahead.test.tsx +0 -553
- package/src/Typeahead/Typeahead.fr10.test.tsx +0 -28
- package/src/Typeahead/Typeahead.spec.md +0 -257
- package/src/Typeahead/Typeahead.test.tsx +0 -2984
- package/src/Typeahead/TypeaheadItem.test.tsx +0 -134
- package/src/VStack/VStack.test.tsx +0 -128
- package/src/VisuallyHidden/VisuallyHidden.spec.md +0 -170
- package/src/VisuallyHidden/VisuallyHidden.test.tsx +0 -115
- package/src/__tests__/BusyOwnerAnnouncement.test.tsx +0 -853
- package/src/__tests__/CardPress.a11y.chromium.spec.ts +0 -353
- package/src/__tests__/DisabledTriggerFocus.a11y.chromium.spec.ts +0 -87
- package/src/__tests__/PressModality.a11y.chromium.spec.ts +0 -392
- package/src/__tests__/PressedState.a11y.chromium.spec.ts +0 -814
- package/src/__tests__/TestIcon.tsx +0 -26
- package/src/__tests__/babelPluginAddExtensions.test.ts +0 -190
- package/src/__tests__/fastRoleQueries.ts +0 -66
- package/src/__tests__/forcedColors.ts +0 -60
- package/src/__tests__/internalModulesNotExperimental.test.ts +0 -88
- package/src/__tests__/pressState.ts +0 -216
- package/src/__tests__/stubMatchMedia.test.ts +0 -79
- package/src/__tests__/stubMatchMedia.ts +0 -95
- package/src/__tests__/stylexDeclarations.ts +0 -51
- package/src/__tests__/unthemedLength.ts +0 -34
- package/src/docPropLiterals.test.ts +0 -964
- package/src/docPropReferences.test.ts +0 -178
- package/src/docs-script.test.mjs +0 -55
- package/src/gestures/__tests__/GestureHost.test.ts +0 -2136
- package/src/gestures/__tests__/LongPressGestureRecognizer.test.ts +0 -141
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +0 -327
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +0 -74
- package/src/gestures/__tests__/PressTracker.test.ts +0 -275
- package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +0 -498
- package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +0 -108
- package/src/gestures/__tests__/TapGestureRecognizer.test.ts +0 -154
- package/src/gestures/__tests__/VelocityTracker.streams.test.ts +0 -243
- package/src/gestures/__tests__/VelocityTracker.test.ts +0 -261
- package/src/gestures/__tests__/arena.test.ts +0 -864
- package/src/gestures/__tests__/arenaContinuous.test.ts +0 -207
- package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +0 -193
- package/src/gestures/__tests__/arenaTapLongPress.test.ts +0 -211
- package/src/gestures/__tests__/browser/build-fixture.mjs +0 -46
- package/src/gestures/__tests__/browser/fixture.ts +0 -307
- package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +0 -1137
- package/src/gestures/__tests__/browserNegotiation.test.ts +0 -293
- package/src/gestures/__tests__/fixtures/pointer-streams/README.md +0 -82
- package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-fling.json +0 -130
- package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-slow.json +0 -860
- package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-stop-release.json +0 -357
- package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-fling.json +0 -66
- package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-slow.json +0 -268
- package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-stop-release.json +0 -128
- package/src/gestures/__tests__/fixtures/pointer-streams/capture.html +0 -123
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-fling.json +0 -64
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-slow.json +0 -268
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-stop-release.json +0 -124
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-fling.json +0 -64
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-slow.json +0 -268
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-stop-release.json +0 -124
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-fling.json +0 -84
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-slow.json +0 -381
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-stop-release.json +0 -171
- package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-fling.json +0 -45
- package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-slow.json +0 -101
- package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-stop-release.json +0 -130
- package/src/gestures/__tests__/haptics.test.ts +0 -187
- package/src/gestures/__tests__/harness.ts +0 -252
- package/src/gestures/__tests__/pressTrackerFactory.test.ts +0 -59
- package/src/gestures/__tests__/recognizerKind.test.ts +0 -78
- package/src/gestures/__tests__/touchActionRule.test.ts +0 -54
- package/src/gestures/__tests__/useGestureRecognizer.test.tsx +0 -570
- package/src/hooks/__tests__/MenuPressShadowRoot.a11y.chromium.spec.ts +0 -144
- package/src/hooks/__tests__/menuLinkClicks.ts +0 -71
- package/src/hooks/actionGroupTracker.exports.test.ts +0 -28
- package/src/hooks/actionGroupTracker.test.ts +0 -510
- package/src/hooks/computeOverflow.test.ts +0 -422
- package/src/hooks/deprecatedApis.public.test.ts +0 -33
- package/src/hooks/menuPressGesture.test.ts +0 -253
- package/src/hooks/scrollKeyboardDelegation.test.ts +0 -188
- package/src/hooks/scrollbarGutter.test.ts +0 -167
- package/src/hooks/useAnnounce.modal.test.tsx +0 -1291
- package/src/hooks/useAnnounce.replace.test.tsx +0 -516
- package/src/hooks/useAnnounce.test.tsx +0 -293
- package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +0 -235
- package/src/hooks/useAutoMediaMode.test.ts +0 -109
- package/src/hooks/useBusyAnnouncement.adopters.test.tsx +0 -69
- package/src/hooks/useBusyAnnouncement.test.tsx +0 -112
- package/src/hooks/useClickableContainer.test.tsx +0 -236
- package/src/hooks/useClipboard.test.tsx +0 -151
- package/src/hooks/useContainerReveal.test.tsx +0 -163
- package/src/hooks/useDevWarning.test.tsx +0 -45
- package/src/hooks/useEntryAnimation.ssr.test.tsx +0 -143
- package/src/hooks/useFocusTrap.test.tsx +0 -635
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +0 -166
- package/src/hooks/useGridFocus.test.tsx +0 -165
- package/src/hooks/useHotkeys.test.ts +0 -265
- package/src/hooks/useImageMode.test.ts +0 -133
- package/src/hooks/useInputContainer.test.tsx +0 -180
- package/src/hooks/useInputStatusIcon.test.tsx +0 -240
- package/src/hooks/useIsHydrating.test.tsx +0 -70
- package/src/hooks/useKeyboardHint.test.tsx +0 -92
- package/src/hooks/useListFocus.test.tsx +0 -664
- package/src/hooks/useLongPress.test.tsx +0 -152
- package/src/hooks/useMediaQuery.test.ts +0 -165
- package/src/hooks/useMenuHover.test.tsx +0 -536
- package/src/hooks/useMenuPress.test.tsx +0 -565
- package/src/hooks/useMergedRefs.test.tsx +0 -62
- package/src/hooks/useOverflow.test.ts +0 -504
- package/src/hooks/useRenamedProp.test.tsx +0 -95
- package/src/hooks/useScrollLock.test.ts +0 -248
- package/src/hooks/useScrollOverflow.test.tsx +0 -323
- package/src/hooks/useScrollableArea.test.tsx +0 -836
- package/src/hooks/useStreamingText.test.ts +0 -237
- package/src/hooks/useTreeFocus.test.tsx +0 -351
- package/src/hooks/useTypeahead.test.tsx +0 -351
- package/src/i18n/InternationalizationProvider.spec.md +0 -252
- package/src/i18n/__tests__/InternationalizationProvider.test.tsx +0 -128
- package/src/i18n/__tests__/e2e-pagination.test.tsx +0 -172
- package/src/i18n/__tests__/e2e-powersearch.test.tsx +0 -166
- package/src/i18n/__tests__/getLocaleDirection.test.ts +0 -40
- package/src/i18n/__tests__/resolve.test.ts +0 -325
- package/src/i18n/__tests__/useCollator.test.tsx +0 -115
- package/src/i18n/__tests__/useDirection.test.tsx +0 -66
- package/src/i18n/__tests__/useLocale.test.tsx +0 -52
- package/src/i18n/useTranslator.test.tsx +0 -267
- package/src/inputFontFloor.test.ts +0 -106
- package/src/internal/tokenizer-presentation.test.ts +0 -29
- package/src/internal/touch.test.ts +0 -44
- package/src/motion/__tests__/animatedLayout.interaction.browser.spec.ts +0 -1613
- package/src/motion/__tests__/animatedLayoutAdopters.interaction.browser.spec.ts +0 -217
- package/src/motion/__tests__/animatedLayoutBundle.ts +0 -17
- package/src/motion/__tests__/animator.interaction.browser.spec.ts +0 -843
- package/src/motion/__tests__/motionBundle.ts +0 -14
- package/src/motion/animatedLayout.boundary.test.ts +0 -155
- package/src/motion/animatedLayout.swap.test.ts +0 -827
- package/src/motion/animatedLayout.test.ts +0 -1154
- package/src/motion/animatedLayoutAdopters.test.tsx +0 -500
- package/src/motion/animator.test.ts +0 -3746
- package/src/motion/bezier.test.ts +0 -52
- package/src/motion/coast.test.ts +0 -99
- package/src/motion/decay.test.ts +0 -120
- package/src/motion/projection.test.ts +0 -107
- package/src/motion/reducedMotion.test.ts +0 -129
- package/src/motion/reducedMotionPlan.test.ts +0 -208
- package/src/motion/resolveMotion.test.ts +0 -123
- package/src/motion/resolveSnapPoint.test.ts +0 -189
- package/src/motion/roles.test.ts +0 -273
- package/src/motion/rubberBand.test.ts +0 -88
- package/src/motion/selectPage.test.ts +0 -31
- package/src/motion/spring.test.ts +0 -650
- package/src/motion/uikit/gestures.test.ts +0 -89
- package/src/motion/uikit/springRows.test.ts +0 -71
- package/src/motion/uikit/tableImports.test.ts +0 -293
- package/src/motion/uikit/uikit.test.ts +0 -364
- package/src/motion/uikit/values.test.ts +0 -121
- package/src/naming.test.ts +0 -44
- package/src/postinstall.test.mjs +0 -216
- package/src/reset.a11y.chromium.spec.ts +0 -238
- package/src/reset.test.ts +0 -205
- package/src/reset.until-found.a11y.browser.spec.ts +0 -76
- package/src/reset.until-found.test.ts +0 -32
- package/src/serverSafeComponents.test.ts +0 -675
- package/src/stylexValidation.source-build.test.mjs +0 -42
- package/src/tailwind-theme.test.ts +0 -153
- package/src/theme/MediaTheme.dom.test.tsx +0 -97
- package/src/theme/Theme.test.tsx +0 -337
- package/src/theme/__tests__/SpacingRootFontSize.a11y.chromium.spec.ts +0 -199
- package/src/theme/contrast.test.ts +0 -94
- package/src/theme/declarationBoundary.test.ts +0 -126
- package/src/theme/defineTheme.test.ts +0 -2028
- package/src/theme/derivedVarRegistry.test.ts +0 -592
- package/src/theme/expandColorScale.test.ts +0 -651
- package/src/theme/expandMotionScale.test.ts +0 -145
- package/src/theme/expandRadiusScale.test.ts +0 -59
- package/src/theme/expandTypeScale.test.ts +0 -351
- package/src/theme/extensibleAxes.test.ts +0 -432
- package/src/theme/generateThemeRules.test.ts +0 -1870
- package/src/theme/hct.test.ts +0 -93
- package/src/theme/onMediaTokens.test.ts +0 -431
- package/src/theme/publicThemeHelperContract.test.ts +0 -67
- package/src/theme/syntax/defineSyntaxTheme.diff.test.ts +0 -91
- package/src/theme/syntax/serverSafeSyntax.test.ts +0 -68
- package/src/theme/syntax/useSyntaxTheme.diff.test.tsx +0 -40
- package/src/theme/themeAdaptations.test.ts +0 -1795
- package/src/theme/themeMotion.test.ts +0 -620
- package/src/theme/themeRegistry.test.ts +0 -59
- package/src/theme/themingTargets.test.ts +0 -589
- package/src/theme/tokenValueCompat.test.ts +0 -204
- package/src/theme/tokens.test.ts +0 -441
- package/src/theme/useTheme.test.tsx +0 -322
- package/src/unicodePropertyEscapes.source-build.test.mjs +0 -69
- package/src/utils/chainEventHandlers.test.ts +0 -39
- package/src/utils/characters.test.ts +0 -141
- package/src/utils/color.test.ts +0 -233
- package/src/utils/composeEventHandlers.test.ts +0 -71
- package/src/utils/customPropertyArmLayering.test.ts +0 -131
- package/src/utils/dateParser.test.ts +0 -402
- package/src/utils/dateTypes.test.ts +0 -40
- package/src/utils/devWarning.test.ts +0 -56
- package/src/utils/edgeAutoscroll.test.ts +0 -192
- package/src/utils/focusReturn.test.ts +0 -119
- package/src/utils/getKey.test.ts +0 -25
- package/src/utils/getNodeText.test.ts +0 -24
- package/src/utils/hitArea.test.ts +0 -628
- package/src/utils/ime.test.ts +0 -32
- package/src/utils/inputAria.test.ts +0 -39
- package/src/utils/interactionModality.test.ts +0 -144
- package/src/utils/isApplePlatform.test.ts +0 -61
- package/src/utils/mergeProps.test.ts +0 -166
- package/src/utils/mergeRefs.test.ts +0 -48
- package/src/utils/parseStyleKey.test.ts +0 -56
- package/src/utils/plainDate.test.ts +0 -938
- package/src/utils/presentation.test.ts +0 -380
- package/src/utils/pressFeedback.test.ts +0 -1012
- package/src/utils/pressGesture.test.ts +0 -332
- package/src/utils/pressPaintPriority.test.ts +0 -80
- package/src/utils/pressPaintSource.test.ts +0 -65
- package/src/utils/pressableCoverage.test.ts +0 -192
- package/src/utils/primaryClick.test.ts +0 -38
- package/src/utils/safeUrl.test.ts +0 -101
- package/src/utils/sharedMutationObserver.test.ts +0 -106
- package/src/utils/sharedResizeObserver.test.ts +0 -283
- package/src/utils/themeProps.test.ts +0 -62
- package/src/utils/timeFormat.test.ts +0 -204
- package/src/utils/timeParser.test.ts +0 -295
- package/src/utils/touchPresentation.test.ts +0 -462
- package/src/utils/unicodeDigits.test.ts +0 -44
|
@@ -1,1661 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
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';
|
|
13
|
-
import userEvent from '@testing-library/user-event';
|
|
14
|
-
import {Profiler} from 'react';
|
|
15
|
-
import {hydrateRoot, type Root} from 'react-dom/client';
|
|
16
|
-
import {renderToString} from 'react-dom/server';
|
|
17
|
-
import {Timestamp} from './Timestamp';
|
|
18
|
-
import {formatInstant} from './formatInstant';
|
|
19
|
-
import {formatTooltipLines} from './tooltipEntries';
|
|
20
|
-
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
21
|
-
import {InternationalizationProvider} from '../i18n';
|
|
22
|
-
|
|
23
|
-
async function openTimestampHoverCard(): Promise<HTMLElement> {
|
|
24
|
-
const timestamp = document.querySelector('time');
|
|
25
|
-
if (timestamp == null) {
|
|
26
|
-
throw new Error('Expected Timestamp to render a <time> element');
|
|
27
|
-
}
|
|
28
|
-
const trigger = timestamp.parentElement;
|
|
29
|
-
if (trigger == null) {
|
|
30
|
-
throw new Error('Expected Timestamp to render a hover-card trigger');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
fireEvent.mouseEnter(trigger);
|
|
34
|
-
await waitFor(() => {
|
|
35
|
-
expect(HTMLElement.prototype.showPopover).toHaveBeenCalled();
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
return screen.getByRole('dialog', {hidden: true});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
describe('Timestamp', () => {
|
|
42
|
-
// The hover card is loaded lazily (React.lazy + Suspense), so its chunk
|
|
43
|
-
// resolves asynchronously the first time a card renders. Warm the module
|
|
44
|
-
// cache once up front so findByRole('dialog') never races the cold import's
|
|
45
|
-
// resolution against its default 1s timeout.
|
|
46
|
-
beforeAll(async () => {
|
|
47
|
-
await import('./TimestampHoverCard');
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
beforeEach(() => {
|
|
51
|
-
vi.useFakeTimers();
|
|
52
|
-
vi.setSystemTime(new Date('2026-03-25T12:00:00Z'));
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
afterEach(() => {
|
|
56
|
-
vi.useRealTimers();
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('renders a <time> element with ISO datetime attribute', () => {
|
|
60
|
-
render(
|
|
61
|
-
<Timestamp
|
|
62
|
-
value="2026-03-25T10:00:00Z"
|
|
63
|
-
format="date_time"
|
|
64
|
-
data-testid="ts"
|
|
65
|
-
/>,
|
|
66
|
-
);
|
|
67
|
-
const el = screen.getByTestId('ts');
|
|
68
|
-
expect(el.tagName).toBe('TIME');
|
|
69
|
-
expect(el.getAttribute('datetime')).toBe('2026-03-25T10:00:00.000Z');
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('renders relative format for recent times', () => {
|
|
73
|
-
const twoHoursAgo = Date.now() / 1000 - 7200;
|
|
74
|
-
render(<Timestamp value={twoHoursAgo} format="relative" />);
|
|
75
|
-
expect(screen.getByText('2 hours ago')).toBeInTheDocument();
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('does not round a tier up past its own boundary', () => {
|
|
79
|
-
// Just under each threshold the count must stay within the tier, e.g.
|
|
80
|
-
// 59.98 minutes is "59 minutes ago", never "60 minutes ago".
|
|
81
|
-
const {rerender} = render(
|
|
82
|
-
<Timestamp value={Date.now() / 1000 - 3599} format="relative" />,
|
|
83
|
-
);
|
|
84
|
-
expect(screen.getByText('59 minutes ago')).toBeInTheDocument();
|
|
85
|
-
|
|
86
|
-
rerender(<Timestamp value={Date.now() / 1000 - 86399} format="relative" />);
|
|
87
|
-
expect(screen.getByText('23 hours ago')).toBeInTheDocument();
|
|
88
|
-
|
|
89
|
-
rerender(
|
|
90
|
-
<Timestamp value={Date.now() / 1000 - 2591999} format="relative" />,
|
|
91
|
-
);
|
|
92
|
-
expect(screen.getByText('29 days ago')).toBeInTheDocument();
|
|
93
|
-
|
|
94
|
-
// Same guarantee on the future side.
|
|
95
|
-
rerender(<Timestamp value={Date.now() / 1000 + 3599} format="relative" />);
|
|
96
|
-
expect(screen.getByText('in 59 minutes')).toBeInTheDocument();
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('renders "now" for very recent times', () => {
|
|
100
|
-
const fiveSecondsAgo = Date.now() / 1000 - 5;
|
|
101
|
-
render(<Timestamp value={fiveSecondsAgo} format="relative" />);
|
|
102
|
-
expect(screen.getByText('now')).toBeInTheDocument();
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it('renders "now" for the current instant (not a future phrase)', () => {
|
|
106
|
-
// A value equal to "right now". Because the internal `now` baseline is
|
|
107
|
-
// captured at render time, it can lag the value by a fraction of a second,
|
|
108
|
-
// producing a tiny negative delta that must not be treated as the future.
|
|
109
|
-
render(<Timestamp value={Date.now() / 1000} format="relative" />);
|
|
110
|
-
expect(screen.queryByText(/^in /)).not.toBeInTheDocument();
|
|
111
|
-
expect(screen.getByText('now')).toBeInTheDocument();
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('renders "now" for a value a hair in the future (clock skew)', () => {
|
|
115
|
-
// Real-world clock / captured-now skew can make a current-ish value land a
|
|
116
|
-
// fraction of a second in the future relative to the component's internal
|
|
117
|
-
// `now`. This must read as the present ("now"), never "in a few
|
|
118
|
-
// seconds". Regression test for the right-now -> future-phrase bug.
|
|
119
|
-
const aHairInTheFuture = Date.now() / 1000 + 0.6;
|
|
120
|
-
render(<Timestamp value={aHairInTheFuture} format="relative" />);
|
|
121
|
-
expect(screen.queryByText(/^in /)).not.toBeInTheDocument();
|
|
122
|
-
expect(screen.getByText('now')).toBeInTheDocument();
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it('renders "yesterday" for times ~1 day ago', () => {
|
|
126
|
-
const yesterday = Date.now() / 1000 - 100000;
|
|
127
|
-
render(<Timestamp value={yesterday} format="relative" />);
|
|
128
|
-
expect(screen.getByText('yesterday')).toBeInTheDocument();
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
// --- relative_short format ---
|
|
132
|
-
|
|
133
|
-
describe('relative_short format', () => {
|
|
134
|
-
it('renders "now" for very recent times', () => {
|
|
135
|
-
render(
|
|
136
|
-
<Timestamp value={Date.now() / 1000 - 5} format="relative_short" />,
|
|
137
|
-
);
|
|
138
|
-
expect(screen.getByText('now')).toBeInTheDocument();
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('abbreviates each past tier (s/m/h/d/mo/y)', () => {
|
|
142
|
-
const {rerender} = render(
|
|
143
|
-
<Timestamp value={Date.now() / 1000 - 30} format="relative_short" />,
|
|
144
|
-
);
|
|
145
|
-
expect(screen.getByText('30s ago')).toBeInTheDocument();
|
|
146
|
-
|
|
147
|
-
rerender(
|
|
148
|
-
<Timestamp
|
|
149
|
-
value={Date.now() / 1000 - 5 * 60}
|
|
150
|
-
format="relative_short"
|
|
151
|
-
/>,
|
|
152
|
-
);
|
|
153
|
-
expect(screen.getByText('5m ago')).toBeInTheDocument();
|
|
154
|
-
|
|
155
|
-
rerender(
|
|
156
|
-
<Timestamp
|
|
157
|
-
value={Date.now() / 1000 - 2 * 3600}
|
|
158
|
-
format="relative_short"
|
|
159
|
-
/>,
|
|
160
|
-
);
|
|
161
|
-
expect(screen.getByText('2h ago')).toBeInTheDocument();
|
|
162
|
-
|
|
163
|
-
rerender(
|
|
164
|
-
<Timestamp
|
|
165
|
-
value={Date.now() / 1000 - 3 * 86400}
|
|
166
|
-
format="relative_short"
|
|
167
|
-
/>,
|
|
168
|
-
);
|
|
169
|
-
expect(screen.getByText('3d ago')).toBeInTheDocument();
|
|
170
|
-
|
|
171
|
-
rerender(
|
|
172
|
-
<Timestamp
|
|
173
|
-
value={Date.now() / 1000 - 90 * 86400}
|
|
174
|
-
format="relative_short"
|
|
175
|
-
/>,
|
|
176
|
-
);
|
|
177
|
-
expect(screen.getByText('3mo ago')).toBeInTheDocument();
|
|
178
|
-
|
|
179
|
-
rerender(
|
|
180
|
-
<Timestamp
|
|
181
|
-
value={Date.now() / 1000 - 730 * 86400}
|
|
182
|
-
format="relative_short"
|
|
183
|
-
/>,
|
|
184
|
-
);
|
|
185
|
-
expect(screen.getByText('2y ago')).toBeInTheDocument();
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('uses "mo" for months so it never collides with "m" (minutes)', () => {
|
|
189
|
-
// 45 days → months tier. A bare "m" here would be indistinguishable from
|
|
190
|
-
// the minutes unit, so months must render as "mo".
|
|
191
|
-
render(
|
|
192
|
-
<Timestamp
|
|
193
|
-
value={Date.now() / 1000 - 45 * 86400}
|
|
194
|
-
format="relative_short"
|
|
195
|
-
/>,
|
|
196
|
-
);
|
|
197
|
-
expect(screen.getByText('1mo ago')).toBeInTheDocument();
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
it('renders a single day as "1d ago" (no "yesterday" idiom in short form)', () => {
|
|
201
|
-
render(
|
|
202
|
-
<Timestamp
|
|
203
|
-
value={Date.now() / 1000 - 100000}
|
|
204
|
-
format="relative_short"
|
|
205
|
-
/>,
|
|
206
|
-
);
|
|
207
|
-
expect(screen.getByText('1d ago')).toBeInTheDocument();
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
it('renders future times with the "in" prefix and abbreviated units', () => {
|
|
211
|
-
const {rerender} = render(
|
|
212
|
-
<Timestamp
|
|
213
|
-
value={Date.now() / 1000 + 5 * 60}
|
|
214
|
-
format="relative_short"
|
|
215
|
-
/>,
|
|
216
|
-
);
|
|
217
|
-
expect(screen.getByText('in 5m')).toBeInTheDocument();
|
|
218
|
-
|
|
219
|
-
rerender(
|
|
220
|
-
<Timestamp
|
|
221
|
-
value={Date.now() / 1000 + 2 * 3600}
|
|
222
|
-
format="relative_short"
|
|
223
|
-
/>,
|
|
224
|
-
);
|
|
225
|
-
expect(screen.getByText('in 2h')).toBeInTheDocument();
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
it('does not round a tier up past its own boundary', () => {
|
|
229
|
-
const {rerender} = render(
|
|
230
|
-
<Timestamp value={Date.now() / 1000 - 3599} format="relative_short" />,
|
|
231
|
-
);
|
|
232
|
-
expect(screen.getByText('59m ago')).toBeInTheDocument();
|
|
233
|
-
|
|
234
|
-
rerender(
|
|
235
|
-
<Timestamp value={Date.now() / 1000 - 86399} format="relative_short" />,
|
|
236
|
-
);
|
|
237
|
-
expect(screen.getByText('23h ago')).toBeInTheDocument();
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
it('treats a hair in the future as "now" (clock skew)', () => {
|
|
241
|
-
render(
|
|
242
|
-
<Timestamp value={Date.now() / 1000 + 2} format="relative_short" />,
|
|
243
|
-
);
|
|
244
|
-
expect(screen.getByText('now')).toBeInTheDocument();
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it('keeps the full absolute date as the accessible name', () => {
|
|
248
|
-
render(
|
|
249
|
-
<Timestamp
|
|
250
|
-
value={Date.now() / 1000 - 2 * 3600}
|
|
251
|
-
format="relative_short"
|
|
252
|
-
/>,
|
|
253
|
-
);
|
|
254
|
-
const el = screen.getByText('2h ago');
|
|
255
|
-
// Same a11y contract as the long relative form: the visible short label
|
|
256
|
-
// is backed by the full absolute date for screen readers.
|
|
257
|
-
expect(el).toHaveAttribute('aria-label');
|
|
258
|
-
expect(el.getAttribute('aria-label')).not.toBe('2h ago');
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it.each([
|
|
263
|
-
{format: 'relative' as const, style: 'long' as const},
|
|
264
|
-
{format: 'relative_short' as const, style: 'narrow' as const},
|
|
265
|
-
{format: 'auto' as const, style: 'long' as const},
|
|
266
|
-
])(
|
|
267
|
-
'updates $format output when the provider locale changes',
|
|
268
|
-
({format, style}) => {
|
|
269
|
-
const value = Date.now() / 1000 - 2 * 3600;
|
|
270
|
-
const timestamp = (locale: string) => (
|
|
271
|
-
<InternationalizationProvider locale={locale}>
|
|
272
|
-
<Timestamp
|
|
273
|
-
value={value}
|
|
274
|
-
format={format}
|
|
275
|
-
hasTooltip={false}
|
|
276
|
-
data-testid="ts"
|
|
277
|
-
/>
|
|
278
|
-
</InternationalizationProvider>
|
|
279
|
-
);
|
|
280
|
-
const expected = (locale: string) =>
|
|
281
|
-
new Intl.RelativeTimeFormat(locale, {
|
|
282
|
-
numeric: 'always',
|
|
283
|
-
style,
|
|
284
|
-
}).format(-2, 'hour');
|
|
285
|
-
|
|
286
|
-
const {rerender} = render(timestamp('en-US'));
|
|
287
|
-
expect(screen.getByTestId('ts')).toHaveTextContent(expected('en-US'));
|
|
288
|
-
|
|
289
|
-
rerender(timestamp('fr-FR'));
|
|
290
|
-
expect(screen.getByTestId('ts')).toHaveTextContent(expected('fr-FR'));
|
|
291
|
-
},
|
|
292
|
-
);
|
|
293
|
-
|
|
294
|
-
it('localizes relative idioms from the provider locale', () => {
|
|
295
|
-
const timestamp = (value: number) => (
|
|
296
|
-
<InternationalizationProvider locale="fr-FR">
|
|
297
|
-
<Timestamp
|
|
298
|
-
value={value}
|
|
299
|
-
format="relative"
|
|
300
|
-
hasTooltip={false}
|
|
301
|
-
data-testid="ts"
|
|
302
|
-
/>
|
|
303
|
-
</InternationalizationProvider>
|
|
304
|
-
);
|
|
305
|
-
const formatter = new Intl.RelativeTimeFormat('fr-FR', {
|
|
306
|
-
numeric: 'auto',
|
|
307
|
-
style: 'long',
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
const {rerender} = render(timestamp(Date.now() / 1000 - 5));
|
|
311
|
-
expect(screen.getByTestId('ts')).toHaveTextContent(
|
|
312
|
-
formatter.format(0, 'second'),
|
|
313
|
-
);
|
|
314
|
-
|
|
315
|
-
rerender(timestamp(Date.now() / 1000 - 100000));
|
|
316
|
-
expect(screen.getByTestId('ts')).toHaveTextContent(
|
|
317
|
-
formatter.format(-1, 'day'),
|
|
318
|
-
);
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
// --- Standard display formats ---
|
|
322
|
-
|
|
323
|
-
it('updates absolute output when the provider locale changes', () => {
|
|
324
|
-
const value = '2026-01-25T12:00:00Z';
|
|
325
|
-
const timestamp = (locale: string) => (
|
|
326
|
-
<InternationalizationProvider locale={locale}>
|
|
327
|
-
<Timestamp
|
|
328
|
-
value={value}
|
|
329
|
-
format="date_long"
|
|
330
|
-
hasTooltip={false}
|
|
331
|
-
data-testid="ts"
|
|
332
|
-
/>
|
|
333
|
-
</InternationalizationProvider>
|
|
334
|
-
);
|
|
335
|
-
|
|
336
|
-
const {rerender} = render(timestamp('en-US'));
|
|
337
|
-
expect(screen.getByTestId('ts')).toHaveTextContent('January 25, 2026');
|
|
338
|
-
|
|
339
|
-
rerender(timestamp('de-DE'));
|
|
340
|
-
expect(screen.getByTestId('ts')).toHaveTextContent('25. Januar 2026');
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
it.each(['full', 'date', 'date_long', 'date_weekday', 'date_time'] as const)(
|
|
344
|
-
'keeps Gregorian years for the %s format under a non-Gregorian locale',
|
|
345
|
-
format => {
|
|
346
|
-
const value = formatInstant(
|
|
347
|
-
new Date('2026-08-22T12:00:00Z'),
|
|
348
|
-
format,
|
|
349
|
-
'th-TH',
|
|
350
|
-
{timeZone: 'UTC'},
|
|
351
|
-
);
|
|
352
|
-
expect(value).toContain('2026');
|
|
353
|
-
expect(value).not.toContain('2569');
|
|
354
|
-
},
|
|
355
|
-
);
|
|
356
|
-
|
|
357
|
-
it('keeps Gregorian years in Timestamp output under a non-Gregorian locale', () => {
|
|
358
|
-
render(
|
|
359
|
-
<InternationalizationProvider locale="th-TH">
|
|
360
|
-
<Timestamp
|
|
361
|
-
value="2026-08-22T12:00:00Z"
|
|
362
|
-
format="date_long"
|
|
363
|
-
hasTooltip={false}
|
|
364
|
-
data-testid="ts"
|
|
365
|
-
/>
|
|
366
|
-
</InternationalizationProvider>,
|
|
367
|
-
);
|
|
368
|
-
|
|
369
|
-
expect(screen.getByTestId('ts')).toHaveTextContent('2026');
|
|
370
|
-
expect(screen.getByTestId('ts')).not.toHaveTextContent('2569');
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
it('renders date format', () => {
|
|
374
|
-
render(
|
|
375
|
-
<Timestamp value="2026-02-19T17:00:00Z" format="date" data-testid="ts" />,
|
|
376
|
-
);
|
|
377
|
-
const el = screen.getByTestId('ts');
|
|
378
|
-
expect(el.textContent).toContain('2026');
|
|
379
|
-
// Should not contain time
|
|
380
|
-
expect(el.textContent).not.toContain(':');
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
it('renders date_weekday format with a weekday prefix', () => {
|
|
384
|
-
render(
|
|
385
|
-
<Timestamp
|
|
386
|
-
value="2026-02-19T17:00:00Z"
|
|
387
|
-
format="date_weekday"
|
|
388
|
-
data-testid="ts"
|
|
389
|
-
/>,
|
|
390
|
-
);
|
|
391
|
-
const el = screen.getByTestId('ts');
|
|
392
|
-
// Includes the year and a leading weekday abbreviation, no time portion.
|
|
393
|
-
expect(el.textContent).toContain('2026');
|
|
394
|
-
expect(el.textContent).not.toContain(':');
|
|
395
|
-
// en-US short weekday for 2026-02-19 is "Thu"; assert a weekday word is
|
|
396
|
-
// present without over-fitting the exact locale punctuation.
|
|
397
|
-
expect(el.textContent).toMatch(/Mon|Tue|Wed|Thu|Fri|Sat|Sun/);
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
it('renders date_long format with a full month name', () => {
|
|
401
|
-
render(
|
|
402
|
-
<Timestamp
|
|
403
|
-
value="2026-02-19T17:00:00Z"
|
|
404
|
-
format="date_long"
|
|
405
|
-
data-testid="ts"
|
|
406
|
-
/>,
|
|
407
|
-
);
|
|
408
|
-
const el = screen.getByTestId('ts');
|
|
409
|
-
// Long-month shape: full month name, year, no time portion.
|
|
410
|
-
expect(el.textContent).toContain('February');
|
|
411
|
-
expect(el.textContent).toContain('2026');
|
|
412
|
-
expect(el.textContent).not.toContain(':');
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
it('renders date_time format', () => {
|
|
416
|
-
render(
|
|
417
|
-
<Timestamp
|
|
418
|
-
value="2026-02-19T17:00:00Z"
|
|
419
|
-
format="date_time"
|
|
420
|
-
data-testid="ts"
|
|
421
|
-
/>,
|
|
422
|
-
);
|
|
423
|
-
const el = screen.getByTestId('ts');
|
|
424
|
-
expect(el.textContent).toContain('2026');
|
|
425
|
-
// Should contain a colon for the time portion
|
|
426
|
-
expect(el.textContent).toContain(':');
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
it('renders time format', () => {
|
|
430
|
-
render(
|
|
431
|
-
<Timestamp value="2026-02-19T17:00:00Z" format="time" data-testid="ts" />,
|
|
432
|
-
);
|
|
433
|
-
const el = screen.getByTestId('ts');
|
|
434
|
-
// Should contain time but not year
|
|
435
|
-
expect(el.textContent).toContain(':');
|
|
436
|
-
expect(el.textContent).not.toContain('2026');
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
// --- System formats ---
|
|
440
|
-
|
|
441
|
-
it('renders system_date format', () => {
|
|
442
|
-
render(
|
|
443
|
-
<Timestamp
|
|
444
|
-
value="2026-02-19T17:00:00Z"
|
|
445
|
-
format="system_date"
|
|
446
|
-
data-testid="ts"
|
|
447
|
-
/>,
|
|
448
|
-
);
|
|
449
|
-
const el = screen.getByTestId('ts');
|
|
450
|
-
expect(el.textContent).toMatch(/2026-02-\d{2}/);
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
it('renders system_date_time format', () => {
|
|
454
|
-
render(
|
|
455
|
-
<Timestamp
|
|
456
|
-
value="2026-02-19T17:00:00Z"
|
|
457
|
-
format="system_date_time"
|
|
458
|
-
data-testid="ts"
|
|
459
|
-
/>,
|
|
460
|
-
);
|
|
461
|
-
const el = screen.getByTestId('ts');
|
|
462
|
-
expect(el.textContent).toMatch(/2026-02-\d{2} \d{2}:\d{2}:\d{2}/);
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
it('renders system_time format', () => {
|
|
466
|
-
render(
|
|
467
|
-
<Timestamp
|
|
468
|
-
value="2026-02-19T17:00:00Z"
|
|
469
|
-
format="system_time"
|
|
470
|
-
data-testid="ts"
|
|
471
|
-
/>,
|
|
472
|
-
);
|
|
473
|
-
const el = screen.getByTestId('ts');
|
|
474
|
-
expect(el.textContent).toMatch(/\d{2}:\d{2}:\d{2}/);
|
|
475
|
-
});
|
|
476
|
-
|
|
477
|
-
it('renders unix_seconds format as whole epoch seconds (zone-independent)', () => {
|
|
478
|
-
// 2026-02-19T17:00:00Z is 1771520400 seconds since the epoch. The value is
|
|
479
|
-
// absolute, so it is the same regardless of the viewer's zone.
|
|
480
|
-
render(
|
|
481
|
-
<Timestamp
|
|
482
|
-
value="2026-02-19T17:00:00Z"
|
|
483
|
-
format="unix_seconds"
|
|
484
|
-
data-testid="ts"
|
|
485
|
-
/>,
|
|
486
|
-
);
|
|
487
|
-
expect(screen.getByTestId('ts').textContent).toBe('1771520400');
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
it('renders unix_seconds from a Unix-seconds value input unchanged', () => {
|
|
491
|
-
render(
|
|
492
|
-
<Timestamp value={1771520400} format="unix_seconds" data-testid="ts" />,
|
|
493
|
-
);
|
|
494
|
-
expect(screen.getByTestId('ts').textContent).toBe('1771520400');
|
|
495
|
-
});
|
|
496
|
-
|
|
497
|
-
// --- Auto format ---
|
|
498
|
-
|
|
499
|
-
it('auto format uses relative for recent times', () => {
|
|
500
|
-
const oneHourAgo = Date.now() / 1000 - 3600;
|
|
501
|
-
render(<Timestamp value={oneHourAgo} format="auto" />);
|
|
502
|
-
expect(screen.getByText('1 hour ago')).toBeInTheDocument();
|
|
503
|
-
});
|
|
504
|
-
|
|
505
|
-
it('auto format uses date_time for old times', () => {
|
|
506
|
-
const oldDate = '2026-01-01T12:00:00Z';
|
|
507
|
-
render(<Timestamp value={oldDate} format="auto" data-testid="ts" />);
|
|
508
|
-
const el = screen.getByTestId('ts');
|
|
509
|
-
expect(el.textContent).toContain('2026');
|
|
510
|
-
expect(el.textContent).not.toContain('ago');
|
|
511
|
-
});
|
|
512
|
-
|
|
513
|
-
// --- Accessibility ---
|
|
514
|
-
|
|
515
|
-
it('sets aria-label with full absolute time in relative mode', () => {
|
|
516
|
-
const oneHourAgo = Date.now() / 1000 - 3600;
|
|
517
|
-
render(
|
|
518
|
-
<Timestamp
|
|
519
|
-
value={oneHourAgo}
|
|
520
|
-
format="relative"
|
|
521
|
-
hasTooltip={false}
|
|
522
|
-
data-testid="ts"
|
|
523
|
-
/>,
|
|
524
|
-
);
|
|
525
|
-
const el = screen.getByTestId('ts');
|
|
526
|
-
expect(el.getAttribute('aria-label')).toBeTruthy();
|
|
527
|
-
expect(el.getAttribute('aria-label')).toContain('2026');
|
|
528
|
-
});
|
|
529
|
-
|
|
530
|
-
it('does not set aria-label in non-relative mode', () => {
|
|
531
|
-
render(
|
|
532
|
-
<Timestamp
|
|
533
|
-
value="2026-02-19T17:00:00Z"
|
|
534
|
-
format="date_time"
|
|
535
|
-
data-testid="ts"
|
|
536
|
-
/>,
|
|
537
|
-
);
|
|
538
|
-
const el = screen.getByTestId('ts');
|
|
539
|
-
expect(el.getAttribute('aria-label')).toBeNull();
|
|
540
|
-
});
|
|
541
|
-
|
|
542
|
-
// Timezone abbreviations like "PST" or "GMT+2" are unexpanded abbreviations
|
|
543
|
-
// to a screen-reader user (WCAG 3.1.4) — the AT-facing aria-label must spell
|
|
544
|
-
// the timezone out in full, while visible text keeps the compact short form.
|
|
545
|
-
it('uses the long timezone name in the aria-label (WCAG 3.1.4)', () => {
|
|
546
|
-
const oneHourAgo = new Date(Date.now() - 3600 * 1000);
|
|
547
|
-
render(
|
|
548
|
-
<Timestamp
|
|
549
|
-
value={oneHourAgo.getTime() / 1000}
|
|
550
|
-
format="relative"
|
|
551
|
-
hasTooltip={false}
|
|
552
|
-
data-testid="ts"
|
|
553
|
-
/>,
|
|
554
|
-
);
|
|
555
|
-
|
|
556
|
-
const longTz =
|
|
557
|
-
new Intl.DateTimeFormat('en', {timeZoneName: 'long'})
|
|
558
|
-
.formatToParts(oneHourAgo)
|
|
559
|
-
.find(p => p.type === 'timeZoneName')?.value ?? '';
|
|
560
|
-
expect(longTz).not.toBe('');
|
|
561
|
-
expect(screen.getByTestId('ts').getAttribute('aria-label')).toContain(
|
|
562
|
-
longTz,
|
|
563
|
-
);
|
|
564
|
-
});
|
|
565
|
-
|
|
566
|
-
it('keeps the short timezone form in visible text when isTimezoneShown', () => {
|
|
567
|
-
const date = new Date('2026-03-25T10:00:00Z');
|
|
568
|
-
render(
|
|
569
|
-
<Timestamp
|
|
570
|
-
value="2026-03-25T10:00:00Z"
|
|
571
|
-
format="time"
|
|
572
|
-
isTimezoneShown
|
|
573
|
-
data-testid="ts"
|
|
574
|
-
/>,
|
|
575
|
-
);
|
|
576
|
-
|
|
577
|
-
const tzPart = (form: 'short' | 'long') =>
|
|
578
|
-
new Intl.DateTimeFormat('en', {timeZoneName: form})
|
|
579
|
-
.formatToParts(date)
|
|
580
|
-
.find(p => p.type === 'timeZoneName')?.value ?? '';
|
|
581
|
-
const text = screen.getByTestId('ts').textContent ?? '';
|
|
582
|
-
expect(text).toContain(tzPart('short'));
|
|
583
|
-
expect(text).not.toContain(tzPart('long'));
|
|
584
|
-
});
|
|
585
|
-
|
|
586
|
-
// --- Input handling ---
|
|
587
|
-
|
|
588
|
-
it('accepts Unix timestamp in seconds', () => {
|
|
589
|
-
render(<Timestamp value={1740000000} format="date" data-testid="ts" />);
|
|
590
|
-
const el = screen.getByTestId('ts');
|
|
591
|
-
expect(el.getAttribute('datetime')).toBeTruthy();
|
|
592
|
-
});
|
|
593
|
-
|
|
594
|
-
it('accepts ISO string', () => {
|
|
595
|
-
render(
|
|
596
|
-
<Timestamp
|
|
597
|
-
value="2026-03-25T10:00:00Z"
|
|
598
|
-
format="date_time"
|
|
599
|
-
data-testid="ts"
|
|
600
|
-
/>,
|
|
601
|
-
);
|
|
602
|
-
const el = screen.getByTestId('ts');
|
|
603
|
-
expect(el.getAttribute('datetime')).toBe('2026-03-25T10:00:00.000Z');
|
|
604
|
-
});
|
|
605
|
-
|
|
606
|
-
// --- Live updates ---
|
|
607
|
-
|
|
608
|
-
it('live updates relative time', () => {
|
|
609
|
-
const now = Date.now() / 1000;
|
|
610
|
-
render(<Timestamp value={now - 5} format="relative" isLive />);
|
|
611
|
-
expect(screen.getByText('now')).toBeInTheDocument();
|
|
612
|
-
|
|
613
|
-
act(() => {
|
|
614
|
-
vi.advanceTimersByTime(30_000);
|
|
615
|
-
});
|
|
616
|
-
expect(screen.getByText('35 seconds ago')).toBeInTheDocument();
|
|
617
|
-
});
|
|
618
|
-
|
|
619
|
-
// --- Ref ---
|
|
620
|
-
|
|
621
|
-
it('forwards ref', () => {
|
|
622
|
-
const ref = {current: null as HTMLTimeElement | null};
|
|
623
|
-
render(
|
|
624
|
-
<Timestamp ref={ref} value="2026-03-25T10:00:00Z" format="date_time" />,
|
|
625
|
-
);
|
|
626
|
-
expect(ref.current).toBeInstanceOf(HTMLTimeElement);
|
|
627
|
-
});
|
|
628
|
-
|
|
629
|
-
// --- Test ID ---
|
|
630
|
-
|
|
631
|
-
it('spreads data-testid', () => {
|
|
632
|
-
render(
|
|
633
|
-
<Timestamp
|
|
634
|
-
value="2026-03-25T10:00:00Z"
|
|
635
|
-
format="date_time"
|
|
636
|
-
data-testid="my-timestamp"
|
|
637
|
-
/>,
|
|
638
|
-
);
|
|
639
|
-
expect(screen.getByTestId('my-timestamp')).toBeInTheDocument();
|
|
640
|
-
});
|
|
641
|
-
|
|
642
|
-
// --- Future dates ---
|
|
643
|
-
|
|
644
|
-
it('handles future dates in relative mode', () => {
|
|
645
|
-
const oneHourFromNow = Date.now() / 1000 + 3600;
|
|
646
|
-
render(<Timestamp value={oneHourFromNow} format="relative" />);
|
|
647
|
-
expect(screen.getByText('in 1 hour')).toBeInTheDocument();
|
|
648
|
-
});
|
|
649
|
-
|
|
650
|
-
it('renders "now" for a value a few seconds in the future (clock skew)', () => {
|
|
651
|
-
// Beyond the sub-second render lag but still within the skew tolerance: a
|
|
652
|
-
// value ~20s ahead of our clock is almost always skew (the value's clock
|
|
653
|
-
// running fast), not a genuine future event, so it should read as the
|
|
654
|
-
// present rather than "in a few seconds".
|
|
655
|
-
const twentySecondsFromNow = Date.now() / 1000 + 20;
|
|
656
|
-
render(<Timestamp value={twentySecondsFromNow} format="relative" />);
|
|
657
|
-
expect(screen.queryByText(/^in /)).not.toBeInTheDocument();
|
|
658
|
-
expect(screen.getByText('now')).toBeInTheDocument();
|
|
659
|
-
});
|
|
660
|
-
|
|
661
|
-
it('renders a genuine near-future time beyond the skew tolerance with the native formatter', () => {
|
|
662
|
-
// Past the skew window — this is a real upcoming time, not clock drift.
|
|
663
|
-
const fortyFiveSecondsFromNow = Date.now() / 1000 + 45;
|
|
664
|
-
render(
|
|
665
|
-
<Timestamp
|
|
666
|
-
value={fortyFiveSecondsFromNow}
|
|
667
|
-
format="relative"
|
|
668
|
-
hasTooltip={false}
|
|
669
|
-
/>,
|
|
670
|
-
);
|
|
671
|
-
expect(
|
|
672
|
-
screen.getByText(
|
|
673
|
-
new Intl.RelativeTimeFormat('en', {
|
|
674
|
-
numeric: 'always',
|
|
675
|
-
style: 'long',
|
|
676
|
-
}).format(45, 'second'),
|
|
677
|
-
),
|
|
678
|
-
).toBeInTheDocument();
|
|
679
|
-
});
|
|
680
|
-
|
|
681
|
-
// --- Long-ago relative ---
|
|
682
|
-
|
|
683
|
-
it('renders months ago for dates older than 30 days', () => {
|
|
684
|
-
const threeMonthsAgo = Date.now() / 1000 - 90 * 86400;
|
|
685
|
-
render(<Timestamp value={threeMonthsAgo} format="relative" />);
|
|
686
|
-
expect(screen.getByText('3 months ago')).toBeInTheDocument();
|
|
687
|
-
});
|
|
688
|
-
|
|
689
|
-
it('renders years ago for dates older than 365 days', () => {
|
|
690
|
-
const twoYearsAgo = Date.now() / 1000 - 730 * 86400;
|
|
691
|
-
render(<Timestamp value={twoYearsAgo} format="relative" />);
|
|
692
|
-
expect(screen.getByText('2 years ago')).toBeInTheDocument();
|
|
693
|
-
});
|
|
694
|
-
|
|
695
|
-
// --- Auto threshold ---
|
|
696
|
-
|
|
697
|
-
it('respects custom autoThreshold', () => {
|
|
698
|
-
const twoHoursAgo = Date.now() / 1000 - 7200;
|
|
699
|
-
render(
|
|
700
|
-
<Timestamp value={twoHoursAgo} format="auto" autoThreshold={3600} />,
|
|
701
|
-
);
|
|
702
|
-
const el = screen.getByRole('time');
|
|
703
|
-
expect(el.textContent).not.toContain('ago');
|
|
704
|
-
});
|
|
705
|
-
|
|
706
|
-
// --- Invalid values ---
|
|
707
|
-
|
|
708
|
-
it('renders nothing instead of crashing on an unparseable string value', () => {
|
|
709
|
-
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
710
|
-
try {
|
|
711
|
-
const {container} = render(
|
|
712
|
-
<Timestamp value="not-a-date" data-testid="ts" />,
|
|
713
|
-
);
|
|
714
|
-
expect(container).toBeEmptyDOMElement();
|
|
715
|
-
expect(warn).toHaveBeenCalledWith(
|
|
716
|
-
expect.stringContaining('could not parse value'),
|
|
717
|
-
);
|
|
718
|
-
} finally {
|
|
719
|
-
warn.mockRestore();
|
|
720
|
-
}
|
|
721
|
-
});
|
|
722
|
-
|
|
723
|
-
it('renders nothing instead of crashing on a NaN value', () => {
|
|
724
|
-
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
725
|
-
try {
|
|
726
|
-
const {container} = render(<Timestamp value={NaN} data-testid="ts" />);
|
|
727
|
-
expect(container).toBeEmptyDOMElement();
|
|
728
|
-
} finally {
|
|
729
|
-
warn.mockRestore();
|
|
730
|
-
}
|
|
731
|
-
});
|
|
732
|
-
|
|
733
|
-
// --- Hover card keyboard reachability (WCAG 1.4.13 / 2.1.1) ---
|
|
734
|
-
|
|
735
|
-
describe('hover card keyboard reachability', () => {
|
|
736
|
-
const originalMatches = HTMLElement.prototype.matches;
|
|
737
|
-
const originalShowPopover = HTMLElement.prototype.showPopover;
|
|
738
|
-
const originalHidePopover = HTMLElement.prototype.hidePopover;
|
|
739
|
-
|
|
740
|
-
beforeEach(() => {
|
|
741
|
-
// The card content renders inline in a (mocked) popover; real timers let
|
|
742
|
-
// RTL's findBy* and the async paths resolve (the outer beforeEach
|
|
743
|
-
// installs fake timers, which would stall them).
|
|
744
|
-
vi.useRealTimers();
|
|
745
|
-
|
|
746
|
-
// Mock the Popover API, which jsdom does not implement.
|
|
747
|
-
HTMLElement.prototype.showPopover = vi.fn();
|
|
748
|
-
HTMLElement.prototype.hidePopover = vi.fn();
|
|
749
|
-
|
|
750
|
-
// jsdom does not derive :focus-visible from keyboard focus for a <time>
|
|
751
|
-
// element; treat the focused element as focus-visible so the card's
|
|
752
|
-
// keyboard-focus path can be exercised.
|
|
753
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
754
|
-
(HTMLElement.prototype as any).matches = function (
|
|
755
|
-
selector: string,
|
|
756
|
-
): boolean {
|
|
757
|
-
if (selector === ':focus-visible') {
|
|
758
|
-
return this === document.activeElement;
|
|
759
|
-
}
|
|
760
|
-
return originalMatches.call(this, selector);
|
|
761
|
-
};
|
|
762
|
-
});
|
|
763
|
-
|
|
764
|
-
afterEach(() => {
|
|
765
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
766
|
-
(HTMLElement.prototype as any).matches = originalMatches;
|
|
767
|
-
HTMLElement.prototype.showPopover = originalShowPopover;
|
|
768
|
-
HTMLElement.prototype.hidePopover = originalHidePopover;
|
|
769
|
-
});
|
|
770
|
-
|
|
771
|
-
it("keeps a caller's tabIndex while the hover card is attached (FR9)", async () => {
|
|
772
|
-
render(
|
|
773
|
-
<Timestamp
|
|
774
|
-
value={Date.now() / 1000 - 3600}
|
|
775
|
-
format="relative"
|
|
776
|
-
tabIndex={-1}
|
|
777
|
-
data-testid="ts"
|
|
778
|
-
/>,
|
|
779
|
-
);
|
|
780
|
-
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '-1');
|
|
781
|
-
await openTimestampHoverCard();
|
|
782
|
-
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '-1');
|
|
783
|
-
});
|
|
784
|
-
|
|
785
|
-
it('makes the <time> element focusable while the hover card is attached', () => {
|
|
786
|
-
render(
|
|
787
|
-
<Timestamp
|
|
788
|
-
value={Date.now() / 1000 - 3600}
|
|
789
|
-
format="relative"
|
|
790
|
-
data-testid="ts"
|
|
791
|
-
/>,
|
|
792
|
-
);
|
|
793
|
-
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
794
|
-
});
|
|
795
|
-
|
|
796
|
-
it('does not put aria-expanded on the role-less hover-card trigger', async () => {
|
|
797
|
-
render(
|
|
798
|
-
<Timestamp
|
|
799
|
-
value={Date.now() / 1000 - 3600}
|
|
800
|
-
format="relative"
|
|
801
|
-
data-testid="ts"
|
|
802
|
-
/>,
|
|
803
|
-
);
|
|
804
|
-
const trigger = screen.getByTestId('ts').parentElement;
|
|
805
|
-
// The trigger is Text's <span>, which has no role, so aria-expanded is
|
|
806
|
-
// invalid on it (axe aria-allowed-attr, critical). aria-haspopup is
|
|
807
|
-
// global and still advertises the dialog.
|
|
808
|
-
await waitFor(() => {
|
|
809
|
-
expect(trigger).toHaveAttribute('aria-haspopup', 'dialog');
|
|
810
|
-
});
|
|
811
|
-
expect(trigger).not.toHaveAttribute('aria-expanded');
|
|
812
|
-
});
|
|
813
|
-
|
|
814
|
-
it('shows the hover card when the timestamp receives keyboard focus', async () => {
|
|
815
|
-
const user = userEvent.setup();
|
|
816
|
-
render(
|
|
817
|
-
<Timestamp
|
|
818
|
-
value={Date.now() / 1000 - 3600}
|
|
819
|
-
format="relative"
|
|
820
|
-
data-testid="ts"
|
|
821
|
-
/>,
|
|
822
|
-
);
|
|
823
|
-
const el = screen.getByTestId('ts');
|
|
824
|
-
|
|
825
|
-
// The card carries the full absolute time in its visible form (short
|
|
826
|
-
// timezone abbreviation) as its single default copyable row. The
|
|
827
|
-
// aria-label spells the timezone out in full (WCAG 3.1.4), so the two
|
|
828
|
-
// strings intentionally differ — compare the card against an
|
|
829
|
-
// independently formatted short-form string after opening it.
|
|
830
|
-
// Compare with normalized whitespace: Intl output can contain narrow
|
|
831
|
-
// no-break spaces that jest-dom's matcher normalization would break on.
|
|
832
|
-
const normalize = (s: string) => s.replace(/\s+/g, ' ');
|
|
833
|
-
const datetime = new Date(el.getAttribute('datetime') ?? '');
|
|
834
|
-
const expected = new Intl.DateTimeFormat('en', {
|
|
835
|
-
year: 'numeric',
|
|
836
|
-
month: 'long',
|
|
837
|
-
day: 'numeric',
|
|
838
|
-
hour: 'numeric',
|
|
839
|
-
minute: '2-digit',
|
|
840
|
-
second: '2-digit',
|
|
841
|
-
timeZoneName: 'short',
|
|
842
|
-
}).format(datetime);
|
|
843
|
-
// Tab onto the timestamp — the only tab stop in the document.
|
|
844
|
-
await user.tab();
|
|
845
|
-
expect(el).toHaveFocus();
|
|
846
|
-
await waitFor(() => {
|
|
847
|
-
expect(HTMLElement.prototype.showPopover).toHaveBeenCalled();
|
|
848
|
-
});
|
|
849
|
-
const card = screen.getByRole('dialog', {hidden: true});
|
|
850
|
-
expect(normalize(card.textContent ?? '')).toContain(normalize(expected));
|
|
851
|
-
});
|
|
852
|
-
|
|
853
|
-
it('does not add a tab stop when the hover card is disabled', () => {
|
|
854
|
-
render(
|
|
855
|
-
<Timestamp
|
|
856
|
-
value={Date.now() / 1000 - 3600}
|
|
857
|
-
format="relative"
|
|
858
|
-
hasTooltip={false}
|
|
859
|
-
data-testid="ts"
|
|
860
|
-
/>,
|
|
861
|
-
);
|
|
862
|
-
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
863
|
-
});
|
|
864
|
-
|
|
865
|
-
it('does not add a tab stop for absolute formats (no hover card)', () => {
|
|
866
|
-
render(
|
|
867
|
-
<Timestamp
|
|
868
|
-
value="2026-02-19T17:00:00Z"
|
|
869
|
-
format="date_time"
|
|
870
|
-
data-testid="ts"
|
|
871
|
-
/>,
|
|
872
|
-
);
|
|
873
|
-
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
874
|
-
});
|
|
875
|
-
|
|
876
|
-
it('keeps the full absolute aria-label while the hover card is attached', () => {
|
|
877
|
-
render(
|
|
878
|
-
<Timestamp
|
|
879
|
-
value={Date.now() / 1000 - 3600}
|
|
880
|
-
format="relative"
|
|
881
|
-
data-testid="ts"
|
|
882
|
-
/>,
|
|
883
|
-
);
|
|
884
|
-
const label = screen.getByTestId('ts').getAttribute('aria-label');
|
|
885
|
-
expect(label).toBeTruthy();
|
|
886
|
-
// The label is the full absolute string, not the relative text.
|
|
887
|
-
expect(label).not.toContain('ago');
|
|
888
|
-
});
|
|
889
|
-
});
|
|
890
|
-
|
|
891
|
-
// --- Default hover card (no tooltipEntries) ---
|
|
892
|
-
|
|
893
|
-
describe('default hover card (no tooltipEntries)', () => {
|
|
894
|
-
const originalShowPopover = HTMLElement.prototype.showPopover;
|
|
895
|
-
const originalHidePopover = HTMLElement.prototype.hidePopover;
|
|
896
|
-
|
|
897
|
-
beforeEach(() => {
|
|
898
|
-
// The card content renders inline in a (mocked) popover; real timers let
|
|
899
|
-
// RTL's findBy* and the async clipboard write resolve (the outer
|
|
900
|
-
// beforeEach installs fake timers).
|
|
901
|
-
vi.useRealTimers();
|
|
902
|
-
HTMLElement.prototype.showPopover = vi.fn();
|
|
903
|
-
HTMLElement.prototype.hidePopover = vi.fn();
|
|
904
|
-
// jsdom does not implement the async Clipboard API.
|
|
905
|
-
Object.defineProperty(navigator, 'clipboard', {
|
|
906
|
-
value: {writeText: vi.fn().mockResolvedValue(undefined)},
|
|
907
|
-
configurable: true,
|
|
908
|
-
});
|
|
909
|
-
});
|
|
910
|
-
|
|
911
|
-
afterEach(() => {
|
|
912
|
-
HTMLElement.prototype.showPopover = originalShowPopover;
|
|
913
|
-
HTMLElement.prototype.hidePopover = originalHidePopover;
|
|
914
|
-
__resetLiveRegionsForTest();
|
|
915
|
-
});
|
|
916
|
-
|
|
917
|
-
it('renders the unified copyable card with a single default absolute row', async () => {
|
|
918
|
-
render(
|
|
919
|
-
<Timestamp
|
|
920
|
-
value={Date.now() / 1000 - 3600}
|
|
921
|
-
format="relative"
|
|
922
|
-
data-testid="ts"
|
|
923
|
-
/>,
|
|
924
|
-
);
|
|
925
|
-
// With no entries the hover surface is still the copyable card — one
|
|
926
|
-
// surface, one styling — never the old read-only tooltip. (The copy
|
|
927
|
-
// button carries its own small "Copy" tooltip; that is not the hover
|
|
928
|
-
// surface, so exclude it.)
|
|
929
|
-
expect(
|
|
930
|
-
screen
|
|
931
|
-
.queryAllByRole('tooltip', {hidden: true})
|
|
932
|
-
.filter(el => !/^(Copy|Copied)$/.test(el.textContent?.trim() ?? '')),
|
|
933
|
-
).toHaveLength(0);
|
|
934
|
-
const card = await openTimestampHoverCard();
|
|
935
|
-
// The default card is the named details card, exactly as the configured
|
|
936
|
-
// one is.
|
|
937
|
-
expect(card).toHaveAttribute('aria-label', 'Timestamp details');
|
|
938
|
-
// Exactly one row, carrying the full absolute time in its visible form
|
|
939
|
-
// (short timezone abbreviation) with its own copy button. The
|
|
940
|
-
// aria-label spells the timezone out in full (WCAG 3.1.4), so the two
|
|
941
|
-
// strings intentionally differ — compare the row against an
|
|
942
|
-
// independently formatted short-form string.
|
|
943
|
-
expect(card.querySelectorAll('dd')).toHaveLength(1);
|
|
944
|
-
expect(card.querySelectorAll('button')).toHaveLength(1);
|
|
945
|
-
|
|
946
|
-
const normalize = (s: string) => s.replace(/\s+/g, ' ');
|
|
947
|
-
const datetime = new Date(
|
|
948
|
-
screen.getByTestId('ts').getAttribute('datetime') ?? '',
|
|
949
|
-
);
|
|
950
|
-
const expected = new Intl.DateTimeFormat('en', {
|
|
951
|
-
year: 'numeric',
|
|
952
|
-
month: 'long',
|
|
953
|
-
day: 'numeric',
|
|
954
|
-
hour: 'numeric',
|
|
955
|
-
minute: '2-digit',
|
|
956
|
-
second: '2-digit',
|
|
957
|
-
timeZoneName: 'short',
|
|
958
|
-
}).format(datetime);
|
|
959
|
-
expect(normalize(card.textContent ?? '')).toContain(normalize(expected));
|
|
960
|
-
});
|
|
961
|
-
|
|
962
|
-
it("copies the default absolute row's value", async () => {
|
|
963
|
-
render(<Timestamp value={Date.now() / 1000 - 3600} format="relative" />);
|
|
964
|
-
const card = await openTimestampHoverCard();
|
|
965
|
-
const rowValue = card.querySelector('dd')?.textContent ?? '';
|
|
966
|
-
expect(rowValue).toBeTruthy();
|
|
967
|
-
fireEvent.click(card.querySelector('button')!);
|
|
968
|
-
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(rowValue);
|
|
969
|
-
// Let the async copy resolve and flip the button into its copied state
|
|
970
|
-
// so the state update settles inside act().
|
|
971
|
-
await waitFor(() => {
|
|
972
|
-
expect(
|
|
973
|
-
screen.getByRole('button', {name: 'Copied', hidden: true}),
|
|
974
|
-
).toBeInTheDocument();
|
|
975
|
-
});
|
|
976
|
-
});
|
|
977
|
-
|
|
978
|
-
it("shows a 'Copy' tooltip on the copy button, flipping to 'Copied' after a copy", async () => {
|
|
979
|
-
render(<Timestamp value={Date.now() / 1000 - 3600} format="relative" />);
|
|
980
|
-
const card = await openTimestampHoverCard();
|
|
981
|
-
const button = card.querySelector('button')!;
|
|
982
|
-
// The visible tooltip content defaults to the short imperative 'Copy'
|
|
983
|
-
// (the full "Copy <value>" string stays the button's aria-label).
|
|
984
|
-
fireEvent.mouseEnter(button);
|
|
985
|
-
await waitFor(() =>
|
|
986
|
-
expect(
|
|
987
|
-
screen.getByText('Copy', {
|
|
988
|
-
selector: '[role="tooltip"] *, [role="tooltip"]',
|
|
989
|
-
}),
|
|
990
|
-
).toBeInTheDocument(),
|
|
991
|
-
);
|
|
992
|
-
fireEvent.click(button);
|
|
993
|
-
// After a successful copy the tooltip content flips to 'Copied' in step
|
|
994
|
-
// with the icon/aria-label.
|
|
995
|
-
await waitFor(() =>
|
|
996
|
-
expect(
|
|
997
|
-
screen.getByText('Copied', {
|
|
998
|
-
selector: '[role="tooltip"] *, [role="tooltip"]',
|
|
999
|
-
}),
|
|
1000
|
-
).toBeInTheDocument(),
|
|
1001
|
-
);
|
|
1002
|
-
});
|
|
1003
|
-
});
|
|
1004
|
-
|
|
1005
|
-
// --- Multi-zone / multi-format copyable hover card (tooltipEntries) ---
|
|
1006
|
-
|
|
1007
|
-
describe('tooltipEntries copyable hover card', () => {
|
|
1008
|
-
// A fixed instant that lands on a different calendar day in Tokyo, so a
|
|
1009
|
-
// zone-blind implementation is visible in the output.
|
|
1010
|
-
const VALUE = '2026-02-19T17:00:00Z';
|
|
1011
|
-
|
|
1012
|
-
const originalShowPopover = HTMLElement.prototype.showPopover;
|
|
1013
|
-
const originalHidePopover = HTMLElement.prototype.hidePopover;
|
|
1014
|
-
|
|
1015
|
-
beforeEach(() => {
|
|
1016
|
-
// The card content renders inline in a (mocked) popover, so its rows are
|
|
1017
|
-
// in the DOM without opening it. Real timers so RTL's findBy* and the
|
|
1018
|
-
// async clipboard write resolve (the outer beforeEach installs fake ones).
|
|
1019
|
-
vi.useRealTimers();
|
|
1020
|
-
HTMLElement.prototype.showPopover = vi.fn();
|
|
1021
|
-
HTMLElement.prototype.hidePopover = vi.fn();
|
|
1022
|
-
// jsdom does not implement the async Clipboard API.
|
|
1023
|
-
Object.defineProperty(navigator, 'clipboard', {
|
|
1024
|
-
value: {writeText: vi.fn().mockResolvedValue(undefined)},
|
|
1025
|
-
configurable: true,
|
|
1026
|
-
});
|
|
1027
|
-
});
|
|
1028
|
-
|
|
1029
|
-
afterEach(() => {
|
|
1030
|
-
HTMLElement.prototype.showPopover = originalShowPopover;
|
|
1031
|
-
HTMLElement.prototype.hidePopover = originalHidePopover;
|
|
1032
|
-
__resetLiveRegionsForTest();
|
|
1033
|
-
});
|
|
1034
|
-
|
|
1035
|
-
it('presents configured entries as a named card, not a read-only tooltip', async () => {
|
|
1036
|
-
render(
|
|
1037
|
-
<Timestamp
|
|
1038
|
-
value={VALUE}
|
|
1039
|
-
format="relative"
|
|
1040
|
-
tooltipEntries={[{label: 'Local'}, {timezoneID: 'UTC', label: 'UTC'}]}
|
|
1041
|
-
/>,
|
|
1042
|
-
);
|
|
1043
|
-
// Entries present — the surface is the interactive card, never the
|
|
1044
|
-
// lightweight read-only tooltip. (The copy button's own "Copy" tooltip
|
|
1045
|
-
// is not the hover surface, so exclude it.)
|
|
1046
|
-
expect(
|
|
1047
|
-
screen
|
|
1048
|
-
.queryAllByRole('tooltip', {hidden: true})
|
|
1049
|
-
.filter(el => !/^(Copy|Copied)$/.test(el.textContent?.trim() ?? '')),
|
|
1050
|
-
).toHaveLength(0);
|
|
1051
|
-
const card = await openTimestampHoverCard();
|
|
1052
|
-
expect(card).toHaveAttribute('aria-label', 'Timestamp details');
|
|
1053
|
-
});
|
|
1054
|
-
|
|
1055
|
-
it('renders one row per configured entry, read-only by default', async () => {
|
|
1056
|
-
render(
|
|
1057
|
-
<Timestamp
|
|
1058
|
-
value={VALUE}
|
|
1059
|
-
format="relative"
|
|
1060
|
-
tooltipEntries={[
|
|
1061
|
-
{label: 'Local'},
|
|
1062
|
-
{timezoneID: 'UTC', label: 'UTC'},
|
|
1063
|
-
{timezoneID: 'Asia/Tokyo', label: 'Tokyo'},
|
|
1064
|
-
]}
|
|
1065
|
-
/>,
|
|
1066
|
-
);
|
|
1067
|
-
const card = await openTimestampHoverCard();
|
|
1068
|
-
expect(card.querySelectorAll('dd')).toHaveLength(3);
|
|
1069
|
-
// Entries are read-only unless they opt in, so no copy buttons and no
|
|
1070
|
-
// trailing action column are rendered.
|
|
1071
|
-
expect(card.querySelectorAll('button')).toHaveLength(0);
|
|
1072
|
-
expect(card.textContent).toContain('Local');
|
|
1073
|
-
expect(card.textContent).toContain('UTC');
|
|
1074
|
-
expect(card.textContent).toContain('Tokyo');
|
|
1075
|
-
});
|
|
1076
|
-
|
|
1077
|
-
it('renders a copy button only on rows that opt into isCopyable', async () => {
|
|
1078
|
-
render(
|
|
1079
|
-
<Timestamp
|
|
1080
|
-
value={VALUE}
|
|
1081
|
-
format="relative"
|
|
1082
|
-
tooltipEntries={[
|
|
1083
|
-
{label: 'Local'},
|
|
1084
|
-
{timezoneID: 'UTC', label: 'UTC'},
|
|
1085
|
-
{
|
|
1086
|
-
timezoneID: 'UTC',
|
|
1087
|
-
format: 'system_date_time',
|
|
1088
|
-
label: 'ISO',
|
|
1089
|
-
isCopyable: true,
|
|
1090
|
-
},
|
|
1091
|
-
]}
|
|
1092
|
-
/>,
|
|
1093
|
-
);
|
|
1094
|
-
const card = await openTimestampHoverCard();
|
|
1095
|
-
// Three rows, but only the opted-in row carries a copy button.
|
|
1096
|
-
expect(card.querySelectorAll('dd')).toHaveLength(3);
|
|
1097
|
-
expect(card.querySelectorAll('button')).toHaveLength(1);
|
|
1098
|
-
});
|
|
1099
|
-
|
|
1100
|
-
it('renders each entry in the time zone it names', async () => {
|
|
1101
|
-
render(
|
|
1102
|
-
<Timestamp
|
|
1103
|
-
value={VALUE}
|
|
1104
|
-
format="relative"
|
|
1105
|
-
tooltipEntries={[
|
|
1106
|
-
{timezoneID: 'UTC', format: 'system_date_time', label: 'UTC'},
|
|
1107
|
-
{
|
|
1108
|
-
timezoneID: 'Asia/Tokyo',
|
|
1109
|
-
format: 'system_date_time',
|
|
1110
|
-
label: 'Tokyo',
|
|
1111
|
-
},
|
|
1112
|
-
]}
|
|
1113
|
-
/>,
|
|
1114
|
-
);
|
|
1115
|
-
const card = await openTimestampHoverCard();
|
|
1116
|
-
const values = Array.from(card.querySelectorAll('dd')).map(
|
|
1117
|
-
el => el.textContent,
|
|
1118
|
-
);
|
|
1119
|
-
// Machine formats are locale- and host-timezone-independent, so these
|
|
1120
|
-
// hold on any developer machine and on CI.
|
|
1121
|
-
expect(values).toEqual(['2026-02-19 17:00:00', '2026-02-20 02:00:00']);
|
|
1122
|
-
});
|
|
1123
|
-
|
|
1124
|
-
it("copies an opted-in row's value and flips the button to the copied state", async () => {
|
|
1125
|
-
render(
|
|
1126
|
-
<Timestamp
|
|
1127
|
-
value={VALUE}
|
|
1128
|
-
format="relative"
|
|
1129
|
-
tooltipEntries={[
|
|
1130
|
-
{
|
|
1131
|
-
label: 'ISO',
|
|
1132
|
-
format: 'system_date_time',
|
|
1133
|
-
timezoneID: 'UTC',
|
|
1134
|
-
isCopyable: true,
|
|
1135
|
-
},
|
|
1136
|
-
]}
|
|
1137
|
-
/>,
|
|
1138
|
-
);
|
|
1139
|
-
const card = await openTimestampHoverCard();
|
|
1140
|
-
const [rowValue] = Array.from(card.querySelectorAll('dd')).map(
|
|
1141
|
-
el => el.textContent ?? '',
|
|
1142
|
-
);
|
|
1143
|
-
const copyButton = card.querySelectorAll('button')[0];
|
|
1144
|
-
|
|
1145
|
-
fireEvent.click(copyButton);
|
|
1146
|
-
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(rowValue);
|
|
1147
|
-
|
|
1148
|
-
// The button announces and flips its icon/label to the copied state.
|
|
1149
|
-
await waitFor(() => {
|
|
1150
|
-
expect(
|
|
1151
|
-
screen.getByRole('button', {name: 'Copied', hidden: true}),
|
|
1152
|
-
).toBeInTheDocument();
|
|
1153
|
-
});
|
|
1154
|
-
});
|
|
1155
|
-
|
|
1156
|
-
it('announces the copy to a polite live region through the i18n catalog', async () => {
|
|
1157
|
-
render(
|
|
1158
|
-
<InternationalizationProvider
|
|
1159
|
-
locale="fr"
|
|
1160
|
-
overrides={{fr: {'@astryx.timestamp.copied': 'Copié'}}}>
|
|
1161
|
-
<Timestamp
|
|
1162
|
-
value={VALUE}
|
|
1163
|
-
format="relative"
|
|
1164
|
-
tooltipEntries={[
|
|
1165
|
-
{timezoneID: 'UTC', label: 'UTC', isCopyable: true},
|
|
1166
|
-
]}
|
|
1167
|
-
/>
|
|
1168
|
-
</InternationalizationProvider>,
|
|
1169
|
-
);
|
|
1170
|
-
const card = await openTimestampHoverCard();
|
|
1171
|
-
fireEvent.click(card.querySelector('button')!);
|
|
1172
|
-
await waitFor(() => {
|
|
1173
|
-
expect(
|
|
1174
|
-
document.querySelector('[data-astryx-live-region="polite"]'),
|
|
1175
|
-
).toHaveTextContent('Copié');
|
|
1176
|
-
});
|
|
1177
|
-
});
|
|
1178
|
-
|
|
1179
|
-
it('shows the card for absolute formats once entries are configured', async () => {
|
|
1180
|
-
render(
|
|
1181
|
-
<Timestamp
|
|
1182
|
-
value={VALUE}
|
|
1183
|
-
format="date_time"
|
|
1184
|
-
tooltipEntries={[{timezoneID: 'UTC', label: 'UTC'}]}
|
|
1185
|
-
data-testid="ts"
|
|
1186
|
-
/>,
|
|
1187
|
-
);
|
|
1188
|
-
// Without entries an absolute format has no hover surface at all;
|
|
1189
|
-
// configuring entries must not be silently ignored.
|
|
1190
|
-
const card = await openTimestampHoverCard();
|
|
1191
|
-
expect(card.textContent).toContain('UTC');
|
|
1192
|
-
// ...and the anchor becomes keyboard-reachable, as it is for relative.
|
|
1193
|
-
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
1194
|
-
});
|
|
1195
|
-
|
|
1196
|
-
it('treats an empty entry list exactly like no configuration', () => {
|
|
1197
|
-
render(
|
|
1198
|
-
<Timestamp
|
|
1199
|
-
value={VALUE}
|
|
1200
|
-
format="date_time"
|
|
1201
|
-
tooltipEntries={[]}
|
|
1202
|
-
data-testid="ts"
|
|
1203
|
-
/>,
|
|
1204
|
-
);
|
|
1205
|
-
// An empty array is not a way to configure the card — with no lines to
|
|
1206
|
-
// show, an absolute format stays surface-less (no tab stop, no card).
|
|
1207
|
-
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
1208
|
-
expect(screen.queryByRole('dialog', {hidden: true})).toBeNull();
|
|
1209
|
-
});
|
|
1210
|
-
|
|
1211
|
-
it('stays inert when hasTooltip is false even with entries configured', () => {
|
|
1212
|
-
render(
|
|
1213
|
-
<Timestamp
|
|
1214
|
-
value={VALUE}
|
|
1215
|
-
format="relative"
|
|
1216
|
-
hasTooltip={false}
|
|
1217
|
-
tooltipEntries={[{timezoneID: 'UTC', label: 'UTC'}]}
|
|
1218
|
-
data-testid="ts"
|
|
1219
|
-
/>,
|
|
1220
|
-
);
|
|
1221
|
-
// hasTooltip stays the on/off switch: false suppresses the surface even
|
|
1222
|
-
// when entries would otherwise upgrade it to the card.
|
|
1223
|
-
expect(screen.queryByRole('dialog', {hidden: true})).toBeNull();
|
|
1224
|
-
expect(
|
|
1225
|
-
screen
|
|
1226
|
-
.queryAllByRole('tooltip', {hidden: true})
|
|
1227
|
-
.filter(el => !/^(Copy|Copied)$/.test(el.textContent?.trim() ?? '')),
|
|
1228
|
-
).toHaveLength(0);
|
|
1229
|
-
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
1230
|
-
expect(
|
|
1231
|
-
screen.getByTestId('ts').getAttribute('aria-describedby'),
|
|
1232
|
-
).toBeNull();
|
|
1233
|
-
});
|
|
1234
|
-
|
|
1235
|
-
it('leaves the accessible name unchanged when entries are configured', () => {
|
|
1236
|
-
const value = Date.now() / 1000 - 3600;
|
|
1237
|
-
const {unmount} = render(
|
|
1238
|
-
<Timestamp value={value} format="relative" data-testid="a" />,
|
|
1239
|
-
);
|
|
1240
|
-
const before = screen.getByTestId('a').getAttribute('aria-label');
|
|
1241
|
-
unmount();
|
|
1242
|
-
|
|
1243
|
-
render(
|
|
1244
|
-
<Timestamp
|
|
1245
|
-
value={value}
|
|
1246
|
-
format="relative"
|
|
1247
|
-
tooltipEntries={[{timezoneID: 'UTC', label: 'UTC'}]}
|
|
1248
|
-
data-testid="b"
|
|
1249
|
-
/>,
|
|
1250
|
-
);
|
|
1251
|
-
// The accessible name stays the canonical absolute time in the viewer's
|
|
1252
|
-
// own zone; the extra zones reach assistive tech through the card, not
|
|
1253
|
-
// by being stuffed into the name.
|
|
1254
|
-
expect(screen.getByTestId('b').getAttribute('aria-label')).toBe(before);
|
|
1255
|
-
});
|
|
1256
|
-
|
|
1257
|
-
it('does not add an accessible name to absolute formats with entries', () => {
|
|
1258
|
-
render(
|
|
1259
|
-
<Timestamp
|
|
1260
|
-
value={VALUE}
|
|
1261
|
-
format="date_time"
|
|
1262
|
-
tooltipEntries={[{timezoneID: 'UTC'}]}
|
|
1263
|
-
data-testid="ts"
|
|
1264
|
-
/>,
|
|
1265
|
-
);
|
|
1266
|
-
expect(screen.getByTestId('ts').getAttribute('aria-label')).toBeNull();
|
|
1267
|
-
});
|
|
1268
|
-
|
|
1269
|
-
it('renders nothing for an unparseable value even with entries', () => {
|
|
1270
|
-
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
1271
|
-
try {
|
|
1272
|
-
const {container} = render(
|
|
1273
|
-
<Timestamp
|
|
1274
|
-
value="not-a-date"
|
|
1275
|
-
tooltipEntries={[{timezoneID: 'UTC', label: 'UTC'}]}
|
|
1276
|
-
/>,
|
|
1277
|
-
);
|
|
1278
|
-
// The invalid-value bail-out runs before any hover-surface work, so
|
|
1279
|
-
// there is no half-rendered card anchored to nothing.
|
|
1280
|
-
expect(container).toBeEmptyDOMElement();
|
|
1281
|
-
} finally {
|
|
1282
|
-
warn.mockRestore();
|
|
1283
|
-
}
|
|
1284
|
-
});
|
|
1285
|
-
|
|
1286
|
-
it('shows configured entries when auto resolves to an absolute format', async () => {
|
|
1287
|
-
render(
|
|
1288
|
-
<Timestamp
|
|
1289
|
-
value={VALUE}
|
|
1290
|
-
format="auto"
|
|
1291
|
-
autoThreshold={0}
|
|
1292
|
-
tooltipEntries={[
|
|
1293
|
-
{timezoneID: 'UTC', format: 'system_date_time', label: 'UTC'},
|
|
1294
|
-
]}
|
|
1295
|
-
data-testid="ts"
|
|
1296
|
-
/>,
|
|
1297
|
-
);
|
|
1298
|
-
// autoThreshold={0} forces the absolute branch regardless of the clock.
|
|
1299
|
-
const card = await openTimestampHoverCard();
|
|
1300
|
-
expect(card.textContent).toContain('2026-02-19 17:00:00');
|
|
1301
|
-
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
1302
|
-
});
|
|
1303
|
-
|
|
1304
|
-
it('accepts a unix-seconds value alongside entries', async () => {
|
|
1305
|
-
render(
|
|
1306
|
-
<Timestamp
|
|
1307
|
-
value={Date.parse(VALUE) / 1000}
|
|
1308
|
-
format="relative"
|
|
1309
|
-
tooltipEntries={[
|
|
1310
|
-
{timezoneID: 'UTC', format: 'system_date_time', label: 'UTC'},
|
|
1311
|
-
]}
|
|
1312
|
-
/>,
|
|
1313
|
-
);
|
|
1314
|
-
const card = await openTimestampHoverCard();
|
|
1315
|
-
expect(card.textContent).toContain('2026-02-19 17:00:00');
|
|
1316
|
-
});
|
|
1317
|
-
|
|
1318
|
-
it('pairs exactly one label cell with one value cell per entry', async () => {
|
|
1319
|
-
render(
|
|
1320
|
-
<Timestamp
|
|
1321
|
-
value={VALUE}
|
|
1322
|
-
format="relative"
|
|
1323
|
-
tooltipEntries={[
|
|
1324
|
-
{timezoneID: 'UTC', label: 'UTC'},
|
|
1325
|
-
{timezoneID: 'Asia/Tokyo'},
|
|
1326
|
-
{timezoneID: 'Europe/London', label: 'London'},
|
|
1327
|
-
]}
|
|
1328
|
-
/>,
|
|
1329
|
-
);
|
|
1330
|
-
const card = await openTimestampHoverCard();
|
|
1331
|
-
// An unlabeled entry still emits its label cell, so the grid stays
|
|
1332
|
-
// aligned and the <dl> stays valid markup.
|
|
1333
|
-
expect(card.querySelectorAll('dt')).toHaveLength(3);
|
|
1334
|
-
expect(card.querySelectorAll('dd')).toHaveLength(3);
|
|
1335
|
-
expect(card.querySelectorAll('dt')[1].textContent).toBe('');
|
|
1336
|
-
});
|
|
1337
|
-
|
|
1338
|
-
it('gives the tab stop back when entries are removed', () => {
|
|
1339
|
-
const {rerender} = render(
|
|
1340
|
-
<Timestamp
|
|
1341
|
-
value={VALUE}
|
|
1342
|
-
format="date_time"
|
|
1343
|
-
tooltipEntries={[{timezoneID: 'UTC'}]}
|
|
1344
|
-
data-testid="ts"
|
|
1345
|
-
/>,
|
|
1346
|
-
);
|
|
1347
|
-
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
1348
|
-
|
|
1349
|
-
rerender(<Timestamp value={VALUE} format="date_time" data-testid="ts" />);
|
|
1350
|
-
// The surface is driven purely by entry presence, so dropping the prop
|
|
1351
|
-
// must also drop the tab stop rather than stranding one.
|
|
1352
|
-
expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
|
|
1353
|
-
});
|
|
1354
|
-
|
|
1355
|
-
it('does not crash on an unknown time zone', async () => {
|
|
1356
|
-
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
1357
|
-
try {
|
|
1358
|
-
render(
|
|
1359
|
-
<Timestamp
|
|
1360
|
-
value={VALUE}
|
|
1361
|
-
format="relative"
|
|
1362
|
-
tooltipEntries={[
|
|
1363
|
-
{timezoneID: 'Not/AZone', format: 'system_date_time'},
|
|
1364
|
-
{timezoneID: 'UTC', format: 'system_date_time'},
|
|
1365
|
-
]}
|
|
1366
|
-
/>,
|
|
1367
|
-
);
|
|
1368
|
-
const card = await openTimestampHoverCard();
|
|
1369
|
-
const values = Array.from(card.querySelectorAll('dd')).map(
|
|
1370
|
-
el => el.textContent,
|
|
1371
|
-
);
|
|
1372
|
-
expect(values).toHaveLength(2);
|
|
1373
|
-
expect(values[1]).toBe('2026-02-19 17:00:00');
|
|
1374
|
-
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Not/AZone'));
|
|
1375
|
-
} finally {
|
|
1376
|
-
warn.mockRestore();
|
|
1377
|
-
}
|
|
1378
|
-
});
|
|
1379
|
-
});
|
|
1380
|
-
|
|
1381
|
-
describe('one formatter behind both surfaces', () => {
|
|
1382
|
-
// The rendered text and a tooltip line are two views of the same instant.
|
|
1383
|
-
// They are meant to come from one formatter parameterized by zone, not two
|
|
1384
|
-
// that happen to agree: a format added or reshaped on one surface and not
|
|
1385
|
-
// the other is a silent drift, invisible until someone compares them.
|
|
1386
|
-
// These assertions compare the two surfaces directly, so re-forking either
|
|
1387
|
-
// one fails here. Locale- and timezone-agnostic: nothing is pinned to a
|
|
1388
|
-
// literal, only the two paths to each other.
|
|
1389
|
-
const VALUE = '2026-02-19T17:00:00Z';
|
|
1390
|
-
|
|
1391
|
-
const SHARED_FORMATS = [
|
|
1392
|
-
'date',
|
|
1393
|
-
'date_long',
|
|
1394
|
-
'date_weekday',
|
|
1395
|
-
'date_time',
|
|
1396
|
-
'time',
|
|
1397
|
-
'system_date',
|
|
1398
|
-
'system_date_time',
|
|
1399
|
-
'system_time',
|
|
1400
|
-
] as const;
|
|
1401
|
-
|
|
1402
|
-
it.each(SHARED_FORMATS)(
|
|
1403
|
-
'renders %s identically as text and as a zone-less tooltip line',
|
|
1404
|
-
format => {
|
|
1405
|
-
render(
|
|
1406
|
-
<Timestamp
|
|
1407
|
-
value={VALUE}
|
|
1408
|
-
format={format}
|
|
1409
|
-
hasTooltip={false}
|
|
1410
|
-
data-testid="ts"
|
|
1411
|
-
/>,
|
|
1412
|
-
);
|
|
1413
|
-
const [line] = formatTooltipLines(new Date(VALUE), [{format}], 'en');
|
|
1414
|
-
expect(line.value).toBe(screen.getByTestId('ts').textContent);
|
|
1415
|
-
},
|
|
1416
|
-
);
|
|
1417
|
-
|
|
1418
|
-
it('renders the full style as the aria-label and as a line, differing only in zone-name spelling', () => {
|
|
1419
|
-
// 'full' is the one member with no visible-text counterpart — it backs
|
|
1420
|
-
// the accessible name of a relative timestamp and the tooltip's default
|
|
1421
|
-
// line. The two must not drift apart on anything but the zone name: the
|
|
1422
|
-
// aria-label spells the zone out in full for assistive tech (WCAG 3.1.4),
|
|
1423
|
-
// the visible line keeps the abbreviation. Comparing them after swapping
|
|
1424
|
-
// the abbreviation for the spelled-out form keeps this a direct
|
|
1425
|
-
// surface-to-surface check, so re-forking either path still fails here.
|
|
1426
|
-
render(
|
|
1427
|
-
<Timestamp
|
|
1428
|
-
value={VALUE}
|
|
1429
|
-
format="relative"
|
|
1430
|
-
hasTooltip={false}
|
|
1431
|
-
data-testid="ts"
|
|
1432
|
-
/>,
|
|
1433
|
-
);
|
|
1434
|
-
const date = new Date(VALUE);
|
|
1435
|
-
const tzPart = (form: 'short' | 'long') =>
|
|
1436
|
-
new Intl.DateTimeFormat('en', {timeZoneName: form})
|
|
1437
|
-
.formatToParts(date)
|
|
1438
|
-
.find(p => p.type === 'timeZoneName')?.value ?? '';
|
|
1439
|
-
const [line] = formatTooltipLines(date, [{format: 'full'}], 'en');
|
|
1440
|
-
expect(screen.getByTestId('ts').getAttribute('aria-label')).toBe(
|
|
1441
|
-
line.value.replace(tzPart('short'), tzPart('long')),
|
|
1442
|
-
);
|
|
1443
|
-
});
|
|
1444
|
-
});
|
|
1445
|
-
});
|
|
1446
|
-
|
|
1447
|
-
describe('Timestamp pass-through props', () => {
|
|
1448
|
-
it('forwards pass-through props to the time element', () => {
|
|
1449
|
-
render(
|
|
1450
|
-
<Timestamp
|
|
1451
|
-
value="2024-01-15T10:30:00Z"
|
|
1452
|
-
format="date_time"
|
|
1453
|
-
aria-label="Published"
|
|
1454
|
-
id="published-at"
|
|
1455
|
-
data-source="cms"
|
|
1456
|
-
data-testid="stamp"
|
|
1457
|
-
/>,
|
|
1458
|
-
);
|
|
1459
|
-
const time = screen.getByTestId('stamp');
|
|
1460
|
-
expect(time.tagName).toBe('TIME');
|
|
1461
|
-
expect(time).toHaveAttribute('aria-label', 'Published');
|
|
1462
|
-
expect(time).toHaveAttribute('id', 'published-at');
|
|
1463
|
-
expect(time).toHaveAttribute('data-source', 'cms');
|
|
1464
|
-
});
|
|
1465
|
-
|
|
1466
|
-
it("keeps a caller's aria-label on a relative timestamp (FR5)", () => {
|
|
1467
|
-
render(
|
|
1468
|
-
<Timestamp
|
|
1469
|
-
value={Date.now()}
|
|
1470
|
-
format="relative"
|
|
1471
|
-
aria-label="Caller label"
|
|
1472
|
-
data-source="cms"
|
|
1473
|
-
data-testid="stamp"
|
|
1474
|
-
/>,
|
|
1475
|
-
);
|
|
1476
|
-
const stamp = screen.getByTestId('stamp');
|
|
1477
|
-
expect({
|
|
1478
|
-
ariaLabel: stamp.getAttribute('aria-label'),
|
|
1479
|
-
dataSource: stamp.getAttribute('data-source'),
|
|
1480
|
-
}).toEqual({ariaLabel: 'Caller label', dataSource: 'cms'});
|
|
1481
|
-
});
|
|
1482
|
-
|
|
1483
|
-
it('names a relative timestamp by the full date when the caller names nothing (FR5)', () => {
|
|
1484
|
-
render(
|
|
1485
|
-
<Timestamp
|
|
1486
|
-
value={Date.now()}
|
|
1487
|
-
format="relative"
|
|
1488
|
-
aria-label={undefined}
|
|
1489
|
-
data-testid="stamp"
|
|
1490
|
-
/>,
|
|
1491
|
-
);
|
|
1492
|
-
expect(screen.getByTestId('stamp').getAttribute('aria-label')).toMatch(
|
|
1493
|
-
/\d{4}/,
|
|
1494
|
-
);
|
|
1495
|
-
});
|
|
1496
|
-
});
|
|
1497
|
-
|
|
1498
|
-
/**
|
|
1499
|
-
* Counts `new Date()` calls with no argument (reads of the current time) made
|
|
1500
|
-
* while `run` executes.
|
|
1501
|
-
*/
|
|
1502
|
-
function countClockReads(run: () => void): number {
|
|
1503
|
-
const ActiveDate = globalThis.Date;
|
|
1504
|
-
let reads = 0;
|
|
1505
|
-
class CountingDate extends ActiveDate {
|
|
1506
|
-
constructor(...args: [] | [string | number | Date]) {
|
|
1507
|
-
if (args.length === 0) {
|
|
1508
|
-
reads += 1;
|
|
1509
|
-
}
|
|
1510
|
-
super(...(args as [string | number | Date]));
|
|
1511
|
-
}
|
|
1512
|
-
}
|
|
1513
|
-
globalThis.Date = CountingDate as DateConstructor;
|
|
1514
|
-
try {
|
|
1515
|
-
run();
|
|
1516
|
-
} finally {
|
|
1517
|
-
globalThis.Date = ActiveDate;
|
|
1518
|
-
}
|
|
1519
|
-
return reads;
|
|
1520
|
-
}
|
|
1521
|
-
|
|
1522
|
-
describe('Timestamp server rendering', () => {
|
|
1523
|
-
beforeEach(() => {
|
|
1524
|
-
vi.useFakeTimers();
|
|
1525
|
-
vi.setSystemTime(new Date('2026-03-25T12:00:00Z'));
|
|
1526
|
-
});
|
|
1527
|
-
|
|
1528
|
-
afterEach(() => {
|
|
1529
|
-
vi.useRealTimers();
|
|
1530
|
-
});
|
|
1531
|
-
|
|
1532
|
-
it.each(['date', 'date_time', 'time', 'unix_seconds'] as const)(
|
|
1533
|
-
'never reads the current time for the absolute %s format',
|
|
1534
|
-
format => {
|
|
1535
|
-
const element = (
|
|
1536
|
-
<Timestamp value="2026-03-25T10:00:00Z" format={format} />
|
|
1537
|
-
);
|
|
1538
|
-
expect(countClockReads(() => renderToString(element))).toBe(0);
|
|
1539
|
-
expect(countClockReads(() => render(element))).toBe(0);
|
|
1540
|
-
},
|
|
1541
|
-
);
|
|
1542
|
-
|
|
1543
|
-
it.each(['relative', 'relative_short', 'auto'] as const)(
|
|
1544
|
-
'renders the %s format as the full date and time in UTC on the server without reading the clock',
|
|
1545
|
-
format => {
|
|
1546
|
-
const value = '2026-03-25T10:00:00Z';
|
|
1547
|
-
let html = '';
|
|
1548
|
-
expect(
|
|
1549
|
-
countClockReads(() => {
|
|
1550
|
-
html = renderToString(<Timestamp value={value} format={format} />);
|
|
1551
|
-
}),
|
|
1552
|
-
).toBe(0);
|
|
1553
|
-
const host = document.createElement('div');
|
|
1554
|
-
host.innerHTML = html;
|
|
1555
|
-
expect(host.textContent).toBe(
|
|
1556
|
-
formatInstant(new Date(value), 'date_time', 'en-US', {
|
|
1557
|
-
timeZone: 'UTC',
|
|
1558
|
-
isTimezoneShown: true,
|
|
1559
|
-
}),
|
|
1560
|
-
);
|
|
1561
|
-
},
|
|
1562
|
-
);
|
|
1563
|
-
|
|
1564
|
-
it('never commits the UTC placeholder when a client Timestamp switches to a relative format', () => {
|
|
1565
|
-
const value = Date.now() / 1000 - 7200;
|
|
1566
|
-
const committed: string[] = [];
|
|
1567
|
-
function Spy({format}: {format: 'date' | 'relative'}) {
|
|
1568
|
-
return (
|
|
1569
|
-
<Profiler
|
|
1570
|
-
id="ts"
|
|
1571
|
-
onRender={() => {
|
|
1572
|
-
committed.push(document.querySelector('time')?.textContent ?? '');
|
|
1573
|
-
}}>
|
|
1574
|
-
<Timestamp value={value} format={format} hasTooltip={false} />
|
|
1575
|
-
</Profiler>
|
|
1576
|
-
);
|
|
1577
|
-
}
|
|
1578
|
-
const {rerender} = render(<Spy format="date" />);
|
|
1579
|
-
committed.length = 0;
|
|
1580
|
-
rerender(<Spy format="relative" />);
|
|
1581
|
-
expect(screen.getByText('2 hours ago')).toBeInTheDocument();
|
|
1582
|
-
expect(committed.some(text => text.includes('UTC'))).toBe(false);
|
|
1583
|
-
});
|
|
1584
|
-
|
|
1585
|
-
describe('across time zones', () => {
|
|
1586
|
-
const originalTZ = process.env.TZ;
|
|
1587
|
-
|
|
1588
|
-
afterEach(() => {
|
|
1589
|
-
if (originalTZ === undefined) {
|
|
1590
|
-
delete process.env.TZ;
|
|
1591
|
-
} else {
|
|
1592
|
-
process.env.TZ = originalTZ;
|
|
1593
|
-
}
|
|
1594
|
-
});
|
|
1595
|
-
|
|
1596
|
-
it('writes the same server markup whatever the server time zone', () => {
|
|
1597
|
-
const element = (
|
|
1598
|
-
<Timestamp value="2026-03-25T10:00:00Z" format="relative" />
|
|
1599
|
-
);
|
|
1600
|
-
process.env.TZ = 'UTC';
|
|
1601
|
-
const utc = renderToString(element);
|
|
1602
|
-
process.env.TZ = 'Asia/Tokyo';
|
|
1603
|
-
expect(renderToString(element)).toBe(utc);
|
|
1604
|
-
});
|
|
1605
|
-
|
|
1606
|
-
it('hydrates server markup from another time zone without a mismatch', () => {
|
|
1607
|
-
const value = Date.now() / 1000 - 7200;
|
|
1608
|
-
const element = (
|
|
1609
|
-
<Timestamp value={value} format="relative" hasTooltip={false} />
|
|
1610
|
-
);
|
|
1611
|
-
process.env.TZ = 'UTC';
|
|
1612
|
-
const host = document.createElement('div');
|
|
1613
|
-
document.body.appendChild(host);
|
|
1614
|
-
host.innerHTML = renderToString(element);
|
|
1615
|
-
|
|
1616
|
-
process.env.TZ = 'America/Los_Angeles';
|
|
1617
|
-
const errors = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
1618
|
-
let root: Root | undefined;
|
|
1619
|
-
try {
|
|
1620
|
-
act(() => {
|
|
1621
|
-
root = hydrateRoot(host, element, {
|
|
1622
|
-
onRecoverableError: error => {
|
|
1623
|
-
throw error;
|
|
1624
|
-
},
|
|
1625
|
-
});
|
|
1626
|
-
});
|
|
1627
|
-
expect(host.textContent).toBe('2 hours ago');
|
|
1628
|
-
expect(errors).not.toHaveBeenCalled();
|
|
1629
|
-
} finally {
|
|
1630
|
-
errors.mockRestore();
|
|
1631
|
-
act(() => root?.unmount());
|
|
1632
|
-
host.remove();
|
|
1633
|
-
}
|
|
1634
|
-
});
|
|
1635
|
-
});
|
|
1636
|
-
|
|
1637
|
-
it('hydrates the server markup without a mismatch, then shows the relative phrase', () => {
|
|
1638
|
-
const value = Date.now() / 1000 - 7200;
|
|
1639
|
-
const element = (
|
|
1640
|
-
<Timestamp value={value} format="relative" hasTooltip={false} />
|
|
1641
|
-
);
|
|
1642
|
-
const host = document.createElement('div');
|
|
1643
|
-
document.body.appendChild(host);
|
|
1644
|
-
host.innerHTML = renderToString(element);
|
|
1645
|
-
expect(host.textContent).not.toBe('2 hours ago');
|
|
1646
|
-
|
|
1647
|
-
const errors = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
1648
|
-
let root: Root | undefined;
|
|
1649
|
-
try {
|
|
1650
|
-
act(() => {
|
|
1651
|
-
root = hydrateRoot(host, element);
|
|
1652
|
-
});
|
|
1653
|
-
expect(host.textContent).toBe('2 hours ago');
|
|
1654
|
-
expect(errors).not.toHaveBeenCalled();
|
|
1655
|
-
} finally {
|
|
1656
|
-
errors.mockRestore();
|
|
1657
|
-
act(() => root?.unmount());
|
|
1658
|
-
host.remove();
|
|
1659
|
-
}
|
|
1660
|
-
});
|
|
1661
|
-
});
|