@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,1025 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file ButtonGroup.test.tsx
|
|
5
|
-
* @input Uses vitest, @testing-library/react, @babel/core + @stylexjs/babel-plugin,
|
|
6
|
-
* ButtonGroup and Button components
|
|
7
|
-
* @output Unit tests for ButtonGroup, incl. the compiled-CSS contract for the
|
|
8
|
-
* trailing radius (#2508)
|
|
9
|
-
* @position Testing; validates ButtonGroup component implementation
|
|
10
|
-
*
|
|
11
|
-
* SYNC: When ButtonGroup component changes, update tests to match new behavior
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import {describe, it, expect} from 'vitest';
|
|
15
|
-
import type {ReactNode} from 'react';
|
|
16
|
-
import {render, screen, fireEvent} from '@testing-library/react';
|
|
17
|
-
import userEvent from '@testing-library/user-event';
|
|
18
|
-
import {transformSync} from '@babel/core';
|
|
19
|
-
import stylexBabelPlugin from '@stylexjs/babel-plugin';
|
|
20
|
-
import {readFileSync} from 'node:fs';
|
|
21
|
-
import {createRequire} from 'node:module';
|
|
22
|
-
import path from 'node:path';
|
|
23
|
-
import {ButtonGroup} from './ButtonGroup';
|
|
24
|
-
import {Button} from '../Button';
|
|
25
|
-
import {IconButton} from '../IconButton';
|
|
26
|
-
import {DropdownMenu} from '../DropdownMenu';
|
|
27
|
-
import {Tooltip} from '../Tooltip';
|
|
28
|
-
import {HoverCard} from '../HoverCard';
|
|
29
|
-
|
|
30
|
-
describe('ButtonGroup', () => {
|
|
31
|
-
it('renders a group with aria-label', () => {
|
|
32
|
-
render(
|
|
33
|
-
<ButtonGroup label="Actions">
|
|
34
|
-
<Button label="Copy" />
|
|
35
|
-
<Button label="Cut" />
|
|
36
|
-
<Button label="Paste" />
|
|
37
|
-
</ButtonGroup>,
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
const group = screen.getByRole('group');
|
|
41
|
-
expect(group).toBeInTheDocument();
|
|
42
|
-
expect(group).toHaveAttribute('aria-label', 'Actions');
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('renders all child buttons', () => {
|
|
46
|
-
render(
|
|
47
|
-
<ButtonGroup label="Actions">
|
|
48
|
-
<Button label="Copy" />
|
|
49
|
-
<Button label="Cut" />
|
|
50
|
-
<Button label="Paste" />
|
|
51
|
-
</ButtonGroup>,
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toBeInTheDocument();
|
|
55
|
-
expect(screen.getByRole('button', {name: 'Cut'})).toBeInTheDocument();
|
|
56
|
-
expect(screen.getByRole('button', {name: 'Paste'})).toBeInTheDocument();
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('works with IconButton children', () => {
|
|
60
|
-
render(
|
|
61
|
-
<ButtonGroup label="Text formatting">
|
|
62
|
-
<IconButton
|
|
63
|
-
label="Bold"
|
|
64
|
-
icon={<span data-testid="bold-icon">B</span>}
|
|
65
|
-
/>
|
|
66
|
-
<IconButton
|
|
67
|
-
label="Italic"
|
|
68
|
-
icon={<span data-testid="italic-icon">I</span>}
|
|
69
|
-
/>
|
|
70
|
-
</ButtonGroup>,
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
expect(screen.getByRole('button', {name: 'Bold'})).toBeInTheDocument();
|
|
74
|
-
expect(screen.getByRole('button', {name: 'Italic'})).toBeInTheDocument();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('applies data-testid', () => {
|
|
78
|
-
render(
|
|
79
|
-
<ButtonGroup label="Actions" data-testid="my-group">
|
|
80
|
-
<Button label="Copy" />
|
|
81
|
-
</ButtonGroup>,
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
expect(screen.getByTestId('my-group')).toBeInTheDocument();
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('forwards ref to the root element', () => {
|
|
88
|
-
let refValue: HTMLDivElement | null = null;
|
|
89
|
-
render(
|
|
90
|
-
<ButtonGroup
|
|
91
|
-
label="Actions"
|
|
92
|
-
ref={el => {
|
|
93
|
-
refValue = el;
|
|
94
|
-
}}>
|
|
95
|
-
<Button label="Copy" />
|
|
96
|
-
</ButtonGroup>,
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
expect(refValue).toBeInstanceOf(HTMLDivElement);
|
|
100
|
-
expect(refValue).toBe(screen.getByRole('group'));
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('reflects orientation via data-orientation, not aria-orientation', () => {
|
|
104
|
-
// aria-orientation is not a valid ARIA attribute on role="group"; the
|
|
105
|
-
// orientation is exposed through data-orientation instead.
|
|
106
|
-
const {rerender} = render(
|
|
107
|
-
<ButtonGroup label="Actions">
|
|
108
|
-
<Button label="Copy" />
|
|
109
|
-
</ButtonGroup>,
|
|
110
|
-
);
|
|
111
|
-
|
|
112
|
-
let group = screen.getByRole('group');
|
|
113
|
-
expect(group).not.toHaveAttribute('aria-orientation');
|
|
114
|
-
expect(group).toHaveAttribute('data-orientation', 'horizontal');
|
|
115
|
-
|
|
116
|
-
rerender(
|
|
117
|
-
<ButtonGroup label="Actions" orientation="vertical">
|
|
118
|
-
<Button label="Copy" />
|
|
119
|
-
</ButtonGroup>,
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
group = screen.getByRole('group');
|
|
123
|
-
expect(group).not.toHaveAttribute('aria-orientation');
|
|
124
|
-
expect(group).toHaveAttribute('data-orientation', 'vertical');
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it('renders with vertical orientation', () => {
|
|
128
|
-
render(
|
|
129
|
-
<ButtonGroup label="Actions" orientation="vertical">
|
|
130
|
-
<Button label="Copy" />
|
|
131
|
-
<Button label="Cut" />
|
|
132
|
-
</ButtonGroup>,
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
const group = screen.getByRole('group');
|
|
136
|
-
expect(group).toBeInTheDocument();
|
|
137
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toBeInTheDocument();
|
|
138
|
-
expect(screen.getByRole('button', {name: 'Cut'})).toBeInTheDocument();
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('renders with different sizes', () => {
|
|
142
|
-
const {rerender} = render(
|
|
143
|
-
<ButtonGroup label="Actions" size="sm">
|
|
144
|
-
<Button label="Copy" />
|
|
145
|
-
</ButtonGroup>,
|
|
146
|
-
);
|
|
147
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toBeInTheDocument();
|
|
148
|
-
|
|
149
|
-
rerender(
|
|
150
|
-
<ButtonGroup label="Actions" size="lg">
|
|
151
|
-
<Button label="Copy" />
|
|
152
|
-
</ButtonGroup>,
|
|
153
|
-
);
|
|
154
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toBeInTheDocument();
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('disables all buttons when isDisabled is true', () => {
|
|
158
|
-
render(
|
|
159
|
-
<ButtonGroup label="Actions" isDisabled>
|
|
160
|
-
<Button label="Copy" />
|
|
161
|
-
<Button label="Cut" />
|
|
162
|
-
</ButtonGroup>,
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
expect(screen.getByRole('group')).toHaveAttribute('aria-disabled', 'true');
|
|
166
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toBeDisabled();
|
|
167
|
-
expect(screen.getByRole('button', {name: 'Cut'})).toBeDisabled();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('does not set aria-disabled when not disabled', () => {
|
|
171
|
-
render(
|
|
172
|
-
<ButtonGroup label="Actions">
|
|
173
|
-
<Button label="Copy" />
|
|
174
|
-
</ButtonGroup>,
|
|
175
|
-
);
|
|
176
|
-
|
|
177
|
-
expect(screen.getByRole('group')).not.toHaveAttribute('aria-disabled');
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it('renders a single button without errors', () => {
|
|
181
|
-
render(
|
|
182
|
-
<ButtonGroup label="Actions">
|
|
183
|
-
<Button label="Copy" />
|
|
184
|
-
</ButtonGroup>,
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toBeInTheDocument();
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it('renders mixed Button and IconButton children', () => {
|
|
191
|
-
render(
|
|
192
|
-
<ButtonGroup label="Edit actions">
|
|
193
|
-
<Button label="Edit" />
|
|
194
|
-
<IconButton label="More options" icon={<span>▼</span>} />
|
|
195
|
-
</ButtonGroup>,
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
expect(screen.getByRole('button', {name: 'Edit'})).toBeInTheDocument();
|
|
199
|
-
expect(
|
|
200
|
-
screen.getByRole('button', {name: 'More options'}),
|
|
201
|
-
).toBeInTheDocument();
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
// ===========================================================================
|
|
205
|
-
// Trailing radius (issue #2508)
|
|
206
|
-
//
|
|
207
|
-
// The trailing end cap cannot be keyed off `:last-child`: members render an
|
|
208
|
-
// invisible layer infrastructure AFTER their button (tooltip'd Button,
|
|
209
|
-
// DropdownMenu), and useLayer renders a marker plus the layer inline when the
|
|
210
|
-
// host is safe, so they steal the slot. See IS_LAST_ITEM in Button.tsx.
|
|
211
|
-
//
|
|
212
|
-
// HOW THESE TESTS CATCH THE BUG
|
|
213
|
-
// jsdom applies no StyleX CSS, so a DOM-only test cannot prove which rule
|
|
214
|
-
// wins — and a test that hand-copies the selector is a tautology (revert
|
|
215
|
-
// groupStyles to `:last-child` and it still passes). So the predicate is NOT
|
|
216
|
-
// hand-copied here: `compileButtonRules()` runs the REAL StyleX babel plugin
|
|
217
|
-
// over Button.tsx (same config as scripts/build-css.mjs) and reads the
|
|
218
|
-
// trailing-radius rule's selector straight out of the emitted CSS, then
|
|
219
|
-
// matches it against the real rendered DOM. Revert groupStyles to
|
|
220
|
-
// `:last-child` and these go red.
|
|
221
|
-
// ===========================================================================
|
|
222
|
-
describe('trailing radius (#2508)', () => {
|
|
223
|
-
/** The group members, in DOM order (excludes invisible layer siblings). */
|
|
224
|
-
const items = (group: HTMLElement): Element[] =>
|
|
225
|
-
Array.from(
|
|
226
|
-
group.querySelectorAll(':scope > *:not([popover]):not(template)'),
|
|
227
|
-
);
|
|
228
|
-
|
|
229
|
-
// -- Compiled CSS, read from the source -----------------------------------
|
|
230
|
-
|
|
231
|
-
/** One atomic StyleX rule, parsed out of the plugin's emitted CSS. */
|
|
232
|
-
type CompiledRule = {
|
|
233
|
-
/** Atomic class name, e.g. `xp0wexf`. */
|
|
234
|
-
className: string;
|
|
235
|
-
/** Selector text after the class, e.g. `:first-child`. '' if unconditional. */
|
|
236
|
-
condition: string;
|
|
237
|
-
/** CSS property, e.g. `border-start-end-radius`. */
|
|
238
|
-
property: string;
|
|
239
|
-
/** CSS value, e.g. `var(--radius-element)`. */
|
|
240
|
-
value: string;
|
|
241
|
-
/** The full compiled selector, e.g. `.xp0wexf:not(:has(~ [data-...]))`. */
|
|
242
|
-
selector: string;
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Compiles Button.tsx with the real StyleX babel plugin and returns its
|
|
247
|
-
* atomic rules. This is the CSS the browser actually gets — the whole point
|
|
248
|
-
* is that the trailing-radius predicate comes from the SOURCE, never from a
|
|
249
|
-
* string retyped in this file.
|
|
250
|
-
*/
|
|
251
|
-
function compileButtonRules(): CompiledRule[] {
|
|
252
|
-
const repoRoot = path.resolve(__dirname, '../../../..');
|
|
253
|
-
const buttonSrc = path.resolve(__dirname, '../Button/Button.tsx');
|
|
254
|
-
// Babel looks bare preset names up from the cwd, the repo root, which
|
|
255
|
-
// does not declare them. Resolve them from this package, which does.
|
|
256
|
-
const require = createRequire(__filename);
|
|
257
|
-
|
|
258
|
-
const result = transformSync(readFileSync(buttonSrc, 'utf8'), {
|
|
259
|
-
babelrc: false,
|
|
260
|
-
configFile: false,
|
|
261
|
-
filename: buttonSrc,
|
|
262
|
-
presets: [
|
|
263
|
-
[
|
|
264
|
-
require.resolve('@babel/preset-typescript'),
|
|
265
|
-
{isTSX: true, allExtensions: true},
|
|
266
|
-
],
|
|
267
|
-
[require.resolve('@babel/preset-react'), {runtime: 'automatic'}],
|
|
268
|
-
],
|
|
269
|
-
plugins: [
|
|
270
|
-
[
|
|
271
|
-
stylexBabelPlugin,
|
|
272
|
-
{
|
|
273
|
-
dev: false,
|
|
274
|
-
runtimeInjection: false,
|
|
275
|
-
genConditionalClasses: true,
|
|
276
|
-
treeshakeCompensation: true,
|
|
277
|
-
unstable_moduleResolution: {type: 'commonJS', rootDir: repoRoot},
|
|
278
|
-
},
|
|
279
|
-
],
|
|
280
|
-
],
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
const rules =
|
|
284
|
-
(result?.metadata as {stylex?: [string, {ltr: string}, number][]})
|
|
285
|
-
?.stylex ?? [];
|
|
286
|
-
|
|
287
|
-
return rules.flatMap(([, {ltr}]) => {
|
|
288
|
-
// Plain atomic rules only: `.cls<condition>{prop:value}`. @media-wrapped
|
|
289
|
-
// rules are irrelevant to the radius contract.
|
|
290
|
-
const parsed = /^\.([\w-]+)([^{]*)\{([\w-]+):(.+)\}$/.exec(ltr);
|
|
291
|
-
if (!parsed) {
|
|
292
|
-
return [];
|
|
293
|
-
}
|
|
294
|
-
const [, className, condition, property, value] = parsed;
|
|
295
|
-
return [
|
|
296
|
-
{
|
|
297
|
-
className,
|
|
298
|
-
condition,
|
|
299
|
-
property,
|
|
300
|
-
value,
|
|
301
|
-
selector: `.${className}${condition}`,
|
|
302
|
-
},
|
|
303
|
-
];
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
const COMPILED = compileButtonRules();
|
|
308
|
-
|
|
309
|
-
/** A rounded (non-zero) corner is exactly this value in the compiled CSS. */
|
|
310
|
-
const ROUNDED = 'var(--radius-element)';
|
|
311
|
-
|
|
312
|
-
/** The two corners on the group's trailing edge — pure geometry. */
|
|
313
|
-
const TRAILING_CORNERS = {
|
|
314
|
-
horizontal: ['border-end-end-radius', 'border-start-end-radius'],
|
|
315
|
-
vertical: ['border-end-end-radius', 'border-end-start-radius'],
|
|
316
|
-
} as const;
|
|
317
|
-
|
|
318
|
-
/** The two corners on the group's leading edge — pure geometry. */
|
|
319
|
-
const LEADING_CORNERS = {
|
|
320
|
-
horizontal: ['border-end-start-radius', 'border-start-start-radius'],
|
|
321
|
-
vertical: ['border-start-end-radius', 'border-start-start-radius'],
|
|
322
|
-
} as const;
|
|
323
|
-
|
|
324
|
-
type Orientation = keyof typeof TRAILING_CORNERS;
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* The compiled rules that ROUND `corners` and are actually applied to `el`
|
|
328
|
-
* (its class list carries them). StyleX emits the `default: 0` class and the
|
|
329
|
-
* conditional class on every member, so this returns the same rules for any
|
|
330
|
-
* member of the group — which rule *wins* is decided by the selector, and
|
|
331
|
-
* that is what the tests below assert against the DOM.
|
|
332
|
-
*/
|
|
333
|
-
const roundingRules = (
|
|
334
|
-
el: Element,
|
|
335
|
-
corners: ReadonlyArray<string>,
|
|
336
|
-
): CompiledRule[] =>
|
|
337
|
-
COMPILED.filter(
|
|
338
|
-
rule =>
|
|
339
|
-
corners.includes(rule.property) &&
|
|
340
|
-
rule.value === ROUNDED &&
|
|
341
|
-
el.classList.contains(rule.className),
|
|
342
|
-
);
|
|
343
|
-
|
|
344
|
-
/** The compiled selectors that round `el`'s trailing corners. */
|
|
345
|
-
const trailingRoundingSelectors = (
|
|
346
|
-
el: Element,
|
|
347
|
-
orientation: Orientation,
|
|
348
|
-
): string[] => {
|
|
349
|
-
const rules = roundingRules(el, TRAILING_CORNERS[orientation]);
|
|
350
|
-
// Guard against a vacuous pass: both trailing corners must be accounted
|
|
351
|
-
// for, or the assertions below would be quantifying over an empty set.
|
|
352
|
-
expect(rules.map(rule => rule.property).sort()).toEqual([
|
|
353
|
-
...TRAILING_CORNERS[orientation],
|
|
354
|
-
]);
|
|
355
|
-
return rules.map(rule => rule.selector);
|
|
356
|
-
};
|
|
357
|
-
|
|
358
|
-
/** Does the compiled CSS actually round `el`'s trailing corners? */
|
|
359
|
-
const hasRoundedTrailingCorners = (
|
|
360
|
-
el: Element,
|
|
361
|
-
orientation: Orientation = 'horizontal',
|
|
362
|
-
): boolean =>
|
|
363
|
-
trailingRoundingSelectors(el, orientation).every(selector =>
|
|
364
|
-
el.matches(selector),
|
|
365
|
-
);
|
|
366
|
-
|
|
367
|
-
// -- The compiled CSS contract --------------------------------------------
|
|
368
|
-
|
|
369
|
-
it.each(['horizontal', 'vertical'] as const)(
|
|
370
|
-
'keys the trailing radius off layer-skipping, not :last-child (%s)',
|
|
371
|
-
orientation => {
|
|
372
|
-
render(
|
|
373
|
-
<ButtonGroup label="Actions" orientation={orientation}>
|
|
374
|
-
<Button label="Save" />
|
|
375
|
-
</ButtonGroup>,
|
|
376
|
-
);
|
|
377
|
-
|
|
378
|
-
const save = screen.getByRole('button', {name: 'Save'});
|
|
379
|
-
const selectors = trailingRoundingSelectors(save, orientation);
|
|
380
|
-
|
|
381
|
-
for (const selector of selectors) {
|
|
382
|
-
// `:last-child` is the bug: an inline layer element steals the slot.
|
|
383
|
-
expect(selector).not.toContain(':last-child');
|
|
384
|
-
// `[popover]` must survive compilation *verbatim*. StyleX only
|
|
385
|
-
// statically evaluates a selector key from a same-file const; from a
|
|
386
|
-
// .stylex.ts file it compiles to a mangled selector like `[x13pbwiz]`
|
|
387
|
-
// that matches nothing in the DOM.
|
|
388
|
-
expect(selector).toContain('[popover]');
|
|
389
|
-
expect(selector).toContain('template');
|
|
390
|
-
}
|
|
391
|
-
},
|
|
392
|
-
);
|
|
393
|
-
|
|
394
|
-
it.each(['horizontal', 'vertical'] as const)(
|
|
395
|
-
'still rounds the leading corners off :first-child (%s)',
|
|
396
|
-
orientation => {
|
|
397
|
-
render(
|
|
398
|
-
<ButtonGroup label="Actions" orientation={orientation}>
|
|
399
|
-
<Button label="Save" />
|
|
400
|
-
<Button label="More" tooltip="More options" />
|
|
401
|
-
</ButtonGroup>,
|
|
402
|
-
);
|
|
403
|
-
|
|
404
|
-
const save = screen.getByRole('button', {name: 'Save'});
|
|
405
|
-
const more = screen.getByRole('button', {name: 'More'});
|
|
406
|
-
const rules = roundingRules(save, LEADING_CORNERS[orientation]);
|
|
407
|
-
|
|
408
|
-
expect(rules.map(rule => rule.property).sort()).toEqual([
|
|
409
|
-
...LEADING_CORNERS[orientation],
|
|
410
|
-
]);
|
|
411
|
-
for (const {condition, selector} of rules) {
|
|
412
|
-
// The leading edge is genuinely safe on :first-child — a member's
|
|
413
|
-
// button always precedes its own layer.
|
|
414
|
-
expect(condition).toBe(':first-child');
|
|
415
|
-
expect(save.matches(selector)).toBe(true);
|
|
416
|
-
expect(more.matches(selector)).toBe(false);
|
|
417
|
-
}
|
|
418
|
-
},
|
|
419
|
-
);
|
|
420
|
-
|
|
421
|
-
// -- The compiled CSS, matched against the real DOM ------------------------
|
|
422
|
-
|
|
423
|
-
it.each(['horizontal', 'vertical'] as const)(
|
|
424
|
-
'rounds a tooltip’d trailing Button, whose layer follows it in the DOM (%s)',
|
|
425
|
-
orientation => {
|
|
426
|
-
render(
|
|
427
|
-
<ButtonGroup label="Actions" orientation={orientation}>
|
|
428
|
-
<Button label="Save" />
|
|
429
|
-
<Button label="More" tooltip="More options" />
|
|
430
|
-
</ButtonGroup>,
|
|
431
|
-
);
|
|
432
|
-
|
|
433
|
-
const group = screen.getByRole('group');
|
|
434
|
-
const save = screen.getByRole('button', {name: 'Save'});
|
|
435
|
-
const more = screen.getByRole('button', {name: 'More'});
|
|
436
|
-
|
|
437
|
-
// Precondition: the tooltip layer really is an inline DOM sibling that
|
|
438
|
-
// follows the button — this is exactly what broke `:last-child`.
|
|
439
|
-
expect(more).not.toBe(group.lastElementChild);
|
|
440
|
-
expect(items(group).at(-1)).toBe(more);
|
|
441
|
-
|
|
442
|
-
expect(hasRoundedTrailingCorners(more, orientation)).toBe(true);
|
|
443
|
-
expect(hasRoundedTrailingCorners(save, orientation)).toBe(false);
|
|
444
|
-
},
|
|
445
|
-
);
|
|
446
|
-
|
|
447
|
-
it.each(['horizontal', 'vertical'] as const)(
|
|
448
|
-
'rounds a trailing DropdownMenu trigger, whose popover follows it (%s)',
|
|
449
|
-
orientation => {
|
|
450
|
-
render(
|
|
451
|
-
<ButtonGroup label="Approve action" orientation={orientation}>
|
|
452
|
-
<Button label="Allow once" variant="primary" />
|
|
453
|
-
<DropdownMenu
|
|
454
|
-
button={{label: 'Allow options', variant: 'primary'}}
|
|
455
|
-
items={[{label: 'Always allow'}]}
|
|
456
|
-
/>
|
|
457
|
-
</ButtonGroup>,
|
|
458
|
-
);
|
|
459
|
-
|
|
460
|
-
const group = screen.getByRole('group');
|
|
461
|
-
const allow = screen.getByRole('button', {name: 'Allow once'});
|
|
462
|
-
const trigger = screen.getByRole('button', {name: 'Allow options'});
|
|
463
|
-
|
|
464
|
-
// The popover surface is an inline sibling after the trigger.
|
|
465
|
-
expect(trigger).not.toBe(group.lastElementChild);
|
|
466
|
-
expect(items(group).at(-1)).toBe(trigger);
|
|
467
|
-
|
|
468
|
-
expect(hasRoundedTrailingCorners(trigger, orientation)).toBe(true);
|
|
469
|
-
expect(hasRoundedTrailingCorners(allow, orientation)).toBe(false);
|
|
470
|
-
},
|
|
471
|
-
);
|
|
472
|
-
|
|
473
|
-
it('rounds a trailing link (<a>) member with a tooltip', () => {
|
|
474
|
-
render(
|
|
475
|
-
<ButtonGroup label="Actions">
|
|
476
|
-
<Button label="Save" />
|
|
477
|
-
<Button label="Docs" href="https://example.com" tooltip="Open docs" />
|
|
478
|
-
</ButtonGroup>,
|
|
479
|
-
);
|
|
480
|
-
|
|
481
|
-
const group = screen.getByRole('group');
|
|
482
|
-
const link = screen.getByRole('link', {name: 'Docs'});
|
|
483
|
-
|
|
484
|
-
expect(link.tagName).toBe('A');
|
|
485
|
-
expect(link).not.toBe(group.lastElementChild);
|
|
486
|
-
expect(items(group).at(-1)).toBe(link);
|
|
487
|
-
|
|
488
|
-
expect(hasRoundedTrailingCorners(link)).toBe(true);
|
|
489
|
-
});
|
|
490
|
-
|
|
491
|
-
it('rounds only the last member (first/middle/last)', () => {
|
|
492
|
-
render(
|
|
493
|
-
<ButtonGroup label="Actions">
|
|
494
|
-
<Button label="First" />
|
|
495
|
-
<Button label="Middle" tooltip="Middle tip" />
|
|
496
|
-
<DropdownMenu
|
|
497
|
-
button={{label: 'Last'}}
|
|
498
|
-
items={[{label: 'An option'}]}
|
|
499
|
-
/>
|
|
500
|
-
</ButtonGroup>,
|
|
501
|
-
);
|
|
502
|
-
|
|
503
|
-
const group = screen.getByRole('group');
|
|
504
|
-
const [first, middle, last] = items(group);
|
|
505
|
-
|
|
506
|
-
expect([first, middle, last].map(el => el.textContent)).toEqual([
|
|
507
|
-
'First',
|
|
508
|
-
'Middle',
|
|
509
|
-
'Last',
|
|
510
|
-
]);
|
|
511
|
-
|
|
512
|
-
// Middle has a tooltip layer after it, but a *marked* sibling follows too,
|
|
513
|
-
// so it must NOT take the trailing radius.
|
|
514
|
-
expect(hasRoundedTrailingCorners(first)).toBe(false);
|
|
515
|
-
expect(hasRoundedTrailingCorners(middle)).toBe(false);
|
|
516
|
-
expect(hasRoundedTrailingCorners(last)).toBe(true);
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
it('rounds both edges of a lone tooltip’d member', () => {
|
|
520
|
-
render(
|
|
521
|
-
<ButtonGroup label="Actions">
|
|
522
|
-
<Button label="Only" tooltip="The only one" />
|
|
523
|
-
</ButtonGroup>,
|
|
524
|
-
);
|
|
525
|
-
|
|
526
|
-
const only = screen.getByRole('button', {name: 'Only'});
|
|
527
|
-
|
|
528
|
-
// Leading edge is unaffected: a member's button always precedes its layer.
|
|
529
|
-
expect(only.matches(':first-child')).toBe(true);
|
|
530
|
-
expect(hasRoundedTrailingCorners(only)).toBe(true);
|
|
531
|
-
});
|
|
532
|
-
|
|
533
|
-
// -- Members the group does not recognise ---------------------------------
|
|
534
|
-
//
|
|
535
|
-
// The trailing predicate must stay CONSERVATIVE: a sibling the group does
|
|
536
|
-
// not understand is still a member. Otherwise the button BEFORE it wrongly
|
|
537
|
-
// takes the trailing radius and renders as a rounded notch mid-group —
|
|
538
|
-
// worse than the bug being fixed, because it is silent and visual.
|
|
539
|
-
|
|
540
|
-
it('does not round the preceding button when a Tooltip-wrapped member follows', () => {
|
|
541
|
-
render(
|
|
542
|
-
<ButtonGroup label="Actions">
|
|
543
|
-
<Button label="Save" />
|
|
544
|
-
<Tooltip content="Rich tip">
|
|
545
|
-
<Button label="More" />
|
|
546
|
-
</Tooltip>
|
|
547
|
-
</ButtonGroup>,
|
|
548
|
-
);
|
|
549
|
-
|
|
550
|
-
const save = screen.getByRole('button', {name: 'Save'});
|
|
551
|
-
|
|
552
|
-
// Tooltip wraps element children in a `display: contents` <div>, so the
|
|
553
|
-
// inner Button is a DESCENDANT of the wrapper, not a DOM sibling of Save.
|
|
554
|
-
expect(hasRoundedTrailingCorners(save)).toBe(false);
|
|
555
|
-
});
|
|
556
|
-
|
|
557
|
-
it('does not round the preceding button when a HoverCard-wrapped member follows', () => {
|
|
558
|
-
render(
|
|
559
|
-
<ButtonGroup label="Actions">
|
|
560
|
-
<Button label="Save" />
|
|
561
|
-
<HoverCard content="Preview">
|
|
562
|
-
<Button label="More" />
|
|
563
|
-
</HoverCard>
|
|
564
|
-
</ButtonGroup>,
|
|
565
|
-
);
|
|
566
|
-
|
|
567
|
-
const save = screen.getByRole('button', {name: 'Save'});
|
|
568
|
-
|
|
569
|
-
// Button has no `hoverCard` prop, so wrapping is the ONLY way to put a
|
|
570
|
-
// HoverCard on a group button — this composition has no alternative.
|
|
571
|
-
expect(hasRoundedTrailingCorners(save)).toBe(false);
|
|
572
|
-
});
|
|
573
|
-
|
|
574
|
-
it('does not round the preceding button when a raw <button> follows', () => {
|
|
575
|
-
render(
|
|
576
|
-
<ButtonGroup label="Actions">
|
|
577
|
-
<Button label="Save" />
|
|
578
|
-
<button type="button">Custom</button>
|
|
579
|
-
</ButtonGroup>,
|
|
580
|
-
);
|
|
581
|
-
|
|
582
|
-
const save = screen.getByRole('button', {name: 'Save'});
|
|
583
|
-
|
|
584
|
-
expect(hasRoundedTrailingCorners(save)).toBe(false);
|
|
585
|
-
});
|
|
586
|
-
});
|
|
587
|
-
|
|
588
|
-
describe('elevation', () => {
|
|
589
|
-
it('renders a distinct class on the group for each elevation level', () => {
|
|
590
|
-
const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
|
|
591
|
-
const {container} = render(
|
|
592
|
-
<ButtonGroup label="Actions" elevation={elevation}>
|
|
593
|
-
<Button label="One" />
|
|
594
|
-
<Button label="Two" />
|
|
595
|
-
</ButtonGroup>,
|
|
596
|
-
);
|
|
597
|
-
return container.querySelector('[role="group"]')!.className;
|
|
598
|
-
};
|
|
599
|
-
const classes = new Set([
|
|
600
|
-
classFor('none'),
|
|
601
|
-
classFor('low'),
|
|
602
|
-
classFor('med'),
|
|
603
|
-
classFor('high'),
|
|
604
|
-
]);
|
|
605
|
-
expect(classes.size).toBe(4);
|
|
606
|
-
});
|
|
607
|
-
|
|
608
|
-
it('defaults to flat (elevation none)', () => {
|
|
609
|
-
const {container: def} = render(
|
|
610
|
-
<ButtonGroup label="Actions">
|
|
611
|
-
<Button label="One" />
|
|
612
|
-
</ButtonGroup>,
|
|
613
|
-
);
|
|
614
|
-
const {container: none} = render(
|
|
615
|
-
<ButtonGroup label="Actions" elevation="none">
|
|
616
|
-
<Button label="One" />
|
|
617
|
-
</ButtonGroup>,
|
|
618
|
-
);
|
|
619
|
-
expect(def.querySelector('[role="group"]')!.className).toBe(
|
|
620
|
-
none.querySelector('[role="group"]')!.className,
|
|
621
|
-
);
|
|
622
|
-
});
|
|
623
|
-
|
|
624
|
-
it('exposes the elevation to a theme as a data attribute', () => {
|
|
625
|
-
render(
|
|
626
|
-
<ButtonGroup label="Actions" elevation="high">
|
|
627
|
-
<Button label="One" />
|
|
628
|
-
</ButtonGroup>,
|
|
629
|
-
);
|
|
630
|
-
|
|
631
|
-
expect(screen.getByRole('group')).toHaveAttribute(
|
|
632
|
-
'data-elevation',
|
|
633
|
-
'high',
|
|
634
|
-
);
|
|
635
|
-
});
|
|
636
|
-
|
|
637
|
-
it('reports flat on a member, since the group owns the surface', () => {
|
|
638
|
-
render(
|
|
639
|
-
<ButtonGroup label="Actions" elevation="high">
|
|
640
|
-
<Button label="One" elevation="high" />
|
|
641
|
-
</ButtonGroup>,
|
|
642
|
-
);
|
|
643
|
-
|
|
644
|
-
expect(screen.getByRole('button', {name: 'One'})).toHaveAttribute(
|
|
645
|
-
'data-elevation',
|
|
646
|
-
'none',
|
|
647
|
-
);
|
|
648
|
-
});
|
|
649
|
-
});
|
|
650
|
-
|
|
651
|
-
// ===========================================================================
|
|
652
|
-
// Keyboard navigation
|
|
653
|
-
//
|
|
654
|
-
// The group wires useListFocus, so arrow keys move focus between members.
|
|
655
|
-
// The last two tests cover the boundary: a member can own a layer, whose
|
|
656
|
-
// keys belong to that layer, and the group itself can sit inside a layer,
|
|
657
|
-
// whose keys are still the group's own. Both must hold at once.
|
|
658
|
-
// ===========================================================================
|
|
659
|
-
describe('keyboard navigation', () => {
|
|
660
|
-
const clipboard = (
|
|
661
|
-
<ButtonGroup label="Actions">
|
|
662
|
-
<Button label="Copy" />
|
|
663
|
-
<Button label="Cut" />
|
|
664
|
-
<Button label="Paste" />
|
|
665
|
-
</ButtonGroup>
|
|
666
|
-
);
|
|
667
|
-
|
|
668
|
-
it('moves focus between members with the arrow keys, wrapping at the end', async () => {
|
|
669
|
-
const user = userEvent.setup();
|
|
670
|
-
render(clipboard);
|
|
671
|
-
|
|
672
|
-
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
673
|
-
|
|
674
|
-
await user.keyboard('{ArrowRight}');
|
|
675
|
-
expect(screen.getByRole('button', {name: 'Cut'})).toHaveFocus();
|
|
676
|
-
|
|
677
|
-
await user.keyboard('{ArrowRight}{ArrowRight}');
|
|
678
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
679
|
-
|
|
680
|
-
await user.keyboard('{ArrowLeft}');
|
|
681
|
-
expect(screen.getByRole('button', {name: 'Paste'})).toHaveFocus();
|
|
682
|
-
});
|
|
683
|
-
|
|
684
|
-
it('jumps to the first and last member with Home and End', async () => {
|
|
685
|
-
const user = userEvent.setup();
|
|
686
|
-
render(clipboard);
|
|
687
|
-
|
|
688
|
-
screen.getByRole('button', {name: 'Cut'}).focus();
|
|
689
|
-
|
|
690
|
-
await user.keyboard('{End}');
|
|
691
|
-
expect(screen.getByRole('button', {name: 'Paste'})).toHaveFocus();
|
|
692
|
-
|
|
693
|
-
await user.keyboard('{Home}');
|
|
694
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
695
|
-
});
|
|
696
|
-
|
|
697
|
-
it('uses the vertical arrows when the group is vertical', async () => {
|
|
698
|
-
const user = userEvent.setup();
|
|
699
|
-
render(
|
|
700
|
-
<ButtonGroup label="Actions" orientation="vertical">
|
|
701
|
-
<Button label="Copy" />
|
|
702
|
-
<Button label="Cut" />
|
|
703
|
-
</ButtonGroup>,
|
|
704
|
-
);
|
|
705
|
-
|
|
706
|
-
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
707
|
-
|
|
708
|
-
await user.keyboard('{ArrowDown}');
|
|
709
|
-
expect(screen.getByRole('button', {name: 'Cut'})).toHaveFocus();
|
|
710
|
-
|
|
711
|
-
await user.keyboard('{ArrowUp}');
|
|
712
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
713
|
-
});
|
|
714
|
-
|
|
715
|
-
it('follows visual direction in RTL', async () => {
|
|
716
|
-
const user = userEvent.setup();
|
|
717
|
-
// dir sits on the group because jsdom resolves computed direction from
|
|
718
|
-
// the element's own attribute, not from an ancestor.
|
|
719
|
-
render(
|
|
720
|
-
<ButtonGroup label="Actions" dir="rtl">
|
|
721
|
-
<Button label="Copy" />
|
|
722
|
-
<Button label="Cut" />
|
|
723
|
-
<Button label="Paste" />
|
|
724
|
-
</ButtonGroup>,
|
|
725
|
-
);
|
|
726
|
-
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
727
|
-
|
|
728
|
-
await user.keyboard('{ArrowLeft}');
|
|
729
|
-
expect(screen.getByRole('button', {name: 'Cut'})).toHaveFocus();
|
|
730
|
-
|
|
731
|
-
await user.keyboard('{ArrowRight}');
|
|
732
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
733
|
-
});
|
|
734
|
-
|
|
735
|
-
it('skips a disabled member', async () => {
|
|
736
|
-
const user = userEvent.setup();
|
|
737
|
-
render(
|
|
738
|
-
<ButtonGroup label="Actions">
|
|
739
|
-
<Button label="Copy" />
|
|
740
|
-
<Button label="Cut" isDisabled />
|
|
741
|
-
<Button label="Paste" />
|
|
742
|
-
</ButtonGroup>,
|
|
743
|
-
);
|
|
744
|
-
|
|
745
|
-
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
746
|
-
|
|
747
|
-
await user.keyboard('{ArrowRight}');
|
|
748
|
-
expect(screen.getByRole('button', {name: 'Paste'})).toHaveFocus();
|
|
749
|
-
});
|
|
750
|
-
|
|
751
|
-
it('leaves arrow keys to a member\u2019s open menu', async () => {
|
|
752
|
-
const user = userEvent.setup();
|
|
753
|
-
render(
|
|
754
|
-
<ButtonGroup label="Approve action">
|
|
755
|
-
<Button label="Allow once" />
|
|
756
|
-
<DropdownMenu
|
|
757
|
-
hasChevron={false}
|
|
758
|
-
button={{label: 'Allow options', isIconOnly: true}}
|
|
759
|
-
items={[{label: 'Allow for 30 minutes'}, {label: 'Always allow'}]}
|
|
760
|
-
/>
|
|
761
|
-
</ButtonGroup>,
|
|
762
|
-
);
|
|
763
|
-
|
|
764
|
-
await user.click(screen.getByRole('button', {name: /Allow options/}));
|
|
765
|
-
const item = screen.getByRole('menuitem', {
|
|
766
|
-
name: 'Allow for 30 minutes',
|
|
767
|
-
hidden: true,
|
|
768
|
-
});
|
|
769
|
-
item.focus();
|
|
770
|
-
|
|
771
|
-
// Assert positively: the menu item keeps focus. `.not.toHaveFocus()` on
|
|
772
|
-
// the group's buttons would also pass if the group had thrown focus
|
|
773
|
-
// somewhere else entirely.
|
|
774
|
-
fireEvent.keyDown(item, {key: 'ArrowRight'});
|
|
775
|
-
expect(item).toHaveFocus();
|
|
776
|
-
|
|
777
|
-
fireEvent.keyDown(item, {key: 'ArrowLeft'});
|
|
778
|
-
expect(item).toHaveFocus();
|
|
779
|
-
|
|
780
|
-
// End belongs to the menu's own list focus, so it lands on the last menu
|
|
781
|
-
// item rather than the group's last button.
|
|
782
|
-
fireEvent.keyDown(item, {key: 'End'});
|
|
783
|
-
expect(
|
|
784
|
-
screen.getByRole('menuitem', {name: 'Always allow', hidden: true}),
|
|
785
|
-
).toHaveFocus();
|
|
786
|
-
});
|
|
787
|
-
|
|
788
|
-
it('leaves a link member in the arrow order', async () => {
|
|
789
|
-
const user = userEvent.setup();
|
|
790
|
-
render(
|
|
791
|
-
<ButtonGroup label="Docs actions">
|
|
792
|
-
<Button label="Save" />
|
|
793
|
-
<Button label="Docs" href="https://example.com" />
|
|
794
|
-
<Button label="Print" />
|
|
795
|
-
</ButtonGroup>,
|
|
796
|
-
);
|
|
797
|
-
|
|
798
|
-
screen.getByRole('button', {name: 'Save'}).focus();
|
|
799
|
-
|
|
800
|
-
await user.keyboard('{ArrowRight}');
|
|
801
|
-
expect(screen.getByRole('link', {name: 'Docs'})).toHaveFocus();
|
|
802
|
-
|
|
803
|
-
await user.keyboard('{ArrowRight}');
|
|
804
|
-
expect(screen.getByRole('button', {name: 'Print'})).toHaveFocus();
|
|
805
|
-
});
|
|
806
|
-
|
|
807
|
-
it('still moves between its own members when the group sits inside a popover', async () => {
|
|
808
|
-
const user = userEvent.setup();
|
|
809
|
-
// A group rendered inside a Popover, ContextMenu, HoverCard or Toast has
|
|
810
|
-
// a `[popover]` ancestor, because that is how useLayer mounts a layer.
|
|
811
|
-
// A bare `popover` div is the same DOM fact without the layer harness.
|
|
812
|
-
render(
|
|
813
|
-
<div popover="manual">
|
|
814
|
-
<ButtonGroup label="Actions">
|
|
815
|
-
<Button label="Copy" />
|
|
816
|
-
<Button label="Cut" />
|
|
817
|
-
<Button label="Paste" />
|
|
818
|
-
</ButtonGroup>
|
|
819
|
-
</div>,
|
|
820
|
-
);
|
|
821
|
-
|
|
822
|
-
// A closed popover is display:none in jsdom, so its contents read as
|
|
823
|
-
// inaccessible; focus and key handling still work on them.
|
|
824
|
-
const button = (name: string) =>
|
|
825
|
-
screen.getByRole('button', {name, hidden: true});
|
|
826
|
-
|
|
827
|
-
button('Copy').focus();
|
|
828
|
-
|
|
829
|
-
await user.keyboard('{ArrowRight}');
|
|
830
|
-
expect(button('Cut')).toHaveFocus();
|
|
831
|
-
|
|
832
|
-
await user.keyboard('{End}');
|
|
833
|
-
expect(button('Paste')).toHaveFocus();
|
|
834
|
-
|
|
835
|
-
await user.keyboard('{Home}');
|
|
836
|
-
expect(button('Copy')).toHaveFocus();
|
|
837
|
-
});
|
|
838
|
-
});
|
|
839
|
-
|
|
840
|
-
// ===========================================================================
|
|
841
|
-
// Roving tabindex
|
|
842
|
-
//
|
|
843
|
-
// The group is a single tab stop: exactly one enabled member carries
|
|
844
|
-
// tabindex="0", the rest carry -1, and the stop moves with arrow navigation.
|
|
845
|
-
// Entering and leaving is asserted through the real tab order as well as the
|
|
846
|
-
// attribute, because the attribute alone says nothing about a member the
|
|
847
|
-
// itemSelector missed — such a member stays natively tabbable and quietly
|
|
848
|
-
// adds a second stop.
|
|
849
|
-
// ===========================================================================
|
|
850
|
-
describe('roving tabindex', () => {
|
|
851
|
-
const tabIndexOf = (name: string) =>
|
|
852
|
-
screen.getByRole('button', {name}).getAttribute('tabindex');
|
|
853
|
-
|
|
854
|
-
const bracketed = (group: ReactNode) => (
|
|
855
|
-
<>
|
|
856
|
-
<button type="button">before</button>
|
|
857
|
-
{group}
|
|
858
|
-
<button type="button">after</button>
|
|
859
|
-
</>
|
|
860
|
-
);
|
|
861
|
-
|
|
862
|
-
const clipboard = (
|
|
863
|
-
<ButtonGroup label="Actions">
|
|
864
|
-
<Button label="Copy" />
|
|
865
|
-
<Button label="Cut" />
|
|
866
|
-
<Button label="Paste" />
|
|
867
|
-
</ButtonGroup>
|
|
868
|
-
);
|
|
869
|
-
|
|
870
|
-
it('gives the group one tab stop, on the first member', () => {
|
|
871
|
-
render(clipboard);
|
|
872
|
-
|
|
873
|
-
expect(tabIndexOf('Copy')).toBe('0');
|
|
874
|
-
expect(tabIndexOf('Cut')).toBe('-1');
|
|
875
|
-
expect(tabIndexOf('Paste')).toBe('-1');
|
|
876
|
-
});
|
|
877
|
-
|
|
878
|
-
it('takes one Tab to enter and one to leave', async () => {
|
|
879
|
-
const user = userEvent.setup();
|
|
880
|
-
render(bracketed(clipboard));
|
|
881
|
-
|
|
882
|
-
await user.tab();
|
|
883
|
-
expect(screen.getByRole('button', {name: 'before'})).toHaveFocus();
|
|
884
|
-
|
|
885
|
-
await user.tab();
|
|
886
|
-
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
887
|
-
|
|
888
|
-
await user.tab();
|
|
889
|
-
expect(screen.getByRole('button', {name: 'after'})).toHaveFocus();
|
|
890
|
-
});
|
|
891
|
-
|
|
892
|
-
it('moves the tab stop with arrow navigation', async () => {
|
|
893
|
-
const user = userEvent.setup();
|
|
894
|
-
render(clipboard);
|
|
895
|
-
|
|
896
|
-
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
897
|
-
await user.keyboard('{ArrowRight}');
|
|
898
|
-
|
|
899
|
-
expect(tabIndexOf('Copy')).toBe('-1');
|
|
900
|
-
expect(tabIndexOf('Cut')).toBe('0');
|
|
901
|
-
});
|
|
902
|
-
|
|
903
|
-
it('never parks the tab stop on a disabled member', () => {
|
|
904
|
-
render(
|
|
905
|
-
<ButtonGroup label="Actions">
|
|
906
|
-
<Button label="Copy" isDisabled />
|
|
907
|
-
<Button label="Cut" />
|
|
908
|
-
<Button label="Paste" />
|
|
909
|
-
</ButtonGroup>,
|
|
910
|
-
);
|
|
911
|
-
|
|
912
|
-
expect(tabIndexOf('Copy')).toBe('-1');
|
|
913
|
-
expect(tabIndexOf('Cut')).toBe('0');
|
|
914
|
-
});
|
|
915
|
-
|
|
916
|
-
it('repairs the tab stop when the member holding it unmounts', () => {
|
|
917
|
-
const {rerender} = render(
|
|
918
|
-
<ButtonGroup label="Actions">
|
|
919
|
-
<Button label="Copy" />
|
|
920
|
-
<Button label="Cut" />
|
|
921
|
-
</ButtonGroup>,
|
|
922
|
-
);
|
|
923
|
-
expect(tabIndexOf('Copy')).toBe('0');
|
|
924
|
-
|
|
925
|
-
rerender(
|
|
926
|
-
<ButtonGroup label="Actions">
|
|
927
|
-
<Button label="Cut" />
|
|
928
|
-
</ButtonGroup>,
|
|
929
|
-
);
|
|
930
|
-
|
|
931
|
-
expect(tabIndexOf('Cut')).toBe('0');
|
|
932
|
-
});
|
|
933
|
-
|
|
934
|
-
it('repairs the tab stop when the member holding it becomes disabled', () => {
|
|
935
|
-
const {rerender} = render(
|
|
936
|
-
<ButtonGroup label="Actions">
|
|
937
|
-
<Button label="Copy" />
|
|
938
|
-
<Button label="Cut" />
|
|
939
|
-
</ButtonGroup>,
|
|
940
|
-
);
|
|
941
|
-
expect(tabIndexOf('Copy')).toBe('0');
|
|
942
|
-
|
|
943
|
-
rerender(
|
|
944
|
-
<ButtonGroup label="Actions">
|
|
945
|
-
<Button label="Copy" isDisabled />
|
|
946
|
-
<Button label="Cut" />
|
|
947
|
-
</ButtonGroup>,
|
|
948
|
-
);
|
|
949
|
-
|
|
950
|
-
expect(tabIndexOf('Copy')).toBe('-1');
|
|
951
|
-
expect(tabIndexOf('Cut')).toBe('0');
|
|
952
|
-
});
|
|
953
|
-
|
|
954
|
-
it('counts a link member as the tab stop', async () => {
|
|
955
|
-
const user = userEvent.setup();
|
|
956
|
-
render(
|
|
957
|
-
bracketed(
|
|
958
|
-
<ButtonGroup label="Docs actions">
|
|
959
|
-
<Button label="Docs" href="https://example.com" />
|
|
960
|
-
<Button label="Print" />
|
|
961
|
-
</ButtonGroup>,
|
|
962
|
-
),
|
|
963
|
-
);
|
|
964
|
-
|
|
965
|
-
expect(
|
|
966
|
-
screen.getByRole('link', {name: 'Docs'}).getAttribute('tabindex'),
|
|
967
|
-
).toBe('0');
|
|
968
|
-
expect(tabIndexOf('Print')).toBe('-1');
|
|
969
|
-
|
|
970
|
-
await user.tab();
|
|
971
|
-
await user.tab();
|
|
972
|
-
expect(screen.getByRole('link', {name: 'Docs'})).toHaveFocus();
|
|
973
|
-
|
|
974
|
-
await user.tab();
|
|
975
|
-
expect(screen.getByRole('button', {name: 'after'})).toHaveFocus();
|
|
976
|
-
});
|
|
977
|
-
|
|
978
|
-
it('contributes no tab stop when the whole group is disabled', async () => {
|
|
979
|
-
const user = userEvent.setup();
|
|
980
|
-
render(
|
|
981
|
-
bracketed(
|
|
982
|
-
<ButtonGroup label="Actions" isDisabled>
|
|
983
|
-
<Button label="Copy" />
|
|
984
|
-
<Button label="Cut" />
|
|
985
|
-
</ButtonGroup>,
|
|
986
|
-
),
|
|
987
|
-
);
|
|
988
|
-
|
|
989
|
-
await user.tab();
|
|
990
|
-
expect(screen.getByRole('button', {name: 'before'})).toHaveFocus();
|
|
991
|
-
|
|
992
|
-
await user.tab();
|
|
993
|
-
expect(screen.getByRole('button', {name: 'after'})).toHaveFocus();
|
|
994
|
-
});
|
|
995
|
-
|
|
996
|
-
it('leaves the tab stop on its own members when a member owns an open menu', async () => {
|
|
997
|
-
const user = userEvent.setup();
|
|
998
|
-
render(
|
|
999
|
-
<ButtonGroup label="Approve action">
|
|
1000
|
-
<Button label="Allow once" />
|
|
1001
|
-
<DropdownMenu
|
|
1002
|
-
hasChevron={false}
|
|
1003
|
-
button={{label: 'Allow options', isIconOnly: true}}
|
|
1004
|
-
items={[{label: 'Allow for 30 minutes'}, {label: 'Always allow'}]}
|
|
1005
|
-
/>
|
|
1006
|
-
</ButtonGroup>,
|
|
1007
|
-
);
|
|
1008
|
-
|
|
1009
|
-
const trigger = screen.getByRole('button', {name: /Allow options/});
|
|
1010
|
-
expect(tabIndexOf('Allow once')).toBe('0');
|
|
1011
|
-
expect(trigger.getAttribute('tabindex')).toBe('-1');
|
|
1012
|
-
|
|
1013
|
-
await user.click(trigger);
|
|
1014
|
-
|
|
1015
|
-
// The menu's own items are a different list level (the boundary), so the
|
|
1016
|
-
// group must not stamp them or hand them its tab stop.
|
|
1017
|
-
const item = screen.getByRole('menuitem', {
|
|
1018
|
-
name: 'Allow for 30 minutes',
|
|
1019
|
-
hidden: true,
|
|
1020
|
-
});
|
|
1021
|
-
expect(item.getAttribute('tabindex')).not.toBe('0');
|
|
1022
|
-
expect(tabIndexOf('Allow once')).toBe('0');
|
|
1023
|
-
});
|
|
1024
|
-
});
|
|
1025
|
-
});
|