@astryxdesign/core 0.7.6-canary.f73623d → 0.7.6-canary.f899313
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/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +2 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +8 -2
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +17 -18
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +8 -4
- package/dist/DropdownMenu/DropdownMenuGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuGroup.js +2 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +27 -2
- package/dist/FieldStatus/FieldStatus.d.ts +3 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +1 -0
- package/dist/FileInput/FileInput.d.ts +3 -0
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +59 -33
- package/dist/Layer/useTouchTrigger.d.ts +9 -0
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +1 -1
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +10 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +19 -9
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +11 -15
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +9 -6
- package/dist/Selector/hooks.js +2 -2
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +82 -10
- 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.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +16 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +10 -3
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +36 -10
- package/dist/astryx.css +1 -1
- 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/package.json +18 -5
- package/src/Badge/Badge.tsx +2 -1
- package/src/Chat/ChatMessage.spec.md +64 -65
- package/src/Citation/Citation.spec.md +60 -47
- package/src/ComplexSelector/ComplexSelector.tsx +19 -2
- package/src/DateInput/DateInput.spec.md +74 -57
- package/src/DateInput/MonthScroller.tsx +15 -17
- package/src/DateRangeInput/DateRangeInput.tsx +18 -3
- package/src/DropdownMenu/DropdownMenuGroup.tsx +2 -1
- package/src/Field/Field.doc.mjs +2 -1
- package/src/Field/FieldLabel.doc.mjs +4 -2
- package/src/Field/FieldLabel.spec.md +30 -21
- package/src/Field/FieldLabel.tsx +37 -3
- package/src/FieldStatus/FieldStatus.tsx +7 -0
- package/src/FileInput/FileInput.tsx +69 -28
- package/src/FormLayout/FormLayout.spec.md +11 -19
- package/src/Layer/useTouchTrigger.ts +1 -1
- package/src/Lightbox/Lightbox.spec.md +249 -61
- package/src/Link/Link.tsx +9 -2
- package/src/MultiSelector/MultiSelector.spec.md +121 -114
- package/src/MultiSelector/MultiSelector.tsx +19 -5
- package/src/NumberInput/NumberInput.tsx +11 -18
- package/src/ProgressBar/ProgressBar.spec.md +143 -119
- package/src/Selector/Selector.tsx +16 -6
- package/src/Selector/hooks.ts +2 -2
- package/src/Slider/Slider.spec.md +18 -16
- package/src/Slider/Slider.tsx +101 -9
- package/src/Token/Token.spec.md +24 -23
- package/src/Token/Token.tsx +15 -0
- package/src/Tokenizer/Tokenizer.tsx +10 -0
- package/src/Typeahead/BaseTypeahead.tsx +18 -2
- package/src/Typeahead/Typeahead.tsx +40 -9
- package/src/i18n/useListFormatter.ts +42 -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.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.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.test.tsx +0 -398
- package/src/AspectRatio/__tests__/AspectRatioFitLayers.a11y.browser.spec.ts +0 -158
- package/src/Avatar/Avatar.test.tsx +0 -867
- package/src/Avatar/AvatarStatusDot.test.tsx +0 -306
- package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +0 -126
- package/src/AvatarGroup/AvatarGroup.test.tsx +0 -313
- package/src/AvatarGroup/AvatarGroupOverflow.test.tsx +0 -263
- package/src/Badge/Badge.test.tsx +0 -125
- package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +0 -260
- package/src/Banner/Banner.test.tsx +0 -879
- package/src/Blockquote/Blockquote.test.tsx +0 -121
- 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.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/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.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.test.tsx +0 -1025
- 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.test.tsx +0 -202
- 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.test.tsx +0 -406
- package/src/Chat/ChatComposer.test.tsx +0 -364
- package/src/Chat/ChatComposerDrawer.test.tsx +0 -130
- package/src/Chat/ChatComposerInput.test.tsx +0 -2136
- package/src/Chat/ChatComposerTokenElement.test.tsx +0 -85
- package/src/Chat/ChatDictationButton.test.tsx +0 -108
- package/src/Chat/ChatLayout.test.tsx +0 -311
- package/src/Chat/ChatLayoutScrollButton.test.tsx +0 -99
- package/src/Chat/ChatMessage.test.tsx +0 -344
- package/src/Chat/ChatMessageBubble.test.tsx +0 -294
- package/src/Chat/ChatMessageList.test.tsx +0 -198
- package/src/Chat/ChatMessageMetadata.test.tsx +0 -66
- package/src/Chat/ChatPastedTextToken.test.tsx +0 -71
- package/src/Chat/ChatSendButton.test.tsx +0 -309
- package/src/Chat/ChatSystemMessage.test.tsx +0 -189
- package/src/Chat/ChatTokenizedText.test.tsx +0 -163
- 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.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.test.tsx +0 -1159
- package/src/CheckboxList/__tests__/CheckboxList.a11y.chromium.spec.ts +0 -1998
- package/src/Citation/Citation.test.tsx +0 -361
- package/src/ClickableCard/ClickableCard.test.tsx +0 -382
- package/src/Code/Code.test.tsx +0 -75
- package/src/CodeBlock/CodeBlock.highlightStyles.test.tsx +0 -87
- 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.test.tsx +0 -620
- 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.test.tsx +0 -750
- 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.test.tsx +0 -539
- package/src/CommandPalette/CommandPaletteItem.test.tsx +0 -417
- 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.test.tsx +0 -1171
- package/src/ComplexSelector/__tests__/ComplexSelector.a11y.chromium.spec.ts +0 -965
- package/src/ContextMenu/ContextMenu.test.tsx +0 -1617
- package/src/ContextMenu/ContextMenu.triggerProps.test.tsx +0 -54
- 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.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.test.tsx +0 -1151
- package/src/DateTimeInput/DateTimeInput.fr10.test.tsx +0 -319
- 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.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/useImperativeDialog.test.tsx +0 -78
- package/src/Divider/Divider.test.tsx +0 -155
- package/src/Drawer/Drawer.test.tsx +0 -1335
- package/src/Drawer/DrawerDirection.test.tsx +0 -127
- 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.ssr.test.tsx +0 -93
- package/src/DropdownMenu/DropdownMenu.test.tsx +0 -4498
- package/src/DropdownMenu/DropdownMenuContext.public.test.ts +0 -22
- package/src/DropdownMenu/DropdownMenuLazySheet.test.tsx +0 -126
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +0 -635
- package/src/DropdownMenu/DropdownMenuSheetFirstOpen.test.tsx +0 -72
- 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/EmptyState/EmptyState.announce.test.tsx +0 -227
- package/src/EmptyState/EmptyState.test.tsx +0 -284
- package/src/Field/Field.test.tsx +0 -800
- 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.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.test.tsx +0 -1291
- package/src/FormLayout/FormLayout.test.tsx +0 -444
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -46
- package/src/Grid/Grid.test.tsx +0 -509
- package/src/HStack/HStack.test.tsx +0 -129
- package/src/Heading/Heading.test.tsx +0 -328
- package/src/HoverCard/HoverCard.test.tsx +0 -1339
- package/src/Icon/Icon.test.tsx +0 -990
- package/src/Icon/globalIconRegistry.test.tsx +0 -613
- package/src/IconButton/IconButton.test.tsx +0 -156
- package/src/Indicator/Indicator.test.tsx +0 -389
- package/src/Indicator/indicatorRegistry.test.tsx +0 -106
- package/src/InputGroup/InputGroup.test.tsx +0 -502
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +0 -185
- package/src/Item/Item.source-build.test.mjs +0 -88
- 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.test.tsx +0 -299
- 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.test.tsx +0 -375
- 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.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.test.tsx +0 -457
- 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.test.tsx +0 -1052
- package/src/List/ListItem.source-build.test.mjs +0 -41
- 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.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/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.test.tsx +0 -383
- 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.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.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.test.tsx +0 -41
- 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.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.test.tsx +0 -1134
- package/src/Outline/OutlineFocus.a11y.chromium.spec.ts +0 -551
- package/src/Outline/parseOutlineFromMarkdown.test.ts +0 -104
- package/src/OverflowList/OverflowList.test.tsx +0 -1073
- package/src/Overlay/Overlay.test.tsx +0 -424
- package/src/Pagination/Pagination.test.tsx +0 -1754
- 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.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.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.test.tsx +0 -1051
- package/src/RadioList/RadioListItem.press.source-build.test.mjs +0 -80
- 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/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.test.tsx +0 -304
- package/src/Section/Section.test.tsx +0 -376
- package/src/SegmentedControl/SegmentedControl.test.tsx +0 -981
- 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.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.test.tsx +0 -4275
- package/src/SideNav/SideNavRailMotion.test.tsx +0 -620
- package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +0 -542
- package/src/SizeContext/SizeContext.test.tsx +0 -226
- package/src/Skeleton/Skeleton.test.tsx +0 -148
- package/src/Slider/Slider.fr10.test.tsx +0 -93
- 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.test.tsx +0 -484
- package/src/Stack/Stack.test.tsx +0 -473
- package/src/Stack/StackItem.test.tsx +0 -105
- package/src/StatusDot/StatusDot.test.tsx +0 -213
- package/src/Stepper/Stepper.public.test.ts +0 -91
- package/src/Stepper/Stepper.test.tsx +0 -2130
- package/src/Switch/Switch.focusRing.source-build.test.mjs +0 -81
- 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/TabList.test.tsx +0 -1755
- 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.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/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/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.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/tableContextMenu.test.tsx +0 -208
- 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.test.tsx +0 -1317
- package/src/TextInput/TextInput.fr10.test.tsx +0 -21
- 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.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.test.tsx +0 -907
- package/src/Timer/Timer.test.tsx +0 -302
- package/src/Timestamp/Timestamp.test.tsx +0 -1661
- package/src/Timestamp/tooltipEntries.test.ts +0 -566
- 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.test.tsx +0 -1000
- 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.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.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.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.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.test.tsx +0 -863
- package/src/TopNav/TopNavMegaMenu.reduced-motion.source-build.test.mjs +0 -83
- package/src/TopNav/TopNavMegaMenu.test.tsx +0 -1153
- package/src/TopNav/TopNavMenu.test.tsx +0 -502
- package/src/TopNav/__tests__/TopNavMobileLongHeading.a11y.chromium.spec.ts +0 -75
- 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.test.tsx +0 -553
- package/src/Typeahead/Typeahead.fr10.test.tsx +0 -28
- 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.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/__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,1291 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
/**
|
|
3
|
-
* @file useAnnounce.modal.test.tsx
|
|
4
|
-
* @input Uses vitest, Testing Library, useAnnounce, and the Astryx modals
|
|
5
|
-
* @output Proof of spec:AST-086 FR14: a message follows the nearest open
|
|
6
|
-
* native modal enclosing its caller — inside an Astryx Dialog, modal
|
|
7
|
-
* BottomSheet, modal Drawer or Lightbox it reaches that dialog's own
|
|
8
|
-
* persistent containers; a caller outside, or inside a non-modal sheet
|
|
9
|
-
* with no modal above it, keeps the shared channel; a non-modal sheet
|
|
10
|
-
* nested in a modal routes to the modal; a modal over a modal routes to
|
|
11
|
-
* the top one; a message unexposed when its modal closes is handed to the
|
|
12
|
-
* channel exposed after the close; join, identical-repeat and empty-message
|
|
13
|
-
* rules hold inside the dialog
|
|
14
|
-
* @position Core a11y tests beside the hook
|
|
15
|
-
*/
|
|
16
|
-
import {act, fireEvent, render, screen} from '@testing-library/react';
|
|
17
|
-
import {
|
|
18
|
-
useEffect,
|
|
19
|
-
useLayoutEffect,
|
|
20
|
-
useRef,
|
|
21
|
-
useState,
|
|
22
|
-
type ReactNode,
|
|
23
|
-
} from 'react';
|
|
24
|
-
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
|
|
25
|
-
import {BottomSheet} from '../BottomSheet/BottomSheet';
|
|
26
|
-
import {Dialog} from '../Dialog/Dialog';
|
|
27
|
-
import {Drawer} from '../Drawer/Drawer';
|
|
28
|
-
import {BottomSheetSwitcher} from '../BottomSheet/BottomSheetSwitcher';
|
|
29
|
-
import {Lightbox} from '../Lightbox/Lightbox';
|
|
30
|
-
import {MobileNav} from '../MobileNav/MobileNav';
|
|
31
|
-
import {Popover} from '../Popover/Popover';
|
|
32
|
-
import {DropdownMenu} from '../DropdownMenu/DropdownMenu';
|
|
33
|
-
import {useBusyAnnouncement} from './useBusyAnnouncement';
|
|
34
|
-
import {ModalAnnounceProvider} from './ModalAnnounceProvider';
|
|
35
|
-
import {__resetLiveRegionsForTest, useAnnounce} from './useAnnounce';
|
|
36
|
-
|
|
37
|
-
function Owner({
|
|
38
|
-
message = 'Added Design',
|
|
39
|
-
urgency,
|
|
40
|
-
label = 'Say',
|
|
41
|
-
}: {
|
|
42
|
-
message?: string;
|
|
43
|
-
urgency?: 'assertive';
|
|
44
|
-
label?: string;
|
|
45
|
-
}) {
|
|
46
|
-
const announce = useAnnounce();
|
|
47
|
-
return (
|
|
48
|
-
<button type="button" onClick={() => announce(message, urgency)}>
|
|
49
|
-
{label}
|
|
50
|
-
</button>
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function TwoMessageOwner() {
|
|
55
|
-
const announce = useAnnounce();
|
|
56
|
-
return (
|
|
57
|
-
<>
|
|
58
|
-
<button
|
|
59
|
-
type="button"
|
|
60
|
-
onClick={() => {
|
|
61
|
-
announce('Added Design');
|
|
62
|
-
announce('Removed Eng');
|
|
63
|
-
}}>
|
|
64
|
-
Both
|
|
65
|
-
</button>
|
|
66
|
-
<button type="button" onClick={() => announce('Loading')}>
|
|
67
|
-
Busy
|
|
68
|
-
</button>
|
|
69
|
-
<button type="button" onClick={() => announce('')}>
|
|
70
|
-
Withdraw
|
|
71
|
-
</button>
|
|
72
|
-
</>
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** jsdom has no showModal(); stand in for a dialog opened modally. */
|
|
77
|
-
function stubDialogs() {
|
|
78
|
-
HTMLDialogElement.prototype.showModal = vi.fn(function (
|
|
79
|
-
this: HTMLDialogElement,
|
|
80
|
-
) {
|
|
81
|
-
this.setAttribute('open', '');
|
|
82
|
-
this.dataset.modal = 'true';
|
|
83
|
-
});
|
|
84
|
-
HTMLDialogElement.prototype.show = vi.fn(function (this: HTMLDialogElement) {
|
|
85
|
-
this.setAttribute('open', '');
|
|
86
|
-
delete this.dataset.modal;
|
|
87
|
-
});
|
|
88
|
-
HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) {
|
|
89
|
-
this.removeAttribute('open');
|
|
90
|
-
delete this.dataset.modal;
|
|
91
|
-
this.dispatchEvent(new Event('close'));
|
|
92
|
-
});
|
|
93
|
-
const matches = Element.prototype.matches;
|
|
94
|
-
vi.spyOn(Element.prototype, 'matches').mockImplementation(function (
|
|
95
|
-
this: Element,
|
|
96
|
-
selector: string,
|
|
97
|
-
) {
|
|
98
|
-
return selector === ':modal'
|
|
99
|
-
? this instanceof HTMLDialogElement &&
|
|
100
|
-
this.open &&
|
|
101
|
-
this.dataset.modal === 'true'
|
|
102
|
-
: matches.call(this, selector);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async function nextFrame() {
|
|
107
|
-
await act(
|
|
108
|
-
async () =>
|
|
109
|
-
new Promise<void>(resolve => requestAnimationFrame(() => resolve())),
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const shared = (politeness = 'polite') =>
|
|
114
|
-
document.querySelector(`[data-astryx-live-region="${politeness}"]`);
|
|
115
|
-
const regionIn = (dialog: Element, politeness = 'polite') =>
|
|
116
|
-
dialog.querySelector(
|
|
117
|
-
`:scope > [data-astryx-modal-live-region="${politeness}"]`,
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
beforeEach(() => {
|
|
121
|
-
__resetLiveRegionsForTest();
|
|
122
|
-
stubDialogs();
|
|
123
|
-
});
|
|
124
|
-
afterEach(() => {
|
|
125
|
-
vi.restoreAllMocks();
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
describe('useAnnounce inside Astryx modals (spec:AST-086 FR14)', () => {
|
|
129
|
-
it('uses the shared channel outside any modal', async () => {
|
|
130
|
-
render(<Owner />);
|
|
131
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
132
|
-
await nextFrame();
|
|
133
|
-
expect(shared()).toHaveTextContent('Added Design');
|
|
134
|
-
expect(
|
|
135
|
-
document.querySelector('[data-astryx-modal-live-region]'),
|
|
136
|
-
).toBeNull();
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it.each([
|
|
140
|
-
[
|
|
141
|
-
'Dialog',
|
|
142
|
-
(children: ReactNode) => (
|
|
143
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Modal">
|
|
144
|
-
{children}
|
|
145
|
-
</Dialog>
|
|
146
|
-
),
|
|
147
|
-
],
|
|
148
|
-
[
|
|
149
|
-
'modal BottomSheet',
|
|
150
|
-
(children: ReactNode) => (
|
|
151
|
-
<BottomSheet isOpen onOpenChange={() => {}} label="Modal">
|
|
152
|
-
{children}
|
|
153
|
-
</BottomSheet>
|
|
154
|
-
),
|
|
155
|
-
],
|
|
156
|
-
[
|
|
157
|
-
'modal Drawer',
|
|
158
|
-
(children: ReactNode) => (
|
|
159
|
-
<Drawer isOpen onOpenChange={() => {}} label="Modal">
|
|
160
|
-
{children}
|
|
161
|
-
</Drawer>
|
|
162
|
-
),
|
|
163
|
-
],
|
|
164
|
-
] as const)(
|
|
165
|
-
'routes a caller inside an open %s into that dialog, not the shared channel',
|
|
166
|
-
async (_name, wrap) => {
|
|
167
|
-
render(wrap(<Owner />));
|
|
168
|
-
const dialog = screen.getByRole('dialog', {name: 'Modal'});
|
|
169
|
-
expect(dialog.matches(':modal')).toBe(true);
|
|
170
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
171
|
-
// Inserted empty (FR3), filled on the next frame.
|
|
172
|
-
const region = regionIn(dialog);
|
|
173
|
-
expect(region).not.toBeNull();
|
|
174
|
-
expect(region).toHaveAttribute('role', 'status');
|
|
175
|
-
expect(region).toHaveAttribute('aria-live', 'polite');
|
|
176
|
-
expect(region).toHaveTextContent('');
|
|
177
|
-
await nextFrame();
|
|
178
|
-
expect(region).toHaveTextContent('Added Design');
|
|
179
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
180
|
-
},
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
it("routes a caller inside a Popover's bottom-sheet presentation into that sheet", async () => {
|
|
184
|
-
// Popover's `presentation="bottom-sheet"` lazily renders the shared
|
|
185
|
-
// BottomSheet, so the provider BottomSheet renders covers it.
|
|
186
|
-
render(
|
|
187
|
-
<Popover label="Filters" presentation="bottom-sheet" content={<Owner />}>
|
|
188
|
-
<button type="button">Filter</button>
|
|
189
|
-
</Popover>,
|
|
190
|
-
);
|
|
191
|
-
fireEvent.click(screen.getByRole('button', {name: 'Filter'}));
|
|
192
|
-
const dialog = await screen.findByRole('dialog', {name: 'Filters'});
|
|
193
|
-
await screen.findByRole('button', {name: 'Say'});
|
|
194
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
195
|
-
await nextFrame();
|
|
196
|
-
expect(regionIn(dialog)).toHaveTextContent('Added Design');
|
|
197
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
it("routes a caller inside a DropdownMenu's bottom-sheet presentation into that sheet", async () => {
|
|
201
|
-
render(
|
|
202
|
-
<DropdownMenu
|
|
203
|
-
button={{label: 'Project actions'}}
|
|
204
|
-
presentation="bottom-sheet"
|
|
205
|
-
items={[{label: 'Edit project', onClick: () => {}}]}
|
|
206
|
-
footer={<Owner />}
|
|
207
|
-
/>,
|
|
208
|
-
);
|
|
209
|
-
fireEvent.click(screen.getByRole('button', {name: /Project actions/}));
|
|
210
|
-
const dialog = await screen.findByRole('dialog', {name: 'Project actions'});
|
|
211
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
212
|
-
await nextFrame();
|
|
213
|
-
expect(regionIn(dialog)).toHaveTextContent('Added Design');
|
|
214
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
it('holds no MutationObserver for a dialog closed at rest; observes from the open intent until the real close (runtime INV5)', async () => {
|
|
218
|
-
// The provider's watch is the one filtering on open/inert/aria-hidden.
|
|
219
|
-
const isPresentationWatch = (options?: MutationObserverInit) =>
|
|
220
|
-
options?.attributeFilter?.join() === 'open,inert,aria-hidden';
|
|
221
|
-
const observed: Node[] = [];
|
|
222
|
-
const disconnected: number[] = [];
|
|
223
|
-
const Original = globalThis.MutationObserver;
|
|
224
|
-
class Counting extends Original {
|
|
225
|
-
#isWatch = false;
|
|
226
|
-
observe(target: Node, options?: MutationObserverInit) {
|
|
227
|
-
if (isPresentationWatch(options)) {
|
|
228
|
-
this.#isWatch = true;
|
|
229
|
-
observed.push(target);
|
|
230
|
-
}
|
|
231
|
-
super.observe(target, options);
|
|
232
|
-
}
|
|
233
|
-
disconnect() {
|
|
234
|
-
if (this.#isWatch) {
|
|
235
|
-
disconnected.push(1);
|
|
236
|
-
}
|
|
237
|
-
super.disconnect();
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
vi.stubGlobal('MutationObserver', Counting);
|
|
241
|
-
try {
|
|
242
|
-
function Closed({isOpen}: {isOpen: boolean}) {
|
|
243
|
-
return (
|
|
244
|
-
<BottomSheet isOpen={isOpen} onOpenChange={() => {}} label="Rest">
|
|
245
|
-
<Owner />
|
|
246
|
-
</BottomSheet>
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
const {rerender} = render(<Closed isOpen={false} />);
|
|
250
|
-
expect(observed).toHaveLength(0);
|
|
251
|
-
rerender(<Closed isOpen />);
|
|
252
|
-
await nextFrame();
|
|
253
|
-
expect(observed).toHaveLength(1);
|
|
254
|
-
expect(observed[0]).toBe(screen.getByRole('dialog', {name: 'Rest'}));
|
|
255
|
-
const before = disconnected.length;
|
|
256
|
-
rerender(<Closed isOpen={false} />);
|
|
257
|
-
// The sheet runs its exit, then closes the dialog for real.
|
|
258
|
-
fireEvent.transitionEnd(document.querySelector('.astryx-bottom-sheet')!, {
|
|
259
|
-
propertyName: 'transform',
|
|
260
|
-
});
|
|
261
|
-
await nextFrame();
|
|
262
|
-
await nextFrame();
|
|
263
|
-
expect(disconnected.length).toBeGreaterThan(before);
|
|
264
|
-
} finally {
|
|
265
|
-
vi.unstubAllGlobals();
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
it('routes a caller inside an open Lightbox into its dialog', async () => {
|
|
270
|
-
// Lightbox renders no children; a caption is content inside its dialog.
|
|
271
|
-
render(
|
|
272
|
-
<Lightbox
|
|
273
|
-
isOpen
|
|
274
|
-
onOpenChange={() => {}}
|
|
275
|
-
media={{src: '/photo.jpg', alt: 'Photo', caption: <Owner />}}
|
|
276
|
-
/>,
|
|
277
|
-
);
|
|
278
|
-
const dialog = screen.getByRole('dialog', {name: 'Photo'});
|
|
279
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
280
|
-
await nextFrame();
|
|
281
|
-
expect(regionIn(dialog)).toHaveTextContent('Added Design');
|
|
282
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
it('keeps the shared channel inside a non-modal sheet with no modal above it', async () => {
|
|
286
|
-
render(
|
|
287
|
-
<BottomSheet
|
|
288
|
-
isOpen
|
|
289
|
-
onOpenChange={() => {}}
|
|
290
|
-
hasScrim={false}
|
|
291
|
-
label="Sheet">
|
|
292
|
-
<Owner />
|
|
293
|
-
</BottomSheet>,
|
|
294
|
-
);
|
|
295
|
-
const dialog = screen.getByRole('dialog', {name: 'Sheet'});
|
|
296
|
-
expect(dialog.matches(':modal')).toBe(false);
|
|
297
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
298
|
-
await nextFrame();
|
|
299
|
-
expect(shared()).toHaveTextContent('Added Design');
|
|
300
|
-
expect(regionIn(dialog)).toBeNull();
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
it('routes a caller inside a non-modal sheet nested in a Dialog to the Dialog', async () => {
|
|
304
|
-
render(
|
|
305
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Modal">
|
|
306
|
-
<BottomSheet
|
|
307
|
-
isOpen
|
|
308
|
-
onOpenChange={() => {}}
|
|
309
|
-
hasScrim={false}
|
|
310
|
-
label="Sheet">
|
|
311
|
-
<Owner />
|
|
312
|
-
</BottomSheet>
|
|
313
|
-
</Dialog>,
|
|
314
|
-
);
|
|
315
|
-
const modal = screen.getByRole('dialog', {name: 'Modal'});
|
|
316
|
-
const sheet = screen.getByRole('dialog', {name: 'Sheet'});
|
|
317
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
318
|
-
await nextFrame();
|
|
319
|
-
expect(regionIn(modal)).toHaveTextContent('Added Design');
|
|
320
|
-
expect(regionIn(sheet)).toBeNull();
|
|
321
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
it('routes a caller inside a modal over a modal to the top one', async () => {
|
|
325
|
-
function Host() {
|
|
326
|
-
const [isUpperOpen, setIsUpperOpen] = useState(false);
|
|
327
|
-
return (
|
|
328
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Lower">
|
|
329
|
-
<Owner label="Lower say" message="Lower words" />
|
|
330
|
-
<button type="button" onClick={() => setIsUpperOpen(true)}>
|
|
331
|
-
Open upper
|
|
332
|
-
</button>
|
|
333
|
-
<Dialog
|
|
334
|
-
isOpen={isUpperOpen}
|
|
335
|
-
onOpenChange={setIsUpperOpen}
|
|
336
|
-
aria-label="Upper">
|
|
337
|
-
<Owner label="Upper say" message="Upper words" />
|
|
338
|
-
</Dialog>
|
|
339
|
-
</Dialog>
|
|
340
|
-
);
|
|
341
|
-
}
|
|
342
|
-
render(<Host />);
|
|
343
|
-
const lower = screen.getByRole('dialog', {name: 'Lower'});
|
|
344
|
-
await nextFrame();
|
|
345
|
-
fireEvent.click(screen.getByRole('button', {name: 'Open upper'}));
|
|
346
|
-
const upper = screen.getByRole('dialog', {name: 'Upper'});
|
|
347
|
-
await nextFrame();
|
|
348
|
-
fireEvent.click(screen.getByRole('button', {name: 'Upper say'}));
|
|
349
|
-
fireEvent.click(screen.getByRole('button', {name: 'Lower say'}));
|
|
350
|
-
await nextFrame();
|
|
351
|
-
expect(regionIn(upper)).toHaveTextContent('Upper words');
|
|
352
|
-
// The lower modal is covered: its owner is not operable until the upper
|
|
353
|
-
// one closes, and a message it announces meanwhile is not heard — its
|
|
354
|
-
// container is clear before it is on top again (FR14).
|
|
355
|
-
expect(regionIn(lower)?.textContent ?? '').toBe('');
|
|
356
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
it('clears words a modal received while covered before it is on top again (FR14)', async () => {
|
|
360
|
-
function Host() {
|
|
361
|
-
const [isUpperOpen, setIsUpperOpen] = useState(false);
|
|
362
|
-
return (
|
|
363
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Lower">
|
|
364
|
-
<Owner label="Lower say" message="Lower words" />
|
|
365
|
-
<button type="button" onClick={() => setIsUpperOpen(true)}>
|
|
366
|
-
Cover
|
|
367
|
-
</button>
|
|
368
|
-
<Dialog
|
|
369
|
-
isOpen={isUpperOpen}
|
|
370
|
-
onOpenChange={setIsUpperOpen}
|
|
371
|
-
aria-label="Upper">
|
|
372
|
-
<button type="button" onClick={() => setIsUpperOpen(false)}>
|
|
373
|
-
Uncover
|
|
374
|
-
</button>
|
|
375
|
-
</Dialog>
|
|
376
|
-
</Dialog>
|
|
377
|
-
);
|
|
378
|
-
}
|
|
379
|
-
render(<Host />);
|
|
380
|
-
const lower = screen.getByRole('dialog', {name: 'Lower'});
|
|
381
|
-
await nextFrame();
|
|
382
|
-
fireEvent.click(screen.getByRole('button', {name: 'Cover'}));
|
|
383
|
-
await nextFrame();
|
|
384
|
-
fireEvent.click(screen.getByRole('button', {name: 'Lower say'}));
|
|
385
|
-
await nextFrame();
|
|
386
|
-
fireEvent.click(screen.getByRole('button', {name: 'Uncover'}));
|
|
387
|
-
await nextFrame();
|
|
388
|
-
await nextFrame();
|
|
389
|
-
// On top again within the clear delay, holding nothing from the time it
|
|
390
|
-
// was covered.
|
|
391
|
-
expect(lower.matches(':modal')).toBe(true);
|
|
392
|
-
expect(regionIn(lower)?.textContent ?? '').toBe('');
|
|
393
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
394
|
-
// Heard again now that it is on top.
|
|
395
|
-
fireEvent.click(screen.getByRole('button', {name: 'Lower say'}));
|
|
396
|
-
await nextFrame();
|
|
397
|
-
expect(regionIn(lower)).toHaveTextContent('Lower words');
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
it('routes a message announced in the commit that opens its Dialog into the Dialog (the field error a mounting form announces)', async () => {
|
|
401
|
-
function FieldError() {
|
|
402
|
-
const announce = useAnnounce();
|
|
403
|
-
useEffect(() => {
|
|
404
|
-
// The Dialog presents from its own Effect, which runs after this one.
|
|
405
|
-
announce('Name is required', 'assertive');
|
|
406
|
-
}, [announce]);
|
|
407
|
-
return <span>Name is required</span>;
|
|
408
|
-
}
|
|
409
|
-
function Host() {
|
|
410
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
411
|
-
return (
|
|
412
|
-
<>
|
|
413
|
-
<button type="button" onClick={() => setIsOpen(true)}>
|
|
414
|
-
Open
|
|
415
|
-
</button>
|
|
416
|
-
{isOpen && (
|
|
417
|
-
<Dialog isOpen onOpenChange={setIsOpen} aria-label="Edit">
|
|
418
|
-
<FieldError />
|
|
419
|
-
</Dialog>
|
|
420
|
-
)}
|
|
421
|
-
</>
|
|
422
|
-
);
|
|
423
|
-
}
|
|
424
|
-
render(<Host />);
|
|
425
|
-
fireEvent.click(screen.getByRole('button', {name: 'Open'}));
|
|
426
|
-
const dialog = screen.getByRole('dialog', {name: 'Edit'});
|
|
427
|
-
expect(dialog.matches(':modal')).toBe(true);
|
|
428
|
-
await nextFrame();
|
|
429
|
-
await nextFrame();
|
|
430
|
-
expect(regionIn(dialog, 'assertive')).toHaveTextContent('Name is required');
|
|
431
|
-
expect(shared('assertive')?.textContent ?? '').toBe('');
|
|
432
|
-
});
|
|
433
|
-
|
|
434
|
-
it('lets an empty message in the commit that opens the Dialog withdraw a message deferred in that commit (FR9)', async () => {
|
|
435
|
-
function FieldError() {
|
|
436
|
-
const announce = useAnnounce();
|
|
437
|
-
useEffect(() => {
|
|
438
|
-
announce('Name is required', 'assertive');
|
|
439
|
-
// Taken back in the same commit, before the Dialog has presented.
|
|
440
|
-
announce('', 'assertive');
|
|
441
|
-
}, [announce]);
|
|
442
|
-
return <span>Name</span>;
|
|
443
|
-
}
|
|
444
|
-
function Host() {
|
|
445
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
446
|
-
return (
|
|
447
|
-
<>
|
|
448
|
-
<button type="button" onClick={() => setIsOpen(true)}>
|
|
449
|
-
Open
|
|
450
|
-
</button>
|
|
451
|
-
{isOpen && (
|
|
452
|
-
<Dialog isOpen onOpenChange={setIsOpen} aria-label="Edit">
|
|
453
|
-
<FieldError />
|
|
454
|
-
</Dialog>
|
|
455
|
-
)}
|
|
456
|
-
</>
|
|
457
|
-
);
|
|
458
|
-
}
|
|
459
|
-
render(<Host />);
|
|
460
|
-
fireEvent.click(screen.getByRole('button', {name: 'Open'}));
|
|
461
|
-
const dialog = screen.getByRole('dialog', {name: 'Edit'});
|
|
462
|
-
await nextFrame();
|
|
463
|
-
await nextFrame();
|
|
464
|
-
expect(regionIn(dialog, 'assertive')?.textContent ?? '').toBe('');
|
|
465
|
-
expect(shared('assertive')?.textContent ?? '').toBe('');
|
|
466
|
-
});
|
|
467
|
-
|
|
468
|
-
it('lets an empty message withdraw a message announced in the same commit inside an already-open Dialog (FR9)', async () => {
|
|
469
|
-
function Pair() {
|
|
470
|
-
const announce = useAnnounce();
|
|
471
|
-
return (
|
|
472
|
-
<button
|
|
473
|
-
type="button"
|
|
474
|
-
onClick={() => {
|
|
475
|
-
announce('3 results');
|
|
476
|
-
announce('');
|
|
477
|
-
}}>
|
|
478
|
-
Pair
|
|
479
|
-
</button>
|
|
480
|
-
);
|
|
481
|
-
}
|
|
482
|
-
render(
|
|
483
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Modal">
|
|
484
|
-
<Pair />
|
|
485
|
-
</Dialog>,
|
|
486
|
-
);
|
|
487
|
-
const dialog = screen.getByRole('dialog', {name: 'Modal'});
|
|
488
|
-
await nextFrame();
|
|
489
|
-
fireEvent.click(screen.getByRole('button', {name: 'Pair'}));
|
|
490
|
-
await nextFrame();
|
|
491
|
-
await nextFrame();
|
|
492
|
-
expect(regionIn(dialog)?.textContent ?? '').toBe('');
|
|
493
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
494
|
-
});
|
|
495
|
-
|
|
496
|
-
it("routes a caller inside a closed Dialog (content still mounted) to the shared channel at once, joined with the frame's other messages (FR9)", async () => {
|
|
497
|
-
function Announcer({message}: {message: string}) {
|
|
498
|
-
const announce = useAnnounce();
|
|
499
|
-
useEffect(() => {
|
|
500
|
-
announce(message);
|
|
501
|
-
}, [announce, message]);
|
|
502
|
-
return null;
|
|
503
|
-
}
|
|
504
|
-
render(
|
|
505
|
-
<>
|
|
506
|
-
<Announcer message="Page loaded" />
|
|
507
|
-
<Dialog isOpen={false} onOpenChange={() => {}} aria-label="Closed">
|
|
508
|
-
<Announcer message="Inside closed" />
|
|
509
|
-
</Dialog>
|
|
510
|
-
</>,
|
|
511
|
-
);
|
|
512
|
-
await nextFrame();
|
|
513
|
-
await nextFrame();
|
|
514
|
-
// Both written in one commit, both exposed, in order: neither dropped.
|
|
515
|
-
expect(shared()?.textContent).toBe('Page loaded Inside closed');
|
|
516
|
-
expect(
|
|
517
|
-
document.querySelector('[data-astryx-modal-live-region]'),
|
|
518
|
-
).toBeNull();
|
|
519
|
-
});
|
|
520
|
-
|
|
521
|
-
it.each([
|
|
522
|
-
[
|
|
523
|
-
'Dialog',
|
|
524
|
-
(children: ReactNode) => (
|
|
525
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Inner">
|
|
526
|
-
{children}
|
|
527
|
-
</Dialog>
|
|
528
|
-
),
|
|
529
|
-
],
|
|
530
|
-
[
|
|
531
|
-
'modal BottomSheet',
|
|
532
|
-
(children: ReactNode) => (
|
|
533
|
-
<BottomSheet isOpen onOpenChange={() => {}} label="Inner">
|
|
534
|
-
{children}
|
|
535
|
-
</BottomSheet>
|
|
536
|
-
),
|
|
537
|
-
],
|
|
538
|
-
] as const)(
|
|
539
|
-
'routes a message announced in the commit that opens a %s inside an already-open Dialog into the inner modal, not the outer one',
|
|
540
|
-
async (_name, wrapInner) => {
|
|
541
|
-
function FieldError() {
|
|
542
|
-
const announce = useAnnounce();
|
|
543
|
-
useEffect(() => {
|
|
544
|
-
announce('Name is required', 'assertive');
|
|
545
|
-
}, [announce]);
|
|
546
|
-
return <span>Name</span>;
|
|
547
|
-
}
|
|
548
|
-
function Host() {
|
|
549
|
-
const [isInnerOpen, setIsInnerOpen] = useState(false);
|
|
550
|
-
return (
|
|
551
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Outer">
|
|
552
|
-
<button type="button" onClick={() => setIsInnerOpen(true)}>
|
|
553
|
-
Open inner
|
|
554
|
-
</button>
|
|
555
|
-
{isInnerOpen && wrapInner(<FieldError />)}
|
|
556
|
-
</Dialog>
|
|
557
|
-
);
|
|
558
|
-
}
|
|
559
|
-
render(<Host />);
|
|
560
|
-
const outer = screen.getByRole('dialog', {name: 'Outer'});
|
|
561
|
-
await nextFrame();
|
|
562
|
-
fireEvent.click(screen.getByRole('button', {name: 'Open inner'}));
|
|
563
|
-
const inner = screen.getByRole('dialog', {name: 'Inner'});
|
|
564
|
-
expect(inner.matches(':modal')).toBe(true);
|
|
565
|
-
await nextFrame();
|
|
566
|
-
await nextFrame();
|
|
567
|
-
expect(regionIn(inner, 'assertive')).toHaveTextContent(
|
|
568
|
-
'Name is required',
|
|
569
|
-
);
|
|
570
|
-
expect(regionIn(outer, 'assertive')).toBeNull();
|
|
571
|
-
expect(shared('assertive')?.textContent ?? '').toBe('');
|
|
572
|
-
},
|
|
573
|
-
);
|
|
574
|
-
|
|
575
|
-
it('is heard from app code rendered inside a Dialog', async () => {
|
|
576
|
-
function AppForm() {
|
|
577
|
-
const announce = useAnnounce();
|
|
578
|
-
return (
|
|
579
|
-
<form
|
|
580
|
-
onSubmit={event => {
|
|
581
|
-
event.preventDefault();
|
|
582
|
-
announce('Saved');
|
|
583
|
-
}}>
|
|
584
|
-
<button type="submit">Save</button>
|
|
585
|
-
</form>
|
|
586
|
-
);
|
|
587
|
-
}
|
|
588
|
-
render(
|
|
589
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Edit">
|
|
590
|
-
<AppForm />
|
|
591
|
-
</Dialog>,
|
|
592
|
-
);
|
|
593
|
-
fireEvent.click(screen.getByRole('button', {name: 'Save'}));
|
|
594
|
-
await nextFrame();
|
|
595
|
-
expect(
|
|
596
|
-
regionIn(screen.getByRole('dialog', {name: 'Edit'})),
|
|
597
|
-
).toHaveTextContent('Saved');
|
|
598
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
599
|
-
});
|
|
600
|
-
|
|
601
|
-
it('joins different messages written before the previous is exposed, says an identical repeat once, and clears on an empty message (FR9, FR5)', async () => {
|
|
602
|
-
render(
|
|
603
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Modal">
|
|
604
|
-
<TwoMessageOwner />
|
|
605
|
-
<Owner urgency="assertive" message="Failed" label="Fail" />
|
|
606
|
-
</Dialog>,
|
|
607
|
-
);
|
|
608
|
-
const dialog = screen.getByRole('dialog', {name: 'Modal'});
|
|
609
|
-
fireEvent.click(screen.getByRole('button', {name: 'Both'}));
|
|
610
|
-
fireEvent.click(screen.getByRole('button', {name: 'Both'}));
|
|
611
|
-
await nextFrame();
|
|
612
|
-
expect(regionIn(dialog)?.textContent).toBe('Added Design Removed Eng');
|
|
613
|
-
// A message in the frame the words were written still joins.
|
|
614
|
-
fireEvent.click(screen.getByRole('button', {name: 'Busy'}));
|
|
615
|
-
await nextFrame();
|
|
616
|
-
expect(regionIn(dialog)?.textContent).toBe(
|
|
617
|
-
'Added Design Removed Eng Loading',
|
|
618
|
-
);
|
|
619
|
-
// A frame later the words count as exposed: a new message starts fresh.
|
|
620
|
-
await nextFrame();
|
|
621
|
-
fireEvent.click(screen.getByRole('button', {name: 'Busy'}));
|
|
622
|
-
await nextFrame();
|
|
623
|
-
expect(regionIn(dialog)?.textContent).toBe('Loading');
|
|
624
|
-
// Assertive has its own container.
|
|
625
|
-
fireEvent.click(screen.getByRole('button', {name: 'Fail'}));
|
|
626
|
-
await nextFrame();
|
|
627
|
-
expect(regionIn(dialog, 'assertive')).toHaveAttribute('role', 'alert');
|
|
628
|
-
expect(regionIn(dialog, 'assertive')).toHaveTextContent('Failed');
|
|
629
|
-
expect(regionIn(dialog)?.textContent).toBe('Loading');
|
|
630
|
-
// An empty message withdraws the pending and shown polite text at once.
|
|
631
|
-
fireEvent.click(screen.getByRole('button', {name: 'Both'}));
|
|
632
|
-
fireEvent.click(screen.getByRole('button', {name: 'Withdraw'}));
|
|
633
|
-
await nextFrame();
|
|
634
|
-
expect(regionIn(dialog)?.textContent).toBe('');
|
|
635
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
636
|
-
});
|
|
637
|
-
|
|
638
|
-
it('hands a message unexposed when its Dialog closes to the shared channel', async () => {
|
|
639
|
-
function SaveAndClose({onDone}: {onDone: () => void}) {
|
|
640
|
-
const announce = useAnnounce();
|
|
641
|
-
return (
|
|
642
|
-
<button
|
|
643
|
-
type="button"
|
|
644
|
-
onClick={() => {
|
|
645
|
-
announce('Saved');
|
|
646
|
-
onDone();
|
|
647
|
-
}}>
|
|
648
|
-
Save and close
|
|
649
|
-
</button>
|
|
650
|
-
);
|
|
651
|
-
}
|
|
652
|
-
function Host() {
|
|
653
|
-
const [isOpen, setIsOpen] = useState(true);
|
|
654
|
-
return (
|
|
655
|
-
<Dialog isOpen={isOpen} onOpenChange={setIsOpen} aria-label="Edit">
|
|
656
|
-
<SaveAndClose onDone={() => setIsOpen(false)} />
|
|
657
|
-
</Dialog>
|
|
658
|
-
);
|
|
659
|
-
}
|
|
660
|
-
render(<Host />);
|
|
661
|
-
fireEvent.click(screen.getByRole('button', {name: 'Save and close'}));
|
|
662
|
-
await nextFrame();
|
|
663
|
-
await nextFrame();
|
|
664
|
-
// Not lost in the closed dialog: the page-body channel has it.
|
|
665
|
-
expect(shared()).toHaveTextContent('Saved');
|
|
666
|
-
});
|
|
667
|
-
|
|
668
|
-
it('hands a message unexposed when an upper modal closes to the modal then on top', async () => {
|
|
669
|
-
function Palette({onDone}: {onDone: () => void}) {
|
|
670
|
-
const announce = useAnnounce();
|
|
671
|
-
return (
|
|
672
|
-
<button
|
|
673
|
-
type="button"
|
|
674
|
-
onClick={() => {
|
|
675
|
-
announce('3 results');
|
|
676
|
-
onDone();
|
|
677
|
-
}}>
|
|
678
|
-
Pick
|
|
679
|
-
</button>
|
|
680
|
-
);
|
|
681
|
-
}
|
|
682
|
-
function Host() {
|
|
683
|
-
const [isUpperOpen, setIsUpperOpen] = useState(true);
|
|
684
|
-
return (
|
|
685
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Lower">
|
|
686
|
-
<Dialog
|
|
687
|
-
isOpen={isUpperOpen}
|
|
688
|
-
onOpenChange={setIsUpperOpen}
|
|
689
|
-
aria-label="Upper">
|
|
690
|
-
<Palette onDone={() => setIsUpperOpen(false)} />
|
|
691
|
-
</Dialog>
|
|
692
|
-
</Dialog>
|
|
693
|
-
);
|
|
694
|
-
}
|
|
695
|
-
render(<Host />);
|
|
696
|
-
const lower = screen.getByRole('dialog', {name: 'Lower'});
|
|
697
|
-
fireEvent.click(screen.getByRole('button', {name: 'Pick'}));
|
|
698
|
-
await nextFrame();
|
|
699
|
-
await nextFrame();
|
|
700
|
-
expect(regionIn(lower)).toHaveTextContent('3 results');
|
|
701
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
702
|
-
});
|
|
703
|
-
|
|
704
|
-
it('keeps a waiting message in a dialog that is closed and shown again in one task (a hand-over, not a close)', async () => {
|
|
705
|
-
// A switcher moves one shared dialog between steps: close() then
|
|
706
|
-
// showModal() in the same task. The native close event must not hand the
|
|
707
|
-
// step's words to the page body the person cannot hear.
|
|
708
|
-
render(
|
|
709
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Modal">
|
|
710
|
-
<Owner message="80 results" />
|
|
711
|
-
</Dialog>,
|
|
712
|
-
);
|
|
713
|
-
const dialog = document.querySelector<HTMLDialogElement>('dialog')!;
|
|
714
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
715
|
-
act(() => {
|
|
716
|
-
dialog.close();
|
|
717
|
-
dialog.showModal();
|
|
718
|
-
});
|
|
719
|
-
await nextFrame();
|
|
720
|
-
await nextFrame();
|
|
721
|
-
expect(regionIn(dialog)).toHaveTextContent('80 results');
|
|
722
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
723
|
-
});
|
|
724
|
-
|
|
725
|
-
it('keeps a waiting message when the dialog is re-presented from a later layout effect', async () => {
|
|
726
|
-
// The entering step is presented in a layout effect of a later commit,
|
|
727
|
-
// not in the task that closed the leaving step.
|
|
728
|
-
function Steps() {
|
|
729
|
-
const [step, setStep] = useState(1);
|
|
730
|
-
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
731
|
-
useLayoutEffect(() => {
|
|
732
|
-
const dialog = dialogRef.current;
|
|
733
|
-
if (dialog != null && !dialog.open) {
|
|
734
|
-
dialog.showModal();
|
|
735
|
-
}
|
|
736
|
-
}, [step]);
|
|
737
|
-
return (
|
|
738
|
-
<Dialog
|
|
739
|
-
ref={dialogRef}
|
|
740
|
-
isOpen
|
|
741
|
-
onOpenChange={() => {}}
|
|
742
|
-
aria-label="Modal">
|
|
743
|
-
<Owner message={`Step ${step} words`} />
|
|
744
|
-
<button
|
|
745
|
-
type="button"
|
|
746
|
-
onClick={() => {
|
|
747
|
-
// Close the dialog as the leaving step would, and move on; the
|
|
748
|
-
// next commit's layout effect presents the entering step.
|
|
749
|
-
dialogRef.current?.close();
|
|
750
|
-
setStep(2);
|
|
751
|
-
}}>
|
|
752
|
-
Next
|
|
753
|
-
</button>
|
|
754
|
-
</Dialog>
|
|
755
|
-
);
|
|
756
|
-
}
|
|
757
|
-
render(<Steps />);
|
|
758
|
-
const dialog = document.querySelector<HTMLDialogElement>('dialog')!;
|
|
759
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
760
|
-
fireEvent.click(screen.getByRole('button', {name: 'Next'}));
|
|
761
|
-
expect(dialog.open).toBe(true);
|
|
762
|
-
await nextFrame();
|
|
763
|
-
await nextFrame();
|
|
764
|
-
expect(regionIn(dialog)).toHaveTextContent('Step 1 words');
|
|
765
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
766
|
-
});
|
|
767
|
-
|
|
768
|
-
it('hands a message unexposed when a step closes to the sibling step opened in its place (the modal then on top)', async () => {
|
|
769
|
-
// A flow of sibling modals, as a switcher presents its steps: the leaving
|
|
770
|
-
// step announces and closes in the same update that opens the entering
|
|
771
|
-
// step. The entering step is not an ancestor of the leaving one; it is
|
|
772
|
-
// the modal on top after the close, so the words are delivered there.
|
|
773
|
-
function Flow() {
|
|
774
|
-
const [step, setStep] = useState(1);
|
|
775
|
-
return (
|
|
776
|
-
<>
|
|
777
|
-
<Dialog isOpen={step === 1} onOpenChange={() => {}} aria-label="One">
|
|
778
|
-
<Owner message="Step one saved" label="Say" />
|
|
779
|
-
<button type="button" onClick={() => setStep(2)}>
|
|
780
|
-
Next
|
|
781
|
-
</button>
|
|
782
|
-
</Dialog>
|
|
783
|
-
<Dialog isOpen={step === 2} onOpenChange={() => {}} aria-label="Two">
|
|
784
|
-
<span>Step two</span>
|
|
785
|
-
</Dialog>
|
|
786
|
-
</>
|
|
787
|
-
);
|
|
788
|
-
}
|
|
789
|
-
render(<Flow />);
|
|
790
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
791
|
-
fireEvent.click(screen.getByRole('button', {name: 'Next'}));
|
|
792
|
-
const two = screen.getByRole('dialog', {name: 'Two'});
|
|
793
|
-
await nextFrame();
|
|
794
|
-
await nextFrame();
|
|
795
|
-
expect(regionIn(two)).toHaveTextContent('Step one saved');
|
|
796
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
797
|
-
});
|
|
798
|
-
|
|
799
|
-
it('holds words sent as a modal BottomSheet closes — open but inert and aria-hidden through its exit — and delivers them to the page body at the real close', async () => {
|
|
800
|
-
function Host() {
|
|
801
|
-
const [isOpen, setIsOpen] = useState(true);
|
|
802
|
-
return (
|
|
803
|
-
<BottomSheet isOpen={isOpen} onOpenChange={setIsOpen} label="Sheet">
|
|
804
|
-
<Owner message="Saved" />
|
|
805
|
-
<button type="button" onClick={() => setIsOpen(false)}>
|
|
806
|
-
Done
|
|
807
|
-
</button>
|
|
808
|
-
</BottomSheet>
|
|
809
|
-
);
|
|
810
|
-
}
|
|
811
|
-
render(<Host />);
|
|
812
|
-
const sheet = document.querySelector<HTMLDialogElement>('dialog')!;
|
|
813
|
-
await nextFrame();
|
|
814
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
815
|
-
fireEvent.click(screen.getByRole('button', {name: 'Done'}));
|
|
816
|
-
// The sheet keeps its dialog open and modal while it leaves, but takes
|
|
817
|
-
// it out of the accessibility tree; the page body is behind an active
|
|
818
|
-
// modal until the dialog closes, so nothing is exposed yet and the
|
|
819
|
-
// words wait.
|
|
820
|
-
expect(sheet.open).toBe(true);
|
|
821
|
-
expect(sheet).toHaveAttribute('aria-hidden', 'true');
|
|
822
|
-
expect(sheet).toHaveAttribute('inert');
|
|
823
|
-
await nextFrame();
|
|
824
|
-
await nextFrame();
|
|
825
|
-
expect(regionIn(sheet)?.textContent ?? '').toBe('');
|
|
826
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
827
|
-
// The exit motion ends: the dialog closes and the page body is exposed.
|
|
828
|
-
act(() => {
|
|
829
|
-
sheet.close();
|
|
830
|
-
});
|
|
831
|
-
await nextFrame();
|
|
832
|
-
await nextFrame();
|
|
833
|
-
expect(shared()).toHaveTextContent('Saved');
|
|
834
|
-
});
|
|
835
|
-
it('drops held words when an empty message withdraws them while the sheet exits, so nothing is delivered after the close', async () => {
|
|
836
|
-
function Host() {
|
|
837
|
-
const [isOpen, setIsOpen] = useState(true);
|
|
838
|
-
return (
|
|
839
|
-
<BottomSheet isOpen={isOpen} onOpenChange={setIsOpen} label="Sheet">
|
|
840
|
-
<TwoMessageOwner />
|
|
841
|
-
<button type="button" onClick={() => setIsOpen(false)}>
|
|
842
|
-
Done
|
|
843
|
-
</button>
|
|
844
|
-
</BottomSheet>
|
|
845
|
-
);
|
|
846
|
-
}
|
|
847
|
-
render(<Host />);
|
|
848
|
-
const sheet = document.querySelector<HTMLDialogElement>('dialog')!;
|
|
849
|
-
await nextFrame();
|
|
850
|
-
fireEvent.click(screen.getByRole('button', {name: 'Busy'}));
|
|
851
|
-
fireEvent.click(screen.getByRole('button', {name: 'Done'}));
|
|
852
|
-
// Held for the real close, as the sheet-exit test shows...
|
|
853
|
-
expect(sheet).toHaveAttribute('inert');
|
|
854
|
-
await nextFrame();
|
|
855
|
-
// ...until the owner takes the words back with an empty message (the
|
|
856
|
-
// exiting sheet is aria-hidden, so reach its control by element).
|
|
857
|
-
fireEvent.click(screen.getByText('Withdraw'));
|
|
858
|
-
act(() => {
|
|
859
|
-
sheet.close();
|
|
860
|
-
});
|
|
861
|
-
await nextFrame();
|
|
862
|
-
await nextFrame();
|
|
863
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
864
|
-
expect(regionIn(sheet)?.textContent ?? '').toBe('');
|
|
865
|
-
});
|
|
866
|
-
|
|
867
|
-
it('hands words sent as a switcher step hands over to the entering step', async () => {
|
|
868
|
-
window.scrollTo = vi.fn();
|
|
869
|
-
vi.stubGlobal(
|
|
870
|
-
'matchMedia',
|
|
871
|
-
vi.fn().mockReturnValue({
|
|
872
|
-
matches: false,
|
|
873
|
-
media: '',
|
|
874
|
-
onchange: null,
|
|
875
|
-
addEventListener: vi.fn(),
|
|
876
|
-
removeEventListener: vi.fn(),
|
|
877
|
-
addListener: vi.fn(),
|
|
878
|
-
removeListener: vi.fn(),
|
|
879
|
-
dispatchEvent: vi.fn(),
|
|
880
|
-
}),
|
|
881
|
-
);
|
|
882
|
-
function Flow() {
|
|
883
|
-
const [activeSheet, setActiveSheet] = useState<string | null>('one');
|
|
884
|
-
return (
|
|
885
|
-
<BottomSheetSwitcher
|
|
886
|
-
activeSheet={activeSheet}
|
|
887
|
-
onActiveSheetChange={setActiveSheet}>
|
|
888
|
-
<BottomSheet sheetId="one" label="One">
|
|
889
|
-
<Owner message="Overview saved" />
|
|
890
|
-
<button type="button" onClick={() => setActiveSheet('two')}>
|
|
891
|
-
Continue
|
|
892
|
-
</button>
|
|
893
|
-
</BottomSheet>
|
|
894
|
-
<BottomSheet sheetId="two" label="Two">
|
|
895
|
-
<span>Step two</span>
|
|
896
|
-
</BottomSheet>
|
|
897
|
-
</BottomSheetSwitcher>
|
|
898
|
-
);
|
|
899
|
-
}
|
|
900
|
-
render(<Flow />);
|
|
901
|
-
const one = screen.getByRole('dialog', {name: 'One'});
|
|
902
|
-
await nextFrame();
|
|
903
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
904
|
-
fireEvent.click(screen.getByRole('button', {name: 'Continue'}));
|
|
905
|
-
const two = screen.getByRole('dialog', {name: 'Two'});
|
|
906
|
-
// The leaving step stays open but inert through its exit; the entering
|
|
907
|
-
// step is the exposed modal.
|
|
908
|
-
expect(one).toHaveAttribute('open');
|
|
909
|
-
expect(one).toHaveAttribute('inert');
|
|
910
|
-
expect(two.matches(':modal')).toBe(true);
|
|
911
|
-
await nextFrame();
|
|
912
|
-
await nextFrame();
|
|
913
|
-
expect(regionIn(two)).toHaveTextContent('Overview saved');
|
|
914
|
-
expect(regionIn(one)?.textContent ?? '').toBe('');
|
|
915
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
916
|
-
vi.unstubAllGlobals();
|
|
917
|
-
});
|
|
918
|
-
|
|
919
|
-
it('hands words sent just before an open Dialog is unmounted to the shared channel', async () => {
|
|
920
|
-
function Host() {
|
|
921
|
-
const [isOpen, setIsOpen] = useState(true);
|
|
922
|
-
return isOpen ? (
|
|
923
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Edit">
|
|
924
|
-
<Owner message="Saved" />
|
|
925
|
-
<button type="button" onClick={() => setIsOpen(false)}>
|
|
926
|
-
Remove
|
|
927
|
-
</button>
|
|
928
|
-
</Dialog>
|
|
929
|
-
) : null;
|
|
930
|
-
}
|
|
931
|
-
render(<Host />);
|
|
932
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
933
|
-
fireEvent.click(screen.getByRole('button', {name: 'Remove'}));
|
|
934
|
-
expect(screen.queryByRole('dialog')).toBeNull();
|
|
935
|
-
await nextFrame();
|
|
936
|
-
await nextFrame();
|
|
937
|
-
expect(shared()).toHaveTextContent('Saved');
|
|
938
|
-
});
|
|
939
|
-
|
|
940
|
-
it('announces a busy start inside a native modal an app renders without Astryx, opened inside a Dialog, in the app modal (FR14)', async () => {
|
|
941
|
-
function BusyThing({isBusy}: {isBusy: boolean}) {
|
|
942
|
-
const ref = useRef<HTMLDivElement>(null);
|
|
943
|
-
useBusyAnnouncement(isBusy, 'Loading', ref);
|
|
944
|
-
return <div ref={ref}>thing</div>;
|
|
945
|
-
}
|
|
946
|
-
function Host() {
|
|
947
|
-
const appDialogRef = useRef<HTMLDialogElement>(null);
|
|
948
|
-
const [isBusy, setIsBusy] = useState(false);
|
|
949
|
-
useLayoutEffect(() => {
|
|
950
|
-
appDialogRef.current?.showModal();
|
|
951
|
-
}, []);
|
|
952
|
-
return (
|
|
953
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Outer">
|
|
954
|
-
<dialog ref={appDialogRef} aria-label="App">
|
|
955
|
-
<BusyThing isBusy={isBusy} />
|
|
956
|
-
<button type="button" onClick={() => setIsBusy(true)}>
|
|
957
|
-
Start
|
|
958
|
-
</button>
|
|
959
|
-
</dialog>
|
|
960
|
-
</Dialog>
|
|
961
|
-
);
|
|
962
|
-
}
|
|
963
|
-
render(<Host />);
|
|
964
|
-
const outer = screen.getByRole('dialog', {name: 'Outer'});
|
|
965
|
-
const app = screen.getByRole('dialog', {name: 'App'});
|
|
966
|
-
expect(app.matches(':modal')).toBe(true);
|
|
967
|
-
fireEvent.click(screen.getByRole('button', {name: 'Start'}));
|
|
968
|
-
// The busy hook chooses its route a frame later and the region fills a
|
|
969
|
-
// frame after that.
|
|
970
|
-
await nextFrame();
|
|
971
|
-
await nextFrame();
|
|
972
|
-
expect(regionIn(app)).toHaveTextContent('Loading');
|
|
973
|
-
expect(regionIn(outer)).toBeNull();
|
|
974
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
975
|
-
});
|
|
976
|
-
|
|
977
|
-
it('routes a caller inside an open MobileNav into its dialog', async () => {
|
|
978
|
-
render(
|
|
979
|
-
<MobileNav isOpen onOpenChange={() => {}} label="Menu">
|
|
980
|
-
<Owner />
|
|
981
|
-
</MobileNav>,
|
|
982
|
-
);
|
|
983
|
-
const nav = screen.getByRole('dialog', {name: 'Menu'});
|
|
984
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
985
|
-
await nextFrame();
|
|
986
|
-
expect(regionIn(nav)).toHaveTextContent('Added Design');
|
|
987
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
988
|
-
});
|
|
989
|
-
|
|
990
|
-
it('keeps the step the person went back to on top while the leaving step exits, so its messages are heard', async () => {
|
|
991
|
-
window.scrollTo = vi.fn();
|
|
992
|
-
vi.stubGlobal(
|
|
993
|
-
'matchMedia',
|
|
994
|
-
vi.fn().mockReturnValue({
|
|
995
|
-
matches: false,
|
|
996
|
-
media: '',
|
|
997
|
-
onchange: null,
|
|
998
|
-
addEventListener: vi.fn(),
|
|
999
|
-
removeEventListener: vi.fn(),
|
|
1000
|
-
addListener: vi.fn(),
|
|
1001
|
-
removeListener: vi.fn(),
|
|
1002
|
-
dispatchEvent: vi.fn(),
|
|
1003
|
-
}),
|
|
1004
|
-
);
|
|
1005
|
-
function Flow() {
|
|
1006
|
-
const [activeSheet, setActiveSheet] = useState<string | null>('one');
|
|
1007
|
-
return (
|
|
1008
|
-
<BottomSheetSwitcher
|
|
1009
|
-
activeSheet={activeSheet}
|
|
1010
|
-
onActiveSheetChange={setActiveSheet}>
|
|
1011
|
-
<BottomSheet sheetId="one" label="One">
|
|
1012
|
-
<Owner message="Back on one" />
|
|
1013
|
-
<button type="button" onClick={() => setActiveSheet('two')}>
|
|
1014
|
-
Continue
|
|
1015
|
-
</button>
|
|
1016
|
-
</BottomSheet>
|
|
1017
|
-
<BottomSheet sheetId="two" label="Two">
|
|
1018
|
-
<button type="button" onClick={() => setActiveSheet('one')}>
|
|
1019
|
-
Back
|
|
1020
|
-
</button>
|
|
1021
|
-
</BottomSheet>
|
|
1022
|
-
</BottomSheetSwitcher>
|
|
1023
|
-
);
|
|
1024
|
-
}
|
|
1025
|
-
render(<Flow />);
|
|
1026
|
-
const one = screen.getByRole('dialog', {name: 'One'});
|
|
1027
|
-
// Hidden steps are out of the accessibility tree; reach it by element.
|
|
1028
|
-
const two = document.querySelector<HTMLDialogElement>(
|
|
1029
|
-
'dialog[aria-label="Two"]',
|
|
1030
|
-
)!;
|
|
1031
|
-
await nextFrame();
|
|
1032
|
-
fireEvent.click(screen.getByRole('button', {name: 'Continue'}));
|
|
1033
|
-
await nextFrame();
|
|
1034
|
-
fireEvent.click(screen.getByRole('button', {name: 'Back'}));
|
|
1035
|
-
await nextFrame();
|
|
1036
|
-
// Two is leaving: still open, inert; one is the exposed step again.
|
|
1037
|
-
expect(two).toHaveAttribute('open');
|
|
1038
|
-
expect(two).toHaveAttribute('inert');
|
|
1039
|
-
expect(one.matches(':modal')).toBe(true);
|
|
1040
|
-
expect(one).not.toHaveAttribute('inert');
|
|
1041
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
1042
|
-
await nextFrame();
|
|
1043
|
-
expect(regionIn(one)).toHaveTextContent('Back on one');
|
|
1044
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
1045
|
-
vi.unstubAllGlobals();
|
|
1046
|
-
});
|
|
1047
|
-
|
|
1048
|
-
it('holds words sent as a modal BottomSheet over a Dialog closes and delivers them to the Dialog at the real close', async () => {
|
|
1049
|
-
function Host() {
|
|
1050
|
-
const [isSheetOpen, setIsSheetOpen] = useState(false);
|
|
1051
|
-
return (
|
|
1052
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Edit">
|
|
1053
|
-
<button type="button" onClick={() => setIsSheetOpen(true)}>
|
|
1054
|
-
Open sheet
|
|
1055
|
-
</button>
|
|
1056
|
-
<BottomSheet
|
|
1057
|
-
isOpen={isSheetOpen}
|
|
1058
|
-
onOpenChange={setIsSheetOpen}
|
|
1059
|
-
label="Sheet">
|
|
1060
|
-
<Owner message="Saved" />
|
|
1061
|
-
<button type="button" onClick={() => setIsSheetOpen(false)}>
|
|
1062
|
-
Done
|
|
1063
|
-
</button>
|
|
1064
|
-
</BottomSheet>
|
|
1065
|
-
</Dialog>
|
|
1066
|
-
);
|
|
1067
|
-
}
|
|
1068
|
-
render(<Host />);
|
|
1069
|
-
const edit = screen.getByRole('dialog', {name: 'Edit'});
|
|
1070
|
-
await nextFrame();
|
|
1071
|
-
fireEvent.click(screen.getByRole('button', {name: 'Open sheet'}));
|
|
1072
|
-
const sheet = screen.getByRole('dialog', {name: 'Sheet'});
|
|
1073
|
-
await nextFrame();
|
|
1074
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
1075
|
-
fireEvent.click(screen.getByRole('button', {name: 'Done'}));
|
|
1076
|
-
// The sheet, still an open modal through its exit, covers the Dialog:
|
|
1077
|
-
// nothing is exposed yet, so the words wait rather than being written
|
|
1078
|
-
// to the covered Dialog (which would clear them).
|
|
1079
|
-
expect(sheet).toHaveAttribute('inert');
|
|
1080
|
-
await nextFrame();
|
|
1081
|
-
await nextFrame();
|
|
1082
|
-
expect(regionIn(sheet)?.textContent ?? '').toBe('');
|
|
1083
|
-
expect(regionIn(edit)?.textContent ?? '').toBe('');
|
|
1084
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
1085
|
-
act(() => {
|
|
1086
|
-
(sheet as HTMLDialogElement).close();
|
|
1087
|
-
});
|
|
1088
|
-
await nextFrame();
|
|
1089
|
-
await nextFrame();
|
|
1090
|
-
expect(regionIn(edit)).toHaveTextContent('Saved');
|
|
1091
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
1092
|
-
});
|
|
1093
|
-
it('withdraws a busy start written inside a modal but not yet exposed when its owner settles with its outcome (AST-086 FR8)', async () => {
|
|
1094
|
-
function Search() {
|
|
1095
|
-
const ref = useRef<HTMLDivElement>(null);
|
|
1096
|
-
const announce = useAnnounce();
|
|
1097
|
-
const [isBusy, setIsBusy] = useState(false);
|
|
1098
|
-
const settle = useBusyAnnouncement(isBusy, 'Loading', ref);
|
|
1099
|
-
return (
|
|
1100
|
-
<div ref={ref}>
|
|
1101
|
-
<button type="button" onClick={() => setIsBusy(true)}>
|
|
1102
|
-
Start
|
|
1103
|
-
</button>
|
|
1104
|
-
<button
|
|
1105
|
-
type="button"
|
|
1106
|
-
onClick={() => {
|
|
1107
|
-
settle();
|
|
1108
|
-
setIsBusy(false);
|
|
1109
|
-
announce('3 results');
|
|
1110
|
-
}}>
|
|
1111
|
-
Outcome
|
|
1112
|
-
</button>
|
|
1113
|
-
</div>
|
|
1114
|
-
);
|
|
1115
|
-
}
|
|
1116
|
-
render(
|
|
1117
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Modal">
|
|
1118
|
-
<Search />
|
|
1119
|
-
</Dialog>,
|
|
1120
|
-
);
|
|
1121
|
-
const dialog = screen.getByRole('dialog', {name: 'Modal'});
|
|
1122
|
-
await nextFrame();
|
|
1123
|
-
fireEvent.click(screen.getByRole('button', {name: 'Start'}));
|
|
1124
|
-
// The busy hook chooses its route a frame later and writes "Loading" to
|
|
1125
|
-
// the dialog's container, to be exposed a frame after that...
|
|
1126
|
-
await nextFrame();
|
|
1127
|
-
// ...but the outcome arrives first and the owner settles.
|
|
1128
|
-
fireEvent.click(screen.getByRole('button', {name: 'Outcome'}));
|
|
1129
|
-
await nextFrame();
|
|
1130
|
-
await nextFrame();
|
|
1131
|
-
expect(regionIn(dialog)?.textContent).toBe('3 results');
|
|
1132
|
-
expect(shared()?.textContent ?? '').toBe('');
|
|
1133
|
-
});
|
|
1134
|
-
|
|
1135
|
-
it('withdraws only its own busy start inside a modal when another owner wrote the same words (AST-086 FR8, FR9)', async () => {
|
|
1136
|
-
function Busy({label}: {label: string}) {
|
|
1137
|
-
const ref = useRef<HTMLDivElement>(null);
|
|
1138
|
-
const [isBusy, setIsBusy] = useState(false);
|
|
1139
|
-
const settle = useBusyAnnouncement(isBusy, 'Loading', ref);
|
|
1140
|
-
return (
|
|
1141
|
-
<div ref={ref}>
|
|
1142
|
-
<button type="button" onClick={() => setIsBusy(true)}>
|
|
1143
|
-
Start {label}
|
|
1144
|
-
</button>
|
|
1145
|
-
<button type="button" onClick={() => settle()}>
|
|
1146
|
-
Settle {label}
|
|
1147
|
-
</button>
|
|
1148
|
-
</div>
|
|
1149
|
-
);
|
|
1150
|
-
}
|
|
1151
|
-
render(
|
|
1152
|
-
<Dialog isOpen onOpenChange={() => {}} aria-label="Modal">
|
|
1153
|
-
<Busy label="one" />
|
|
1154
|
-
<Busy label="two" />
|
|
1155
|
-
</Dialog>,
|
|
1156
|
-
);
|
|
1157
|
-
const dialog = screen.getByRole('dialog', {name: 'Modal'});
|
|
1158
|
-
await nextFrame();
|
|
1159
|
-
fireEvent.click(screen.getByRole('button', {name: 'Start one'}));
|
|
1160
|
-
fireEvent.click(screen.getByRole('button', {name: 'Start two'}));
|
|
1161
|
-
await nextFrame();
|
|
1162
|
-
fireEvent.click(screen.getByRole('button', {name: 'Settle one'}));
|
|
1163
|
-
await nextFrame();
|
|
1164
|
-
await nextFrame();
|
|
1165
|
-
expect(regionIn(dialog)?.textContent).toBe('Loading');
|
|
1166
|
-
});
|
|
1167
|
-
|
|
1168
|
-
describe('a non-modal Drawer (hasScrim={false}, shown with showPopover(), never `open`)', () => {
|
|
1169
|
-
beforeEach(() => {
|
|
1170
|
-
// The real showPopover() leaves the dialog's `open` attribute unset.
|
|
1171
|
-
HTMLElement.prototype.showPopover = vi.fn();
|
|
1172
|
-
HTMLElement.prototype.hidePopover = vi.fn();
|
|
1173
|
-
});
|
|
1174
|
-
|
|
1175
|
-
it('routes a caller inside it to the shared channel at once, joined with a page message from the same task (FR9)', async () => {
|
|
1176
|
-
function Announcer({message}: {message: string}) {
|
|
1177
|
-
const announce = useAnnounce();
|
|
1178
|
-
useEffect(() => {
|
|
1179
|
-
announce(message);
|
|
1180
|
-
}, [announce, message]);
|
|
1181
|
-
return null;
|
|
1182
|
-
}
|
|
1183
|
-
render(
|
|
1184
|
-
<>
|
|
1185
|
-
<Announcer message="Page loaded" />
|
|
1186
|
-
<Drawer isOpen onOpenChange={() => {}} hasScrim={false} label="Side">
|
|
1187
|
-
<Announcer message="Inside drawer" />
|
|
1188
|
-
</Drawer>
|
|
1189
|
-
</>,
|
|
1190
|
-
);
|
|
1191
|
-
const drawer = document.querySelector<HTMLDialogElement>('dialog')!;
|
|
1192
|
-
expect(drawer.open).toBe(false);
|
|
1193
|
-
expect(HTMLElement.prototype.showPopover).toHaveBeenCalled();
|
|
1194
|
-
await nextFrame();
|
|
1195
|
-
await nextFrame();
|
|
1196
|
-
expect(shared()?.textContent).toBe('Page loaded Inside drawer');
|
|
1197
|
-
expect(regionIn(drawer)).toBeNull();
|
|
1198
|
-
});
|
|
1199
|
-
|
|
1200
|
-
it('lets a busy start inside it be withdrawn by its outcome (FR8)', async () => {
|
|
1201
|
-
function Search() {
|
|
1202
|
-
const ref = useRef<HTMLDivElement>(null);
|
|
1203
|
-
const announce = useAnnounce();
|
|
1204
|
-
const [isBusy, setIsBusy] = useState(false);
|
|
1205
|
-
const settle = useBusyAnnouncement(isBusy, 'Loading', ref);
|
|
1206
|
-
return (
|
|
1207
|
-
<div ref={ref}>
|
|
1208
|
-
<button type="button" onClick={() => setIsBusy(true)}>
|
|
1209
|
-
Start
|
|
1210
|
-
</button>
|
|
1211
|
-
<button
|
|
1212
|
-
type="button"
|
|
1213
|
-
onClick={() => {
|
|
1214
|
-
settle();
|
|
1215
|
-
setIsBusy(false);
|
|
1216
|
-
announce('3 results');
|
|
1217
|
-
}}>
|
|
1218
|
-
Outcome
|
|
1219
|
-
</button>
|
|
1220
|
-
</div>
|
|
1221
|
-
);
|
|
1222
|
-
}
|
|
1223
|
-
render(
|
|
1224
|
-
<Drawer isOpen onOpenChange={() => {}} hasScrim={false} label="Side">
|
|
1225
|
-
<Search />
|
|
1226
|
-
</Drawer>,
|
|
1227
|
-
);
|
|
1228
|
-
await nextFrame();
|
|
1229
|
-
fireEvent.click(screen.getByRole('button', {name: 'Start'}));
|
|
1230
|
-
await nextFrame();
|
|
1231
|
-
fireEvent.click(screen.getByRole('button', {name: 'Outcome'}));
|
|
1232
|
-
await nextFrame();
|
|
1233
|
-
await nextFrame();
|
|
1234
|
-
expect(shared()?.textContent).toBe('3 results');
|
|
1235
|
-
});
|
|
1236
|
-
});
|
|
1237
|
-
|
|
1238
|
-
it('takes the route of where the call is: a component that renders a Dialog but announces from above it uses the shared channel', async () => {
|
|
1239
|
-
function Opener() {
|
|
1240
|
-
const announce = useAnnounce();
|
|
1241
|
-
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
1242
|
-
return (
|
|
1243
|
-
<>
|
|
1244
|
-
<button type="button" onClick={() => announce('From above')}>
|
|
1245
|
-
Above
|
|
1246
|
-
</button>
|
|
1247
|
-
<Dialog
|
|
1248
|
-
ref={dialogRef}
|
|
1249
|
-
isOpen
|
|
1250
|
-
onOpenChange={() => {}}
|
|
1251
|
-
aria-label="Modal">
|
|
1252
|
-
<Owner message="From inside" label="Inside" />
|
|
1253
|
-
</Dialog>
|
|
1254
|
-
</>
|
|
1255
|
-
);
|
|
1256
|
-
}
|
|
1257
|
-
render(<Opener />);
|
|
1258
|
-
const dialog = screen.getByRole('dialog', {name: 'Modal'});
|
|
1259
|
-
fireEvent.click(screen.getByRole('button', {name: 'Above'}));
|
|
1260
|
-
fireEvent.click(screen.getByRole('button', {name: 'Inside'}));
|
|
1261
|
-
await nextFrame();
|
|
1262
|
-
expect(shared()).toHaveTextContent('From above');
|
|
1263
|
-
expect(regionIn(dialog)).toHaveTextContent('From inside');
|
|
1264
|
-
});
|
|
1265
|
-
|
|
1266
|
-
it('lets a component that owns a modal route its own messages into it through the provider it renders', async () => {
|
|
1267
|
-
// The FR14 route for CommandPalette's counts and Lightbox's position:
|
|
1268
|
-
// the owner renders the provider around the part of itself that
|
|
1269
|
-
// announces about the modal's content.
|
|
1270
|
-
function OwnerOfModal() {
|
|
1271
|
-
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
1272
|
-
return (
|
|
1273
|
-
<Dialog
|
|
1274
|
-
ref={dialogRef}
|
|
1275
|
-
isOpen
|
|
1276
|
-
onOpenChange={() => {}}
|
|
1277
|
-
aria-label="Modal">
|
|
1278
|
-
<ModalAnnounceProvider dialogRef={dialogRef} isOpen>
|
|
1279
|
-
<Owner message="Routed in" />
|
|
1280
|
-
</ModalAnnounceProvider>
|
|
1281
|
-
</Dialog>
|
|
1282
|
-
);
|
|
1283
|
-
}
|
|
1284
|
-
render(<OwnerOfModal />);
|
|
1285
|
-
fireEvent.click(screen.getByRole('button', {name: 'Say'}));
|
|
1286
|
-
await nextFrame();
|
|
1287
|
-
expect(
|
|
1288
|
-
regionIn(screen.getByRole('dialog', {name: 'Modal'})),
|
|
1289
|
-
).toHaveTextContent('Routed in');
|
|
1290
|
-
});
|
|
1291
|
-
});
|