@dogsbay/elements 0.2.0-beta.114 → 0.2.0-beta.116

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.
Files changed (73) hide show
  1. package/dist/{base-BtvRtAsC.d.ts → base-D1Rz70fn.d.ts} +1 -0
  2. package/dist/chunk-3AEQ6KHV.js +70 -0
  3. package/dist/chunk-3AEQ6KHV.js.map +1 -0
  4. package/dist/chunk-3FMXAKOU.js +383 -0
  5. package/dist/chunk-3FMXAKOU.js.map +1 -0
  6. package/dist/{chunk-ZLIF4UYD.js → chunk-4YPDR3W6.js} +13 -4
  7. package/dist/chunk-4YPDR3W6.js.map +1 -0
  8. package/dist/{chunk-IMW234S2.js → chunk-CLUADA3G.js} +2 -2
  9. package/dist/chunk-EGU66XCL.js +116 -0
  10. package/dist/chunk-EGU66XCL.js.map +1 -0
  11. package/dist/{chunk-THLTJ2HB.js → chunk-ETBBSA3I.js} +2 -2
  12. package/dist/chunk-FIJZRZEN.js +90 -0
  13. package/dist/chunk-FIJZRZEN.js.map +1 -0
  14. package/dist/{chunk-ABP4WEKU.js → chunk-K6DPDBAG.js} +25 -2
  15. package/dist/chunk-K6DPDBAG.js.map +1 -0
  16. package/dist/{chunk-5S2MMI3R.js → chunk-LAUNXWKJ.js} +2 -2
  17. package/dist/chunk-MAD6XJY4.js +256 -0
  18. package/dist/chunk-MAD6XJY4.js.map +1 -0
  19. package/dist/chunk-MEOIAZDF.js +140 -0
  20. package/dist/chunk-MEOIAZDF.js.map +1 -0
  21. package/dist/{chunk-WTARNLNI.js → chunk-QSRUT67Y.js} +2 -2
  22. package/dist/chunk-S62ZVVO3.js +234 -0
  23. package/dist/chunk-S62ZVVO3.js.map +1 -0
  24. package/dist/chunk-SLJG53M7.js +208 -0
  25. package/dist/chunk-SLJG53M7.js.map +1 -0
  26. package/dist/{chunk-RVJC6M2U.js → chunk-V4P3UR4I.js} +2 -2
  27. package/dist/{chunk-VJXEM5O6.js → chunk-VW7HZY2B.js} +2 -2
  28. package/dist/db-accordion.d.ts +1 -1
  29. package/dist/db-accordion.js +2 -2
  30. package/dist/db-card.d.ts +1 -1
  31. package/dist/db-card.js +2 -2
  32. package/dist/db-code-block.d.ts +1 -1
  33. package/dist/db-code-block.js +2 -2
  34. package/dist/db-collapsible.d.ts +1 -1
  35. package/dist/db-collapsible.js +2 -2
  36. package/dist/db-combobox.d.ts +70 -0
  37. package/dist/db-combobox.js +9 -0
  38. package/dist/db-combobox.js.map +1 -0
  39. package/dist/db-dialog.d.ts +62 -0
  40. package/dist/db-dialog.js +9 -0
  41. package/dist/db-dialog.js.map +1 -0
  42. package/dist/db-link-button.d.ts +1 -1
  43. package/dist/db-link-button.js +2 -2
  44. package/dist/db-nav-tree.d.ts +83 -0
  45. package/dist/db-nav-tree.js +9 -0
  46. package/dist/db-nav-tree.js.map +1 -0
  47. package/dist/db-popover.d.ts +42 -0
  48. package/dist/db-popover.js +9 -0
  49. package/dist/db-popover.js.map +1 -0
  50. package/dist/db-select.d.ts +72 -0
  51. package/dist/db-select.js +9 -0
  52. package/dist/db-select.js.map +1 -0
  53. package/dist/db-steps.d.ts +1 -1
  54. package/dist/db-steps.js +2 -2
  55. package/dist/db-tabs.d.ts +8 -1
  56. package/dist/db-tabs.js +2 -2
  57. package/dist/db-toc.d.ts +32 -0
  58. package/dist/db-toc.js +8 -0
  59. package/dist/db-toc.js.map +1 -0
  60. package/dist/db-tooltip.d.ts +48 -0
  61. package/dist/db-tooltip.js +9 -0
  62. package/dist/db-tooltip.js.map +1 -0
  63. package/dist/index.d.ts +8 -1
  64. package/dist/index.js +40 -11
  65. package/package.json +30 -2
  66. package/dist/chunk-ABP4WEKU.js.map +0 -1
  67. package/dist/chunk-ZLIF4UYD.js.map +0 -1
  68. /package/dist/{chunk-IMW234S2.js.map → chunk-CLUADA3G.js.map} +0 -0
  69. /package/dist/{chunk-THLTJ2HB.js.map → chunk-ETBBSA3I.js.map} +0 -0
  70. /package/dist/{chunk-5S2MMI3R.js.map → chunk-LAUNXWKJ.js.map} +0 -0
  71. /package/dist/{chunk-WTARNLNI.js.map → chunk-QSRUT67Y.js.map} +0 -0
  72. /package/dist/{chunk-RVJC6M2U.js.map → chunk-V4P3UR4I.js.map} +0 -0
  73. /package/dist/{chunk-VJXEM5O6.js.map → chunk-VW7HZY2B.js.map} +0 -0
