@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,25 @@
|
|
|
1
|
+
import { ActionStep, Probe, ScenarioConfig, SpecBridge } from "../scenario.mjs";
|
|
2
|
+
//#region src/apg/menu-checkable.bridge.d.ts
|
|
3
|
+
export type MenuCheckableVariant = "checkbox-items" | "radio-items" | "mixed";
|
|
4
|
+
export interface MenuCheckableConfig {
|
|
5
|
+
readonly items: ReadonlyArray<string>;
|
|
6
|
+
readonly variant: MenuCheckableVariant;
|
|
7
|
+
readonly disabled: ReadonlyArray<number>;
|
|
8
|
+
readonly controlled: boolean;
|
|
9
|
+
readonly accepts: boolean;
|
|
10
|
+
/** The controlled packed checked state (`checked(wrap, choice)`). */
|
|
11
|
+
readonly value: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Menu (checkable) vocabulary <-> `specs/apg/menu-checkable.qnt`. The spec's
|
|
15
|
+
* fixture is fixed: item 1 is a menuitemcheckbox, items 2-4 one menuitemradio
|
|
16
|
+
* group and item 5 a plain menuitem; `variant: "mixed"` asks the fixture for
|
|
17
|
+
* that shape. `checkbox-items` / `radio-items` are the ported scenarios'
|
|
18
|
+
* uniform menus (never used by the differential walk).
|
|
19
|
+
*/
|
|
20
|
+
export declare const menuCheckableConfig: (config: ScenarioConfig) => MenuCheckableConfig;
|
|
21
|
+
export declare const menuCheckableBridge: SpecBridge;
|
|
22
|
+
/** The user-level steps a differential walk draws from. */
|
|
23
|
+
export declare const menuCheckableSteps: ReadonlyArray<ActionStep>;
|
|
24
|
+
export declare const menuCheckableProbe: Probe;
|
|
25
|
+
//#endregion
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { Unsupported } from "../scenario.mjs";
|
|
2
|
+
//#region src/apg/menu-checkable.bridge.ts
|
|
3
|
+
const specEvent = (tag, params = {}) => ({
|
|
4
|
+
_tag: tag,
|
|
5
|
+
...params
|
|
6
|
+
});
|
|
7
|
+
const CONFIG_KEYS = /* @__PURE__ */ new Set([
|
|
8
|
+
"items",
|
|
9
|
+
"variant",
|
|
10
|
+
"disabled",
|
|
11
|
+
"controlled",
|
|
12
|
+
"accepts",
|
|
13
|
+
"value"
|
|
14
|
+
]);
|
|
15
|
+
/** The packed checked values `menu-checkable.qnt`'s `setValue` pool carries. */
|
|
16
|
+
const CHECKED_POOL = /* @__PURE__ */ new Set([
|
|
17
|
+
2,
|
|
18
|
+
3,
|
|
19
|
+
4,
|
|
20
|
+
7,
|
|
21
|
+
8,
|
|
22
|
+
9
|
|
23
|
+
]);
|
|
24
|
+
const toItems = (value) => {
|
|
25
|
+
if (Array.isArray(value) && value.every((v) => typeof v === "string")) return value;
|
|
26
|
+
throw new Unsupported(`items ${JSON.stringify(value)}`);
|
|
27
|
+
};
|
|
28
|
+
const toIndices = (value) => {
|
|
29
|
+
if (Array.isArray(value) && value.every((v) => typeof v === "number" && Number.isInteger(v))) return value;
|
|
30
|
+
throw new Unsupported(`disabled ${JSON.stringify(value)}`);
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Menu (checkable) vocabulary <-> `specs/apg/menu-checkable.qnt`. The spec's
|
|
34
|
+
* fixture is fixed: item 1 is a menuitemcheckbox, items 2-4 one menuitemradio
|
|
35
|
+
* group and item 5 a plain menuitem; `variant: "mixed"` asks the fixture for
|
|
36
|
+
* that shape. `checkbox-items` / `radio-items` are the ported scenarios'
|
|
37
|
+
* uniform menus (never used by the differential walk).
|
|
38
|
+
*/
|
|
39
|
+
const menuCheckableConfig = (config) => {
|
|
40
|
+
let items = [];
|
|
41
|
+
let variant = "mixed";
|
|
42
|
+
let disabled = [];
|
|
43
|
+
let controlled = false;
|
|
44
|
+
let accepts = true;
|
|
45
|
+
let value = 2;
|
|
46
|
+
for (const [key, val] of Object.entries(config)) {
|
|
47
|
+
if (!CONFIG_KEYS.has(key)) throw new Unsupported(`config ${key}=${JSON.stringify(val)}`);
|
|
48
|
+
if (key === "items") items = toItems(val);
|
|
49
|
+
else if (key === "variant") {
|
|
50
|
+
if (val !== "checkbox-items" && val !== "radio-items" && val !== "mixed") throw new Unsupported(`variant ${JSON.stringify(val)}`);
|
|
51
|
+
variant = val;
|
|
52
|
+
} else if (key === "controlled") controlled = val === true;
|
|
53
|
+
else if (key === "accepts") {
|
|
54
|
+
controlled = true;
|
|
55
|
+
accepts = val === true;
|
|
56
|
+
} else if (key === "value") {
|
|
57
|
+
const packed = typeof val === "number" ? val : NaN;
|
|
58
|
+
if (!CHECKED_POOL.has(packed)) throw new Unsupported(`value ${JSON.stringify(val)}`);
|
|
59
|
+
controlled = true;
|
|
60
|
+
value = packed;
|
|
61
|
+
} else disabled = toIndices(val);
|
|
62
|
+
}
|
|
63
|
+
if (items.length === 0) throw new Unsupported("config has no items");
|
|
64
|
+
return {
|
|
65
|
+
items,
|
|
66
|
+
variant,
|
|
67
|
+
disabled,
|
|
68
|
+
controlled,
|
|
69
|
+
accepts,
|
|
70
|
+
value
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
const keyEvent = (key) => {
|
|
74
|
+
switch (key) {
|
|
75
|
+
case "Enter": return specEvent("enter");
|
|
76
|
+
case " ":
|
|
77
|
+
case "Space": return specEvent("space");
|
|
78
|
+
case "ArrowDown": return specEvent("arrow_down");
|
|
79
|
+
case "ArrowUp": return specEvent("arrow_up");
|
|
80
|
+
case "Home": return specEvent("key_home");
|
|
81
|
+
case "End": return specEvent("key_end");
|
|
82
|
+
case "Escape": return specEvent("escape");
|
|
83
|
+
default: throw new Unsupported(`key ${key ?? ""}`);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const programmatic = (step) => {
|
|
87
|
+
switch (step.prop) {
|
|
88
|
+
case "key": {
|
|
89
|
+
const key = step.value?.["key"];
|
|
90
|
+
if (typeof key !== "string") throw new Unsupported(`prop key ${JSON.stringify(step.value)}`);
|
|
91
|
+
return [keyEvent(key)];
|
|
92
|
+
}
|
|
93
|
+
case "setValue": {
|
|
94
|
+
const packed = typeof step.value === "number" ? step.value : NaN;
|
|
95
|
+
if (!CHECKED_POOL.has(packed)) throw new Unsupported(`prop setValue=${JSON.stringify(step.value)}`);
|
|
96
|
+
return [specEvent("setValue", { v: BigInt(packed) })];
|
|
97
|
+
}
|
|
98
|
+
case "hostToggle": return [specEvent("hostToggle")];
|
|
99
|
+
default: throw new Unsupported(`prop ${step.prop ?? ""}`);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const itemIndexOf = (target) => {
|
|
103
|
+
const match = /^(?:menuitem|item):(\d+)$/.exec(target ?? "menuitem:0");
|
|
104
|
+
if (match?.[1] === void 0) throw new Unsupported(`target ${target ?? ""}`);
|
|
105
|
+
return Number(match[1]) + 1;
|
|
106
|
+
};
|
|
107
|
+
const menuCheckableBridge = {
|
|
108
|
+
setup: (config) => {
|
|
109
|
+
const mount = menuCheckableConfig(config);
|
|
110
|
+
return [
|
|
111
|
+
...mount.controlled ? [specEvent("control")] : [],
|
|
112
|
+
...mount.controlled && mount.accepts ? [specEvent("acceptRequests")] : [],
|
|
113
|
+
...mount.controlled && mount.value !== 2 ? [specEvent("setValue", { v: BigInt(mount.value) })] : []
|
|
114
|
+
];
|
|
115
|
+
},
|
|
116
|
+
event: (step) => {
|
|
117
|
+
if (step.repeat === true) throw new Unsupported("key repeat");
|
|
118
|
+
switch (step.event) {
|
|
119
|
+
case "focus":
|
|
120
|
+
case "blur": return [];
|
|
121
|
+
case "click": return [];
|
|
122
|
+
case "key": return [keyEvent(step.key)];
|
|
123
|
+
case "type": throw new Unsupported(`type ${step.text ?? ""}`);
|
|
124
|
+
case "hover":
|
|
125
|
+
case "unhover":
|
|
126
|
+
case "wait": return [];
|
|
127
|
+
case "prop": return programmatic(step);
|
|
128
|
+
default: throw new Unsupported(`event ${step.event}`);
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
focus: (state) => {
|
|
132
|
+
const index = Number(state["focusIdx"]);
|
|
133
|
+
return state["menuOpen"] === true ? `menuitem:${index - 1}` : "trigger";
|
|
134
|
+
},
|
|
135
|
+
attr: (state, target, name) => {
|
|
136
|
+
const index = itemIndexOf(target);
|
|
137
|
+
if (target.startsWith("trigger")) {
|
|
138
|
+
if (name === "aria-expanded") return String(state["menuOpen"]);
|
|
139
|
+
} else if (name === "role") {
|
|
140
|
+
if (index === 1) return "menuitemcheckbox";
|
|
141
|
+
if (index >= 2 && index <= 4) return "menuitemradio";
|
|
142
|
+
return "menuitem";
|
|
143
|
+
} else if (name === "aria-checked") {
|
|
144
|
+
if (index === 1) return state["wrap"] === true ? "true" : "false";
|
|
145
|
+
if (index >= 2 && index <= 4) return Number(state["choice"]) === index ? "true" : "false";
|
|
146
|
+
throw new Unsupported("plain item has no aria-checked");
|
|
147
|
+
}
|
|
148
|
+
throw new Unsupported(`attribute ${name} on ${target}`);
|
|
149
|
+
},
|
|
150
|
+
visible: (state) => state["menuOpen"] === true ? ["menu"] : [],
|
|
151
|
+
events: () => []
|
|
152
|
+
};
|
|
153
|
+
/** The user-level steps a differential walk draws from. */
|
|
154
|
+
const menuCheckableSteps = [
|
|
155
|
+
{
|
|
156
|
+
event: "prop",
|
|
157
|
+
prop: "key",
|
|
158
|
+
value: { key: "Enter" }
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
event: "prop",
|
|
162
|
+
prop: "key",
|
|
163
|
+
value: { key: "Space" }
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
event: "prop",
|
|
167
|
+
prop: "key",
|
|
168
|
+
value: { key: "ArrowDown" }
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
event: "prop",
|
|
172
|
+
prop: "key",
|
|
173
|
+
value: { key: "ArrowUp" }
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
event: "prop",
|
|
177
|
+
prop: "key",
|
|
178
|
+
value: { key: "Home" }
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
event: "prop",
|
|
182
|
+
prop: "key",
|
|
183
|
+
value: { key: "End" }
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
event: "prop",
|
|
187
|
+
prop: "key",
|
|
188
|
+
value: { key: "Escape" }
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
event: "prop",
|
|
192
|
+
prop: "setValue",
|
|
193
|
+
value: 7
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
event: "prop",
|
|
197
|
+
prop: "setValue",
|
|
198
|
+
value: 4
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
event: "prop",
|
|
202
|
+
prop: "setValue",
|
|
203
|
+
value: 2
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
event: "prop",
|
|
207
|
+
prop: "hostToggle"
|
|
208
|
+
}
|
|
209
|
+
];
|
|
210
|
+
const menuCheckableProbe = {
|
|
211
|
+
attrs: [
|
|
212
|
+
["trigger", "aria-expanded"],
|
|
213
|
+
["menu", "hidden"],
|
|
214
|
+
["menuitem:0", "role"],
|
|
215
|
+
["menuitem:0", "aria-checked"],
|
|
216
|
+
["menuitem:1", "role"],
|
|
217
|
+
["menuitem:1", "aria-checked"],
|
|
218
|
+
["menuitem:2", "role"],
|
|
219
|
+
["menuitem:2", "aria-checked"],
|
|
220
|
+
["menuitem:3", "role"],
|
|
221
|
+
["menuitem:3", "aria-checked"]
|
|
222
|
+
],
|
|
223
|
+
events: []
|
|
224
|
+
};
|
|
225
|
+
//#endregion
|
|
226
|
+
export { menuCheckableBridge, menuCheckableConfig, menuCheckableProbe, menuCheckableSteps };
|