@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,441 @@
|
|
|
1
|
+
{
|
|
2
|
+
"pattern": "tooltip",
|
|
3
|
+
"source": "ariakit",
|
|
4
|
+
"commit": "404c72257b879569feb08465da4ff9915fd873da",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"skipped": [
|
|
7
|
+
{
|
|
8
|
+
"reason": "visual/browser capture tests (ariakit-ui-tooltip/test-browser.ts: capturePage, forEachColorScheme, getCapture)"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"reason": "cross-anchor and fullscreen-portal placement tests (tooltip-cross-anchor/test-browser.ts, tooltip-fullscreen-portal/test-browser.ts) - positioning and portal container internals"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"reason": "focusable-tooltip-7094/test-safari.ts - Safari-specific focus restoration, browser-only"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"reason": "tooltip-perf/perf-chrome.ts - performance measurement, no behaviour"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"reason": "animation and mount lifecycle (tooltip-variants 'keeps the ... tooltip mounted during leave', data-enter/data-leave/data-mounted, poll for removal)"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"reason": "pointer-events shield styling (tooltip-button-disabled 'keeps truly disabled anchors out of pointer reach', toHaveStyle pointer-events: none)"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"reason": "dynamic disabled state races that flip while the show timer is pending (tooltip-button-disabled 'turns truly disabled while it is pending' and 'loses focusable while it is pending') - needs a live prop mutation the step vocabulary models only crudely"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"reason": "forced-open / multiple simultaneously visible tooltips (tooltip-4894 'keeps multiple forced tooltips visible' and 'keeps managed tooltips active after forced tooltips reopen') - intentionally violates the spec's AtMostOneVisible invariant"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"reason": "menu + tooltip integration (menu-tooltip-variants/test.ts) and combobox change-id tests other than the tooltip anchor id: their own APG pattern is menu/combobox"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"reason": "hovercard disclosure toggling (hovercard-disclosure-interactions/test.ts) - the disclosure pattern, not the tooltip"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"reason": "React-only composition (TooltipAnchor render prop, ButtonSlot, VisuallyHidden) and store API tests (unstable_open/setOpen)"
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"scenarios": [
|
|
42
|
+
{
|
|
43
|
+
"id": "tooltip.ariakit.hover-shows-hide-outside-reopens",
|
|
44
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-interactions/test.ts#L10",
|
|
45
|
+
"upstreamTest": "shows on hover, hides outside, and immediately reopens",
|
|
46
|
+
"apg": "pointer",
|
|
47
|
+
"config": { "delay": 20, "closeDelay": 20 },
|
|
48
|
+
"steps": [
|
|
49
|
+
{
|
|
50
|
+
"expect": {
|
|
51
|
+
"visible": [],
|
|
52
|
+
"attrs": { "trigger:0": { "aria-describedby": null } }
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
56
|
+
{ "event": "wait", "ms": 600 },
|
|
57
|
+
{
|
|
58
|
+
"expect": {
|
|
59
|
+
"visible": ["tooltip:0"],
|
|
60
|
+
"attrs": { "trigger:0": { "aria-describedby": "*" } }
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
{ "event": "unhover", "target": "trigger:0" },
|
|
64
|
+
{ "event": "wait", "ms": 600 },
|
|
65
|
+
{
|
|
66
|
+
"expect": {
|
|
67
|
+
"visible": [],
|
|
68
|
+
"attrs": { "trigger:0": { "aria-describedby": null } }
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
72
|
+
{ "event": "wait", "ms": 600 },
|
|
73
|
+
{ "expect": { "visible": ["tooltip:0"] } }
|
|
74
|
+
],
|
|
75
|
+
"notes": "aria-describedby value \"*\" means any non-empty IDREF matching the tooltip; the spec removes it while hidden."
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"id": "tooltip.ariakit.hover-then-focus-stays-open",
|
|
79
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-interactions/test.ts#L23",
|
|
80
|
+
"upstreamTest": "stays open when hover is followed by keyboard focus",
|
|
81
|
+
"apg": "extension",
|
|
82
|
+
"config": { "delay": 20, "closeDelay": 20 },
|
|
83
|
+
"steps": [
|
|
84
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
85
|
+
{ "event": "wait", "ms": 600 },
|
|
86
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
87
|
+
{ "event": "focus", "target": "trigger:0" },
|
|
88
|
+
{ "event": "unhover", "target": "trigger:0" },
|
|
89
|
+
{ "event": "wait", "ms": 600 },
|
|
90
|
+
{ "expect": { "visible": ["tooltip:0"], "focus": "trigger:0" } }
|
|
91
|
+
],
|
|
92
|
+
"notes": "Keyboard focus keeps the tooltip engaged after the pointer leaves (WCAG 1.4.13 persistent)."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "tooltip.ariakit.focus-shows-blur-hides",
|
|
96
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-interactions/test.ts#L32",
|
|
97
|
+
"upstreamTest": "shows on focus and hides after focus moves",
|
|
98
|
+
"apg": "focus",
|
|
99
|
+
"config": { "delay": 20, "closeDelay": 20 },
|
|
100
|
+
"steps": [
|
|
101
|
+
{ "event": "focus", "target": "trigger:0" },
|
|
102
|
+
{ "event": "wait", "ms": 600 },
|
|
103
|
+
{ "expect": { "visible": ["tooltip:0"], "focus": "trigger:0" } },
|
|
104
|
+
{ "event": "blur", "target": "trigger:0" },
|
|
105
|
+
{ "event": "wait", "ms": 600 },
|
|
106
|
+
{ "expect": { "visible": [] } }
|
|
107
|
+
],
|
|
108
|
+
"notes": "Tab to the control after the anchor is modelled as a blur."
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "tooltip.ariakit.focus-stays-open-through-pointer-leave",
|
|
112
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-interactions/test.ts#L40",
|
|
113
|
+
"upstreamTest": "stays open after focus-visible and pointer movement",
|
|
114
|
+
"apg": "focus",
|
|
115
|
+
"config": { "delay": 20, "closeDelay": 20 },
|
|
116
|
+
"steps": [
|
|
117
|
+
{ "event": "key", "key": "Tab", "target": "trigger:0" },
|
|
118
|
+
{ "event": "wait", "ms": 600 },
|
|
119
|
+
{ "expect": { "visible": ["tooltip:0"], "focus": "trigger:0" } },
|
|
120
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
121
|
+
{ "event": "unhover", "target": "trigger:0" },
|
|
122
|
+
{ "event": "wait", "ms": 600 },
|
|
123
|
+
{ "expect": { "visible": ["tooltip:0"] } }
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"id": "tooltip.ariakit.waits-again-after-focus-lost",
|
|
128
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-interactions/test.ts#L53",
|
|
129
|
+
"upstreamTest": "waits again after keyboard focus is lost",
|
|
130
|
+
"apg": "extension",
|
|
131
|
+
"config": { "delay": 20, "closeDelay": 20 },
|
|
132
|
+
"steps": [
|
|
133
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
134
|
+
{ "event": "wait", "ms": 600 },
|
|
135
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
136
|
+
{ "event": "key", "key": "Tab", "target": "trigger:0" },
|
|
137
|
+
{ "event": "blur", "target": "trigger:0" },
|
|
138
|
+
{ "event": "wait", "ms": 600 },
|
|
139
|
+
{ "expect": { "visible": [] } },
|
|
140
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
141
|
+
{ "event": "wait", "ms": 10 },
|
|
142
|
+
{ "expect": { "visible": [] } },
|
|
143
|
+
{ "event": "wait", "ms": 600 },
|
|
144
|
+
{ "expect": { "visible": ["tooltip:0"] } }
|
|
145
|
+
],
|
|
146
|
+
"notes": "The short wait pins the visible-but-not-yet-shown window before the show timeout expires (ariakit issue 7043)."
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"id": "tooltip.ariakit.escape-from-content-restores-anchor",
|
|
150
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-interactions/test.ts#L72",
|
|
151
|
+
"upstreamTest": "Escape from tooltip content restores its anchor",
|
|
152
|
+
"apg": "keyboard",
|
|
153
|
+
"config": { "delay": 20, "closeDelay": 20 },
|
|
154
|
+
"steps": [
|
|
155
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
156
|
+
{ "event": "wait", "ms": 600 },
|
|
157
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
158
|
+
{ "event": "click", "target": "tooltip:0" },
|
|
159
|
+
{ "event": "key", "key": "Escape", "target": "tooltip:0" },
|
|
160
|
+
{ "expect": { "visible": [], "focus": "trigger:0" } }
|
|
161
|
+
],
|
|
162
|
+
"notes": "Ariakit's tooltip content can take focus; APG says tooltips never take focus. Divergence from APG, ported as the upstream test states."
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "tooltip.ariakit.escape-keeps-closed-on-pointer-focus",
|
|
166
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-interactions/test.ts#L84",
|
|
167
|
+
"upstreamTest": "Escape keeps the tooltip closed when the anchor has pointer focus",
|
|
168
|
+
"apg": "keyboard",
|
|
169
|
+
"config": { "delay": 20, "closeDelay": 20 },
|
|
170
|
+
"steps": [
|
|
171
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
172
|
+
{ "event": "wait", "ms": 600 },
|
|
173
|
+
{
|
|
174
|
+
"expect": {
|
|
175
|
+
"visible": ["tooltip:0"],
|
|
176
|
+
"attrs": { "trigger:0": { "data-focus-visible": null } }
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
{ "event": "click", "target": "trigger:0" },
|
|
180
|
+
{ "expect": { "focus": "trigger:0", "visible": ["tooltip:0"] } },
|
|
181
|
+
{ "event": "key", "key": "Escape", "target": "trigger:0" },
|
|
182
|
+
{
|
|
183
|
+
"expect": {
|
|
184
|
+
"visible": [],
|
|
185
|
+
"attrs": { "trigger:0": { "data-focus-visible": "true" } }
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
],
|
|
189
|
+
"notes": "Escape makes the anchor focus-visible, which must not reopen the dismissed tooltip (ariakit issue 7622). The data-focus-visible attribute is Ariakit-specific, not APG."
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"id": "tooltip.ariakit.instant-variant-shows-on-hover-and-focus",
|
|
193
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-variants/test.ts#L9",
|
|
194
|
+
"upstreamTest": "shows the instant tooltip on hover and focus",
|
|
195
|
+
"apg": "extension",
|
|
196
|
+
"config": { "delay": 0, "instant": true },
|
|
197
|
+
"steps": [
|
|
198
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
199
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
200
|
+
{ "event": "unhover", "target": "trigger:0" },
|
|
201
|
+
{ "expect": { "visible": [] } },
|
|
202
|
+
{ "event": "key", "key": "Tab", "target": "trigger:0" },
|
|
203
|
+
{ "expect": { "visible": ["tooltip:0"], "focus": "trigger:0" } }
|
|
204
|
+
],
|
|
205
|
+
"notes": "The instant variant uses delay=0; the default delay/no-delay choice is an Ariakit extension."
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"id": "tooltip.ariakit.label-tooltip-stays-open-on-click",
|
|
209
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-variants/test.ts#L20",
|
|
210
|
+
"upstreamTest": "keeps the label tooltip open when its anchor is clicked",
|
|
211
|
+
"apg": "extension",
|
|
212
|
+
"steps": [
|
|
213
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
214
|
+
{ "event": "wait", "ms": 600 },
|
|
215
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
216
|
+
{ "event": "click", "target": "trigger:0" },
|
|
217
|
+
{ "event": "wait", "ms": 600 },
|
|
218
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
219
|
+
{ "event": "unhover", "target": "trigger:0" },
|
|
220
|
+
{ "event": "wait", "ms": 600 },
|
|
221
|
+
{ "expect": { "visible": [] } }
|
|
222
|
+
],
|
|
223
|
+
"notes": "APG tooltips are described by the anchor, never clicked to dismiss; the label tooltip here is an Ariakit variant."
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"id": "tooltip.ariakit.escape-from-animated-content-restores-anchor",
|
|
227
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-variants/test.ts#L55",
|
|
228
|
+
"upstreamTest": "Escape from animated tooltip content restores the anchor",
|
|
229
|
+
"apg": "keyboard",
|
|
230
|
+
"steps": [
|
|
231
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
232
|
+
{ "event": "wait", "ms": 600 },
|
|
233
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
234
|
+
{ "event": "click", "target": "tooltip:0" },
|
|
235
|
+
{ "event": "key", "key": "Escape", "target": "tooltip:0" },
|
|
236
|
+
{ "event": "wait", "ms": 600 },
|
|
237
|
+
{ "expect": { "visible": [], "focus": "trigger:0" } }
|
|
238
|
+
],
|
|
239
|
+
"notes": "The upstream polls the mounted-but-exiting element out of the DOM; only the escape/focus restoration is restated."
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"id": "tooltip.ariakit.disabled-anchor-shows-on-hover-and-focus",
|
|
243
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-button-disabled/test.ts#L5",
|
|
244
|
+
"upstreamTest": "shows the tooltip on hover when the anchor renders the disabled button; shows the tooltip on keyboard focus in both composition orders",
|
|
245
|
+
"apg": "extension",
|
|
246
|
+
"config": { "anchorDisabled": true, "delay": 20 },
|
|
247
|
+
"steps": [
|
|
248
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
249
|
+
{ "event": "wait", "ms": 600 },
|
|
250
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
251
|
+
{ "event": "unhover", "target": "trigger:0" },
|
|
252
|
+
{ "event": "wait", "ms": 600 },
|
|
253
|
+
{ "expect": { "visible": [] } },
|
|
254
|
+
{ "event": "key", "key": "Tab", "target": "trigger:0" },
|
|
255
|
+
{ "event": "wait", "ms": 600 },
|
|
256
|
+
{ "expect": { "visible": ["tooltip:0"], "focus": "trigger:0" } }
|
|
257
|
+
],
|
|
258
|
+
"notes": "APG: a disabled element should still explain why it is disabled; the tooltip must open on both hover and keyboard focus. Restated as one hover+focus scenario."
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"id": "tooltip.ariakit.hover-opted-out-for-disabled-anchor",
|
|
262
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-button-disabled/test.ts#L32",
|
|
263
|
+
"upstreamTest": "does not show the tooltip on hover when the consumer opts out for disabled anchors",
|
|
264
|
+
"apg": "extension",
|
|
265
|
+
"config": {
|
|
266
|
+
"anchorDisabled": true,
|
|
267
|
+
"showOnDisabledHover": false,
|
|
268
|
+
"delay": 20
|
|
269
|
+
},
|
|
270
|
+
"steps": [
|
|
271
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
272
|
+
{ "event": "wait", "ms": 600 },
|
|
273
|
+
{ "expect": { "visible": [] } }
|
|
274
|
+
]
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"id": "tooltip.ariakit.opted-out-hover-still-shows-on-focus",
|
|
278
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-button-disabled/test.ts#L39",
|
|
279
|
+
"upstreamTest": "still shows the tooltip on keyboard focus when hover is opted out",
|
|
280
|
+
"apg": "focus",
|
|
281
|
+
"config": {
|
|
282
|
+
"anchorDisabled": true,
|
|
283
|
+
"showOnDisabledHover": false,
|
|
284
|
+
"delay": 20
|
|
285
|
+
},
|
|
286
|
+
"steps": [
|
|
287
|
+
{ "event": "focus", "target": "trigger:0" },
|
|
288
|
+
{ "event": "wait", "ms": 600 },
|
|
289
|
+
{ "expect": { "visible": ["tooltip:0"], "focus": "trigger:0" } }
|
|
290
|
+
],
|
|
291
|
+
"notes": "Same anchor as the hover opt-out, so the focus half is not vacuous."
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"id": "tooltip.ariakit.truly-disabled-anchor-shows-on-hover",
|
|
295
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-button-disabled/test.ts#L69",
|
|
296
|
+
"upstreamTest": "shows the tooltip on hover when the rendered element declares itself disabled",
|
|
297
|
+
"apg": "extension",
|
|
298
|
+
"config": { "elementDisabled": true, "delay": 20 },
|
|
299
|
+
"steps": [
|
|
300
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
301
|
+
{ "event": "wait", "ms": 600 },
|
|
302
|
+
{ "expect": { "visible": ["tooltip:0"] } }
|
|
303
|
+
],
|
|
304
|
+
"notes": "The resolved disabled state is read from the element, so hover still explains it."
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
"id": "tooltip.ariakit.truly-disabled-anchor-keeps-pointer-events-no-hover",
|
|
308
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-button-disabled/test.ts#L95",
|
|
309
|
+
"upstreamTest": "does not show the tooltip on hover for a truly disabled anchor that keeps pointer events",
|
|
310
|
+
"apg": "extension",
|
|
311
|
+
"config": { "trulyDisabled": true, "pointerEvents": "auto", "delay": 20 },
|
|
312
|
+
"steps": [
|
|
313
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
314
|
+
{ "event": "wait", "ms": 600 },
|
|
315
|
+
{ "expect": { "visible": [] } }
|
|
316
|
+
]
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"id": "tooltip.ariakit.delayed-tooltip-opens-on-hover",
|
|
320
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-button-disabled/test.ts#L111",
|
|
321
|
+
"upstreamTest": "opens a delayed tooltip on hover",
|
|
322
|
+
"apg": "extension",
|
|
323
|
+
"config": { "delay": 150 },
|
|
324
|
+
"steps": [
|
|
325
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
326
|
+
{ "event": "wait", "ms": 100 },
|
|
327
|
+
{ "expect": { "visible": [] } },
|
|
328
|
+
{ "event": "wait", "ms": 600 },
|
|
329
|
+
{ "expect": { "visible": ["tooltip:0"] } }
|
|
330
|
+
],
|
|
331
|
+
"notes": "The provider delays the show by 150ms; the short wait is the pending window."
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"id": "tooltip.ariakit.controlled-tooltip-replaces-open-one",
|
|
335
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/tooltip-4894/test.ts#L16",
|
|
336
|
+
"upstreamTest": "hides controlled tooltips that accept setOpen updates",
|
|
337
|
+
"apg": "extension",
|
|
338
|
+
"config": { "controlled": true },
|
|
339
|
+
"steps": [
|
|
340
|
+
{ "event": "click", "target": "trigger:0" },
|
|
341
|
+
{ "event": "wait", "ms": 600 },
|
|
342
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
343
|
+
{ "event": "click", "target": "trigger:1" },
|
|
344
|
+
{ "event": "wait", "ms": 600 },
|
|
345
|
+
{ "expect": { "visible": ["tooltip:1"] } }
|
|
346
|
+
],
|
|
347
|
+
"notes": "Opening one controlled tooltip hides the other; at most one visible, matching the spec invariant."
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"id": "tooltip.ariakit.hovercard-shows-on-hover-hides-outside",
|
|
351
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/hovercard-interactions/test.ts#L13",
|
|
352
|
+
"upstreamTest": "shows after hovering and hides after hovering outside",
|
|
353
|
+
"apg": "extension",
|
|
354
|
+
"config": { "delay": 600 },
|
|
355
|
+
"steps": [
|
|
356
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
357
|
+
{ "event": "wait", "ms": 600 },
|
|
358
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
359
|
+
{ "event": "unhover", "target": "trigger:0" },
|
|
360
|
+
{ "event": "wait", "ms": 600 },
|
|
361
|
+
{ "expect": { "visible": [] } }
|
|
362
|
+
],
|
|
363
|
+
"notes": "A hovercard is a tooltip with rich hoverable content (WCAG 1.4.13), not an APG tooltip; modelled as an extension with the tooltip part name."
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
"id": "tooltip.ariakit.hovercard-stays-open-on-quick-pointer-return",
|
|
367
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/hovercard-interactions/test.ts#L37",
|
|
368
|
+
"upstreamTest": "stays open when the pointer quickly returns",
|
|
369
|
+
"apg": "extension",
|
|
370
|
+
"config": { "delay": 600, "closeDelay": 300 },
|
|
371
|
+
"steps": [
|
|
372
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
373
|
+
{ "event": "wait", "ms": 600 },
|
|
374
|
+
{ "expect": { "visible": ["tooltip:0"] } },
|
|
375
|
+
{ "event": "unhover", "target": "trigger:0" },
|
|
376
|
+
{ "event": "wait", "ms": 100 },
|
|
377
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
378
|
+
{ "event": "wait", "ms": 300 },
|
|
379
|
+
{ "expect": { "visible": ["tooltip:0"] } }
|
|
380
|
+
],
|
|
381
|
+
"notes": "Re-entering before the close grace expires cancels it."
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
"id": "tooltip.ariakit.hovercard-escape-unfocused-hides-without-moving-focus",
|
|
385
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/hovercard-interactions/test.ts#L55",
|
|
386
|
+
"upstreamTest": "Escape closes an unfocused hovercard without moving focus",
|
|
387
|
+
"apg": "keyboard",
|
|
388
|
+
"config": { "delay": 600 },
|
|
389
|
+
"steps": [
|
|
390
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
391
|
+
{ "event": "wait", "ms": 600 },
|
|
392
|
+
{ "expect": { "visible": ["tooltip:0"], "focus": null } },
|
|
393
|
+
{ "event": "key", "key": "Escape", "target": "trigger:0" },
|
|
394
|
+
{ "expect": { "visible": [], "focus": null } }
|
|
395
|
+
],
|
|
396
|
+
"notes": "WCAG 1.4.13 dismissable: Escape hides the content without moving pointer or focus."
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
"id": "tooltip.ariakit.hovercard-escape-focused-restores-anchor",
|
|
400
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/hovercard-interactions/test.ts#L65",
|
|
401
|
+
"upstreamTest": "Escape closes a focused hovercard and restores the anchor",
|
|
402
|
+
"apg": "keyboard",
|
|
403
|
+
"config": { "delay": 600 },
|
|
404
|
+
"steps": [
|
|
405
|
+
{ "event": "hover", "target": "trigger:0" },
|
|
406
|
+
{ "event": "wait", "ms": 600 },
|
|
407
|
+
{ "event": "focus", "target": "trigger:0" },
|
|
408
|
+
{ "expect": { "visible": ["tooltip:0"], "focus": "trigger:0" } },
|
|
409
|
+
{ "event": "key", "key": "Escape", "target": "trigger:0" },
|
|
410
|
+
{ "expect": { "visible": [], "focus": "trigger:0" } }
|
|
411
|
+
],
|
|
412
|
+
"notes": "The upstream focuses a button inside the card; the anchor focus stands in for card focus, which keeps it engaged."
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"id": "tooltip.ariakit.label-id-follows-tooltip-content-id-change",
|
|
416
|
+
"upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-select-tag-tooltip-element-id/test.ts#L20",
|
|
417
|
+
"upstreamTest": "updates the tooltip anchor when the content id changes",
|
|
418
|
+
"apg": "aria",
|
|
419
|
+
"config": { "tooltipId": "tooltip-before" },
|
|
420
|
+
"steps": [
|
|
421
|
+
{
|
|
422
|
+
"expect": {
|
|
423
|
+
"attrs": { "trigger:0": { "aria-labelledby": "tooltip-before" } }
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"event": "prop",
|
|
428
|
+
"target": "tooltip:0",
|
|
429
|
+
"prop": "id",
|
|
430
|
+
"value": "tooltip-after"
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
"expect": {
|
|
434
|
+
"attrs": { "trigger:0": { "aria-labelledby": "tooltip-after" } }
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
],
|
|
438
|
+
"notes": "This tooltip names its anchor (aria-labelledby), unlike the APG described-by tooltip; kept as the id-wiring behaviour under test."
|
|
439
|
+
}
|
|
440
|
+
]
|
|
441
|
+
}
|