@@ -0,0 +1,140 @@
1
+ import {
2
+ hideFloating,
3
+ ownOne,
4
+ resolveAsChild,
5
+ showFloating,
6
+ uid
7
+ } from "./chunk-3AEQ6KHV.js";
8
+ import {
9
+ DogsbayElement,
10
+ ensureDefaultDisplay
11
+ } from "./chunk-K6DPDBAG.js";
12
+
13
+ // src/db-tooltip.ts
14
+ import { setupFloating } from "@dogsbay/primitives/floating";
15
+ var DbTooltip = class extends DogsbayElement {
16
+ trigger = null;
17
+ content = null;
18
+ cleanupFloating = null;
19
+ showTimer = null;
20
+ hideTimer = null;
21
+ _open = false;
22
+ get open() {
23
+ return this._open;
24
+ }
25
+ num(name, fallback) {
26
+ const v = Number(this.getAttribute(name));
27
+ return Number.isFinite(v) && this.hasAttribute(name) ? v : fallback;
28
+ }
29
+ onEnter = (e) => {
30
+ if (e.pointerType === "touch") return;
31
+ this.clearTimers();
32
+ if (!this._open) this.showTimer = setTimeout(() => this.show(), this.num("delay", 200));
33
+ };
34
+ onLeave = (e) => {
35
+ if (e.pointerType === "touch") return;
36
+ this.clearTimers();
37
+ this.hideTimer = setTimeout(() => this.hide(), this.num("close-delay", 100));
38
+ };
39
+ onContentEnter = () => this.clearTimers();
40
+ // Keyboard focus only: a mouse press focuses the button too, and would reopen
41
+ // the tooltip the press just closed.
42
+ onFocus = () => {
43
+ let keyboard = true;
44
+ try {
45
+ keyboard = this.trigger.matches(":focus-visible");
46
+ } catch {
47
+ }
48
+ if (!keyboard) return;
49
+ this.clearTimers();
50
+ this.show();
51
+ };
52
+ onBlur = () => this.hide();
53
+ onPress = () => this.hide();
54
+ // Capture phase, consumed: Escape dismisses only the tooltip, not a popover or
55
+ // dialog around its trigger (WCAG 1.4.13, APG tooltip).
56
+ onKey = (e) => {
57
+ if (e.key === "Escape" && this._open) {
58
+ e.preventDefault();
59
+ e.stopImmediatePropagation();
60
+ this.hide();
61
+ }
62
+ };
63
+ setup() {
64
+ this.trigger = resolveAsChild(ownOne(this, "[data-part='trigger']"));
65
+ this.content = ownOne(this, "[data-part='content']");
66
+ if (!this.trigger || !this.content) return;
67
+ this.content.id ||= uid("db-tooltip");
68
+ this.content.setAttribute("role", "tooltip");
69
+ this.content.hidden = true;
70
+ const described = (this.trigger.getAttribute("aria-describedby") ?? "").split(/\s+/).filter(Boolean);
71
+ if (!described.includes(this.content.id)) this.trigger.setAttribute("aria-describedby", [...described, this.content.id].join(" "));
72
+ this.setState("closed");
73
+ }
74
+ connect() {
75
+ const { trigger, content } = this;
76
+ if (!trigger || !content) return;
77
+ trigger.addEventListener("pointerenter", this.onEnter);
78
+ trigger.addEventListener("pointerleave", this.onLeave);
79
+ trigger.addEventListener("focus", this.onFocus);
80
+ trigger.addEventListener("blur", this.onBlur);
81
+ trigger.addEventListener("pointerdown", this.onPress);
82
+ content.addEventListener("pointerenter", this.onContentEnter);
83
+ content.addEventListener("pointerleave", this.onLeave);
84
+ }
85
+ disconnect() {
86
+ const { trigger, content } = this;
87
+ trigger?.removeEventListener("pointerenter", this.onEnter);
88
+ trigger?.removeEventListener("pointerleave", this.onLeave);
89
+ trigger?.removeEventListener("focus", this.onFocus);
90
+ trigger?.removeEventListener("blur", this.onBlur);
91
+ trigger?.removeEventListener("pointerdown", this.onPress);
92
+ content?.removeEventListener("pointerenter", this.onContentEnter);
93
+ content?.removeEventListener("pointerleave", this.onLeave);
94
+ this.hide();
95
+ }
96
+ clearTimers() {
97
+ if (this.showTimer) clearTimeout(this.showTimer);
98
+ if (this.hideTimer) clearTimeout(this.hideTimer);
99
+ this.showTimer = this.hideTimer = null;
100
+ }
101
+ setState(state) {
102
+ this.setAttribute("data-state", state);
103
+ this.content?.setAttribute("data-state", state);
104
+ }
105
+ show() {
106
+ const { trigger, content } = this;
107
+ if (!trigger || !content || this._open) return;
108
+ this._open = true;
109
+ this.clearTimers();
110
+ const layer = showFloating(content);
111
+ this.setState("open");
112
+ this.cleanupFloating = setupFloating(trigger, content, {
113
+ placement: this.getAttribute("placement") || content.dataset.side || "top",
114
+ offset: 8,
115
+ strategy: layer === "top-layer" ? "fixed" : "absolute"
116
+ });
117
+ document.addEventListener("keydown", this.onKey, true);
118
+ this.dispatchEvent(new CustomEvent("db-tooltip:open", { bubbles: true }));
119
+ }
120
+ hide() {
121
+ this.clearTimers();
122
+ if (!this._open || !this.content) return;
123
+ this._open = false;
124
+ document.removeEventListener("keydown", this.onKey, true);
125
+ this.cleanupFloating?.();
126
+ this.cleanupFloating = null;
127
+ hideFloating(this.content);
128
+ this.setState("closed");
129
+ this.dispatchEvent(new CustomEvent("db-tooltip:close", { bubbles: true }));
130
+ }
131
+ };
132
+ ensureDefaultDisplay();
133
+ if (!customElements.get("db-tooltip")) {
134
+ customElements.define("db-tooltip", DbTooltip);
135
+ }
136
+
137
+ export {
138
+ DbTooltip
139
+ };
140
+ //# sourceMappingURL=chunk-MEOIAZDF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db-tooltip.ts"],"sourcesContent":["import { setupFloating, type FloatingOptions } from \"@dogsbay/primitives/floating\";\nimport { DogsbayElement, ensureDefaultDisplay } from \"./base.js\";\nimport { hideFloating, ownOne, resolveAsChild, showFloating, uid } from \"./utils.js\";\n\ntype Placement = NonNullable<FloatingOptions[\"placement\"]>;\n\n/**\n * `<db-tooltip>` — Short description shown on hover and keyboard focus\n * (APG \"Tooltip\"). The trigger is described by the content\n * (aria-describedby), so screen readers announce it without showing it.\n *\n * WCAG 1.4.13 (content on hover or focus):\n * - hoverable: the pointer can move from the trigger onto the tooltip\n * without it closing (`close-delay`, default 100 ms);\n * - dismissible: Escape hides it, whether it opened from hover or focus;\n * - persistent: it stays until the pointer leaves, focus moves or Escape.\n *\n * Attributes:\n * delay — ms before showing on hover (default 200)\n * close-delay — ms grace period on leave (default 100)\n * placement — \"top\" (default), or data-side on the content\n *\n * Parts: [data-part=\"trigger\"] (`data-as-child` supported), [data-part=\"content\"]\n *\n * Events: db-tooltip:open, db-tooltip:close\n */\nexport class DbTooltip extends DogsbayElement {\n private trigger: HTMLElement | null = null;\n private content: HTMLElement | null = null;\n private cleanupFloating: (() => void) | null = null;\n private showTimer: ReturnType<typeof setTimeout> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n private _open = false;\n\n get open(): boolean {\n return this._open;\n }\n\n private num(name: string, fallback: number): number {\n const v = Number(this.getAttribute(name));\n return Number.isFinite(v) && this.hasAttribute(name) ? v : fallback;\n }\n\n private onEnter = (e: PointerEvent) => {\n if (e.pointerType === \"touch\") return;\n this.clearTimers();\n if (!this._open) this.showTimer = setTimeout(() => this.show(), this.num(\"delay\", 200));\n };\n\n private onLeave = (e: PointerEvent) => {\n if (e.pointerType === \"touch\") return;\n this.clearTimers();\n this.hideTimer = setTimeout(() => this.hide(), this.num(\"close-delay\", 100));\n };\n\n private onContentEnter = () => this.clearTimers();\n\n // Keyboard focus only: a mouse press focuses the button too, and would reopen\n // the tooltip the press just closed.\n private onFocus = () => {\n let keyboard = true;\n try {\n keyboard = this.trigger!.matches(\":focus-visible\");\n } catch {\n /* :focus-visible unsupported: treat as keyboard */\n }\n if (!keyboard) return;\n this.clearTimers();\n this.show();\n };\n\n private onBlur = () => this.hide();\n\n private onPress = () => this.hide();\n\n // Capture phase, consumed: Escape dismisses only the tooltip, not a popover or\n // dialog around its trigger (WCAG 1.4.13, APG tooltip).\n private onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && this._open) {\n e.preventDefault();\n e.stopImmediatePropagation();\n this.hide();\n }\n };\n\n protected setup() {\n this.trigger = resolveAsChild(ownOne(this, \"[data-part='trigger']\"));\n this.content = ownOne(this, \"[data-part='content']\");\n if (!this.trigger || !this.content) return;\n this.content.id ||= uid(\"db-tooltip\");\n this.content.setAttribute(\"role\", \"tooltip\");\n this.content.hidden = true;\n const described = (this.trigger.getAttribute(\"aria-describedby\") ?? \"\").split(/\\s+/).filter(Boolean);\n if (!described.includes(this.content.id)) this.trigger.setAttribute(\"aria-describedby\", [...described, this.content.id].join(\" \"));\n this.setState(\"closed\");\n }\n\n protected connect() {\n const { trigger, content } = this;\n if (!trigger || !content) return;\n trigger.addEventListener(\"pointerenter\", this.onEnter);\n trigger.addEventListener(\"pointerleave\", this.onLeave);\n trigger.addEventListener(\"focus\", this.onFocus);\n trigger.addEventListener(\"blur\", this.onBlur);\n trigger.addEventListener(\"pointerdown\", this.onPress);\n content.addEventListener(\"pointerenter\", this.onContentEnter);\n content.addEventListener(\"pointerleave\", this.onLeave);\n }\n\n protected disconnect() {\n const { trigger, content } = this;\n trigger?.removeEventListener(\"pointerenter\", this.onEnter);\n trigger?.removeEventListener(\"pointerleave\", this.onLeave);\n trigger?.removeEventListener(\"focus\", this.onFocus);\n trigger?.removeEventListener(\"blur\", this.onBlur);\n trigger?.removeEventListener(\"pointerdown\", this.onPress);\n content?.removeEventListener(\"pointerenter\", this.onContentEnter);\n content?.removeEventListener(\"pointerleave\", this.onLeave);\n this.hide();\n }\n\n private clearTimers() {\n if (this.showTimer) clearTimeout(this.showTimer);\n if (this.hideTimer) clearTimeout(this.hideTimer);\n this.showTimer = this.hideTimer = null;\n }\n\n private setState(state: \"open\" | \"closed\") {\n this.setAttribute(\"data-state\", state);\n this.content?.setAttribute(\"data-state\", state);\n }\n\n show() {\n const { trigger, content } = this;\n if (!trigger || !content || this._open) return;\n this._open = true;\n this.clearTimers();\n const layer = showFloating(content);\n this.setState(\"open\");\n this.cleanupFloating = setupFloating(trigger, content, {\n placement: (this.getAttribute(\"placement\") || content.dataset.side || \"top\") as Placement,\n offset: 8,\n strategy: layer === \"top-layer\" ? \"fixed\" : \"absolute\",\n });\n document.addEventListener(\"keydown\", this.onKey, true);\n this.dispatchEvent(new CustomEvent(\"db-tooltip:open\", { bubbles: true }));\n }\n\n hide() {\n this.clearTimers();\n if (!this._open || !this.content) return;\n this._open = false;\n document.removeEventListener(\"keydown\", this.onKey, true);\n this.cleanupFloating?.();\n this.cleanupFloating = null;\n hideFloating(this.content);\n this.setState(\"closed\");\n this.dispatchEvent(new CustomEvent(\"db-tooltip:close\", { bubbles: true }));\n }\n}\n\nensureDefaultDisplay();\n\nif (!customElements.get(\"db-tooltip\")) {\n customElements.define(\"db-tooltip\", DbTooltip);\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DogsbayElement,
3
3
  ensureDefaultDisplay
