@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,1159 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file CheckboxList.test.tsx
|
|
5
|
-
* @input Uses vitest, @testing-library/react, CheckboxList, CheckboxListItem
|
|
6
|
-
* @output Unit tests for CheckboxList and CheckboxListItem behavior
|
|
7
|
-
* @position Testing; validates CheckboxList.tsx and CheckboxListItem.tsx implementation
|
|
8
|
-
*
|
|
9
|
-
* SYNC: When CheckboxList.tsx or CheckboxListItem.tsx changes, update tests to match new behavior
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
13
|
-
import {createRef} from 'react';
|
|
14
|
-
import {
|
|
15
|
-
render,
|
|
16
|
-
screen,
|
|
17
|
-
fireEvent,
|
|
18
|
-
within,
|
|
19
|
-
waitFor,
|
|
20
|
-
} from '@testing-library/react';
|
|
21
|
-
import userEvent from '@testing-library/user-event';
|
|
22
|
-
import {CheckboxList} from './CheckboxList';
|
|
23
|
-
import {CheckboxListItem} from './CheckboxListItem';
|
|
24
|
-
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
25
|
-
import {List} from '../List/List';
|
|
26
|
-
|
|
27
|
-
// FieldStatus announces status messages through the persistent useAnnounce
|
|
28
|
-
// singletons; remove them between tests so role/aria-live queries in this
|
|
29
|
-
// file never match a leftover region.
|
|
30
|
-
afterEach(() => {
|
|
31
|
-
__resetLiveRegionsForTest();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// Mock showPopover/hidePopover (not implemented in jsdom) so the tooltip layer
|
|
35
|
-
// reflects its open state via a `popover-open` attribute the tests can assert.
|
|
36
|
-
beforeEach(() => {
|
|
37
|
-
HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
|
|
38
|
-
this.setAttribute('popover-open', '');
|
|
39
|
-
const event = new Event('toggle', {bubbles: false});
|
|
40
|
-
Object.defineProperty(event, 'newState', {value: 'open'});
|
|
41
|
-
this.dispatchEvent(event);
|
|
42
|
-
});
|
|
43
|
-
HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
|
|
44
|
-
this.removeAttribute('popover-open');
|
|
45
|
-
const event = new Event('toggle', {bubbles: false});
|
|
46
|
-
Object.defineProperty(event, 'newState', {value: 'closed'});
|
|
47
|
-
this.dispatchEvent(event);
|
|
48
|
-
});
|
|
49
|
-
const originalMatches = HTMLElement.prototype.matches;
|
|
50
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
|
-
(HTMLElement.prototype as any).matches = function (
|
|
52
|
-
selector: string,
|
|
53
|
-
): boolean {
|
|
54
|
-
if (selector === ':popover-open') {
|
|
55
|
-
return this.hasAttribute('popover-open');
|
|
56
|
-
}
|
|
57
|
-
return originalMatches.call(this, selector);
|
|
58
|
-
};
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
describe('CheckboxList', () => {
|
|
62
|
-
it('forwards CheckboxListItem align to its Item row unchanged', () => {
|
|
63
|
-
render(
|
|
64
|
-
<CheckboxList label="Toppings" value={[]} onChange={() => {}}>
|
|
65
|
-
<CheckboxListItem label="Cheese" value="cheese" data-testid="cheese" />
|
|
66
|
-
<CheckboxListItem
|
|
67
|
-
label="Olives"
|
|
68
|
-
value="olives"
|
|
69
|
-
align="first-line"
|
|
70
|
-
data-testid="olives"
|
|
71
|
-
/>
|
|
72
|
-
</CheckboxList>,
|
|
73
|
-
);
|
|
74
|
-
expect(screen.getByTestId('cheese')).toHaveAttribute(
|
|
75
|
-
'data-align',
|
|
76
|
-
'center',
|
|
77
|
-
);
|
|
78
|
-
expect(screen.getByTestId('olives')).toHaveAttribute(
|
|
79
|
-
'data-align',
|
|
80
|
-
'first-line',
|
|
81
|
-
);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('renders with label', () => {
|
|
85
|
-
render(
|
|
86
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
87
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
88
|
-
</CheckboxList>,
|
|
89
|
-
);
|
|
90
|
-
expect(screen.getByText('Preferences')).toBeInTheDocument();
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('wraps items in a group named by the label (forms audit: group role)', () => {
|
|
94
|
-
render(
|
|
95
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
96
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
97
|
-
</CheckboxList>,
|
|
98
|
-
);
|
|
99
|
-
// The checkboxes are wrapped in a role="group" whose accessible name comes
|
|
100
|
-
// from the field label (via aria-labelledby). The label is rendered as a
|
|
101
|
-
// <span> (not a literal <label>, which can't name a group) with no
|
|
102
|
-
// orphaned htmlFor.
|
|
103
|
-
const group = screen.getByRole('group', {name: 'Preferences'});
|
|
104
|
-
expect(group).toBeInTheDocument();
|
|
105
|
-
const label = screen.getByText('Preferences');
|
|
106
|
-
expect(label.tagName).toBe('SPAN');
|
|
107
|
-
expect(label.closest('label')).toBeNull();
|
|
108
|
-
expect(label).not.toHaveAttribute('for');
|
|
109
|
-
expect(group.getAttribute('aria-labelledby')).toBe(label.id);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('renders checkbox items', () => {
|
|
113
|
-
render(
|
|
114
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
115
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
116
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
117
|
-
<CheckboxListItem label="Option C" value="c" />
|
|
118
|
-
</CheckboxList>,
|
|
119
|
-
);
|
|
120
|
-
expect(screen.getAllByRole('checkbox')).toHaveLength(3);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('checks the correct items based on value prop', () => {
|
|
124
|
-
render(
|
|
125
|
-
<CheckboxList label="Preferences" value={['a', 'c']} onChange={() => {}}>
|
|
126
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
127
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
128
|
-
<CheckboxListItem label="Option C" value="c" />
|
|
129
|
-
</CheckboxList>,
|
|
130
|
-
);
|
|
131
|
-
const checkboxes = screen.getAllByRole('checkbox');
|
|
132
|
-
expect(checkboxes[0]).toBeChecked();
|
|
133
|
-
expect(checkboxes[1]).not.toBeChecked();
|
|
134
|
-
expect(checkboxes[2]).toBeChecked();
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it('calls onChange with added value when checking an item', async () => {
|
|
138
|
-
const user = userEvent.setup();
|
|
139
|
-
const handleChange = vi.fn();
|
|
140
|
-
render(
|
|
141
|
-
<CheckboxList label="Preferences" value={['a']} onChange={handleChange}>
|
|
142
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
143
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
144
|
-
</CheckboxList>,
|
|
145
|
-
);
|
|
146
|
-
|
|
147
|
-
await user.click(screen.getByRole('checkbox', {name: 'Option B'}));
|
|
148
|
-
expect(handleChange).toHaveBeenCalledTimes(1);
|
|
149
|
-
expect(handleChange).toHaveBeenCalledWith(['a', 'b']);
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it('calls onChange with removed value when unchecking an item', async () => {
|
|
153
|
-
const user = userEvent.setup();
|
|
154
|
-
const handleChange = vi.fn();
|
|
155
|
-
render(
|
|
156
|
-
<CheckboxList
|
|
157
|
-
label="Preferences"
|
|
158
|
-
value={['a', 'b']}
|
|
159
|
-
onChange={handleChange}>
|
|
160
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
161
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
162
|
-
</CheckboxList>,
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
await user.click(screen.getByRole('checkbox', {name: 'Option A'}));
|
|
166
|
-
expect(handleChange).toHaveBeenCalledWith(['b']);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it('fires a consumer onClick on an item in addition to toggling', async () => {
|
|
170
|
-
const user = userEvent.setup();
|
|
171
|
-
const handleChange = vi.fn();
|
|
172
|
-
const handleClick = vi.fn();
|
|
173
|
-
render(
|
|
174
|
-
<CheckboxList label="Preferences" value={['a']} onChange={handleChange}>
|
|
175
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
176
|
-
<CheckboxListItem label="Option B" value="b" onClick={handleClick} />
|
|
177
|
-
</CheckboxList>,
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
// The row is a pointer-only click surface (no invisible row button — the
|
|
181
|
-
// checkbox is the option's only tab stop). Click the row's label area,
|
|
182
|
-
// where the composed onClick fires — not the inner checkbox.
|
|
183
|
-
expect(
|
|
184
|
-
screen.queryByRole('button', {name: 'Option B'}),
|
|
185
|
-
).not.toBeInTheDocument();
|
|
186
|
-
// The text also exists in the checkbox's visually hidden <label>; target
|
|
187
|
-
// the row's label <span> to click the row surface.
|
|
188
|
-
await user.click(screen.getByText('Option B', {selector: 'span'}));
|
|
189
|
-
|
|
190
|
-
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
191
|
-
expect(handleChange).toHaveBeenCalledWith(['a', 'b']);
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
describe('single tab stop per option (WCAG 4.1.2 / APG checkbox pattern)', () => {
|
|
195
|
-
it('renders exactly one focusable control per option — the checkbox, no row button', () => {
|
|
196
|
-
render(
|
|
197
|
-
<CheckboxList label="Preferences" value={['a']} onChange={() => {}}>
|
|
198
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
199
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
200
|
-
</CheckboxList>,
|
|
201
|
-
);
|
|
202
|
-
// No invisible whole-row button duplicating the checkbox's action.
|
|
203
|
-
expect(screen.queryByRole('button')).not.toBeInTheDocument();
|
|
204
|
-
for (const item of screen.getAllByRole('listitem')) {
|
|
205
|
-
const focusables = item.querySelectorAll(
|
|
206
|
-
'button, a[href], input, select, textarea, [tabindex]:not([tabindex="-1"])',
|
|
207
|
-
);
|
|
208
|
-
expect(focusables).toHaveLength(1);
|
|
209
|
-
expect(focusables[0]).toBe(within(item).getByRole('checkbox'));
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
it('Tab moves directly from one option checkbox to the next', async () => {
|
|
214
|
-
const user = userEvent.setup();
|
|
215
|
-
render(
|
|
216
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
217
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
218
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
219
|
-
</CheckboxList>,
|
|
220
|
-
);
|
|
221
|
-
await user.tab();
|
|
222
|
-
expect(screen.getByRole('checkbox', {name: 'Option A'})).toHaveFocus();
|
|
223
|
-
await user.tab();
|
|
224
|
-
expect(screen.getByRole('checkbox', {name: 'Option B'})).toHaveFocus();
|
|
225
|
-
// No further tab stop inside the list (the row itself is not focusable).
|
|
226
|
-
await user.tab();
|
|
227
|
-
expect(document.body).toHaveFocus();
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it('clicking the row surface (outside the checkbox) still toggles', async () => {
|
|
231
|
-
const user = userEvent.setup();
|
|
232
|
-
const handleChange = vi.fn();
|
|
233
|
-
render(
|
|
234
|
-
<CheckboxList label="Preferences" value={['a']} onChange={handleChange}>
|
|
235
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
236
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
237
|
-
</CheckboxList>,
|
|
238
|
-
);
|
|
239
|
-
// The text also exists in the checkbox's visually hidden <label>;
|
|
240
|
-
// target the row's label <span> to click the row surface.
|
|
241
|
-
await user.click(screen.getByText('Option B', {selector: 'span'}));
|
|
242
|
-
expect(handleChange).toHaveBeenCalledTimes(1);
|
|
243
|
-
expect(handleChange).toHaveBeenCalledWith(['a', 'b']);
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
it('toggles with Space on the focused checkbox, which reports checked state', async () => {
|
|
247
|
-
const user = userEvent.setup();
|
|
248
|
-
const handleChange = vi.fn();
|
|
249
|
-
render(
|
|
250
|
-
<CheckboxList label="Preferences" value={['a']} onChange={handleChange}>
|
|
251
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
252
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
253
|
-
</CheckboxList>,
|
|
254
|
-
);
|
|
255
|
-
await user.tab();
|
|
256
|
-
// The focused control is the checkbox itself, so its accessible name
|
|
257
|
-
// and checked state are what assistive tech announces on focus.
|
|
258
|
-
const checkboxA = screen.getByRole('checkbox', {name: 'Option A'});
|
|
259
|
-
expect(checkboxA).toHaveFocus();
|
|
260
|
-
expect(checkboxA).toBeChecked();
|
|
261
|
-
await user.keyboard(' ');
|
|
262
|
-
expect(handleChange).toHaveBeenCalledTimes(1);
|
|
263
|
-
expect(handleChange).toHaveBeenCalledWith([]);
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
it('the row itself is not focusable', () => {
|
|
267
|
-
render(
|
|
268
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
269
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
270
|
-
</CheckboxList>,
|
|
271
|
-
);
|
|
272
|
-
const item = screen.getByRole('listitem');
|
|
273
|
-
expect(item).not.toHaveAttribute('tabindex');
|
|
274
|
-
item.focus();
|
|
275
|
-
expect(item).not.toHaveFocus();
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
it('disables all checkboxes when group isDisabled is true', () => {
|
|
280
|
-
render(
|
|
281
|
-
<CheckboxList
|
|
282
|
-
label="Preferences"
|
|
283
|
-
value={[]}
|
|
284
|
-
onChange={() => {}}
|
|
285
|
-
isDisabled>
|
|
286
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
287
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
288
|
-
</CheckboxList>,
|
|
289
|
-
);
|
|
290
|
-
const checkboxes = screen.getAllByRole('checkbox');
|
|
291
|
-
expect(checkboxes[0]).toHaveAttribute('aria-disabled', 'true');
|
|
292
|
-
expect(checkboxes[1]).toHaveAttribute('aria-disabled', 'true');
|
|
293
|
-
expect(checkboxes[0]).not.toHaveAttribute('disabled');
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
it('does not call onChange when group is disabled', () => {
|
|
297
|
-
const handleChange = vi.fn();
|
|
298
|
-
render(
|
|
299
|
-
<CheckboxList
|
|
300
|
-
label="Preferences"
|
|
301
|
-
value={[]}
|
|
302
|
-
onChange={handleChange}
|
|
303
|
-
isDisabled>
|
|
304
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
305
|
-
</CheckboxList>,
|
|
306
|
-
);
|
|
307
|
-
|
|
308
|
-
// Use fireEvent since userEvent correctly blocks pointer-events: none
|
|
309
|
-
fireEvent.click(screen.getByRole('checkbox', {name: 'Option A'}));
|
|
310
|
-
expect(handleChange).not.toHaveBeenCalled();
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
it('disables individual item when item isDisabled is true', () => {
|
|
314
|
-
render(
|
|
315
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
316
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
317
|
-
<CheckboxListItem label="Option B" value="b" isDisabled />
|
|
318
|
-
</CheckboxList>,
|
|
319
|
-
);
|
|
320
|
-
const checkboxes = screen.getAllByRole('checkbox');
|
|
321
|
-
expect(checkboxes[0]).not.toHaveAttribute('aria-disabled');
|
|
322
|
-
expect(checkboxes[1]).toHaveAttribute('aria-disabled', 'true');
|
|
323
|
-
expect(checkboxes[1]).not.toHaveAttribute('disabled');
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
it('throws when item has no value prop inside collection-mode CheckboxList', () => {
|
|
327
|
-
// Suppress console.error for expected error
|
|
328
|
-
const spy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
329
|
-
expect(() => {
|
|
330
|
-
render(
|
|
331
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
332
|
-
<CheckboxListItem label="No value" />
|
|
333
|
-
</CheckboxList>,
|
|
334
|
-
);
|
|
335
|
-
}).toThrow(
|
|
336
|
-
'CheckboxListItem requires a `value` prop when used inside CheckboxList with a value array.',
|
|
337
|
-
);
|
|
338
|
-
spy.mockRestore();
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
it('renders error status message', () => {
|
|
342
|
-
render(
|
|
343
|
-
<CheckboxList
|
|
344
|
-
label="Preferences"
|
|
345
|
-
value={[]}
|
|
346
|
-
onChange={() => {}}
|
|
347
|
-
status={{type: 'error', message: 'Select at least one'}}>
|
|
348
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
349
|
-
</CheckboxList>,
|
|
350
|
-
);
|
|
351
|
-
expect(screen.getByText('Select at least one')).toBeInTheDocument();
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
it('renders description on items', () => {
|
|
355
|
-
render(
|
|
356
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
357
|
-
<CheckboxListItem
|
|
358
|
-
label="Option A"
|
|
359
|
-
value="a"
|
|
360
|
-
description="This is option A"
|
|
361
|
-
/>
|
|
362
|
-
</CheckboxList>,
|
|
363
|
-
);
|
|
364
|
-
expect(screen.getByText('This is option A')).toBeInTheDocument();
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
it('renders a ReactNode description on items', () => {
|
|
368
|
-
render(
|
|
369
|
-
<CheckboxList label="Plans" value={[]} onChange={() => {}}>
|
|
370
|
-
<CheckboxListItem
|
|
371
|
-
label="Pro plan"
|
|
372
|
-
value="pro"
|
|
373
|
-
description={
|
|
374
|
-
<span>
|
|
375
|
-
See the <a href="#pricing">pricing page</a>
|
|
376
|
-
</span>
|
|
377
|
-
}
|
|
378
|
-
/>
|
|
379
|
-
</CheckboxList>,
|
|
380
|
-
);
|
|
381
|
-
expect(
|
|
382
|
-
screen.getByRole('link', {name: 'pricing page'}),
|
|
383
|
-
).toBeInTheDocument();
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
it('keeps a link in a ReactNode label independent from selection', async () => {
|
|
387
|
-
const onChange = vi.fn();
|
|
388
|
-
const user = userEvent.setup();
|
|
389
|
-
render(
|
|
390
|
-
<CheckboxList label="Plans" value={[]} onChange={onChange}>
|
|
391
|
-
<CheckboxListItem
|
|
392
|
-
label={
|
|
393
|
-
<>
|
|
394
|
-
Pro plan <a href="#pricing">pricing details</a>
|
|
395
|
-
</>
|
|
396
|
-
}
|
|
397
|
-
aria-label="Pro plan pricing details"
|
|
398
|
-
value="pro"
|
|
399
|
-
/>
|
|
400
|
-
</CheckboxList>,
|
|
401
|
-
);
|
|
402
|
-
const checkbox = screen.getByRole('checkbox', {
|
|
403
|
-
name: 'Pro plan pricing details',
|
|
404
|
-
});
|
|
405
|
-
const link = screen.getByRole('link', {name: 'pricing details'});
|
|
406
|
-
await user.tab();
|
|
407
|
-
expect(checkbox).toHaveFocus();
|
|
408
|
-
await user.tab();
|
|
409
|
-
expect(link).toHaveFocus();
|
|
410
|
-
await user.click(link);
|
|
411
|
-
expect(onChange).not.toHaveBeenCalled();
|
|
412
|
-
});
|
|
413
|
-
|
|
414
|
-
it('exposes a string description to the checkbox via aria-describedby', () => {
|
|
415
|
-
render(
|
|
416
|
-
<List>
|
|
417
|
-
<CheckboxListItem
|
|
418
|
-
label="Email"
|
|
419
|
-
description="Receive notifications by email"
|
|
420
|
-
/>
|
|
421
|
-
</List>,
|
|
422
|
-
);
|
|
423
|
-
const checkbox = screen.getByRole('checkbox', {name: 'Email'});
|
|
424
|
-
const ids = checkbox.getAttribute('aria-describedby');
|
|
425
|
-
expect(ids).not.toBeNull();
|
|
426
|
-
const target = document.getElementById(ids!);
|
|
427
|
-
expect(target).toHaveTextContent('Receive notifications by email');
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
it('exposes a ReactNode description to the checkbox via aria-describedby', () => {
|
|
431
|
-
render(
|
|
432
|
-
<List>
|
|
433
|
-
<CheckboxListItem
|
|
434
|
-
label="Pro plan"
|
|
435
|
-
description={
|
|
436
|
-
<span>
|
|
437
|
-
See the <a href="#pricing">pricing page</a>
|
|
438
|
-
</span>
|
|
439
|
-
}
|
|
440
|
-
/>
|
|
441
|
-
</List>,
|
|
442
|
-
);
|
|
443
|
-
const checkbox = screen.getByRole('checkbox', {name: 'Pro plan'});
|
|
444
|
-
const target = document.getElementById(
|
|
445
|
-
checkbox.getAttribute('aria-describedby')!,
|
|
446
|
-
);
|
|
447
|
-
expect(target).toHaveTextContent('See the pricing page');
|
|
448
|
-
});
|
|
449
|
-
|
|
450
|
-
it('adds no aria-describedby when the description is absent or empty', () => {
|
|
451
|
-
render(
|
|
452
|
-
<List>
|
|
453
|
-
<CheckboxListItem label="Plain" />
|
|
454
|
-
<CheckboxListItem label="Empty" description="" />
|
|
455
|
-
<CheckboxListItem label="False" description={false} />
|
|
456
|
-
</List>,
|
|
457
|
-
);
|
|
458
|
-
for (const name of ['Plain', 'Empty', 'False']) {
|
|
459
|
-
expect(screen.getByRole('checkbox', {name})).not.toHaveAttribute(
|
|
460
|
-
'aria-describedby',
|
|
461
|
-
);
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
it('renders description on the checkbox list group', () => {
|
|
466
|
-
render(
|
|
467
|
-
<CheckboxList
|
|
468
|
-
label="Preferences"
|
|
469
|
-
description="Choose your preferences"
|
|
470
|
-
value={[]}
|
|
471
|
-
onChange={() => {}}>
|
|
472
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
473
|
-
</CheckboxList>,
|
|
474
|
-
);
|
|
475
|
-
expect(screen.getByText('Choose your preferences')).toBeInTheDocument();
|
|
476
|
-
});
|
|
477
|
-
|
|
478
|
-
it('describes the group with its description and status message', () => {
|
|
479
|
-
render(
|
|
480
|
-
<CheckboxList
|
|
481
|
-
label="Preferences"
|
|
482
|
-
description="Choose your preferences"
|
|
483
|
-
status={{type: 'error', message: 'Select at least one'}}
|
|
484
|
-
value={[]}
|
|
485
|
-
onChange={() => {}}>
|
|
486
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
487
|
-
</CheckboxList>,
|
|
488
|
-
);
|
|
489
|
-
expect(
|
|
490
|
-
screen.getByRole('group', {name: 'Preferences'}),
|
|
491
|
-
).toHaveAccessibleDescription(
|
|
492
|
-
'Choose your preferences Select at least one',
|
|
493
|
-
);
|
|
494
|
-
});
|
|
495
|
-
|
|
496
|
-
it('forwards ref to the group, container* to the field root, and item styling to the row', () => {
|
|
497
|
-
const listRef = createRef<HTMLDivElement>();
|
|
498
|
-
const itemRef = createRef<HTMLLIElement>();
|
|
499
|
-
const {container} = render(
|
|
500
|
-
<CheckboxList
|
|
501
|
-
ref={listRef}
|
|
502
|
-
label="Preferences"
|
|
503
|
-
containerClassName="consumer-list"
|
|
504
|
-
containerStyle={{marginTop: 12}}
|
|
505
|
-
value={[]}
|
|
506
|
-
onChange={() => {}}>
|
|
507
|
-
<CheckboxListItem
|
|
508
|
-
ref={itemRef}
|
|
509
|
-
label="Option A"
|
|
510
|
-
value="a"
|
|
511
|
-
className="consumer-item"
|
|
512
|
-
style={{marginTop: 4}}
|
|
513
|
-
/>
|
|
514
|
-
</CheckboxList>,
|
|
515
|
-
);
|
|
516
|
-
expect(listRef.current).toBe(
|
|
517
|
-
screen.getByRole('group', {name: 'Preferences'}),
|
|
518
|
-
);
|
|
519
|
-
const fieldRoot = container.querySelector('.consumer-list');
|
|
520
|
-
expect(fieldRoot).toHaveClass('astryx-checkbox-list');
|
|
521
|
-
expect(fieldRoot).toHaveStyle({marginTop: '12px'});
|
|
522
|
-
expect(fieldRoot).toContainElement(listRef.current);
|
|
523
|
-
const row = screen.getByRole('listitem');
|
|
524
|
-
expect(itemRef.current).toBe(row);
|
|
525
|
-
expect(row).toHaveClass('consumer-item', 'astryx-list-item');
|
|
526
|
-
expect(row).toHaveStyle({marginTop: '4px'});
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
it('supports data-testid on CheckboxList', () => {
|
|
530
|
-
render(
|
|
531
|
-
<CheckboxList
|
|
532
|
-
label="Preferences"
|
|
533
|
-
value={[]}
|
|
534
|
-
onChange={() => {}}
|
|
535
|
-
data-testid="my-checkbox-list">
|
|
536
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
537
|
-
</CheckboxList>,
|
|
538
|
-
);
|
|
539
|
-
expect(screen.getByTestId('my-checkbox-list')).toBeInTheDocument();
|
|
540
|
-
});
|
|
541
|
-
|
|
542
|
-
it('passes spacious density through to checkbox list items', () => {
|
|
543
|
-
render(
|
|
544
|
-
<CheckboxList
|
|
545
|
-
label="Preferences"
|
|
546
|
-
density="spacious"
|
|
547
|
-
value={[]}
|
|
548
|
-
onChange={() => {}}>
|
|
549
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
550
|
-
</CheckboxList>,
|
|
551
|
-
);
|
|
552
|
-
expect(screen.getByRole('listitem')).toHaveAttribute(
|
|
553
|
-
'data-density',
|
|
554
|
-
'spacious',
|
|
555
|
-
);
|
|
556
|
-
});
|
|
557
|
-
|
|
558
|
-
it('supports data-testid on CheckboxListItem', () => {
|
|
559
|
-
render(
|
|
560
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
561
|
-
<CheckboxListItem
|
|
562
|
-
label="Option A"
|
|
563
|
-
value="a"
|
|
564
|
-
data-testid="my-checkbox-item"
|
|
565
|
-
/>
|
|
566
|
-
</CheckboxList>,
|
|
567
|
-
);
|
|
568
|
-
expect(screen.getByTestId('my-checkbox-item')).toBeInTheDocument();
|
|
569
|
-
});
|
|
570
|
-
|
|
571
|
-
it('renders endContent', () => {
|
|
572
|
-
render(
|
|
573
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
574
|
-
<CheckboxListItem
|
|
575
|
-
label="Option A"
|
|
576
|
-
value="a"
|
|
577
|
-
endContent={<span data-testid="end">Badge</span>}
|
|
578
|
-
/>
|
|
579
|
-
</CheckboxList>,
|
|
580
|
-
);
|
|
581
|
-
expect(screen.getByTestId('end')).toBeInTheDocument();
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
it('does not toggle when clicking interactive endContent', async () => {
|
|
585
|
-
const user = userEvent.setup();
|
|
586
|
-
const handleChange = vi.fn();
|
|
587
|
-
render(
|
|
588
|
-
<CheckboxList label="Preferences" value={[]} onChange={handleChange}>
|
|
589
|
-
<CheckboxListItem
|
|
590
|
-
label="Option A"
|
|
591
|
-
value="a"
|
|
592
|
-
endContent={
|
|
593
|
-
<button type="button" data-testid="end-btn">
|
|
594
|
-
Action
|
|
595
|
-
</button>
|
|
596
|
-
}
|
|
597
|
-
/>
|
|
598
|
-
</CheckboxList>,
|
|
599
|
-
);
|
|
600
|
-
|
|
601
|
-
await user.click(screen.getByTestId('end-btn'));
|
|
602
|
-
expect(handleChange).not.toHaveBeenCalled();
|
|
603
|
-
});
|
|
604
|
-
|
|
605
|
-
it('allows standalone items inside CheckboxList without parent value (select-all pattern)', async () => {
|
|
606
|
-
const user = userEvent.setup();
|
|
607
|
-
const handleSelectAll = vi.fn();
|
|
608
|
-
const handleCheck = vi.fn();
|
|
609
|
-
render(
|
|
610
|
-
<CheckboxList label="Columns" hasDividers>
|
|
611
|
-
<CheckboxListItem
|
|
612
|
-
label="Select all"
|
|
613
|
-
isChecked={false}
|
|
614
|
-
onCheck={handleSelectAll}
|
|
615
|
-
/>
|
|
616
|
-
<CheckboxListItem label="Name" isChecked={true} onCheck={handleCheck} />
|
|
617
|
-
<CheckboxListItem
|
|
618
|
-
label="Email"
|
|
619
|
-
isChecked={false}
|
|
620
|
-
onCheck={handleCheck}
|
|
621
|
-
/>
|
|
622
|
-
</CheckboxList>,
|
|
623
|
-
);
|
|
624
|
-
|
|
625
|
-
// All items render without throwing
|
|
626
|
-
expect(screen.getAllByRole('checkbox')).toHaveLength(3);
|
|
627
|
-
|
|
628
|
-
// Select all triggers its own handler
|
|
629
|
-
await user.click(screen.getByRole('checkbox', {name: 'Select all'}));
|
|
630
|
-
expect(handleSelectAll).toHaveBeenCalledWith(true);
|
|
631
|
-
expect(handleCheck).not.toHaveBeenCalled();
|
|
632
|
-
});
|
|
633
|
-
});
|
|
634
|
-
|
|
635
|
-
describe('CheckboxListItem standalone mode', () => {
|
|
636
|
-
it('ignores isChecked and onCheck when the parent CheckboxList has a value array', async () => {
|
|
637
|
-
const user = userEvent.setup();
|
|
638
|
-
const onChange = vi.fn();
|
|
639
|
-
const onCheck = vi.fn();
|
|
640
|
-
render(
|
|
641
|
-
<CheckboxList label="Preferences" value={[]} onChange={onChange}>
|
|
642
|
-
<CheckboxListItem
|
|
643
|
-
label="Option A"
|
|
644
|
-
value="a"
|
|
645
|
-
isChecked
|
|
646
|
-
onCheck={onCheck}
|
|
647
|
-
/>
|
|
648
|
-
</CheckboxList>,
|
|
649
|
-
);
|
|
650
|
-
const checkbox = screen.getByRole('checkbox', {name: 'Option A'});
|
|
651
|
-
// The list's value array owns checked state in collection mode.
|
|
652
|
-
expect(checkbox).not.toBeChecked();
|
|
653
|
-
await user.click(checkbox);
|
|
654
|
-
expect(onChange).toHaveBeenCalledWith(['a']);
|
|
655
|
-
expect(onCheck).not.toHaveBeenCalled();
|
|
656
|
-
});
|
|
657
|
-
|
|
658
|
-
it('renders the sm checkbox at compact density and md otherwise', () => {
|
|
659
|
-
const {unmount} = render(
|
|
660
|
-
<CheckboxList
|
|
661
|
-
label="Preferences"
|
|
662
|
-
density="compact"
|
|
663
|
-
value={[]}
|
|
664
|
-
onChange={() => {}}>
|
|
665
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
666
|
-
</CheckboxList>,
|
|
667
|
-
);
|
|
668
|
-
const compactField = screen
|
|
669
|
-
.getByRole('checkbox')
|
|
670
|
-
.closest('.astryx-checkbox-input');
|
|
671
|
-
expect(compactField).toHaveAttribute('data-size', 'sm');
|
|
672
|
-
unmount();
|
|
673
|
-
render(
|
|
674
|
-
<List>
|
|
675
|
-
<CheckboxListItem label="Option A" />
|
|
676
|
-
</List>,
|
|
677
|
-
);
|
|
678
|
-
const balancedField = screen
|
|
679
|
-
.getByRole('checkbox')
|
|
680
|
-
.closest('.astryx-checkbox-input');
|
|
681
|
-
expect(balancedField).toHaveAttribute('data-size', 'md');
|
|
682
|
-
});
|
|
683
|
-
|
|
684
|
-
it('uses isChecked/onCheck for standalone control', async () => {
|
|
685
|
-
const user = userEvent.setup();
|
|
686
|
-
const handleCheck = vi.fn();
|
|
687
|
-
render(
|
|
688
|
-
<List>
|
|
689
|
-
<CheckboxListItem
|
|
690
|
-
label="Accept terms"
|
|
691
|
-
isChecked={false}
|
|
692
|
-
onCheck={handleCheck}
|
|
693
|
-
/>
|
|
694
|
-
</List>,
|
|
695
|
-
);
|
|
696
|
-
|
|
697
|
-
await user.click(screen.getByRole('checkbox', {name: 'Accept terms'}));
|
|
698
|
-
expect(handleCheck).toHaveBeenCalledWith(true);
|
|
699
|
-
});
|
|
700
|
-
|
|
701
|
-
it('renders checked state from isChecked prop', () => {
|
|
702
|
-
render(
|
|
703
|
-
<List>
|
|
704
|
-
<CheckboxListItem label="Checked item" isChecked={true} />
|
|
705
|
-
</List>,
|
|
706
|
-
);
|
|
707
|
-
expect(screen.getByRole('checkbox')).toBeChecked();
|
|
708
|
-
});
|
|
709
|
-
|
|
710
|
-
it('renders unchecked when no isChecked provided', () => {
|
|
711
|
-
render(
|
|
712
|
-
<List>
|
|
713
|
-
<CheckboxListItem label="Default item" />
|
|
714
|
-
</List>,
|
|
715
|
-
);
|
|
716
|
-
expect(screen.getByRole('checkbox')).not.toBeChecked();
|
|
717
|
-
});
|
|
718
|
-
|
|
719
|
-
it('does not throw without value prop in standalone mode', () => {
|
|
720
|
-
expect(() => {
|
|
721
|
-
render(
|
|
722
|
-
<List>
|
|
723
|
-
<CheckboxListItem label="No value needed" />
|
|
724
|
-
</List>,
|
|
725
|
-
);
|
|
726
|
-
}).not.toThrow();
|
|
727
|
-
});
|
|
728
|
-
|
|
729
|
-
it('renders indeterminate state', () => {
|
|
730
|
-
render(
|
|
731
|
-
<List>
|
|
732
|
-
<CheckboxListItem label="Partial" isChecked="indeterminate" />
|
|
733
|
-
</List>,
|
|
734
|
-
);
|
|
735
|
-
// The inner native checkbox exposes mixed state via the indeterminate DOM
|
|
736
|
-
// property (not a redundant aria-checked, forms-16). The list row is a
|
|
737
|
-
// plain listitem and must not carry aria-checked (aria-allowed-attr).
|
|
738
|
-
const checkbox = screen.getByRole('checkbox');
|
|
739
|
-
expect(checkbox).toBeInstanceOf(HTMLInputElement);
|
|
740
|
-
if (checkbox instanceof HTMLInputElement) {
|
|
741
|
-
expect(checkbox.indeterminate).toBe(true);
|
|
742
|
-
}
|
|
743
|
-
expect(checkbox).not.toHaveAttribute('aria-checked');
|
|
744
|
-
});
|
|
745
|
-
|
|
746
|
-
it('calls onCheck with true when clicking indeterminate item', async () => {
|
|
747
|
-
const user = userEvent.setup();
|
|
748
|
-
const handleCheck = vi.fn();
|
|
749
|
-
render(
|
|
750
|
-
<List>
|
|
751
|
-
<CheckboxListItem
|
|
752
|
-
label="Partial"
|
|
753
|
-
isChecked="indeterminate"
|
|
754
|
-
onCheck={handleCheck}
|
|
755
|
-
/>
|
|
756
|
-
</List>,
|
|
757
|
-
);
|
|
758
|
-
|
|
759
|
-
await user.click(screen.getByRole('checkbox', {name: 'Partial'}));
|
|
760
|
-
expect(handleCheck).toHaveBeenCalledWith(true);
|
|
761
|
-
});
|
|
762
|
-
});
|
|
763
|
-
|
|
764
|
-
describe('CheckboxListItem accessible name', () => {
|
|
765
|
-
it('names the checkbox from a string label', () => {
|
|
766
|
-
render(
|
|
767
|
-
<CheckboxList label="Preferences" value={[]} onChange={() => {}}>
|
|
768
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
769
|
-
</CheckboxList>,
|
|
770
|
-
);
|
|
771
|
-
expect(
|
|
772
|
-
screen.getByRole('checkbox', {name: 'Option A'}),
|
|
773
|
-
).toBeInTheDocument();
|
|
774
|
-
});
|
|
775
|
-
|
|
776
|
-
it('names the checkbox from a conforming aria-label when the label is a ReactNode', () => {
|
|
777
|
-
render(
|
|
778
|
-
<CheckboxList label="Plans" value={[]} onChange={() => {}}>
|
|
779
|
-
<CheckboxListItem
|
|
780
|
-
label={
|
|
781
|
-
<span>
|
|
782
|
-
Pro plan <em>(recommended)</em>
|
|
783
|
-
</span>
|
|
784
|
-
}
|
|
785
|
-
aria-label="Pro plan (recommended) option"
|
|
786
|
-
value="pro"
|
|
787
|
-
/>
|
|
788
|
-
</CheckboxList>,
|
|
789
|
-
);
|
|
790
|
-
expect(
|
|
791
|
-
screen.getByRole('checkbox', {name: 'Pro plan (recommended) option'}),
|
|
792
|
-
).toBeInTheDocument();
|
|
793
|
-
});
|
|
794
|
-
|
|
795
|
-
it('links a ReactNode label to the checkbox control', () => {
|
|
796
|
-
render(
|
|
797
|
-
<CheckboxList label="Plans" value={[]} onChange={() => {}}>
|
|
798
|
-
<CheckboxListItem
|
|
799
|
-
label={
|
|
800
|
-
<span>
|
|
801
|
-
Pro plan <em>(recommended)</em>
|
|
802
|
-
</span>
|
|
803
|
-
}
|
|
804
|
-
value="pro"
|
|
805
|
-
/>
|
|
806
|
-
</CheckboxList>,
|
|
807
|
-
);
|
|
808
|
-
const checkbox = screen.getByRole('checkbox');
|
|
809
|
-
const labelledBy = checkbox.getAttribute('aria-labelledby');
|
|
810
|
-
expect(labelledBy).toBeTruthy();
|
|
811
|
-
expect(document.getElementById(labelledBy!)).toHaveTextContent(
|
|
812
|
-
'Pro plan (recommended)',
|
|
813
|
-
);
|
|
814
|
-
});
|
|
815
|
-
|
|
816
|
-
it('does not reference the visible label when a conforming aria-label is given', () => {
|
|
817
|
-
render(
|
|
818
|
-
<CheckboxList label="Plans" value={[]} onChange={() => {}}>
|
|
819
|
-
<CheckboxListItem
|
|
820
|
-
label={<span>Pro plan</span>}
|
|
821
|
-
aria-label="Pro plan option"
|
|
822
|
-
value="pro"
|
|
823
|
-
/>
|
|
824
|
-
</CheckboxList>,
|
|
825
|
-
);
|
|
826
|
-
const checkbox = screen.getByRole('checkbox', {name: 'Pro plan option'});
|
|
827
|
-
expect(checkbox).not.toHaveAttribute('aria-labelledby');
|
|
828
|
-
});
|
|
829
|
-
});
|
|
830
|
-
|
|
831
|
-
describe('CheckboxListItem ARIA props', () => {
|
|
832
|
-
it('conveys checked state via the inner checkbox, not aria-checked on the listitem', () => {
|
|
833
|
-
render(
|
|
834
|
-
<CheckboxList label="Prefs" value={['a']} onChange={() => {}}>
|
|
835
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
836
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
837
|
-
</CheckboxList>,
|
|
838
|
-
);
|
|
839
|
-
// The listitem row must not carry aria-checked (not a valid attribute on
|
|
840
|
-
// role="listitem" — axe: aria-allowed-attr). Checked state is exposed by
|
|
841
|
-
// the inner native checkbox instead.
|
|
842
|
-
const items = screen.getAllByRole('listitem');
|
|
843
|
-
expect(items[0]).not.toHaveAttribute('aria-checked');
|
|
844
|
-
expect(items[1]).not.toHaveAttribute('aria-checked');
|
|
845
|
-
|
|
846
|
-
const checkboxes = screen.getAllByRole('checkbox');
|
|
847
|
-
expect(checkboxes[0]).toBeChecked();
|
|
848
|
-
expect(checkboxes[1]).not.toBeChecked();
|
|
849
|
-
});
|
|
850
|
-
|
|
851
|
-
it('does not put aria-checked on the listitem in standalone mode', () => {
|
|
852
|
-
render(
|
|
853
|
-
<List>
|
|
854
|
-
<CheckboxListItem label="Done" isChecked={true} />
|
|
855
|
-
<CheckboxListItem label="Todo" isChecked={false} />
|
|
856
|
-
</List>,
|
|
857
|
-
);
|
|
858
|
-
const items = screen.getAllByRole('listitem');
|
|
859
|
-
expect(items[0]).not.toHaveAttribute('aria-checked');
|
|
860
|
-
expect(items[1]).not.toHaveAttribute('aria-checked');
|
|
861
|
-
|
|
862
|
-
const checkboxes = screen.getAllByRole('checkbox');
|
|
863
|
-
expect(checkboxes[0]).toBeChecked();
|
|
864
|
-
expect(checkboxes[1]).not.toBeChecked();
|
|
865
|
-
});
|
|
866
|
-
|
|
867
|
-
it('exposes indeterminate state via the checkbox, not aria-checked on the listitem', () => {
|
|
868
|
-
render(
|
|
869
|
-
<List>
|
|
870
|
-
<CheckboxListItem label="Partial" isChecked="indeterminate" />
|
|
871
|
-
</List>,
|
|
872
|
-
);
|
|
873
|
-
const item = screen.getByRole('listitem');
|
|
874
|
-
expect(item).not.toHaveAttribute('aria-checked');
|
|
875
|
-
const checkbox = screen.getByRole('checkbox');
|
|
876
|
-
if (checkbox instanceof HTMLInputElement) {
|
|
877
|
-
expect(checkbox.indeterminate).toBe(true);
|
|
878
|
-
}
|
|
879
|
-
});
|
|
880
|
-
|
|
881
|
-
it('does not mark items aria-busy when idle', () => {
|
|
882
|
-
render(
|
|
883
|
-
<CheckboxList label="Prefs" value={['a']} onChange={() => {}}>
|
|
884
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
885
|
-
</CheckboxList>,
|
|
886
|
-
);
|
|
887
|
-
const item = screen.getByRole('listitem');
|
|
888
|
-
expect(item).not.toHaveAttribute('aria-busy');
|
|
889
|
-
});
|
|
890
|
-
|
|
891
|
-
it('marks the item aria-busy when item-level isLoading is set', () => {
|
|
892
|
-
render(
|
|
893
|
-
<CheckboxList label="Prefs" value={['a']} onChange={() => {}}>
|
|
894
|
-
<CheckboxListItem label="Option A" value="a" isLoading />
|
|
895
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
896
|
-
</CheckboxList>,
|
|
897
|
-
);
|
|
898
|
-
const [itemA, itemB] = screen.getAllByRole('listitem');
|
|
899
|
-
expect(itemA).toHaveAttribute('aria-busy', 'true');
|
|
900
|
-
// Loading is per-item — sibling items are unaffected.
|
|
901
|
-
expect(itemB).not.toHaveAttribute('aria-busy');
|
|
902
|
-
});
|
|
903
|
-
|
|
904
|
-
it('renders a spinner inside the checkbox when item isLoading is set', () => {
|
|
905
|
-
render(
|
|
906
|
-
<CheckboxList label="Prefs" value={['a']} onChange={() => {}}>
|
|
907
|
-
<CheckboxListItem label="Option A" value="a" isLoading />
|
|
908
|
-
</CheckboxList>,
|
|
909
|
-
);
|
|
910
|
-
// The spinner is decorative — it lives inside the checkbox's
|
|
911
|
-
// aria-hidden visual box, so query with hidden:true. The accessible
|
|
912
|
-
// loading signal is `aria-busy` on the item (asserted above).
|
|
913
|
-
expect(screen.getByRole('status', {hidden: true})).toBeInTheDocument();
|
|
914
|
-
});
|
|
915
|
-
|
|
916
|
-
it('does not toggle when item-level isLoading is set', () => {
|
|
917
|
-
const onChange = vi.fn();
|
|
918
|
-
render(
|
|
919
|
-
<CheckboxList label="Prefs" value={[]} onChange={onChange}>
|
|
920
|
-
<CheckboxListItem label="Option A" value="a" isLoading />
|
|
921
|
-
</CheckboxList>,
|
|
922
|
-
);
|
|
923
|
-
fireEvent.click(screen.getByRole('checkbox'));
|
|
924
|
-
expect(onChange).not.toHaveBeenCalled();
|
|
925
|
-
});
|
|
926
|
-
|
|
927
|
-
it('shows a spinner only on the toggled item while changeAction is pending', async () => {
|
|
928
|
-
// changeAction returns a promise that never resolves, so the pending
|
|
929
|
-
// (loading) state persists for assertions.
|
|
930
|
-
const changeAction = vi.fn(async () => {
|
|
931
|
-
await new Promise<void>(() => {});
|
|
932
|
-
});
|
|
933
|
-
render(
|
|
934
|
-
<CheckboxList
|
|
935
|
-
label="Prefs"
|
|
936
|
-
value={[]}
|
|
937
|
-
onChange={() => {}}
|
|
938
|
-
changeAction={changeAction}>
|
|
939
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
940
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
941
|
-
</CheckboxList>,
|
|
942
|
-
);
|
|
943
|
-
|
|
944
|
-
const [itemA, itemB] = screen.getAllByRole('listitem');
|
|
945
|
-
// Toggle Option A.
|
|
946
|
-
fireEvent.click(within(itemA).getByRole('checkbox'));
|
|
947
|
-
|
|
948
|
-
// The toggled item becomes busy and shows a spinner; the sibling stays idle.
|
|
949
|
-
// The spinner is decorative (inside the aria-hidden box), so query hidden.
|
|
950
|
-
expect(
|
|
951
|
-
await within(itemA).findByRole('status', {hidden: true}),
|
|
952
|
-
).toBeInTheDocument();
|
|
953
|
-
expect(itemA).toHaveAttribute('aria-busy', 'true');
|
|
954
|
-
expect(itemB).not.toHaveAttribute('aria-busy');
|
|
955
|
-
expect(
|
|
956
|
-
within(itemB).queryByRole('status', {hidden: true}),
|
|
957
|
-
).not.toBeInTheDocument();
|
|
958
|
-
expect(changeAction).toHaveBeenCalledWith(['a']);
|
|
959
|
-
});
|
|
960
|
-
|
|
961
|
-
it('keeps a read-only item onClick while refusing every toggle', async () => {
|
|
962
|
-
const user = userEvent.setup();
|
|
963
|
-
const onChange = vi.fn();
|
|
964
|
-
const onItemClick = vi.fn();
|
|
965
|
-
render(
|
|
966
|
-
<CheckboxList label="Prefs" value={[]} onChange={onChange} isReadOnly>
|
|
967
|
-
<CheckboxListItem label="Option A" value="a" onClick={onItemClick} />
|
|
968
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
969
|
-
</CheckboxList>,
|
|
970
|
-
);
|
|
971
|
-
const [itemA, itemB] = screen.getAllByRole('listitem');
|
|
972
|
-
const checkboxA = within(itemA).getByRole('checkbox');
|
|
973
|
-
const checkboxB = within(itemB).getByRole('checkbox');
|
|
974
|
-
|
|
975
|
-
// With an onClick, a row-surface click still delegates to the checkbox.
|
|
976
|
-
// The text also exists in the checkbox's visually hidden <label>; target
|
|
977
|
-
// the row's label <span> to click the row surface.
|
|
978
|
-
fireEvent.click(within(itemA).getByText('Option A', {selector: 'span'}));
|
|
979
|
-
expect(onItemClick).toHaveBeenCalledTimes(1);
|
|
980
|
-
fireEvent.click(checkboxA);
|
|
981
|
-
expect(onItemClick).toHaveBeenCalledTimes(2);
|
|
982
|
-
checkboxA.focus();
|
|
983
|
-
await user.keyboard(' ');
|
|
984
|
-
expect(onItemClick).toHaveBeenCalledTimes(3);
|
|
985
|
-
expect(checkboxA).toHaveAttribute('aria-readonly', 'true');
|
|
986
|
-
expect(checkboxA).not.toBeChecked();
|
|
987
|
-
|
|
988
|
-
// Without one, the read-only row does not delegate at all.
|
|
989
|
-
const delegated = vi.fn();
|
|
990
|
-
checkboxB.addEventListener('click', delegated);
|
|
991
|
-
fireEvent.click(within(itemB).getByText('Option B', {selector: 'span'}));
|
|
992
|
-
expect(delegated).not.toHaveBeenCalled();
|
|
993
|
-
fireEvent.click(checkboxB);
|
|
994
|
-
expect(checkboxB).not.toBeChecked();
|
|
995
|
-
expect(onChange).not.toHaveBeenCalled();
|
|
996
|
-
});
|
|
997
|
-
|
|
998
|
-
it('keeps an earlier toggled item busy and locked while its changeAction is still pending', async () => {
|
|
999
|
-
// Never-resolving actions keep both toggles pending for the assertions.
|
|
1000
|
-
const changeAction = vi.fn(async () => {
|
|
1001
|
-
await new Promise<void>(() => {});
|
|
1002
|
-
});
|
|
1003
|
-
const onChange = vi.fn();
|
|
1004
|
-
render(
|
|
1005
|
-
<CheckboxList
|
|
1006
|
-
label="Prefs"
|
|
1007
|
-
value={[]}
|
|
1008
|
-
onChange={onChange}
|
|
1009
|
-
changeAction={changeAction}>
|
|
1010
|
-
<CheckboxListItem label="Option A" value="a" />
|
|
1011
|
-
<CheckboxListItem label="Option B" value="b" />
|
|
1012
|
-
</CheckboxList>,
|
|
1013
|
-
);
|
|
1014
|
-
|
|
1015
|
-
const [itemA, itemB] = screen.getAllByRole('listitem');
|
|
1016
|
-
fireEvent.click(within(itemA).getByRole('checkbox'));
|
|
1017
|
-
await waitFor(() => expect(itemA).toHaveAttribute('aria-busy', 'true'));
|
|
1018
|
-
|
|
1019
|
-
// Other items stay interactive, and toggling one must not clear the
|
|
1020
|
-
// pending state of the item that is still saving.
|
|
1021
|
-
fireEvent.click(within(itemB).getByRole('checkbox'));
|
|
1022
|
-
await waitFor(() => expect(itemB).toHaveAttribute('aria-busy', 'true'));
|
|
1023
|
-
expect(itemA).toHaveAttribute('aria-busy', 'true');
|
|
1024
|
-
expect(
|
|
1025
|
-
within(itemA).getByRole('status', {hidden: true}),
|
|
1026
|
-
).toBeInTheDocument();
|
|
1027
|
-
|
|
1028
|
-
// Re-toggling the still-pending item stays blocked.
|
|
1029
|
-
fireEvent.click(within(itemA).getByRole('checkbox'));
|
|
1030
|
-
expect(onChange).toHaveBeenCalledTimes(2);
|
|
1031
|
-
expect(changeAction).toHaveBeenCalledTimes(2);
|
|
1032
|
-
expect(changeAction).toHaveBeenLastCalledWith(['a', 'b']);
|
|
1033
|
-
});
|
|
1034
|
-
|
|
1035
|
-
it('forwards arbitrary aria attributes to the list item, but aria-label names the checkbox', () => {
|
|
1036
|
-
render(
|
|
1037
|
-
<List>
|
|
1038
|
-
<CheckboxListItem
|
|
1039
|
-
label="Custom aria"
|
|
1040
|
-
aria-describedby="help-text"
|
|
1041
|
-
aria-label="Custom aria label"
|
|
1042
|
-
/>
|
|
1043
|
-
</List>,
|
|
1044
|
-
);
|
|
1045
|
-
const item = screen.getByRole('listitem');
|
|
1046
|
-
// Arbitrary aria-* still forward to the row...
|
|
1047
|
-
expect(item).toHaveAttribute('aria-describedby', 'help-text');
|
|
1048
|
-
// ...but aria-label names the checkbox control, not the row.
|
|
1049
|
-
expect(item).not.toHaveAttribute('aria-label');
|
|
1050
|
-
expect(
|
|
1051
|
-
screen.getByRole('checkbox', {name: 'Custom aria label'}),
|
|
1052
|
-
).toBeInTheDocument();
|
|
1053
|
-
});
|
|
1054
|
-
|
|
1055
|
-
describe('disabledMessage', () => {
|
|
1056
|
-
const h = {hidden: true} as const;
|
|
1057
|
-
|
|
1058
|
-
function renderGroup(props?: {onChange?: (v: string[]) => void}) {
|
|
1059
|
-
return render(
|
|
1060
|
-
<CheckboxList
|
|
1061
|
-
label="Notifications"
|
|
1062
|
-
value={['email']}
|
|
1063
|
-
onChange={props?.onChange ?? (() => {})}
|
|
1064
|
-
isDisabled
|
|
1065
|
-
disabledMessage="Notifications are managed by your administrator">
|
|
1066
|
-
<CheckboxListItem label="Email" value="email" />
|
|
1067
|
-
<CheckboxListItem label="SMS" value="sms" />
|
|
1068
|
-
</CheckboxList>,
|
|
1069
|
-
);
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
it('shows the reason tooltip on hover when the group is disabled with a reason', async () => {
|
|
1073
|
-
renderGroup();
|
|
1074
|
-
const tooltip = screen.getByRole('tooltip', h);
|
|
1075
|
-
expect(tooltip).toHaveTextContent(
|
|
1076
|
-
'Notifications are managed by your administrator',
|
|
1077
|
-
);
|
|
1078
|
-
const group = screen.getByRole('group');
|
|
1079
|
-
fireEvent.mouseEnter(group);
|
|
1080
|
-
await waitFor(() => expect(tooltip).toHaveAttribute('popover-open'));
|
|
1081
|
-
fireEvent.mouseLeave(group);
|
|
1082
|
-
await waitFor(() => expect(tooltip).not.toHaveAttribute('popover-open'));
|
|
1083
|
-
});
|
|
1084
|
-
|
|
1085
|
-
it('shows the reason tooltip on keyboard focus', async () => {
|
|
1086
|
-
const user = userEvent.setup();
|
|
1087
|
-
renderGroup();
|
|
1088
|
-
const tooltip = screen.getByRole('tooltip', h);
|
|
1089
|
-
await user.tab();
|
|
1090
|
-
await waitFor(() => expect(tooltip).toHaveAttribute('popover-open'));
|
|
1091
|
-
});
|
|
1092
|
-
|
|
1093
|
-
it('does not render a tooltip when not disabled', () => {
|
|
1094
|
-
render(
|
|
1095
|
-
<CheckboxList
|
|
1096
|
-
label="Notifications"
|
|
1097
|
-
value={['email']}
|
|
1098
|
-
onChange={() => {}}
|
|
1099
|
-
disabledMessage="Notifications are managed by your administrator">
|
|
1100
|
-
<CheckboxListItem label="Email" value="email" />
|
|
1101
|
-
</CheckboxList>,
|
|
1102
|
-
);
|
|
1103
|
-
expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
|
|
1104
|
-
});
|
|
1105
|
-
|
|
1106
|
-
it('does not render a tooltip when disabled without a reason', () => {
|
|
1107
|
-
render(
|
|
1108
|
-
<CheckboxList
|
|
1109
|
-
label="Notifications"
|
|
1110
|
-
value={['email']}
|
|
1111
|
-
onChange={() => {}}
|
|
1112
|
-
isDisabled>
|
|
1113
|
-
<CheckboxListItem label="Email" value="email" />
|
|
1114
|
-
</CheckboxList>,
|
|
1115
|
-
);
|
|
1116
|
-
expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
|
|
1117
|
-
});
|
|
1118
|
-
|
|
1119
|
-
it('keeps checkboxes focusable via aria-disabled when a reason is provided', () => {
|
|
1120
|
-
renderGroup();
|
|
1121
|
-
for (const checkbox of screen.getAllByRole('checkbox', h)) {
|
|
1122
|
-
expect(checkbox).not.toBeDisabled();
|
|
1123
|
-
expect(checkbox).toHaveAttribute('aria-disabled', 'true');
|
|
1124
|
-
}
|
|
1125
|
-
});
|
|
1126
|
-
|
|
1127
|
-
it('links the reason tooltip from the group via aria-describedby', () => {
|
|
1128
|
-
renderGroup();
|
|
1129
|
-
const group = screen.getByRole('group');
|
|
1130
|
-
const tooltip = screen.getByRole('tooltip', h);
|
|
1131
|
-
expect(group.getAttribute('aria-describedby')).toContain(tooltip.id);
|
|
1132
|
-
});
|
|
1133
|
-
|
|
1134
|
-
it('blocks toggling while focusable-disabled', () => {
|
|
1135
|
-
const onChange = vi.fn();
|
|
1136
|
-
renderGroup({onChange});
|
|
1137
|
-
const sms = screen.getByRole('checkbox', {name: 'SMS', hidden: true});
|
|
1138
|
-
fireEvent.click(sms);
|
|
1139
|
-
expect(onChange).not.toHaveBeenCalled();
|
|
1140
|
-
});
|
|
1141
|
-
|
|
1142
|
-
it('keeps checkboxes focusable via aria-disabled when disabled without a reason', () => {
|
|
1143
|
-
render(
|
|
1144
|
-
<CheckboxList
|
|
1145
|
-
label="Notifications"
|
|
1146
|
-
value={['email']}
|
|
1147
|
-
onChange={() => {}}
|
|
1148
|
-
isDisabled>
|
|
1149
|
-
<CheckboxListItem label="Email" value="email" />
|
|
1150
|
-
<CheckboxListItem label="SMS" value="sms" />
|
|
1151
|
-
</CheckboxList>,
|
|
1152
|
-
);
|
|
1153
|
-
for (const checkbox of screen.getAllByRole('checkbox', h)) {
|
|
1154
|
-
expect(checkbox).not.toHaveAttribute('disabled');
|
|
1155
|
-
expect(checkbox).toHaveAttribute('aria-disabled', 'true');
|
|
1156
|
-
}
|
|
1157
|
-
});
|
|
1158
|
-
});
|
|
1159
|
-
});
|