@cssints/apg-specs 0.0.0-stage → 0.5.1
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/LICENSE +21 -0
- package/README.md +65 -2
- package/dist/apg/accordion.bridge.d.mts +35 -0
- package/dist/apg/accordion.bridge.mjs +326 -0
- package/dist/apg/accordion.model.json +8397 -0
- package/dist/apg/alert.bridge.d.mts +22 -0
- package/dist/apg/alert.bridge.mjs +86 -0
- package/dist/apg/alert.model.json +871 -0
- package/dist/apg/alertdialog.bridge.d.mts +21 -0
- package/dist/apg/alertdialog.bridge.mjs +221 -0
- package/dist/apg/alertdialog.model.json +5232 -0
- package/dist/apg/breadcrumb.bridge.d.mts +26 -0
- package/dist/apg/breadcrumb.bridge.mjs +120 -0
- package/dist/apg/breadcrumb.model.json +574 -0
- package/dist/apg/button.bridge.d.mts +35 -0
- package/dist/apg/button.bridge.mjs +208 -0
- package/dist/apg/button.model.json +5814 -0
- package/dist/apg/carousel.bridge.d.mts +44 -0
- package/dist/apg/carousel.bridge.mjs +262 -0
- package/dist/apg/carousel.model.json +8963 -0
- package/dist/apg/checkbox-group.bridge.d.mts +25 -0
- package/dist/apg/checkbox-group.bridge.mjs +276 -0
- package/dist/apg/checkbox-group.model.json +3863 -0
- package/dist/apg/checkbox.bridge.d.mts +34 -0
- package/dist/apg/checkbox.bridge.mjs +253 -0
- package/dist/apg/checkbox.model.json +3158 -0
- package/dist/apg/combobox-autocomplete.bridge.d.mts +14 -0
- package/dist/apg/combobox-autocomplete.bridge.mjs +326 -0
- package/dist/apg/combobox-autocomplete.model.json +11586 -0
- package/dist/apg/combobox-dialog.bridge.d.mts +17 -0
- package/dist/apg/combobox-dialog.bridge.mjs +250 -0
- package/dist/apg/combobox-dialog.model.json +8981 -0
- package/dist/apg/combobox-grid.bridge.d.mts +17 -0
- package/dist/apg/combobox-grid.bridge.mjs +227 -0
- package/dist/apg/combobox-grid.model.json +8554 -0
- package/dist/apg/combobox-select-only.bridge.d.mts +24 -0
- package/dist/apg/combobox-select-only.bridge.mjs +304 -0
- package/dist/apg/combobox-select-only.model.json +7846 -0
- package/dist/apg/combobox-tree.bridge.d.mts +17 -0
- package/dist/apg/combobox-tree.bridge.mjs +211 -0
- package/dist/apg/combobox-tree.model.json +9345 -0
- package/dist/apg/dialog-modal.bridge.d.mts +35 -0
- package/dist/apg/dialog-modal.bridge.mjs +186 -0
- package/dist/apg/dialog-modal.model.json +7580 -0
- package/dist/apg/disclosure.bridge.d.mts +25 -0
- package/dist/apg/disclosure.bridge.mjs +202 -0
- package/dist/apg/disclosure.model.json +4703 -0
- package/dist/apg/feed.bridge.d.mts +31 -0
- package/dist/apg/feed.bridge.mjs +246 -0
- package/dist/apg/feed.model.json +4523 -0
- package/dist/apg/grid-selection.bridge.d.mts +13 -0
- package/dist/apg/grid-selection.bridge.mjs +160 -0
- package/dist/apg/grid-selection.model.json +6974 -0
- package/dist/apg/grid-sort.bridge.d.mts +12 -0
- package/dist/apg/grid-sort.bridge.mjs +138 -0
- package/dist/apg/grid-sort.model.json +3799 -0
- package/dist/apg/grid.bridge.d.mts +54 -0
- package/dist/apg/grid.bridge.mjs +441 -0
- package/dist/apg/grid.model.json +3802 -0
- package/dist/apg/link.bridge.d.mts +24 -0
- package/dist/apg/link.bridge.mjs +126 -0
- package/dist/apg/link.model.json +694 -0
- package/dist/apg/listbox-multi.bridge.d.mts +10 -0
- package/dist/apg/listbox-multi.bridge.mjs +261 -0
- package/dist/apg/listbox-multi.model.json +10893 -0
- package/dist/apg/listbox-rearrangeable.bridge.d.mts +20 -0
- package/dist/apg/listbox-rearrangeable.bridge.mjs +237 -0
- package/dist/apg/listbox-rearrangeable.model.json +17592 -0
- package/dist/apg/listbox-shared.d.mts +58 -0
- package/dist/apg/listbox-shared.mjs +171 -0
- package/dist/apg/listbox-single.bridge.d.mts +10 -0
- package/dist/apg/listbox-single.bridge.mjs +196 -0
- package/dist/apg/listbox-single.model.json +8024 -0
- package/dist/apg/listbox-typeahead.bridge.d.mts +10 -0
- package/dist/apg/listbox-typeahead.bridge.mjs +153 -0
- package/dist/apg/listbox-typeahead.model.json +5615 -0
- package/dist/apg/menu-button.bridge.d.mts +29 -0
- package/dist/apg/menu-button.bridge.mjs +259 -0
- package/dist/apg/menu-button.model.json +5706 -0
- package/dist/apg/menu-checkable.bridge.d.mts +25 -0
- package/dist/apg/menu-checkable.bridge.mjs +226 -0
- package/dist/apg/menu-checkable.model.json +4277 -0
- package/dist/apg/menu-menubar.bridge.d.mts +27 -0
- package/dist/apg/menu-menubar.bridge.mjs +273 -0
- package/dist/apg/menu-menubar.model.json +9540 -0
- package/dist/apg/meter.bridge.d.mts +28 -0
- package/dist/apg/meter.bridge.mjs +159 -0
- package/dist/apg/meter.model.json +1185 -0
- package/dist/apg/player.bridge.d.mts +24 -0
- package/dist/apg/player.bridge.mjs +342 -0
- package/dist/apg/player.model.json +11013 -0
- package/dist/apg/radio.bridge.d.mts +35 -0
- package/dist/apg/radio.bridge.mjs +371 -0
- package/dist/apg/radio.model.json +5011 -0
- package/dist/apg/slider-multithumb.bridge.d.mts +34 -0
- package/dist/apg/slider-multithumb.bridge.mjs +365 -0
- package/dist/apg/slider-multithumb.model.json +5774 -0
- package/dist/apg/slider.bridge.d.mts +54 -0
- package/dist/apg/slider.bridge.mjs +359 -0
- package/dist/apg/slider.model.json +4881 -0
- package/dist/apg/spinbutton.bridge.d.mts +41 -0
- package/dist/apg/spinbutton.bridge.mjs +327 -0
- package/dist/apg/spinbutton.model.json +7571 -0
- package/dist/apg/switch.bridge.d.mts +30 -0
- package/dist/apg/switch.bridge.mjs +243 -0
- package/dist/apg/switch.model.json +3159 -0
- package/dist/apg/tabs.bridge.d.mts +41 -0
- package/dist/apg/tabs.bridge.mjs +294 -0
- package/dist/apg/tabs.model.json +7659 -0
- package/dist/apg/timeline.bridge.d.mts +36 -0
- package/dist/apg/timeline.bridge.mjs +265 -0
- package/dist/apg/timeline.model.json +6189 -0
- package/dist/apg/toolbar.bridge.d.mts +25 -0
- package/dist/apg/toolbar.bridge.mjs +307 -0
- package/dist/apg/toolbar.model.json +6616 -0
- package/dist/apg/tooltip.bridge.d.mts +36 -0
- package/dist/apg/tooltip.bridge.mjs +208 -0
- package/dist/apg/tooltip.model.json +8295 -0
- package/dist/apg/treegrid.bridge.d.mts +28 -0
- package/dist/apg/treegrid.bridge.mjs +311 -0
- package/dist/apg/treegrid.model.json +17358 -0
- package/dist/apg/treeview.bridge.d.mts +26 -0
- package/dist/apg/treeview.bridge.mjs +396 -0
- package/dist/apg/treeview.model.json +13745 -0
- package/dist/apg/windowsplitter.bridge.d.mts +36 -0
- package/dist/apg/windowsplitter.bridge.mjs +242 -0
- package/dist/apg/windowsplitter.model.json +6253 -0
- package/dist/canvas/camera.model.json +6568 -0
- package/dist/canvas/canvas.bridge.d.mts +190 -0
- package/dist/canvas/canvas.bridge.mjs +729 -0
- package/dist/canvas/pointer.model.json +17095 -0
- package/dist/scenario.d.mts +233 -0
- package/dist/scenario.mjs +313 -0
- package/package.json +57 -4
- package/scenarios/apg/README.md +221 -0
- package/scenarios/apg/accordion.base-ui.json +1005 -0
- package/scenarios/apg/accordion.react-aria.json +929 -0
- package/scenarios/apg/alert.base-ui.json +81 -0
- package/scenarios/apg/alert.react-aria.json +98 -0
- package/scenarios/apg/alertdialog.base-ui.json +331 -0
- package/scenarios/apg/alertdialog.react-aria.json +225 -0
- package/scenarios/apg/breadcrumb.react-aria.json +312 -0
- package/scenarios/apg/button.ariakit.json +136 -0
- package/scenarios/apg/button.base-ui.json +747 -0
- package/scenarios/apg/button.react-aria.json +443 -0
- package/scenarios/apg/carousel.apg.json +909 -0
- package/scenarios/apg/checkbox.ariakit.json +299 -0
- package/scenarios/apg/checkbox.base-ui.json +1126 -0
- package/scenarios/apg/checkbox.react-aria.json +518 -0
- package/scenarios/apg/combobox.ariakit.json +945 -0
- package/scenarios/apg/combobox.base-ui.json +2444 -0
- package/scenarios/apg/combobox.react-aria.json +845 -0
- package/scenarios/apg/dialog-modal.ariakit.json +1102 -0
- package/scenarios/apg/dialog-modal.base-ui.json +775 -0
- package/scenarios/apg/dialog-modal.react-aria.json +638 -0
- package/scenarios/apg/disclosure.apg.json +349 -0
- package/scenarios/apg/disclosure.ariakit.json +163 -0
- package/scenarios/apg/disclosure.base-ui.json +451 -0
- package/scenarios/apg/disclosure.react-aria.json +643 -0
- package/scenarios/apg/feed.apg.json +442 -0
- package/scenarios/apg/grid.ariakit.json +197 -0
- package/scenarios/apg/grid.base-ui.json +720 -0
- package/scenarios/apg/grid.react-aria.json +969 -0
- package/scenarios/apg/landmarks.ariakit.json +93 -0
- package/scenarios/apg/landmarks.react-aria.json +330 -0
- package/scenarios/apg/link.ariakit.json +83 -0
- package/scenarios/apg/link.base-ui.json +88 -0
- package/scenarios/apg/link.react-aria.json +186 -0
- package/scenarios/apg/listbox.ariakit.json +78 -0
- package/scenarios/apg/listbox.base-ui.json +163 -0
- package/scenarios/apg/listbox.react-aria.json +1118 -0
- package/scenarios/apg/menu-button.ariakit.json +924 -0
- package/scenarios/apg/menu-button.base-ui.json +1155 -0
- package/scenarios/apg/menu-button.react-aria.json +1080 -0
- package/scenarios/apg/menubar.ariakit.json +758 -0
- package/scenarios/apg/menubar.base-ui.json +673 -0
- package/scenarios/apg/meter.base-ui.json +243 -0
- package/scenarios/apg/meter.react-aria.json +201 -0
- package/scenarios/apg/radio.ariakit.json +459 -0
- package/scenarios/apg/radio.base-ui.json +581 -0
- package/scenarios/apg/radio.react-aria.json +576 -0
- package/scenarios/apg/slider-multithumb.base-ui.json +316 -0
- package/scenarios/apg/slider-multithumb.react-aria.json +363 -0
- package/scenarios/apg/slider.base-ui.json +544 -0
- package/scenarios/apg/slider.react-aria.json +456 -0
- package/scenarios/apg/spinbutton.base-ui.json +1688 -0
- package/scenarios/apg/spinbutton.react-aria.json +426 -0
- package/scenarios/apg/switch.base-ui.json +456 -0
- package/scenarios/apg/switch.react-aria.json +303 -0
- package/scenarios/apg/table.ariakit.json +65 -0
- package/scenarios/apg/table.react-aria.json +221 -0
- package/scenarios/apg/tabs.ariakit.json +329 -0
- package/scenarios/apg/tabs.base-ui.json +875 -0
- package/scenarios/apg/tabs.react-aria.json +644 -0
- package/scenarios/apg/toolbar.ariakit.json +595 -0
- package/scenarios/apg/toolbar.base-ui.json +1189 -0
- package/scenarios/apg/toolbar.react-aria.json +383 -0
- package/scenarios/apg/tooltip.ariakit.json +441 -0
- package/scenarios/apg/tooltip.base-ui.json +411 -0
- package/scenarios/apg/tooltip.react-aria.json +454 -0
- package/scenarios/apg/treegrid.apg.json +2558 -0
- package/scenarios/apg/treegrid.react-aria.json +5094 -0
- package/scenarios/apg/treeview.apg.json +928 -0
- package/scenarios/apg/windowsplitter.apg.json +557 -0
- package/scenarios/canvas/README.md +69 -0
- package/scenarios/canvas/camera.contract.json +237 -0
- package/scenarios/canvas/camera.excalidraw.json +57 -0
- package/scenarios/canvas/marquee.excalidraw.json +122 -0
- package/scenarios/canvas/pan.excalidraw.json +46 -0
- package/scenarios/canvas/pointer.contract.json +528 -0
- package/scenarios/parts.json +291 -0
- package/shared/aria.qnt +186 -0
- package/shared/details-group.qnt +50 -0
- package/shared/focusgroup.qnt +152 -0
- package/shared/invokers.qnt +81 -0
- package/shared/popover.qnt +71 -0
- package/specs/apg/STATIC.md +103 -0
- package/specs/apg/accordion.qnt +578 -0
- package/specs/apg/alert.qnt +131 -0
- package/specs/apg/alertdialog.qnt +455 -0
- package/specs/apg/breadcrumb.qnt +88 -0
- package/specs/apg/button.qnt +445 -0
- package/specs/apg/carousel.qnt +732 -0
- package/specs/apg/checkbox-group.qnt +388 -0
- package/specs/apg/checkbox.qnt +394 -0
- package/specs/apg/combobox-autocomplete.qnt +764 -0
- package/specs/apg/combobox-dialog.qnt +627 -0
- package/specs/apg/combobox-grid.qnt +632 -0
- package/specs/apg/combobox-select-only.qnt +626 -0
- package/specs/apg/combobox-tree.qnt +633 -0
- package/specs/apg/dialog-modal.qnt +499 -0
- package/specs/apg/disclosure.qnt +309 -0
- package/specs/apg/feed.qnt +485 -0
- package/specs/apg/grid-selection.qnt +512 -0
- package/specs/apg/grid-sort.qnt +330 -0
- package/specs/apg/grid.qnt +360 -0
- package/specs/apg/link.qnt +119 -0
- package/specs/apg/listbox-multi.qnt +799 -0
- package/specs/apg/listbox-rearrangeable.qnt +801 -0
- package/specs/apg/listbox-single.qnt +511 -0
- package/specs/apg/listbox-typeahead.qnt +396 -0
- package/specs/apg/menu-button.qnt +363 -0
- package/specs/apg/menu-checkable.qnt +304 -0
- package/specs/apg/menu-menubar.qnt +531 -0
- package/specs/apg/meter.qnt +129 -0
- package/specs/apg/player.qnt +1081 -0
- package/specs/apg/radio.qnt +394 -0
- package/specs/apg/slider-multithumb.qnt +441 -0
- package/specs/apg/slider.qnt +396 -0
- package/specs/apg/spinbutton.qnt +494 -0
- package/specs/apg/switch.qnt +389 -0
- package/specs/apg/tabs.qnt +412 -0
- package/specs/apg/timeline.qnt +612 -0
- package/specs/apg/toolbar.qnt +364 -0
- package/specs/apg/tooltip.qnt +553 -0
- package/specs/apg/treegrid.qnt +983 -0
- package/specs/apg/treeview.qnt +1004 -0
- package/specs/apg/windowsplitter.qnt +487 -0
- package/specs/canvas/camera.qnt +407 -0
- package/specs/canvas/pointer.qnt +841 -0
|
@@ -0,0 +1,875 @@
|
|
|
1
|
+
{
|
|
2
|
+
"pattern": "tabs",
|
|
3
|
+
"source": "base-ui",
|
|
4
|
+
"commit": "19511bb171f3b360b006c94cf6d07e53cb446505",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"id": "tabs.base-ui.selected-prop-drives-aria",
|
|
9
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L236",
|
|
10
|
+
"upstreamTest": "should pass selected prop to children",
|
|
11
|
+
"apg": "aria",
|
|
12
|
+
"config": {
|
|
13
|
+
"orientation": "horizontal",
|
|
14
|
+
"activation": "automatic",
|
|
15
|
+
"items": 2,
|
|
16
|
+
"selected": 1
|
|
17
|
+
},
|
|
18
|
+
"steps": [
|
|
19
|
+
{
|
|
20
|
+
"expect": {
|
|
21
|
+
"attrs": {
|
|
22
|
+
"tab:0": { "aria-selected": "false" },
|
|
23
|
+
"tab:1": { "aria-selected": "true" }
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"notes": "Controlled value 1 marks only the second tab selected."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "tabs.base-ui.first-enabled-skipping-disabled",
|
|
32
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L286",
|
|
33
|
+
"upstreamTest": "should select the second tab when the first one is disabled",
|
|
34
|
+
"apg": "aria",
|
|
35
|
+
"config": {
|
|
36
|
+
"orientation": "horizontal",
|
|
37
|
+
"activation": "automatic",
|
|
38
|
+
"items": 2,
|
|
39
|
+
"disabled": [0]
|
|
40
|
+
},
|
|
41
|
+
"steps": [
|
|
42
|
+
{
|
|
43
|
+
"expect": {
|
|
44
|
+
"attrs": {
|
|
45
|
+
"tab:0": { "aria-selected": "false" },
|
|
46
|
+
"tab:1": { "aria-selected": "true" }
|
|
47
|
+
},
|
|
48
|
+
"visible": ["tabpanel:1"]
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"notes": "With no explicit value the first enabled tab becomes selected; the disabled panel stays hidden."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "tabs.base-ui.third-enabled-when-first-two-disabled",
|
|
56
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L314",
|
|
57
|
+
"upstreamTest": "should select the third tab when first two tabs are disabled",
|
|
58
|
+
"apg": "aria",
|
|
59
|
+
"config": {
|
|
60
|
+
"orientation": "horizontal",
|
|
61
|
+
"activation": "automatic",
|
|
62
|
+
"items": 4,
|
|
63
|
+
"disabled": [0, 1]
|
|
64
|
+
},
|
|
65
|
+
"steps": [
|
|
66
|
+
{
|
|
67
|
+
"expect": {
|
|
68
|
+
"attrs": {
|
|
69
|
+
"tab:0": { "aria-selected": "false" },
|
|
70
|
+
"tab:1": { "aria-selected": "false" },
|
|
71
|
+
"tab:2": { "aria-selected": "true" },
|
|
72
|
+
"tab:3": { "aria-selected": "false" }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
"notes": "The first non-disabled tab (index 2) is auto-selected."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "tabs.base-ui.explicit-value-points-at-disabled",
|
|
81
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L404",
|
|
82
|
+
"upstreamTest": "should still honor explicit value prop even if it points to a disabled tab",
|
|
83
|
+
"apg": "extension",
|
|
84
|
+
"config": {
|
|
85
|
+
"orientation": "horizontal",
|
|
86
|
+
"activation": "automatic",
|
|
87
|
+
"items": 3,
|
|
88
|
+
"selected": 0,
|
|
89
|
+
"disabled": [0]
|
|
90
|
+
},
|
|
91
|
+
"steps": [
|
|
92
|
+
{
|
|
93
|
+
"expect": {
|
|
94
|
+
"attrs": {
|
|
95
|
+
"tab:0": { "aria-selected": "true" },
|
|
96
|
+
"tab:1": { "aria-selected": "false" },
|
|
97
|
+
"tab:2": { "aria-selected": "false" }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"notes": "An explicit selection wins even when it names a disabled tab; auto-fallback applies only to implicit defaults."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "tabs.base-ui.no-selection-all-disabled",
|
|
106
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L467",
|
|
107
|
+
"upstreamTest": "does not select any tab when all tabs are disabled",
|
|
108
|
+
"apg": "aria",
|
|
109
|
+
"config": {
|
|
110
|
+
"orientation": "horizontal",
|
|
111
|
+
"activation": "automatic",
|
|
112
|
+
"items": 3,
|
|
113
|
+
"disabled": [0, 1, 2]
|
|
114
|
+
},
|
|
115
|
+
"steps": [
|
|
116
|
+
{
|
|
117
|
+
"expect": {
|
|
118
|
+
"attrs": {
|
|
119
|
+
"tab:0": { "aria-selected": "false" },
|
|
120
|
+
"tab:1": { "aria-selected": "false" },
|
|
121
|
+
"tab:2": { "aria-selected": "false" }
|
|
122
|
+
},
|
|
123
|
+
"visible": []
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
],
|
|
127
|
+
"notes": "All panels hidden when no tab can be selected."
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"id": "tabs.base-ui.disabled-selected-tab-keeps-tabindex-on-previous",
|
|
131
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L432",
|
|
132
|
+
"upstreamTest": "does not set tabIndex=0 on disabled tabs when they are programmatically selected",
|
|
133
|
+
"apg": "extension",
|
|
134
|
+
"config": {
|
|
135
|
+
"orientation": "horizontal",
|
|
136
|
+
"activation": "automatic",
|
|
137
|
+
"items": 3,
|
|
138
|
+
"selected": 1,
|
|
139
|
+
"disabled": [0]
|
|
140
|
+
},
|
|
141
|
+
"steps": [
|
|
142
|
+
{
|
|
143
|
+
"expect": {
|
|
144
|
+
"attrs": {
|
|
145
|
+
"tab:0": { "tabindex": "-1" },
|
|
146
|
+
"tab:1": { "tabindex": "0" },
|
|
147
|
+
"tab:2": { "tabindex": "-1" }
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
{ "event": "prop", "prop": "selectedKey", "value": 0 },
|
|
152
|
+
{
|
|
153
|
+
"expect": {
|
|
154
|
+
"attrs": {
|
|
155
|
+
"tab:0": { "aria-selected": "true", "tabindex": "-1" },
|
|
156
|
+
"tab:1": { "tabindex": "0" }
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"notes": "Programmatically selecting a disabled tab marks it selected but leaves the roving tab stop on the previously highlighted enabled tab."
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"id": "tabs.base-ui.arrow-next-activates",
|
|
165
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1637",
|
|
166
|
+
"upstreamTest": "moves focus to the next tab while activating it",
|
|
167
|
+
"apg": "keyboard",
|
|
168
|
+
"config": {
|
|
169
|
+
"orientation": "horizontal",
|
|
170
|
+
"activation": "automatic",
|
|
171
|
+
"items": 3,
|
|
172
|
+
"selected": 1
|
|
173
|
+
},
|
|
174
|
+
"steps": [
|
|
175
|
+
{ "event": "focus", "target": "tab:1" },
|
|
176
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:1" },
|
|
177
|
+
{
|
|
178
|
+
"expect": {
|
|
179
|
+
"focus": "tab:2",
|
|
180
|
+
"attrs": { "tab:2": { "aria-selected": "true" } },
|
|
181
|
+
"events": { "onValueChange": ["tab:2"] }
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
],
|
|
185
|
+
"notes": "activateOnFocus=true: arrow moves focus and commits the selection."
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"id": "tabs.base-ui.arrow-next-focus-only",
|
|
189
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1528",
|
|
190
|
+
"upstreamTest": "moves focus to the next tab without activating it",
|
|
191
|
+
"apg": "keyboard",
|
|
192
|
+
"config": {
|
|
193
|
+
"orientation": "horizontal",
|
|
194
|
+
"activation": "manual",
|
|
195
|
+
"items": 3,
|
|
196
|
+
"selected": 0
|
|
197
|
+
},
|
|
198
|
+
"steps": [
|
|
199
|
+
{ "event": "focus", "target": "tab:0" },
|
|
200
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:0" },
|
|
201
|
+
{
|
|
202
|
+
"expect": {
|
|
203
|
+
"focus": "tab:1",
|
|
204
|
+
"attrs": {
|
|
205
|
+
"tab:0": { "aria-selected": "true" },
|
|
206
|
+
"tab:1": { "aria-selected": "false" }
|
|
207
|
+
},
|
|
208
|
+
"events": { "onValueChange": [] }
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
],
|
|
212
|
+
"notes": "activateOnFocus=false: arrow moves focus without selecting and without firing onValueChange."
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"id": "tabs.base-ui.arrow-previous-activates",
|
|
216
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1427",
|
|
217
|
+
"upstreamTest": "moves focus to the previous tab while activating it",
|
|
218
|
+
"apg": "keyboard",
|
|
219
|
+
"config": {
|
|
220
|
+
"orientation": "horizontal",
|
|
221
|
+
"activation": "automatic",
|
|
222
|
+
"items": 3,
|
|
223
|
+
"selected": 1
|
|
224
|
+
},
|
|
225
|
+
"steps": [
|
|
226
|
+
{ "event": "focus", "target": "tab:1" },
|
|
227
|
+
{ "event": "key", "key": "ArrowLeft", "target": "tab:1" },
|
|
228
|
+
{
|
|
229
|
+
"expect": {
|
|
230
|
+
"focus": "tab:0",
|
|
231
|
+
"attrs": { "tab:0": { "aria-selected": "true" } },
|
|
232
|
+
"events": { "onValueChange": ["tab:0"] }
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
],
|
|
236
|
+
"notes": "activateOnFocus=true previous direction."
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"id": "tabs.base-ui.arrow-wraps-across-ends",
|
|
240
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1291",
|
|
241
|
+
"upstreamTest": "moves focus to the last tab while activating it if focus is on the first tab",
|
|
242
|
+
"apg": "keyboard",
|
|
243
|
+
"config": {
|
|
244
|
+
"orientation": "horizontal",
|
|
245
|
+
"activation": "automatic",
|
|
246
|
+
"items": 3,
|
|
247
|
+
"selected": 0
|
|
248
|
+
},
|
|
249
|
+
"steps": [
|
|
250
|
+
{ "event": "focus", "target": "tab:0" },
|
|
251
|
+
{ "event": "key", "key": "ArrowLeft", "target": "tab:0" },
|
|
252
|
+
{
|
|
253
|
+
"expect": {
|
|
254
|
+
"focus": "tab:2",
|
|
255
|
+
"attrs": { "tab:2": { "aria-selected": "true" } }
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:2" },
|
|
259
|
+
{
|
|
260
|
+
"expect": {
|
|
261
|
+
"focus": "tab:0",
|
|
262
|
+
"attrs": { "tab:0": { "aria-selected": "true" } }
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
],
|
|
266
|
+
"notes": "APG allows optional wrapping; base-ui wraps by default."
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"id": "tabs.base-ui.rtl-arrow-mapping",
|
|
270
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1281",
|
|
271
|
+
"upstreamTest": "when focus is on a tab element in a horizontal rtl tablist ArrowRight moves focus to the previous tab while activating it",
|
|
272
|
+
"apg": "keyboard",
|
|
273
|
+
"config": {
|
|
274
|
+
"orientation": "horizontal",
|
|
275
|
+
"activation": "automatic",
|
|
276
|
+
"items": 3,
|
|
277
|
+
"selected": 1,
|
|
278
|
+
"direction": "rtl"
|
|
279
|
+
},
|
|
280
|
+
"steps": [
|
|
281
|
+
{ "event": "focus", "target": "tab:1" },
|
|
282
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:1" },
|
|
283
|
+
{
|
|
284
|
+
"expect": {
|
|
285
|
+
"focus": "tab:0",
|
|
286
|
+
"attrs": { "tab:0": { "aria-selected": "true" } }
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
{ "event": "key", "key": "ArrowLeft", "target": "tab:0" },
|
|
290
|
+
{
|
|
291
|
+
"expect": {
|
|
292
|
+
"focus": "tab:1",
|
|
293
|
+
"attrs": { "tab:1": { "aria-selected": "true" } }
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
],
|
|
297
|
+
"notes": "In RTL the horizontal previous/next keys are mirrored."
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"id": "tabs.base-ui.vertical-arrow-mapping",
|
|
301
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1282",
|
|
302
|
+
"upstreamTest": "when focus is on a tab element in a vertical tablist ArrowDown moves focus to the next tab while activating it",
|
|
303
|
+
"apg": "keyboard",
|
|
304
|
+
"config": {
|
|
305
|
+
"orientation": "vertical",
|
|
306
|
+
"activation": "automatic",
|
|
307
|
+
"items": 3,
|
|
308
|
+
"selected": 1
|
|
309
|
+
},
|
|
310
|
+
"steps": [
|
|
311
|
+
{ "event": "focus", "target": "tab:1" },
|
|
312
|
+
{ "event": "key", "key": "ArrowDown", "target": "tab:1" },
|
|
313
|
+
{
|
|
314
|
+
"expect": {
|
|
315
|
+
"focus": "tab:2",
|
|
316
|
+
"attrs": { "tab:2": { "aria-selected": "true" } }
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
{ "event": "key", "key": "ArrowUp", "target": "tab:2" },
|
|
320
|
+
{
|
|
321
|
+
"expect": {
|
|
322
|
+
"focus": "tab:1",
|
|
323
|
+
"attrs": { "tab:1": { "aria-selected": "true" } }
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
],
|
|
327
|
+
"notes": "Vertical tablists use ArrowUp/ArrowDown."
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"id": "tabs.base-ui.arrow-focuses-disabled-without-activating",
|
|
331
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1673",
|
|
332
|
+
"upstreamTest": "ArrowRight moves focus to a disabled tab without activating it",
|
|
333
|
+
"apg": "keyboard",
|
|
334
|
+
"config": {
|
|
335
|
+
"orientation": "horizontal",
|
|
336
|
+
"activation": "automatic",
|
|
337
|
+
"items": 3,
|
|
338
|
+
"selected": 0,
|
|
339
|
+
"disabled": [1]
|
|
340
|
+
},
|
|
341
|
+
"steps": [
|
|
342
|
+
{ "event": "focus", "target": "tab:0" },
|
|
343
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:0" },
|
|
344
|
+
{
|
|
345
|
+
"expect": {
|
|
346
|
+
"focus": "tab:1",
|
|
347
|
+
"attrs": {
|
|
348
|
+
"tab:0": { "aria-selected": "true" },
|
|
349
|
+
"tab:1": { "aria-selected": "false" }
|
|
350
|
+
},
|
|
351
|
+
"events": { "onValueChange": [] }
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:1" },
|
|
355
|
+
{ "expect": { "focus": "tab:2" } }
|
|
356
|
+
],
|
|
357
|
+
"notes": "A disabled tab is focusable for roving focus but is never activated; the next arrow moves on to the following tab."
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
"id": "tabs.base-ui.home-end-activates",
|
|
361
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1784",
|
|
362
|
+
"upstreamTest": "when `activateOnFocus = true`, moves focus to the first tab while activating it (Home)",
|
|
363
|
+
"apg": "keyboard",
|
|
364
|
+
"config": {
|
|
365
|
+
"orientation": "horizontal",
|
|
366
|
+
"activation": "automatic",
|
|
367
|
+
"items": 3,
|
|
368
|
+
"selected": 0
|
|
369
|
+
},
|
|
370
|
+
"steps": [
|
|
371
|
+
{ "event": "focus", "target": "tab:0" },
|
|
372
|
+
{ "event": "key", "key": "End", "target": "tab:0" },
|
|
373
|
+
{
|
|
374
|
+
"expect": {
|
|
375
|
+
"focus": "tab:2",
|
|
376
|
+
"attrs": { "tab:2": { "aria-selected": "true" } },
|
|
377
|
+
"events": { "onValueChange": ["tab:2"] }
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
{ "event": "key", "key": "Home", "target": "tab:2" },
|
|
381
|
+
{
|
|
382
|
+
"expect": {
|
|
383
|
+
"focus": "tab:0",
|
|
384
|
+
"attrs": { "tab:0": { "aria-selected": "true" } },
|
|
385
|
+
"events": { "onValueChange": ["tab:2", "tab:0"] }
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
],
|
|
389
|
+
"notes": "Home/End always move focus to the first/last tab regardless of orientation; automatic activation commits them."
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
"id": "tabs.base-ui.home-end-focus-only",
|
|
393
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1756",
|
|
394
|
+
"upstreamTest": "when `activateOnFocus = false`, moves focus to the first tab without activating it (Home)",
|
|
395
|
+
"apg": "keyboard",
|
|
396
|
+
"config": {
|
|
397
|
+
"orientation": "vertical",
|
|
398
|
+
"activation": "manual",
|
|
399
|
+
"items": 3,
|
|
400
|
+
"selected": 0
|
|
401
|
+
},
|
|
402
|
+
"steps": [
|
|
403
|
+
{ "event": "focus", "target": "tab:0" },
|
|
404
|
+
{ "event": "key", "key": "End", "target": "tab:0" },
|
|
405
|
+
{
|
|
406
|
+
"expect": {
|
|
407
|
+
"focus": "tab:2",
|
|
408
|
+
"attrs": { "tab:2": { "aria-selected": "false" } },
|
|
409
|
+
"events": { "onValueChange": [] }
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
{ "event": "key", "key": "Home", "target": "tab:2" },
|
|
413
|
+
{
|
|
414
|
+
"expect": {
|
|
415
|
+
"focus": "tab:0",
|
|
416
|
+
"attrs": { "tab:0": { "aria-selected": "true" } }
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
],
|
|
420
|
+
"notes": "Manual activation: Home/End move focus only."
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"id": "tabs.base-ui.modifier-keys-do-not-navigate",
|
|
424
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1714",
|
|
425
|
+
"upstreamTest": "does not move focus when modifier key: Shift is pressed",
|
|
426
|
+
"apg": "extension",
|
|
427
|
+
"config": {
|
|
428
|
+
"orientation": "horizontal",
|
|
429
|
+
"activation": "automatic",
|
|
430
|
+
"items": 3,
|
|
431
|
+
"selected": 0
|
|
432
|
+
},
|
|
433
|
+
"steps": [
|
|
434
|
+
{ "event": "focus", "target": "tab:0" },
|
|
435
|
+
{
|
|
436
|
+
"event": "key",
|
|
437
|
+
"key": "ArrowRight",
|
|
438
|
+
"value": { "modifiers": ["Shift"] },
|
|
439
|
+
"target": "tab:0"
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
"expect": {
|
|
443
|
+
"focus": "tab:0",
|
|
444
|
+
"attrs": { "tab:0": { "aria-selected": "true" } },
|
|
445
|
+
"events": { "onValueChange": [] }
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
],
|
|
449
|
+
"notes": "Arrow keys with any modifier (Shift/Control/Alt/Meta) are left to the browser."
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"id": "tabs.base-ui.aria-orientation-default-absent",
|
|
453
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1189",
|
|
454
|
+
"upstreamTest": "does not add aria-orientation by default",
|
|
455
|
+
"apg": "aria",
|
|
456
|
+
"config": {
|
|
457
|
+
"orientation": "horizontal",
|
|
458
|
+
"activation": "automatic",
|
|
459
|
+
"items": 1,
|
|
460
|
+
"selected": 0
|
|
461
|
+
},
|
|
462
|
+
"steps": [
|
|
463
|
+
{ "expect": { "attrs": { "tablist": { "aria-orientation": null } } } }
|
|
464
|
+
],
|
|
465
|
+
"notes": "Horizontal is the implicit ARIA default, so aria-orientation is omitted."
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
"id": "tabs.base-ui.aria-orientation-vertical",
|
|
469
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1201",
|
|
470
|
+
"upstreamTest": "adds the proper aria-orientation when vertical",
|
|
471
|
+
"apg": "aria",
|
|
472
|
+
"config": {
|
|
473
|
+
"orientation": "vertical",
|
|
474
|
+
"activation": "automatic",
|
|
475
|
+
"items": 1,
|
|
476
|
+
"selected": 0
|
|
477
|
+
},
|
|
478
|
+
"steps": [
|
|
479
|
+
{
|
|
480
|
+
"expect": {
|
|
481
|
+
"attrs": { "tablist": { "aria-orientation": "vertical" } }
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
],
|
|
485
|
+
"notes": "Vertical orientation is exposed on the tablist."
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
"id": "tabs.base-ui.click-selects",
|
|
489
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1215",
|
|
490
|
+
"upstreamTest": "selects the clicked tab",
|
|
491
|
+
"apg": "aria",
|
|
492
|
+
"config": {
|
|
493
|
+
"orientation": "horizontal",
|
|
494
|
+
"activation": "manual",
|
|
495
|
+
"items": 3,
|
|
496
|
+
"selected": 0
|
|
497
|
+
},
|
|
498
|
+
"steps": [
|
|
499
|
+
{ "event": "click", "target": "tab:1" },
|
|
500
|
+
{
|
|
501
|
+
"expect": {
|
|
502
|
+
"attrs": { "tab:1": { "aria-selected": "true" } },
|
|
503
|
+
"visible": ["tabpanel:1"]
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
],
|
|
507
|
+
"notes": "Pointer click selects even with activateOnFocus=false."
|
|
508
|
+
},
|
|
509
|
+
{
|
|
510
|
+
"id": "tabs.base-ui.click-disabled-does-not-select",
|
|
511
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L1245",
|
|
512
|
+
"upstreamTest": "does not select the clicked disabled tab",
|
|
513
|
+
"apg": "aria",
|
|
514
|
+
"config": {
|
|
515
|
+
"orientation": "horizontal",
|
|
516
|
+
"activation": "manual",
|
|
517
|
+
"items": 3,
|
|
518
|
+
"selected": 0,
|
|
519
|
+
"disabled": [1]
|
|
520
|
+
},
|
|
521
|
+
"steps": [
|
|
522
|
+
{ "event": "click", "target": "tab:1" },
|
|
523
|
+
{
|
|
524
|
+
"expect": {
|
|
525
|
+
"attrs": {
|
|
526
|
+
"tab:0": { "aria-selected": "true" },
|
|
527
|
+
"tab:1": { "aria-selected": "false" }
|
|
528
|
+
},
|
|
529
|
+
"visible": ["tabpanel:0"]
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
],
|
|
533
|
+
"notes": "Disabled tabs ignore pointer activation."
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
"id": "tabs.base-ui.keyboard-activation-enter-space",
|
|
537
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/tab/TabsTab.test.tsx#L218",
|
|
538
|
+
"upstreamTest": "activates the focused tab with Enter/Space when `activateOnFocus` is false",
|
|
539
|
+
"apg": "keyboard",
|
|
540
|
+
"config": {
|
|
541
|
+
"orientation": "horizontal",
|
|
542
|
+
"activation": "manual",
|
|
543
|
+
"items": 2,
|
|
544
|
+
"selected": 0
|
|
545
|
+
},
|
|
546
|
+
"steps": [
|
|
547
|
+
{ "event": "focus", "target": "tab:0" },
|
|
548
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:0" },
|
|
549
|
+
{
|
|
550
|
+
"expect": {
|
|
551
|
+
"focus": "tab:1",
|
|
552
|
+
"attrs": { "tab:1": { "aria-selected": "false" } }
|
|
553
|
+
}
|
|
554
|
+
},
|
|
555
|
+
{ "event": "key", "key": "Enter", "target": "tab:1" },
|
|
556
|
+
{
|
|
557
|
+
"expect": {
|
|
558
|
+
"attrs": {
|
|
559
|
+
"tab:0": { "aria-selected": "false" },
|
|
560
|
+
"tab:1": { "aria-selected": "true" }
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
},
|
|
564
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:1" },
|
|
565
|
+
{ "event": "key", "key": " ", "target": "tab:0" },
|
|
566
|
+
{
|
|
567
|
+
"expect": {
|
|
568
|
+
"attrs": {
|
|
569
|
+
"tab:0": { "aria-selected": "true" },
|
|
570
|
+
"tab:1": { "aria-selected": "false" }
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
],
|
|
575
|
+
"notes": "Manual activation is committed with either Enter or Space."
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
"id": "tabs.base-ui.onvaluechange-initial-and-pointer",
|
|
579
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L622",
|
|
580
|
+
"upstreamTest": "calls onValueChange when auto-selecting the first tab on mount",
|
|
581
|
+
"apg": "extension",
|
|
582
|
+
"config": {
|
|
583
|
+
"orientation": "horizontal",
|
|
584
|
+
"activation": "automatic",
|
|
585
|
+
"items": 3
|
|
586
|
+
},
|
|
587
|
+
"steps": [
|
|
588
|
+
{
|
|
589
|
+
"expect": {
|
|
590
|
+
"attrs": { "tab:0": { "aria-selected": "true" } },
|
|
591
|
+
"events": { "onValueChange": ["tab:0"] }
|
|
592
|
+
}
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
"event": "pointerdown",
|
|
596
|
+
"value": { "button": "primary" },
|
|
597
|
+
"target": "tab:1"
|
|
598
|
+
},
|
|
599
|
+
{ "expect": { "events": { "onValueChange": ["tab:0", "tab:1"] } } }
|
|
600
|
+
],
|
|
601
|
+
"notes": "Implicit first-tab selection fires onValueChange with reason 'initial'; activateOnFocus makes pointerdown commit too."
|
|
602
|
+
},
|
|
603
|
+
{
|
|
604
|
+
"id": "tabs.base-ui.onvaluechange-not-repeated",
|
|
605
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L560",
|
|
606
|
+
"upstreamTest": "should not call onValueChange when already active",
|
|
607
|
+
"apg": "extension",
|
|
608
|
+
"config": {
|
|
609
|
+
"orientation": "horizontal",
|
|
610
|
+
"activation": "automatic",
|
|
611
|
+
"items": 2,
|
|
612
|
+
"selected": 0
|
|
613
|
+
},
|
|
614
|
+
"steps": [
|
|
615
|
+
{ "event": "click", "target": "tab:0" },
|
|
616
|
+
{
|
|
617
|
+
"expect": {
|
|
618
|
+
"events": { "onValueChange": [] },
|
|
619
|
+
"attrs": { "tab:0": { "aria-selected": "true" } }
|
|
620
|
+
}
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
"event": "click",
|
|
624
|
+
"value": { "button": "secondary" },
|
|
625
|
+
"target": "tab:1"
|
|
626
|
+
},
|
|
627
|
+
{ "expect": { "events": { "onValueChange": [] } } }
|
|
628
|
+
],
|
|
629
|
+
"notes": "Re-clicking the active tab and non-primary button clicks do not change value."
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
"id": "tabs.base-ui.disabled-selected-becomes-disabled",
|
|
633
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L872",
|
|
634
|
+
"upstreamTest": "calls onValueChange when the selected tab becomes disabled",
|
|
635
|
+
"apg": "extension",
|
|
636
|
+
"config": {
|
|
637
|
+
"orientation": "horizontal",
|
|
638
|
+
"activation": "automatic",
|
|
639
|
+
"items": 3,
|
|
640
|
+
"selected": 0
|
|
641
|
+
},
|
|
642
|
+
"steps": [
|
|
643
|
+
{ "event": "prop", "prop": "disabled", "value": [0] },
|
|
644
|
+
{
|
|
645
|
+
"expect": {
|
|
646
|
+
"attrs": {
|
|
647
|
+
"tab:0": { "aria-selected": "false" },
|
|
648
|
+
"tab:1": { "aria-selected": "true" }
|
|
649
|
+
},
|
|
650
|
+
"events": { "onValueChange": ["tab:1"] }
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
],
|
|
654
|
+
"notes": "When the selected tab is disabled after mount, selection falls through to the next enabled tab."
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
"id": "tabs.base-ui.onvaluechange-initial-null-all-disabled",
|
|
658
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L751",
|
|
659
|
+
"upstreamTest": "calls onValueChange with null when all tabs are initially disabled",
|
|
660
|
+
"apg": "extension",
|
|
661
|
+
"config": {
|
|
662
|
+
"orientation": "horizontal",
|
|
663
|
+
"activation": "automatic",
|
|
664
|
+
"items": 2,
|
|
665
|
+
"disabled": [0, 1]
|
|
666
|
+
},
|
|
667
|
+
"steps": [{ "expect": { "events": { "onValueChange": [null] } } }],
|
|
668
|
+
"notes": "With no selectable tab the initial callback reports null."
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
"id": "tabs.base-ui.roving-tabindex",
|
|
672
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/root/TabsRoot.test.tsx#L50",
|
|
673
|
+
"upstreamTest": "puts the selected child in tab order",
|
|
674
|
+
"apg": "aria",
|
|
675
|
+
"config": {
|
|
676
|
+
"orientation": "horizontal",
|
|
677
|
+
"activation": "automatic",
|
|
678
|
+
"items": 2,
|
|
679
|
+
"selected": 1
|
|
680
|
+
},
|
|
681
|
+
"steps": [
|
|
682
|
+
{
|
|
683
|
+
"expect": {
|
|
684
|
+
"attrs": {
|
|
685
|
+
"tab:0": { "tabindex": "-1" },
|
|
686
|
+
"tab:1": { "tabindex": "0" }
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
},
|
|
690
|
+
{ "event": "prop", "prop": "selectedKey", "value": 0 },
|
|
691
|
+
{
|
|
692
|
+
"expect": {
|
|
693
|
+
"attrs": {
|
|
694
|
+
"tab:0": { "tabindex": "0" },
|
|
695
|
+
"tab:1": { "tabindex": "-1" }
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
],
|
|
700
|
+
"notes": "Roving tabindex follows the selected value; only one tab is in the page tab order."
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
"id": "tabs.base-ui.loop-focus-false-no-wrap",
|
|
704
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/list/TabsList.test.tsx#L62",
|
|
705
|
+
"upstreamTest": "does not wrap focus past the first tab when `loopFocus` is false",
|
|
706
|
+
"apg": "extension",
|
|
707
|
+
"config": {
|
|
708
|
+
"orientation": "horizontal",
|
|
709
|
+
"activation": "automatic",
|
|
710
|
+
"items": 3,
|
|
711
|
+
"selected": 0,
|
|
712
|
+
"loopFocus": false
|
|
713
|
+
},
|
|
714
|
+
"steps": [
|
|
715
|
+
{ "event": "focus", "target": "tab:0" },
|
|
716
|
+
{ "event": "key", "key": "ArrowLeft", "target": "tab:0" },
|
|
717
|
+
{ "expect": { "focus": "tab:0" } },
|
|
718
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:0" },
|
|
719
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:1" },
|
|
720
|
+
{ "event": "key", "key": "ArrowRight", "target": "tab:2" },
|
|
721
|
+
{ "expect": { "focus": "tab:2" } }
|
|
722
|
+
],
|
|
723
|
+
"notes": "loopFocus=false stops at the list edges instead of wrapping; the first arrow pair also confirms focus stays put at the start."
|
|
724
|
+
},
|
|
725
|
+
{
|
|
726
|
+
"id": "tabs.base-ui.tablist-named-aria-label",
|
|
727
|
+
"upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/tabs/list/TabsList.test.tsx#L267",
|
|
728
|
+
"upstreamTest": "can be named via `aria-label`",
|
|
729
|
+
"apg": "aria",
|
|
730
|
+
"config": {
|
|
731
|
+
"orientation": "horizontal",
|
|
732
|
+
"activation": "automatic",
|
|
733
|
+
"items": 1,
|
|
734
|
+
"selected": 0,
|
|
735
|
+
"ariaLabel": "Tabs"
|
|
736
|
+
},
|
|
737
|
+
"steps": [
|
|
738
|
+
{ "expect": { "attrs": { "tablist": { "aria-label": "Tabs" } } } }
|
|
739
|
+
],
|
|
740
|
+
"notes": "aria-label on the tablist provides the accessible name."
|
|
741
|
+
}
|
|
742
|
+
],
|
|
743
|
+
"skipped": [
|
|
744
|
+
{
|
|
745
|
+
"upstreamTest": "sets the aria-labelledby attribute on tab panels to the corresponding tab id",
|
|
746
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L67",
|
|
747
|
+
"reason": "generated element-id relationships are not portable across libraries"
|
|
748
|
+
},
|
|
749
|
+
{
|
|
750
|
+
"upstreamTest": "sets the aria-controls attribute on tabs to the corresponding tab panel id",
|
|
751
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L92",
|
|
752
|
+
"reason": "generated element-id relationships are not portable across libraries"
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
"upstreamTest": "syncs aria-controls to the mounted tab panel when keepMounted is false",
|
|
756
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L138",
|
|
757
|
+
"reason": "generated element-id relationships and mount lifecycle"
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
"upstreamTest": "cleans and replaces panel registrations in Strict Mode",
|
|
761
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L167",
|
|
762
|
+
"reason": "React StrictMode/ref-registration API"
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
"upstreamTest": "should support values of different types",
|
|
766
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L252",
|
|
767
|
+
"reason": "React API accepting object/function/symbol values"
|
|
768
|
+
},
|
|
769
|
+
{
|
|
770
|
+
"upstreamTest": "does not cancel automatic value changes",
|
|
771
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L690",
|
|
772
|
+
"reason": "React eventDetails.cancel API"
|
|
773
|
+
},
|
|
774
|
+
{
|
|
775
|
+
"upstreamTest": "does not move an uncontrolled selection when a user-initiated change is canceled",
|
|
776
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L721",
|
|
777
|
+
"reason": "React eventDetails.cancel API"
|
|
778
|
+
},
|
|
779
|
+
{
|
|
780
|
+
"upstreamTest": "does not emit missing when an enabled tab appears after all tabs were disabled",
|
|
781
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L777",
|
|
782
|
+
"reason": "React re-render lifecycle"
|
|
783
|
+
},
|
|
784
|
+
{
|
|
785
|
+
"upstreamTest": "calls onValueChange when the selected tab is removed",
|
|
786
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L978",
|
|
787
|
+
"reason": "React re-render lifecycle"
|
|
788
|
+
},
|
|
789
|
+
{
|
|
790
|
+
"upstreamTest": "calls onValueChange with null when the selected tab is removed and no tabs remain",
|
|
791
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L1009",
|
|
792
|
+
"reason": "React re-render lifecycle"
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
"upstreamTest": "keeps a roving focus entry point when a controlled selected tab is removed",
|
|
796
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L1148",
|
|
797
|
+
"reason": "React controlled-state lifecycle"
|
|
798
|
+
},
|
|
799
|
+
{
|
|
800
|
+
"upstreamTest": "should set the `data-activation-direction` attribute ...",
|
|
801
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L1978",
|
|
802
|
+
"reason": "indicator/animation direction state"
|
|
803
|
+
},
|
|
804
|
+
{
|
|
805
|
+
"upstreamTest": "keeps a nested root independent from the one hosting its panel",
|
|
806
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L2342",
|
|
807
|
+
"reason": "nested tablists outside the single tablist/tab/tabpanel target model"
|
|
808
|
+
},
|
|
809
|
+
{
|
|
810
|
+
"upstreamTest": "works inside Popover / Dialog",
|
|
811
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L2399",
|
|
812
|
+
"reason": "integration with unrelated React components"
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
"upstreamTest": "highlight synchronization on external value change relative to focus",
|
|
816
|
+
"upstream": "packages/react/src/tabs/root/TabsRoot.test.tsx#L2485",
|
|
817
|
+
"reason": "React controlled async-state API"
|
|
818
|
+
},
|
|
819
|
+
{
|
|
820
|
+
"upstreamTest": "skips a natively disabled tab in a single keypress",
|
|
821
|
+
"upstream": "packages/react/src/tabs/list/TabsList.test.tsx#L132",
|
|
822
|
+
"reason": "distinguishes native `disabled` elements from aria-disabled tabs, which the scenario config does not model"
|
|
823
|
+
},
|
|
824
|
+
{
|
|
825
|
+
"upstreamTest": "roving focus after tab removal",
|
|
826
|
+
"upstream": "packages/react/src/tabs/list/TabsList.test.tsx#L160",
|
|
827
|
+
"reason": "React re-render lifecycle"
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
"upstreamTest": "renders as an anchor and toggles selection when `nativeButton` is false",
|
|
831
|
+
"upstream": "packages/react/src/tabs/tab/TabsTab.test.tsx#L34",
|
|
832
|
+
"reason": "React polymorphic render API"
|
|
833
|
+
},
|
|
834
|
+
{
|
|
835
|
+
"upstreamTest": "throws a descriptive error when rendered outside <Tabs.List>",
|
|
836
|
+
"upstream": "packages/react/src/tabs/tab/TabsTab.test.tsx#L101",
|
|
837
|
+
"reason": "React component-tree validation error"
|
|
838
|
+
},
|
|
839
|
+
{
|
|
840
|
+
"upstreamTest": "does not activate a tab focused by a held secondary-button press",
|
|
841
|
+
"upstream": "packages/react/src/tabs/tab/TabsTab.test.tsx#L164",
|
|
842
|
+
"reason": "React pointer-gesture bookkeeping"
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
"upstreamTest": "exposes tab activation direction through the render prop",
|
|
846
|
+
"upstream": "packages/react/src/tabs/tab/TabsTab.test.tsx#L245",
|
|
847
|
+
"reason": "React render-prop/animation state"
|
|
848
|
+
},
|
|
849
|
+
{
|
|
850
|
+
"upstreamTest": "sets the panel index data attribute",
|
|
851
|
+
"upstream": "packages/react/src/tabs/panel/TabsPanel.test.tsx#L64",
|
|
852
|
+
"reason": "library-specific data-* attribute"
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
"upstreamTest": "keeps the surviving registration when a shadowed panel unmounts",
|
|
856
|
+
"upstream": "packages/react/src/tabs/panel/TabsPanel.test.tsx#L28",
|
|
857
|
+
"reason": "React panel registration API"
|
|
858
|
+
},
|
|
859
|
+
{
|
|
860
|
+
"upstreamTest": "renders a panel that suspends when opened",
|
|
861
|
+
"upstream": "packages/react/src/tabs/panel/TabsPanel.test.tsx#L78",
|
|
862
|
+
"reason": "React Suspense integration"
|
|
863
|
+
},
|
|
864
|
+
{
|
|
865
|
+
"upstreamTest": "triggers enter animation via data-starting-style when mounting",
|
|
866
|
+
"upstream": "packages/react/src/tabs/panel/TabsPanel.test.tsx#L149",
|
|
867
|
+
"reason": "animation/styling"
|
|
868
|
+
},
|
|
869
|
+
{
|
|
870
|
+
"upstreamTest": "TabsIndicator tests",
|
|
871
|
+
"upstream": "packages/react/src/tabs/indicator/TabsIndicator.test.tsx",
|
|
872
|
+
"reason": "indicator-animation file"
|
|
873
|
+
}
|
|
874
|
+
]
|
|
875
|
+
}
|