@hypen-space/web 0.4.980 → 0.5.3
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/README.md +20 -13
- package/dist/canvas/accessibility.d.ts +118 -11
- package/dist/canvas/accessibility.js +470 -108
- package/dist/canvas/accessibility.js.map +1 -1
- package/dist/canvas/dispatch.d.ts +24 -0
- package/dist/canvas/dispatch.js +62 -0
- package/dist/canvas/dispatch.js.map +1 -0
- package/dist/canvas/editing.d.ts +178 -0
- package/dist/canvas/editing.js +590 -0
- package/dist/canvas/editing.js.map +1 -0
- package/dist/canvas/events.d.ts +28 -23
- package/dist/canvas/events.js +90 -103
- package/dist/canvas/events.js.map +1 -1
- package/dist/canvas/focus.d.ts +78 -0
- package/dist/canvas/focus.js +182 -0
- package/dist/canvas/focus.js.map +1 -0
- package/dist/canvas/index.d.ts +3 -2
- package/dist/canvas/index.js +3 -2
- package/dist/canvas/index.js.map +1 -1
- package/dist/canvas/layout.js +68 -98
- package/dist/canvas/layout.js.map +1 -1
- package/dist/canvas/paint.d.ts +16 -3
- package/dist/canvas/paint.js +449 -110
- package/dist/canvas/paint.js.map +1 -1
- package/dist/canvas/renderer.d.ts +28 -4
- package/dist/canvas/renderer.js +201 -81
- package/dist/canvas/renderer.js.map +1 -1
- package/dist/canvas/selection.js +31 -177
- package/dist/canvas/selection.js.map +1 -1
- package/dist/canvas/text-geometry.d.ts +72 -0
- package/dist/canvas/text-geometry.js +244 -0
- package/dist/canvas/text-geometry.js.map +1 -0
- package/dist/canvas/text.js +44 -18
- package/dist/canvas/text.js.map +1 -1
- package/dist/canvas/types.d.ts +10 -1
- package/dist/canvas/utils.d.ts +0 -23
- package/dist/canvas/utils.js +3 -67
- package/dist/canvas/utils.js.map +1 -1
- package/dist/canvas/variants.d.ts +52 -0
- package/dist/canvas/variants.js +156 -0
- package/dist/canvas/variants.js.map +1 -0
- package/dist/dom/a11y-styles.d.ts +20 -0
- package/dist/dom/a11y-styles.js +61 -0
- package/dist/dom/a11y-styles.js.map +1 -0
- package/dist/dom/applicators/aria.d.ts +19 -0
- package/dist/dom/applicators/aria.js +36 -0
- package/dist/dom/applicators/aria.js.map +1 -0
- package/dist/dom/applicators/events.d.ts +7 -0
- package/dist/dom/applicators/events.js +36 -8
- package/dist/dom/applicators/events.js.map +1 -1
- package/dist/dom/applicators/font.d.ts +11 -6
- package/dist/dom/applicators/font.js +16 -27
- package/dist/dom/applicators/font.js.map +1 -1
- package/dist/dom/applicators/index.js +51 -45
- package/dist/dom/applicators/index.js.map +1 -1
- package/dist/dom/canvas/index.js +2 -2
- package/dist/dom/canvas/index.js.map +1 -1
- package/dist/dom/components/app.js +2 -2
- package/dist/dom/components/app.js.map +1 -1
- package/dist/dom/components/audio.js +2 -2
- package/dist/dom/components/audio.js.map +1 -1
- package/dist/dom/components/avatar.js +3 -4
- package/dist/dom/components/avatar.js.map +1 -1
- package/dist/dom/components/badge.js +3 -4
- package/dist/dom/components/badge.js.map +1 -1
- package/dist/dom/components/button.js +2 -2
- package/dist/dom/components/button.js.map +1 -1
- package/dist/dom/components/card.js +2 -2
- package/dist/dom/components/card.js.map +1 -1
- package/dist/dom/components/center.js +2 -2
- package/dist/dom/components/center.js.map +1 -1
- package/dist/dom/components/checkbox.js +4 -5
- package/dist/dom/components/checkbox.js.map +1 -1
- package/dist/dom/components/column.js +2 -2
- package/dist/dom/components/column.js.map +1 -1
- package/dist/dom/components/container.js +2 -2
- package/dist/dom/components/container.js.map +1 -1
- package/dist/dom/components/divider.js +2 -2
- package/dist/dom/components/divider.js.map +1 -1
- package/dist/dom/components/grid.js +10 -10
- package/dist/dom/components/grid.js.map +1 -1
- package/dist/dom/components/heading.js +4 -6
- package/dist/dom/components/heading.js.map +1 -1
- package/dist/dom/components/hypenapp.d.ts +25 -1
- package/dist/dom/components/hypenapp.js +215 -247
- package/dist/dom/components/hypenapp.js.map +1 -1
- package/dist/dom/components/icon.js +4 -5
- package/dist/dom/components/icon.js.map +1 -1
- package/dist/dom/components/image.js +2 -2
- package/dist/dom/components/image.js.map +1 -1
- package/dist/dom/components/index.d.ts +2 -2
- package/dist/dom/components/index.js +9 -2
- package/dist/dom/components/index.js.map +1 -1
- package/dist/dom/components/input.js +2 -2
- package/dist/dom/components/input.js.map +1 -1
- package/dist/dom/components/link.js +2 -2
- package/dist/dom/components/link.js.map +1 -1
- package/dist/dom/components/list.js +2 -2
- package/dist/dom/components/list.js.map +1 -1
- package/dist/dom/components/paragraph.js +3 -4
- package/dist/dom/components/paragraph.js.map +1 -1
- package/dist/dom/components/progressbar.js +3 -3
- package/dist/dom/components/progressbar.js.map +1 -1
- package/dist/dom/components/route.js +2 -2
- package/dist/dom/components/route.js.map +1 -1
- package/dist/dom/components/router.js +2 -2
- package/dist/dom/components/router.js.map +1 -1
- package/dist/dom/components/row.js +10 -10
- package/dist/dom/components/row.js.map +1 -1
- package/dist/dom/components/select.js +3 -4
- package/dist/dom/components/select.js.map +1 -1
- package/dist/dom/components/slider.js +2 -2
- package/dist/dom/components/slider.js.map +1 -1
- package/dist/dom/components/spacer.js +2 -2
- package/dist/dom/components/spacer.js.map +1 -1
- package/dist/dom/components/spinner.js +27 -13
- package/dist/dom/components/spinner.js.map +1 -1
- package/dist/dom/components/stack.js +10 -10
- package/dist/dom/components/stack.js.map +1 -1
- package/dist/dom/components/switch.js +5 -6
- package/dist/dom/components/switch.js.map +1 -1
- package/dist/dom/components/tabs.d.ts +27 -0
- package/dist/dom/components/tabs.js +69 -0
- package/dist/dom/components/tabs.js.map +1 -0
- package/dist/dom/components/text.js +4 -7
- package/dist/dom/components/text.js.map +1 -1
- package/dist/dom/components/textarea.js +2 -2
- package/dist/dom/components/textarea.js.map +1 -1
- package/dist/dom/components/video.js +2 -2
- package/dist/dom/components/video.js.map +1 -1
- package/dist/dom/components/visuallyhidden.d.ts +9 -0
- package/dist/dom/components/visuallyhidden.js +26 -0
- package/dist/dom/components/visuallyhidden.js.map +1 -0
- package/dist/dom/debug.js +6 -8
- package/dist/dom/debug.js.map +1 -1
- package/dist/dom/index.d.ts +0 -1
- package/dist/dom/index.js +0 -1
- package/dist/dom/index.js.map +1 -1
- package/dist/dom/operability.d.ts +100 -0
- package/dist/dom/operability.js +298 -0
- package/dist/dom/operability.js.map +1 -0
- package/dist/dom/renderer.d.ts +98 -5
- package/dist/dom/renderer.js +400 -66
- package/dist/dom/renderer.js.map +1 -1
- package/dist/dom/route-focus.d.ts +42 -0
- package/dist/dom/route-focus.js +88 -0
- package/dist/dom/route-focus.js.map +1 -0
- package/dist/dom/semantics.d.ts +35 -0
- package/dist/dom/semantics.js +184 -0
- package/dist/dom/semantics.js.map +1 -0
- package/dist/variants.d.ts +90 -0
- package/dist/variants.js +206 -0
- package/dist/variants.js.map +1 -0
- package/package.json +2 -2
- package/src/canvas/QUICKSTART.md +16 -11
- package/src/canvas/README.md +63 -34
- package/src/canvas/accessibility.ts +507 -115
- package/src/canvas/dispatch.ts +78 -0
- package/src/canvas/editing.ts +697 -0
- package/src/canvas/events.ts +104 -115
- package/src/canvas/focus.ts +216 -0
- package/src/canvas/index.ts +8 -9
- package/src/canvas/layout.ts +68 -103
- package/src/canvas/paint.ts +509 -109
- package/src/canvas/renderer.ts +239 -99
- package/src/canvas/selection.ts +52 -210
- package/src/canvas/text-geometry.ts +311 -0
- package/src/canvas/text.ts +45 -18
- package/src/canvas/types.ts +28 -1
- package/src/canvas/utils.ts +3 -69
- package/src/canvas/variants.ts +172 -0
- package/src/dom/README.md +8 -7
- package/src/dom/a11y-styles.ts +65 -0
- package/src/dom/applicators/aria.ts +41 -0
- package/src/dom/applicators/events.ts +39 -7
- package/src/dom/applicators/font.ts +16 -29
- package/src/dom/applicators/index.ts +61 -46
- package/src/dom/canvas/index.ts +2 -2
- package/src/dom/components/app.ts +2 -2
- package/src/dom/components/audio.ts +2 -2
- package/src/dom/components/avatar.ts +3 -4
- package/src/dom/components/badge.ts +3 -4
- package/src/dom/components/button.ts +2 -2
- package/src/dom/components/card.ts +2 -2
- package/src/dom/components/center.ts +2 -2
- package/src/dom/components/checkbox.ts +4 -5
- package/src/dom/components/column.ts +2 -2
- package/src/dom/components/container.ts +2 -2
- package/src/dom/components/divider.ts +2 -2
- package/src/dom/components/grid.ts +10 -10
- package/src/dom/components/heading.ts +4 -6
- package/src/dom/components/hypenapp.ts +246 -274
- package/src/dom/components/icon.ts +4 -5
- package/src/dom/components/image.ts +2 -2
- package/src/dom/components/index.ts +10 -3
- package/src/dom/components/input.ts +2 -2
- package/src/dom/components/link.ts +2 -2
- package/src/dom/components/list.ts +2 -2
- package/src/dom/components/paragraph.ts +3 -4
- package/src/dom/components/progressbar.ts +3 -3
- package/src/dom/components/route.ts +2 -2
- package/src/dom/components/router.ts +2 -2
- package/src/dom/components/row.ts +10 -10
- package/src/dom/components/select.ts +3 -4
- package/src/dom/components/slider.ts +2 -2
- package/src/dom/components/spacer.ts +2 -2
- package/src/dom/components/spinner.ts +34 -16
- package/src/dom/components/stack.ts +10 -10
- package/src/dom/components/switch.ts +5 -6
- package/src/dom/components/tabs.ts +76 -0
- package/src/dom/components/text.ts +4 -7
- package/src/dom/components/textarea.ts +2 -2
- package/src/dom/components/video.ts +2 -2
- package/src/dom/components/visuallyhidden.ts +30 -0
- package/src/dom/debug.ts +6 -8
- package/src/dom/index.ts +0 -8
- package/src/dom/operability.ts +312 -0
- package/src/dom/renderer.ts +457 -66
- package/src/dom/route-focus.ts +98 -0
- package/src/dom/semantics.ts +199 -0
- package/src/variants.ts +249 -0
- package/dist/canvas/input.d.ts +0 -76
- package/dist/canvas/input.js +0 -207
- package/dist/canvas/input.js.map +0 -1
- package/dist/client.d.ts +0 -36
- package/dist/client.js +0 -47
- package/dist/client.js.map +0 -1
- package/src/canvas/input.ts +0 -251
- package/src/client.ts +0 -88
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composite-widget hosts: Tabs / Tab / TabPanel / Option.
|
|
3
|
+
*
|
|
4
|
+
* These exist so the composite element types render *focusable, styleable*
|
|
5
|
+
* hosts instead of falling through to the unknown-component fallback (a
|
|
6
|
+
* `display: contents` div, which cannot reliably hold keyboard focus). The
|
|
7
|
+
* accessibility roles come from the engine-derived Semantics block
|
|
8
|
+
* (tablist/tab/tabpanel/option), not from these handlers; keyboard roving is
|
|
9
|
+
* wired by the renderer when it sees `role="tablist"` (see operability.ts).
|
|
10
|
+
*/
|
|
11
|
+
/** Tabs → a plain row container; role="tablist" arrives via semantics. */
|
|
12
|
+
export const tabsHandler = {
|
|
13
|
+
create() {
|
|
14
|
+
const el = document.createElement("div");
|
|
15
|
+
el.dataset.hypenType = "tabs";
|
|
16
|
+
el.style.display = "flex";
|
|
17
|
+
el.style.flexDirection = "row";
|
|
18
|
+
return el;
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Tab → a native `<button>` so focus and Enter/Space activation come free;
|
|
23
|
+
* the engine's `role="tab"` overrides the implicit button role (see the
|
|
24
|
+
* IMPLICIT_ROLE override logic in semantics.ts).
|
|
25
|
+
*/
|
|
26
|
+
export const tabHandler = {
|
|
27
|
+
create() {
|
|
28
|
+
const el = document.createElement("button");
|
|
29
|
+
el.setAttribute("type", "button");
|
|
30
|
+
el.dataset.hypenType = "tab";
|
|
31
|
+
return el;
|
|
32
|
+
},
|
|
33
|
+
applyProps(el, props) {
|
|
34
|
+
const text = props["0"] ?? props.text;
|
|
35
|
+
if (text !== undefined) {
|
|
36
|
+
el.dataset.textTemplate = String(text);
|
|
37
|
+
el.textContent = String(text);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* TabPanel → a focusable region (`tabindex=0`) so a Tab keypress from the
|
|
43
|
+
* tablist lands inside the panel even when it has no focusable content
|
|
44
|
+
* (WAI-ARIA APG recommendation).
|
|
45
|
+
*/
|
|
46
|
+
export const tabPanelHandler = {
|
|
47
|
+
create() {
|
|
48
|
+
const el = document.createElement("div");
|
|
49
|
+
el.dataset.hypenType = "tabpanel";
|
|
50
|
+
el.tabIndex = 0;
|
|
51
|
+
return el;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
/** Option → a plain div host; role="option" arrives via semantics. */
|
|
55
|
+
export const optionHandler = {
|
|
56
|
+
create() {
|
|
57
|
+
const el = document.createElement("div");
|
|
58
|
+
el.dataset.hypenType = "option";
|
|
59
|
+
return el;
|
|
60
|
+
},
|
|
61
|
+
applyProps(el, props) {
|
|
62
|
+
const text = props["0"] ?? props.text;
|
|
63
|
+
if (text !== undefined) {
|
|
64
|
+
el.dataset.textTemplate = String(text);
|
|
65
|
+
el.textContent = String(text);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/dom/components/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,MAAM;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC;QAC9B,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAC1B,EAAE,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAqB;IAC1C,MAAM;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC5C,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClC,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,UAAU,CAAC,EAAe,EAAE,KAA0B;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;QACtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,EAAE,CAAC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,EAAE,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,MAAM;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC;QAClC,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC;AAEF,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAqB;IAC7C,MAAM;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,UAAU,CAAC,EAAe,EAAE,KAA0B;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;QACtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,EAAE,CAAC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,EAAE,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Text Component
|
|
3
3
|
*/
|
|
4
4
|
export const textHandler = {
|
|
5
|
-
create(
|
|
6
|
-
const el =
|
|
5
|
+
create() {
|
|
6
|
+
const el = document.createElement("span");
|
|
7
7
|
// Use inline-block for proper flex child behavior
|
|
8
8
|
el.style.display = "inline-block";
|
|
9
9
|
// Tight line-height to match iOS/Android
|
|
@@ -16,11 +16,8 @@ export const textHandler = {
|
|
|
16
16
|
return el;
|
|
17
17
|
},
|
|
18
18
|
applyProps(el, props) {
|
|
19
|
-
// Text content from first positional arg or "text" prop
|
|
20
|
-
|
|
21
|
-
// render — `||` falls through on falsy values and a bound `0` was
|
|
22
|
-
// disappearing entirely on web while iOS rendered it correctly.
|
|
23
|
-
const text = props["0"] ?? props.text;
|
|
19
|
+
// Text content from first positional arg or "text" prop
|
|
20
|
+
const text = props["0"] || props.text;
|
|
24
21
|
if (text !== undefined) {
|
|
25
22
|
// Store the original text template for state interpolation
|
|
26
23
|
el.dataset.textTemplate = String(text);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/dom/components/text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,MAAM
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/dom/components/text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,MAAM;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,kDAAkD;QAClD,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;QAClC,yCAAyC;QACzC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC;QAC1B,4DAA4D;QAC5D,EAAE,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;QAC/B,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QACtB,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;QACvB,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,UAAU,CAAC,EAAe,EAAE,KAA0B;QACpD,wDAAwD;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;QACtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,2DAA2D;YAC3D,EAAE,CAAC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,EAAE,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Textarea Component
|
|
3
3
|
*/
|
|
4
4
|
export const textareaHandler = {
|
|
5
|
-
create(
|
|
6
|
-
const el =
|
|
5
|
+
create() {
|
|
6
|
+
const el = document.createElement("textarea");
|
|
7
7
|
el.dataset.hypenType = "textarea";
|
|
8
8
|
// Same user-agent reset as Input — otherwise `.tw(...)` styling draws
|
|
9
9
|
// over a native dark border and inset shadow.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../../src/dom/components/textarea.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,MAAM
|
|
1
|
+
{"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../../src/dom/components/textarea.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,MAAM;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC9C,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC;QAClC,sEAAsE;QACtE,8CAA8C;QAC9C,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAC1B,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC;QACpC,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;QAC1B,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QAC3B,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,OAAO,EAAiB,CAAC;IAC3B,CAAC;IAED,UAAU,CAAC,EAAe,EAAE,KAA0B;QACpD,MAAM,QAAQ,GAAG,EAAyB,CAAC;QAE3C,mFAAmF;QACnF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,cAAc;QACd,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACnD,CAAC;QAED,OAAO;QACP,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,OAAO;QACP,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,WAAW;QACX,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,WAAW;QACX,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../../src/dom/components/video.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C,MAAM
|
|
1
|
+
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../../src/dom/components/video.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C,MAAM;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAwB,CAAC;IAClC,CAAC;IAED,UAAU,CAAC,EAAe,EAAE,KAA0B;QACpD,MAAM,KAAK,GAAG,EAAsB,CAAC;QAErC,SAAS;QACT,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC;QACpC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAED,WAAW;QACX,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,WAAW;QACX,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO;QACP,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,QAAQ;QACR,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,SAAS;QACT,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VisuallyHidden Component
|
|
3
|
+
*
|
|
4
|
+
* Renders content that is invisible on screen but remains in the accessibility
|
|
5
|
+
* tree for screen readers — the standard "sr-only" pattern. Useful for giving
|
|
6
|
+
* an icon-only control readable text, announcing context, etc.
|
|
7
|
+
*/
|
|
8
|
+
import type { ComponentHandler } from "./index.js";
|
|
9
|
+
export declare const visuallyHiddenHandler: ComponentHandler;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VisuallyHidden Component
|
|
3
|
+
*
|
|
4
|
+
* Renders content that is invisible on screen but remains in the accessibility
|
|
5
|
+
* tree for screen readers — the standard "sr-only" pattern. Useful for giving
|
|
6
|
+
* an icon-only control readable text, announcing context, etc.
|
|
7
|
+
*/
|
|
8
|
+
export const visuallyHiddenHandler = {
|
|
9
|
+
create() {
|
|
10
|
+
const el = document.createElement("span");
|
|
11
|
+
el.dataset.hypenType = "visuallyhidden";
|
|
12
|
+
// Standard visually-hidden (sr-only) styles: removed from the visual
|
|
13
|
+
// layout but still read by assistive technology.
|
|
14
|
+
el.style.position = "absolute";
|
|
15
|
+
el.style.width = "1px";
|
|
16
|
+
el.style.height = "1px";
|
|
17
|
+
el.style.padding = "0";
|
|
18
|
+
el.style.margin = "-1px";
|
|
19
|
+
el.style.overflow = "hidden";
|
|
20
|
+
el.style.clip = "rect(0, 0, 0, 0)";
|
|
21
|
+
el.style.whiteSpace = "nowrap";
|
|
22
|
+
el.style.border = "0";
|
|
23
|
+
return el;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=visuallyhidden.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visuallyhidden.js","sourceRoot":"","sources":["../../../src/dom/components/visuallyhidden.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,MAAM;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,gBAAgB,CAAC;QAExC,qEAAqE;QACrE,iDAAiD;QACjD,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC/B,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QACxB,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;QACvB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,kBAAkB,CAAC;QACnC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;QAC/B,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QAEtB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC"}
|
package/dist/dom/debug.js
CHANGED
|
@@ -51,13 +51,11 @@ export class RerenderTracker {
|
|
|
51
51
|
* Create or update the heatmap overlay for an element
|
|
52
52
|
*/
|
|
53
53
|
updateHeatmap(id, element, renderCount, patchType) {
|
|
54
|
-
const doc = element.ownerDocument;
|
|
55
|
-
const win = doc.defaultView ?? window;
|
|
56
54
|
// Calculate opacity based on render count (increment by heatmapIncrement% each time)
|
|
57
55
|
const opacity = Math.min((renderCount * this.config.heatmapIncrement) / 100, this.config.maxOpacity);
|
|
58
56
|
log.debug(`Updating heatmap for ${id}, count: ${renderCount}, opacity: ${opacity}`);
|
|
59
57
|
// For inline elements or text, use a simpler approach: background color + outline
|
|
60
|
-
const isInline =
|
|
58
|
+
const isInline = window.getComputedStyle(element).display.includes('inline');
|
|
61
59
|
if (isInline || element.tagName === 'SPAN') {
|
|
62
60
|
// Store original styles if not already stored
|
|
63
61
|
if (!element.dataset.hypenDebugOriginalBg) {
|
|
@@ -73,8 +71,8 @@ export class RerenderTracker {
|
|
|
73
71
|
// Add count badge as ::before pseudo-element or data attribute
|
|
74
72
|
element.setAttribute('data-hypen-renders', `${renderCount}× ${patchType}`);
|
|
75
73
|
// Add CSS for the badge if not already added
|
|
76
|
-
if (!
|
|
77
|
-
const style =
|
|
74
|
+
if (!document.getElementById('hypen-debug-styles')) {
|
|
75
|
+
const style = document.createElement('style');
|
|
78
76
|
style.id = 'hypen-debug-styles';
|
|
79
77
|
style.textContent = `
|
|
80
78
|
[data-hypen-renders]::before {
|
|
@@ -95,7 +93,7 @@ export class RerenderTracker {
|
|
|
95
93
|
text-shadow: none;
|
|
96
94
|
}
|
|
97
95
|
`;
|
|
98
|
-
|
|
96
|
+
document.head.appendChild(style);
|
|
99
97
|
}
|
|
100
98
|
// Store in overlays map for cleanup
|
|
101
99
|
this.overlays.set(id, element);
|
|
@@ -114,7 +112,7 @@ export class RerenderTracker {
|
|
|
114
112
|
// For block elements, use overlay approach
|
|
115
113
|
let overlay = this.overlays.get(id);
|
|
116
114
|
if (!overlay) {
|
|
117
|
-
overlay =
|
|
115
|
+
overlay = document.createElement("div");
|
|
118
116
|
overlay.className = "hypen-debug-overlay";
|
|
119
117
|
overlay.style.cssText = `
|
|
120
118
|
position: absolute;
|
|
@@ -136,7 +134,7 @@ export class RerenderTracker {
|
|
|
136
134
|
display: block !important;
|
|
137
135
|
visibility: visible !important;
|
|
138
136
|
`;
|
|
139
|
-
const currentPosition =
|
|
137
|
+
const currentPosition = window.getComputedStyle(element).position;
|
|
140
138
|
if (currentPosition === 'static') {
|
|
141
139
|
element.style.position = 'relative';
|
|
142
140
|
}
|
package/dist/dom/debug.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/dom/debug.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC;AAenC,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC7C,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,IAAI;IACjB,gBAAgB,EAAE,CAAC;IACnB,UAAU,EAAE,GAAG;IACf,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC7C,MAAM,CAAc;IAE5B,YAAY,SAAsB,kBAAkB;QAClD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAA4B;QACpC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QAE5C,mDAAmD;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,EAAU,EAAE,OAAoB,EAAE,SAAiB;QAC/D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACrD,OAAO;QACT,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,MAAM,SAAS,EAAE,CAAC,CAAC;QAEtD,yBAAyB;QACzB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,YAAY,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAEpC,mCAAmC;QACnC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,EAAU,EAAE,OAAoB,EAAE,WAAmB,EAAE,SAAiB;QAC5F,
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/dom/debug.ts"],"names":[],"mappings":"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"}
|
package/dist/dom/index.d.ts
CHANGED
|
@@ -8,4 +8,3 @@ export { ComponentRegistry } from "./components/index.js";
|
|
|
8
8
|
export { ApplicatorRegistry } from "./applicators/index.js";
|
|
9
9
|
export { EventManager } from "./events.js";
|
|
10
10
|
export { RerenderTracker, type DebugConfig, defaultDebugConfig } from "./debug.js";
|
|
11
|
-
export { createDomClient as createHypenClient, createDomClient, type DomClient as HypenClient, type DomClient, type DomClientOptions as HypenClientOptions, type DomClientOptions, } from "../client.js";
|
package/dist/dom/index.js
CHANGED
|
@@ -8,5 +8,4 @@ export { ComponentRegistry } from "./components/index.js";
|
|
|
8
8
|
export { ApplicatorRegistry } from "./applicators/index.js";
|
|
9
9
|
export { EventManager } from "./events.js";
|
|
10
10
|
export { RerenderTracker, defaultDebugConfig } from "./debug.js";
|
|
11
|
-
export { createDomClient as createHypenClient, createDomClient, } from "../client.js";
|
|
12
11
|
//# sourceMappingURL=index.js.map
|
package/dist/dom/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dom/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAoB,kBAAkB,EAAE,MAAM,YAAY,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dom/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAoB,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyboard operability for actionable elements.
|
|
3
|
+
*
|
|
4
|
+
* Native interactive elements (`<button>`, `<a href>`) are keyboard-operable
|
|
5
|
+
* for free — the browser activates them on Enter/Space. But Hypen's actionable
|
|
6
|
+
* `Card` renders a plain `<div>`, which is neither focusable nor
|
|
7
|
+
* keyboard-activatable. This module closes that gap: a non-native actionable
|
|
8
|
+
* host is given a `button` role, made focusable (`tabindex=0`), and wired so
|
|
9
|
+
* Enter/Space dispatch the same action as a click.
|
|
10
|
+
*
|
|
11
|
+
* This is intentionally client-side: focus and key handling are synchronous
|
|
12
|
+
* interactions the streaming engine cannot mediate.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Make a non-native actionable element keyboard-operable. Idempotent across
|
|
16
|
+
* re-renders (guarded by a dataset flag). No-op for native interactive tags.
|
|
17
|
+
*/
|
|
18
|
+
export declare function makeKeyboardActivatable(element: HTMLElement, actionValue: unknown): void;
|
|
19
|
+
/**
|
|
20
|
+
* Pick the focus target for a Tab keypress within a trapped container, wrapping
|
|
21
|
+
* at the ends.
|
|
22
|
+
*
|
|
23
|
+
* Pure over the ordered list of focusable descendants so it is testable without
|
|
24
|
+
* a real DOM: given the currently-focused element (`active`) and the Shift
|
|
25
|
+
* state, returns the element that should receive focus next, or `null` when
|
|
26
|
+
* there is nothing to focus. Tab past the last element wraps to the first;
|
|
27
|
+
* Shift+Tab past the first wraps to the last. When focus is outside the set,
|
|
28
|
+
* Tab lands on the first element and Shift+Tab on the last.
|
|
29
|
+
*/
|
|
30
|
+
export declare function nextTrapFocus<T>(focusable: T[], active: T | null, shift: boolean): T | null;
|
|
31
|
+
/**
|
|
32
|
+
* Pick the tab that should receive focus for a keypress inside a roving
|
|
33
|
+
* tablist (WAI-ARIA APG "Tabs" keyboard contract). Pure over the ordered tab
|
|
34
|
+
* list so it is testable without a real DOM: Arrow Right/Down move to the
|
|
35
|
+
* next tab (wrapping), Arrow Left/Up to the previous (wrapping), Home/End to
|
|
36
|
+
* the first/last. Any other key — or an empty list — returns `null` (leave
|
|
37
|
+
* focus alone).
|
|
38
|
+
*/
|
|
39
|
+
export declare function nextRovingFocus<T>(tabs: T[], active: T | null, key: string): T | null;
|
|
40
|
+
/**
|
|
41
|
+
* Pick the item typeahead should move focus to (WAI-ARIA APG first-character
|
|
42
|
+
* navigation). Pure over the ordered item list so it is testable without a
|
|
43
|
+
* real DOM: the search is a case-insensitive `startsWith` over `textOf(item)`,
|
|
44
|
+
* starting from the item AFTER `active` and wrapping; `active` itself is the
|
|
45
|
+
* last candidate, so a query the current item already matches keeps focus in
|
|
46
|
+
* place (multi-char accumulation refining onto the same item). Returns `null`
|
|
47
|
+
* when nothing matches or the query is empty. Query accumulation and its
|
|
48
|
+
* timeout live at the caller.
|
|
49
|
+
*/
|
|
50
|
+
export declare function nextTypeaheadFocus<T>(items: T[], active: T | null, query: string, textOf: (item: T) => string): T | null;
|
|
51
|
+
/**
|
|
52
|
+
* Install the WAI-ARIA APG "Tabs" keyboard contract on a tablist container:
|
|
53
|
+
* roving tabindex over the `role="tab"` descendants plus first-character
|
|
54
|
+
* typeahead (see `installRovingWidget`).
|
|
55
|
+
*/
|
|
56
|
+
export declare function makeRovingTablist(container: HTMLElement): void;
|
|
57
|
+
/**
|
|
58
|
+
* Install the WAI-ARIA APG "Listbox" keyboard contract on a listbox
|
|
59
|
+
* container: roving tabindex over the `role="option"` descendants plus
|
|
60
|
+
* first-character typeahead (see `installRovingWidget`). No-op for a native
|
|
61
|
+
* `<select>` host (Hypen's `Select`), where the browser already owns arrow
|
|
62
|
+
* and typeahead behaviour.
|
|
63
|
+
*/
|
|
64
|
+
export declare function makeRovingListbox(container: HTMLElement): void;
|
|
65
|
+
/**
|
|
66
|
+
* Install a focus trap on a dialog-like container: Tab / Shift+Tab cycle focus
|
|
67
|
+
* among the container's focusable descendants and wrap at the ends. Closing is
|
|
68
|
+
* app state: Escape is handled by `installDialogEscape` only when the dialog
|
|
69
|
+
* declares an `onClose` action. Idempotent across re-renders, guarded by a
|
|
70
|
+
* dataset flag.
|
|
71
|
+
*/
|
|
72
|
+
export declare function makeFocusTrap(container: HTMLElement): void;
|
|
73
|
+
/**
|
|
74
|
+
* First focusable descendant of `root` in document order, or `null`. Matches
|
|
75
|
+
* the focus trap's element set (`FOCUSABLE_SELECTOR`) but walks `children`
|
|
76
|
+
* recursively instead of `querySelectorAll`, so it works on hosts without
|
|
77
|
+
* selector support (test doubles) — document order is exactly child order.
|
|
78
|
+
*/
|
|
79
|
+
export declare function findFirstFocusable(root: HTMLElement): HTMLElement | null;
|
|
80
|
+
/**
|
|
81
|
+
* Dialog auto-focus on mount (WAI-ARIA APG "Dialog (Modal)"): focus the
|
|
82
|
+
* dialog's first focusable descendant, else the dialog itself (granted
|
|
83
|
+
* programmatic focusability by `focusRouteTarget`). Returns the element that
|
|
84
|
+
* held focus before the dialog opened, so the caller can restore it on close.
|
|
85
|
+
*/
|
|
86
|
+
export declare function focusDialogOnOpen(dialog: HTMLElement): HTMLElement | null;
|
|
87
|
+
/**
|
|
88
|
+
* Restore focus to the element that had it before a dialog opened. Skipped
|
|
89
|
+
* when the opener is gone: no longer connected to the document, or living
|
|
90
|
+
* inside the (now closed) dialog itself.
|
|
91
|
+
*/
|
|
92
|
+
export declare function restoreDialogFocus(dialog: HTMLElement, opener: HTMLElement | null): void;
|
|
93
|
+
/**
|
|
94
|
+
* Escape-to-close for a dialog that declares an `onClose` action: Escape
|
|
95
|
+
* dispatches the action; the actual close (state flip, unmount) stays with
|
|
96
|
+
* the app. A dialog without `onClose` gets no Escape behaviour — the renderer
|
|
97
|
+
* cannot know how to close it. Idempotent across re-renders, guarded by a
|
|
98
|
+
* dataset flag.
|
|
99
|
+
*/
|
|
100
|
+
export declare function installDialogEscape(dialog: HTMLElement, onCloseValue: unknown): void;
|