4
- } from "./chunk-ABP4WEKU.js";
4
+ } from "./chunk-K6DPDBAG.js";
5
5
 
6
6
  // src/db-link-button.ts
7
7
  var DbLinkButton = class extends DogsbayElement {
@@ -36,4 +36,4 @@ if (!customElements.get("db-link-button")) {
36
36
  export {
37
37
  DbLinkButton
38
38
  };
39
- //# sourceMappingURL=chunk-WTARNLNI.js.map
39
+ //# sourceMappingURL=chunk-QSRUT67Y.js.map
@@ -0,0 +1,234 @@
1
+ import {
2
+ own,
3
+ uid
4
+ } from "./chunk-3AEQ6KHV.js";
5
+ import {
6
+ DogsbayElement,
7
+ ensureDefaultDisplay
8
+ } from "./chunk-K6DPDBAG.js";
9
+
10
+ // src/db-nav-tree.ts
11
+ var DbNavTree = class extends DogsbayElement {
12
+ /** Nav data for lazy sections. Falls back to `window[data-source]`. */
13
+ navData = null;
14
+ onClick = (e) => {
15
+ const toggle = e.target.closest("[data-part='toggle']");
16
+ if (!toggle || toggle.closest("db-nav-tree") !== this) return;
17
+ const item = toggle.closest("[data-part='item']");
18
+ if (item) this.toggle(item);
19
+ };
20
+ onKey = (e) => {
21
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;
22
+ const active = document.activeElement;
23
+ if (!active || !this.contains(active)) return;
24
+ const rows = this.visibleRows();
25
+ const row = active.closest("[data-part='row']");
26
+ const i = row ? rows.indexOf(row) : -1;
27
+ if (i < 0) return;
28
+ const item = row.closest("[data-part='item']");
29
+ const hasGroup = !!this.groupOf(item);
30
+ const focusRow = (r) => {
31
+ if (!r) return;
32
+ e.preventDefault();
33
+ this.primary(r)?.focus();
34
+ };
35
+ switch (e.key) {
36
+ case "ArrowDown":
37
+ return focusRow(rows[i + 1]);
38
+ case "ArrowUp":
39
+ return focusRow(rows[i - 1]);
40
+ case "Home":
41
+ return focusRow(rows[0]);
42
+ case "End":
43
+ return focusRow(rows[rows.length - 1]);
44
+ case "ArrowRight":
45
+ if (!hasGroup) return;
46
+ e.preventDefault();
47
+ if (!this.isOpen(item)) this.setOpen(item, true);
48
+ else focusRow(this.visibleRows()[i + 1]);
49
+ return;
50
+ case "ArrowLeft": {
51
+ e.preventDefault();
52
+ if (hasGroup && this.isOpen(item)) return this.setOpen(item, false);
53
+ const parent = item.parentElement?.closest("[data-part='item']");
54
+ if (parent && this.contains(parent)) {
55
+ const pr = parent.querySelector(":scope > [data-part='row']");
56
+ if (pr) this.primary(pr)?.focus();
57
+ }
58
+ return;
59
+ }
60
+ }
61
+ };
62
+ setup() {
63
+ for (const item of own(this, "[data-part='item']")) this.prepareItem(item);
64
+ }
65
+ connect() {
66
+ this.addEventListener("click", this.onClick);
67
+ this.addEventListener("keydown", this.onKey);
68
+ for (const g of own(this, "[data-part='group'][data-lazy]")) {
69
+ const item = g.closest("[data-part='item']");
70
+ if (item && this.isOpen(item)) this.fill(g);
71
+ }
72
+ if (this.hasAttribute("scroll-current")) requestAnimationFrame(() => this.revealCurrent());
73
+ }
74
+ disconnect() {
75
+ this.removeEventListener("click", this.onClick);
76
+ this.removeEventListener("keydown", this.onKey);
77
+ }
78
+ prepareItem(item) {
79
+ const group = this.groupOf(item);
80
+ const toggle = item.querySelector(":scope > [data-part='row'] > [data-part='toggle']");
81
+ if (!group || !toggle) return;
82
+ group.id ||= uid("db-nav-group");
83
+ toggle.setAttribute("aria-controls", group.id);
84
+ if (toggle instanceof HTMLButtonElement && !toggle.hasAttribute("type")) toggle.type = "button";
85
+ const open = toggle.getAttribute("aria-expanded") === "true" || item.getAttribute("data-state") === "open";
86
+ this.apply(item, open);
87
+ }
88
+ groupOf(item) {
89
+ return item.querySelector(":scope > [data-part='group']");
90
+ }
91
+ toggleOf(item) {
92
+ return item.querySelector(":scope > [data-part='row'] > [data-part='toggle']");
93
+ }
94
+ /** The row's main focus target: its link, or its toggle for a label-only section. */
95
+ primary(row) {
96
+ return row.querySelector(":scope > [data-part='link']") ?? row.querySelector(":scope > [data-part='toggle']");
97
+ }
98
+ visibleRows() {
99
+ return own(this, "[data-part='row']").filter((r) => !r.closest("[hidden]"));
100
+ }
101
+ isOpen(item) {
102
+ return item.getAttribute("data-state") === "open";
103
+ }
104
+ toggle(item) {
105
+ this.setOpen(item, !this.isOpen(item));
106
+ }
107
+ setOpen(item, open) {
108
+ const group = this.groupOf(item);
109
+ if (!group || this.isOpen(item) === open) return;
110
+ if (open && group.hasAttribute("data-lazy")) this.fill(group);
111
+ this.apply(item, open);
112
+ this.dispatchEvent(new CustomEvent("db-nav-tree:toggle", { detail: { item, open }, bubbles: true }));
113
+ }
114
+ apply(item, open) {
115
+ const group = this.groupOf(item);
116
+ const toggle = this.toggleOf(item);
117
+ if (group) group.hidden = !open;
118
+ toggle?.setAttribute("aria-expanded", String(open));
119
+ item.setAttribute("data-state", open ? "open" : "closed");
120
+ }
121
+ /** Expand every section on the path to the current page. */
122
+ revealCurrent() {
123
+ const cur = this.querySelector("[aria-current='page']");
124
+ if (!cur) return;
125
+ for (let item = cur.closest("[data-part='item']"); item && this.contains(item); item = item.parentElement?.closest("[data-part='item']") ?? null) {
126
+ if (this.groupOf(item) && !this.groupOf(item).contains(cur)) continue;
127
+ if (this.groupOf(item)) this.setOpen(item, true);
128
+ }
129
+ const scroller = scrollParent(this);
130
+ if (!scroller) return;
131
+ const r = cur.getBoundingClientRect();
132
+ const s = scroller.getBoundingClientRect();
133
+ if (r.top < s.top || r.bottom > s.bottom) scroller.scrollTop += r.top - s.top - s.height / 2 + r.height / 2;
134
+ }
135
+ data() {
136
+ if (this.navData) return this.navData;
137
+ const name = this.getAttribute("data-source");
138
+ const g = name ? globalThis[name] : void 0;
139
+ return Array.isArray(g) ? g : null;
140
+ }
141
+ /** Fill a lazy group from nav data. */
142
+ fill(group) {
143
+ const data = this.data();
144
+ const path = group.dataset.path;
145
+ if (!data || path == null) return;
146
+ let list = data;
147
+ let node;
148
+ for (const i of path.split(".").map(Number)) {
149
+ node = list?.[i];
150
+ list = node?.[2];
151
+ }
152
+ if (!node?.[2]) return;
153
+ group.replaceChildren(...this.build(node[2], path));
154
+ group.removeAttribute("data-lazy");
155
+ }
156
+ build(items, path) {
157
+ const base = this.getAttribute("base") ?? "";
158
+ const tmpl = this.getAttribute("toggle-label") ?? "Toggle {label}";
159
+ const current = location.href.split("#")[0];
160
+ return items.map(([label, url, kids, noCurrent], i) => {
161
+ const here = `${path}.${i}`;
162
+ const li = document.createElement("li");
163
+ li.setAttribute("data-part", "item");
164
+ li.style.setProperty("--db-level", String(here.split(".").length - 1));
165
+ const row = document.createElement("div");
166
+ row.setAttribute("data-part", "row");
167
+ li.appendChild(row);
168
+ const probe = url?.replace(/[\u0000-\u0020]/g, "") ?? "";
169
+ if (url != null && /^[a-z][a-z0-9+.-]*:/i.test(probe) && !/^(?:https?|mailto):/i.test(probe)) url = null;
170
+ const external = url != null && /^[a-z][a-z0-9+.-]*:|^\/\//i.test(probe);
171
+ let toggle = null;
172
+ if (kids?.length) {
173
+ toggle = document.createElement("button");
174
+ toggle.type = "button";
175
+ toggle.setAttribute("data-part", "toggle");
176
+ toggle.setAttribute("aria-expanded", "false");
177
+ if (url != null) toggle.setAttribute("aria-label", tmpl.replace("{label}", () => label));
178
+ else {
179
+ const span = document.createElement("span");
180
+ span.setAttribute("data-part", "label");
181
+ span.textContent = label;
182
+ toggle.appendChild(span);
183
+ }
184
+ toggle.insertAdjacentHTML("beforeend", CHEVRON);
185
+ }
186
+ const atEnd = this.getAttribute("toggle-position") === "end";
187
+ if (toggle && !atEnd) row.appendChild(toggle);
188
+ if (url != null) {
189
+ const a = document.createElement("a");
190
+ a.setAttribute("data-part", "link");
191
+ a.textContent = label;
192
+ a.href = external ? url : base + url;
193
+ if (external) a.rel = "noopener";
194
+ if (!noCurrent && a.href.split("#")[0] === current) a.setAttribute("aria-current", "page");
195
+ row.appendChild(a);
196
+ }
197
+ if (url == null && !kids?.length) {
198
+ const span = document.createElement("span");
199
+ span.setAttribute("data-part", "label");
200
+ span.textContent = label;
201
+ row.appendChild(span);
202
+ }
203
+ if (toggle && atEnd) row.appendChild(toggle);
204
+ if (kids?.length) {
205
+ const ul = document.createElement("ul");
206
+ ul.setAttribute("data-part", "group");
207
+ ul.dataset.lazy = "";
208
+ ul.dataset.path = here;
209
+ ul.hidden = true;
210
+ li.setAttribute("data-state", "closed");
211
+ li.appendChild(ul);
212
+ this.prepareItem(li);
213
+ }
214
+ return li;
215
+ });
216
+ }
217
+ };
218
+ var CHEVRON = '<svg data-part="chevron" viewBox="0 0 24 24" width="16" height="16" aria-hidden="true" focusable="false"><path d="m9 18 6-6-6-6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
219
+ function scrollParent(el) {
220
+ for (let p = el.parentElement; p; p = p.parentElement) {
221
+ const o = getComputedStyle(p).overflowY;
222
+ if ((o === "auto" || o === "scroll") && p.scrollHeight > p.clientHeight) return p;
223
+ }
224
+ return null;
225
+ }
226
+ ensureDefaultDisplay();
227
+ if (!customElements.get("db-nav-tree")) {
228
+ customElements.define("db-nav-tree", DbNavTree);
229
+ }
230
+
231
+ export {
232
+ DbNavTree
233
+ };
234
+ //# sourceMappingURL=chunk-S62ZVVO3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db-nav-tree.ts"],"sourcesContent":["import { DogsbayElement, ensureDefaultDisplay } from \"./base.js\";\nimport { own, uid } from \"./utils.js\";\n\n/**\n * [label, url, children?, noCurrent?]. `noCurrent` (1): never mark this link\n * as the current page even when its URL matches — an alias (a link to a page\n * that lives in another section) or a #section link. The server-rendered\n * tree already leaves those unmarked; lazily built groups must agree.\n */\nexport type NavData = [string, string | null, NavData[]?, 1?];\n\n/**\n * `<db-nav-tree>` — Site navigation tree (APG \"Disclosure Navigation\").\n *\n * A section that is also a page gets a real link AND a separate toggle\n * button as siblings — never a link inside `<summary>`, which is nested\n * interactive content (axe `nested-interactive`). A section with no page\n * is a single toggle button carrying the label. Every link stays in the\n * normal Tab order; arrow keys are an extra shortcut, not a replacement.\n *\n * Server-rendered markup works without JavaScript: links navigate, and the\n * branch to the current page is rendered open.\n *\n * <db-nav-tree>\n * <ul data-part=\"list\">\n * <li data-part=\"item\" data-state=\"open\">\n * <div data-part=\"row\">\n * <button data-part=\"toggle\" type=\"button\" aria-expanded=\"true\" aria-controls=\"g1\" aria-label=\"Toggle Guides\"></button>\n * <a data-part=\"link\" href=\"guides/index.html\">Guides</a>\n * </div>\n * <ul data-part=\"group\" id=\"g1\">…</ul>\n * </li>\n * <li data-part=\"item\"><div data-part=\"row\"><a data-part=\"link\" href=\"faq.html\" aria-current=\"page\">FAQ</a></div></li>\n * </ul>\n * </db-nav-tree>\n *\n * Lazy sections: a group with `data-lazy` and `data-path=\"0.3\"` is filled\n * from `navData` (or the global named by `data-source`) the first time it\n * opens. URLs in the data are prefixed with the `base` attribute.\n *\n * Attributes:\n * base — prefix for data URLs (e.g. \"../../\")\n * data-source — name of a window global holding NavData[]\n * toggle-label — accessible name template, default \"Toggle {label}\"\n * scroll-current — scroll the current page's link into view on connect\n * Built items carry `style=\"--db-level:N\"` (0 at the top) so CSS can indent\n * them; server markup should set the same.\n *\n * toggle-position — \"start\" (default) or \"end\": where lazily built rows put\n * the toggle relative to the link. Match the server markup\n * so DOM (and Tab) order follows the visual order.\n *\n * Keyboard (in addition to Tab): ArrowDown/ArrowUp move between visible\n * rows, ArrowRight opens a section or moves into it, ArrowLeft closes it or\n * moves to its parent, Home/End go to the first/last row.\n *\n * Events: db-nav-tree:toggle (detail: { item, open })\n */\nexport class DbNavTree extends DogsbayElement {\n /** Nav data for lazy sections. Falls back to `window[data-source]`. */\n navData: NavData[] | null = null;\n\n private onClick = (e: Event) => {\n const toggle = (e.target as HTMLElement).closest<HTMLElement>(\"[data-part='toggle']\");\n if (!toggle || toggle.closest(\"db-nav-tree\") !== this) return;\n const item = toggle.closest<HTMLElement>(\"[data-part='item']\");\n if (item) this.toggle(item);\n };\n\n private onKey = (e: KeyboardEvent) => {\n if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;\n const active = document.activeElement as HTMLElement | null;\n if (!active || !this.contains(active)) return;\n const rows = this.visibleRows();\n const row = active.closest<HTMLElement>(\"[data-part='row']\");\n const i = row ? rows.indexOf(row) : -1;\n if (i < 0) return;\n const item = row!.closest<HTMLElement>(\"[data-part='item']\")!;\n const hasGroup = !!this.groupOf(item);\n const focusRow = (r: HTMLElement | undefined) => {\n if (!r) return;\n e.preventDefault();\n this.primary(r)?.focus();\n };\n switch (e.key) {\n case \"ArrowDown\":\n return focusRow(rows[i + 1]);\n case \"ArrowUp\":\n return focusRow(rows[i - 1]);\n case \"Home\":\n return focusRow(rows[0]);\n case \"End\":\n return focusRow(rows[rows.length - 1]);\n case \"ArrowRight\":\n if (!hasGroup) return;\n e.preventDefault();\n if (!this.isOpen(item)) this.setOpen(item, true);\n else focusRow(this.visibleRows()[i + 1]);\n return;\n case \"ArrowLeft\": {\n e.preventDefault();\n if (hasGroup && this.isOpen(item)) return this.setOpen(item, false);\n const parent = item.parentElement?.closest<HTMLElement>(\"[data-part='item']\");\n if (parent && this.contains(parent)) {\n const pr = parent.querySelector<HTMLElement>(\":scope > [data-part='row']\");\n if (pr) this.primary(pr)?.focus();\n }\n return;\n }\n }\n };\n\n protected setup() {\n for (const item of own(this, \"[data-part='item']\")) this.prepareItem(item);\n }\n\n protected connect() {\n this.addEventListener(\"click\", this.onClick);\n this.addEventListener(\"keydown\", this.onKey);\n // Sections rendered open with lazy content fill now.\n for (const g of own(this, \"[data-part='group'][data-lazy]\")) {\n const item = g.closest<HTMLElement>(\"[data-part='item']\");\n if (item && this.isOpen(item)) this.fill(g);\n }\n if (this.hasAttribute(\"scroll-current\")) requestAnimationFrame(() => this.revealCurrent());\n }\n\n protected disconnect() {\n this.removeEventListener(\"click\", this.onClick);\n this.removeEventListener(\"keydown\", this.onKey);\n }\n\n private prepareItem(item: HTMLElement) {\n const group = this.groupOf(item);\n const toggle = item.querySelector<HTMLElement>(\":scope > [data-part='row'] > [data-part='toggle']\");\n if (!group || !toggle) return;\n group.id ||= uid(\"db-nav-group\");\n toggle.setAttribute(\"aria-controls\", group.id);\n if (toggle instanceof HTMLButtonElement && !toggle.hasAttribute(\"type\")) toggle.type = \"button\";\n const open = toggle.getAttribute(\"aria-expanded\") === \"true\" || item.getAttribute(\"data-state\") === \"open\";\n this.apply(item, open);\n }\n\n private groupOf(item: HTMLElement): HTMLElement | null {\n return item.querySelector<HTMLElement>(\":scope > [data-part='group']\");\n }\n\n private toggleOf(item: HTMLElement): HTMLElement | null {\n return item.querySelector<HTMLElement>(\":scope > [data-part='row'] > [data-part='toggle']\");\n }\n\n /** The row's main focus target: its link, or its toggle for a label-only section. */\n private primary(row: HTMLElement): HTMLElement | null {\n return row.querySelector<HTMLElement>(\":scope > [data-part='link']\") ?? row.querySelector<HTMLElement>(\":scope > [data-part='toggle']\");\n }\n\n private visibleRows(): HTMLElement[] {\n return own(this, \"[data-part='row']\").filter((r) => !r.closest(\"[hidden]\"));\n }\n\n isOpen(item: HTMLElement): boolean {\n return item.getAttribute(\"data-state\") === \"open\";\n }\n\n toggle(item: HTMLElement) {\n this.setOpen(item, !this.isOpen(item));\n }\n\n setOpen(item: HTMLElement, open: boolean) {\n const group = this.groupOf(item);\n if (!group || this.isOpen(item) === open) return;\n if (open && group.hasAttribute(\"data-lazy\")) this.fill(group);\n this.apply(item, open);\n this.dispatchEvent(new CustomEvent(\"db-nav-tree:toggle\", { detail: { item, open }, bubbles: true }));\n }\n\n private apply(item: HTMLElement, open: boolean) {\n const group = this.groupOf(item);\n const toggle = this.toggleOf(item);\n if (group) group.hidden = !open;\n toggle?.setAttribute(\"aria-expanded\", String(open));\n item.setAttribute(\"data-state\", open ? \"open\" : \"closed\");\n }\n\n /** Expand every section on the path to the current page. */\n revealCurrent() {\n const cur = this.querySelector<HTMLElement>(\"[aria-current='page']\");\n if (!cur) return;\n for (let item = cur.closest<HTMLElement>(\"[data-part='item']\"); item && this.contains(item); item = item.parentElement?.closest<HTMLElement>(\"[data-part='item']\") ?? null) {\n if (this.groupOf(item) && !this.groupOf(item)!.contains(cur)) continue;\n if (this.groupOf(item)) this.setOpen(item, true);\n }\n // Scroll only the nearest scrolling ancestor, and only when the link is out of view.\n const scroller = scrollParent(this);\n if (!scroller) return;\n const r = cur.getBoundingClientRect();\n const s = scroller.getBoundingClientRect();\n if (r.top < s.top || r.bottom > s.bottom) scroller.scrollTop += r.top - s.top - s.height / 2 + r.height / 2;\n }\n\n private data(): NavData[] | null {\n if (this.navData) return this.navData;\n const name = this.getAttribute(\"data-source\");\n const g = name ? (globalThis as Record<string, unknown>)[name] : undefined;\n return Array.isArray(g) ? (g as NavData[]) : null;\n }\n\n /** Fill a lazy group from nav data. */\n private fill(group: HTMLElement) {\n const data = this.data();\n const path = group.dataset.path;\n if (!data || path == null) return;\n let list: NavData[] | undefined = data;\n let node: NavData | undefined;\n for (const i of path.split(\".\").map(Number)) {\n node = list?.[i];\n list = node?.[2];\n }\n if (!node?.[2]) return;\n group.replaceChildren(...this.build(node[2], path));\n group.removeAttribute(\"data-lazy\");\n }\n\n private build(items: NavData[], path: string): HTMLElement[] {\n const base = this.getAttribute(\"base\") ?? \"\";\n const tmpl = this.getAttribute(\"toggle-label\") ?? \"Toggle {label}\";\n const current = location.href.split(\"#\")[0];\n return items.map(([label, url, kids, noCurrent], i) => {\n const here = `${path}.${i}`;\n const li = document.createElement(\"li\");\n li.setAttribute(\"data-part\", \"item\");\n // Depth for styling (indentation), matching server-rendered items.\n li.style.setProperty(\"--db-level\", String(here.split(\".\").length - 1));\n const row = document.createElement(\"div\");\n row.setAttribute(\"data-part\", \"row\");\n li.appendChild(row);\n // Nav data comes from a project's own TOC files; a `javascript:` (or any\n // scheme but http(s)/mailto) entry renders as text, never as a link.\n // Tested without tabs, newlines and other controls, which browsers\n // strip from a URL (`java\\tscript:` is javascript:).\n const probe = url?.replace(/[\\u0000-\\u0020]/g, \"\") ?? \"\";\n if (url != null && /^[a-z][a-z0-9+.-]*:/i.test(probe) && !/^(?:https?|mailto):/i.test(probe)) url = null;\n const external = url != null && /^[a-z][a-z0-9+.-]*:|^\\/\\//i.test(probe);\n let toggle: HTMLButtonElement | null = null;\n if (kids?.length) {\n toggle = document.createElement(\"button\");\n toggle.type = \"button\";\n toggle.setAttribute(\"data-part\", \"toggle\");\n toggle.setAttribute(\"aria-expanded\", \"false\");\n if (url != null) toggle.setAttribute(\"aria-label\", tmpl.replace(\"{label}\", () => label));\n else {\n const span = document.createElement(\"span\");\n span.setAttribute(\"data-part\", \"label\");\n span.textContent = label;\n toggle.appendChild(span);\n }\n toggle.insertAdjacentHTML(\"beforeend\", CHEVRON);\n }\n const atEnd = this.getAttribute(\"toggle-position\") === \"end\";\n if (toggle && !atEnd) row.appendChild(toggle);\n if (url != null) {\n const a = document.createElement(\"a\");\n a.setAttribute(\"data-part\", \"link\");\n a.textContent = label;\n a.href = external ? url : base + url;\n if (external) a.rel = \"noopener\";\n if (!noCurrent && a.href.split(\"#\")[0] === current) a.setAttribute(\"aria-current\", \"page\");\n row.appendChild(a);\n }\n if (url == null && !kids?.length) {\n // An entry with no usable link (dropped above) keeps its label.\n const span = document.createElement(\"span\");\n span.setAttribute(\"data-part\", \"label\");\n span.textContent = label;\n row.appendChild(span);\n }\n if (toggle && atEnd) row.appendChild(toggle);\n if (kids?.length) {\n const ul = document.createElement(\"ul\");\n ul.setAttribute(\"data-part\", \"group\");\n ul.dataset.lazy = \"\";\n ul.dataset.path = here;\n ul.hidden = true;\n li.setAttribute(\"data-state\", \"closed\");\n li.appendChild(ul);\n this.prepareItem(li);\n }\n return li;\n });\n }\n}\n\nconst CHEVRON =\n '<svg data-part=\"chevron\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m9 18 6-6-6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\nfunction scrollParent(el: HTMLElement): HTMLElement | null {\n for (let p = el.parentElement; p; p = p.parentElement) {\n const o = getComputedStyle(p).overflowY;\n if ((o === \"auto\" || o === \"scroll\") && p.scrollHeight > p.clientHeight) return p;\n }\n return null;\n}\n\nensureDefaultDisplay();\n\nif (!customElements.get(\"db-nav-tree\")) {\n customElements.define(\"db-nav-tree\", DbNavTree);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,208 @@
1
+ import {
2
+ afterAnimations,
3
+ ownOne,
4
+ resolveAsChild,
5
+ uid
6
+ } from "./chunk-3AEQ6KHV.js";
7
+ import {
8
+ DogsbayElement,
9
+ ensureDefaultDisplay
10
+ } from "./chunk-K6DPDBAG.js";
11
+
12
+ // src/db-dialog.ts
13
+ import { FocusTrap } from "@dogsbay/primitives/focus-trap";
14
+ import { ScrollLock } from "@dogsbay/primitives/scroll-lock";
15
+ import { DismissController } from "@dogsbay/primitives/dismiss";
16
+ import { markOthersInert } from "@dogsbay/primitives/inert";
17
+ var DbDialog = class extends DogsbayElement {
18
+ content = null;
19
+ backdrop = null;
20
+ trigger = null;
21
+ native = false;
22
+ _open = false;
23
+ openedBy = null;
24
+ focusTrap = null;
25
+ dismiss = null;
26
+ cleanupInert = null;
27
+ get open() {
28
+ return this._open;
29
+ }
30
+ get dismissible() {
31
+ return this.getAttribute("dismissible") !== "false";
32
+ }
33
+ onTriggerClick = (e) => {
34
+ e.preventDefault();
35
+ this.toggle(e.currentTarget);
36
+ };
37
+ onHostClick = (e) => {
38
+ const close = e.target.closest("[data-part='close']");
39
+ if (close && close.closest("db-dialog") === this) this.close("close-press");
40
+ };
41
+ onDocumentClick = (e) => {
42
+ const ext = e.target.closest?.("[data-dialog-for]");
43
+ if (!ext || ext === this.trigger) return;
44
+ const target = ext.getAttribute("data-dialog-for");
45
+ if (target && (target === this.id || target === this.content?.id)) {
46
+ e.preventDefault();
47
+ this.toggle(ext);
48
+ }
49
+ };
50
+ // Native <dialog>: Escape fires "cancel".
51
+ onCancel = (e) => {
52
+ e.preventDefault();
53
+ if (this.dismissible) this.close("escape-key");
54
+ };
55
+ // Native <dialog>: a click on the ::backdrop targets the dialog itself.
56
+ onNativeClick = (e) => {
57
+ if (!this.dismissible || e.target !== this.content || !this.content) return;
58
+ const r = this.content.getBoundingClientRect();
59
+ const inside = e.clientX >= r.left && e.clientX <= r.right && e.clientY >= r.top && e.clientY <= r.bottom;
60
+ if (!inside && (e.clientX !== 0 || e.clientY !== 0)) this.close("outside-press");
61
+ };
62
+ // Native <dialog> closed by the platform (form method="dialog").
63
+ onNativeClose = () => {
64
+ if (this._open) this.finishClose("close-press");
65
+ };
66
+ setup() {
67
+ this.content = ownOne(this, "[data-part='content']");
68
+ if (!this.content) return;
69
+ this.native = typeof HTMLDialogElement !== "undefined" && this.content instanceof HTMLDialogElement && typeof this.content.showModal === "function";
70
+ this.backdrop = ownOne(this, "[data-part='backdrop']");
71
+ this.trigger = resolveAsChild(ownOne(this, "[data-part='trigger']"));
72
+ const content = this.content;
73
+ if (!content.id) content.id = uid("db-dialog");
74
+ if (!this.native) {
75
+ content.setAttribute("role", content.getAttribute("role") || "dialog");
76
+ content.setAttribute("aria-modal", "true");
77
+ content.hidden = !this.hasAttribute("open");
78
+ if (this.backdrop) this.backdrop.hidden = true;
79
+ }
80
+ const title = content.querySelector("[data-part='title']");
81
+ if (title && !content.hasAttribute("aria-labelledby") && !content.hasAttribute("aria-label")) {
82
+ title.id ||= uid("db-dialog-title");
83
+ content.setAttribute("aria-labelledby", title.id);
84
+ }
85
+ const desc = content.querySelector("[data-part='description']");
86
+ if (desc && !content.hasAttribute("aria-describedby")) {
87
+ desc.id ||= uid("db-dialog-desc");
88
+ content.setAttribute("aria-describedby", desc.id);
89
+ }
90
+ for (const t of this.triggers()) this.prepareTrigger(t);
91
+ this.setState("closed");
92
+ if (!this.native) {
93
+ this.focusTrap = new FocusTrap(content);
94
+ this.dismiss = new DismissController(content, {
95
+ onDismiss: (reason) => this.dismissible && this.close(reason)
96
+ });
97
+ }
98
+ }
99
+ connect() {
100
+ if (!this.content) return;
101
+ this.trigger?.addEventListener("click", this.onTriggerClick);
102
+ this.addEventListener("click", this.onHostClick);
103
+ document.addEventListener("click", this.onDocumentClick);
104
+ if (this.native) {
105
+ this.content.addEventListener("cancel", this.onCancel);
106
+ this.content.addEventListener("click", this.onNativeClick);
107
+ this.content.addEventListener("close", this.onNativeClose);
108
+ }
109
+ queueMicrotask(() => {
110
+ if (!this.isConnected) return;
111
+ for (const t of this.triggers()) if (!t.hasAttribute("aria-controls")) this.prepareTrigger(t);
112
+ if (this.hasAttribute("open") && !this._open) this.show();
113
+ });
114
+ }
115
+ disconnect() {
116
+ this.trigger?.removeEventListener("click", this.onTriggerClick);
117
+ this.removeEventListener("click", this.onHostClick);
118
+ document.removeEventListener("click", this.onDocumentClick);
119
+ if (this.content && this.native) {
120
+ this.content.removeEventListener("cancel", this.onCancel);
121
+ this.content.removeEventListener("click", this.onNativeClick);
122
+ this.content.removeEventListener("close", this.onNativeClose);
123
+ }
124
+ if (this._open) this.finishClose("api", false);
125
+ }
126
+ /** Internal trigger plus every `[data-dialog-for]` pointing here. */
127
+ triggers() {
128
+ const out = this.trigger ? [this.trigger] : [];
129
+ const ids = [this.id, this.content?.id].filter(Boolean);
130
+ for (const id of ids) document.querySelectorAll(`[data-dialog-for="${CSS.escape(id)}"]`).forEach((el) => out.push(el));
131
+ return out;
132
+ }
133
+ prepareTrigger(t) {
134
+ if (!t.hasAttribute("aria-haspopup")) t.setAttribute("aria-haspopup", "dialog");
135
+ t.setAttribute("aria-controls", this.content.id);
136
+ t.setAttribute("aria-expanded", "false");
137
+ }
138
+ setState(state) {
139
+ this.setAttribute("data-state", state);
140
+ this.content?.setAttribute("data-state", state);
141
+ this.backdrop?.setAttribute("data-state", state);
142
+ }
143
+ toggle(opener) {
144
+ if (this._open) this.close("trigger-press");
145
+ else this.show(opener);
146
+ }
147
+ show(opener) {
148
+ const content = this.content;
149
+ if (!content || this._open) return;
150
+ this._open = true;
151
+ this.openedBy = opener ?? document.activeElement ?? this.trigger;
152
+ for (const t of this.triggers()) {
153
+ this.prepareTrigger(t);
154
+ t.setAttribute("aria-expanded", "true");
155
+ }
156
+ ScrollLock.activate();
157
+ if (this.native) {
158
+ const d = content;
159
+ if (!d.open) d.showModal();
160
+ } else {
161
+ content.hidden = false;
162
+ if (this.backdrop) this.backdrop.hidden = false;
163
+ this.cleanupInert = markOthersInert(content);
164
+ this.focusTrap?.activate();
165
+ this.dismiss?.activate();
166
+ }
167
+ this.setState("open");
168
+ this.dispatchEvent(new CustomEvent("db-dialog:open", { bubbles: true }));
169
+ }
170
+ close(reason = "api") {
171
+ if (!this._open) return;
172
+ this.finishClose(reason);
173
+ }
174
+ finishClose(reason, restoreFocus = true) {
175
+ const content = this.content;
176
+ this._open = false;
177
+ this.setState("closed");
178
+ for (const t of this.triggers()) t.setAttribute("aria-expanded", "false");
179
+ ScrollLock.deactivate();
180
+ if (this.native) {
181
+ const d = content;
182
+ if (d.open) d.close();
183
+ } else {
184
+ this.dismiss?.deactivate();
185
+ this.focusTrap?.deactivate();
186
+ this.cleanupInert?.();
187
+ this.cleanupInert = null;
188
+ afterAnimations(content, () => {
189
+ if (this._open) return;
190
+ content.hidden = true;
191
+ if (this.backdrop) this.backdrop.hidden = true;
192
+ });
193
+ }
194
+ const back = this.openedBy;
195
+ this.openedBy = null;
196
+ if (restoreFocus && back && document.contains(back)) back.focus();
197
+ this.dispatchEvent(new CustomEvent("db-dialog:close", { detail: { reason }, bubbles: true }));
198
+ }
199
+ };
200
+ ensureDefaultDisplay();
201
+ if (!customElements.get("db-dialog")) {
202
+ customElements.define("db-dialog", DbDialog);
203
+ }
204
+
205
+ export {
206
+ DbDialog
207
+ };
208
+ //# sourceMappingURL=chunk-SLJG53M7.js.map