@dogsbay/elements 0.2.0-beta.115 → 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 @@
1
+ {"version":3,"sources":["../src/db-dialog.ts"],"sourcesContent":["import { FocusTrap } from \"@dogsbay/primitives/focus-trap\";\nimport { ScrollLock } from \"@dogsbay/primitives/scroll-lock\";\nimport { DismissController } from \"@dogsbay/primitives/dismiss\";\nimport { markOthersInert } from \"@dogsbay/primitives/inert\";\nimport { DogsbayElement, ensureDefaultDisplay } from \"./base.js\";\nimport { afterAnimations, ownOne, resolveAsChild, uid } from \"./utils.js\";\n\nexport type DialogCloseReason = \"escape-key\" | \"outside-press\" | \"close-press\" | \"trigger-press\" | \"api\";\n\n/**\n * `<db-dialog>` — Modal dialog (WAI-ARIA APG \"Dialog (Modal)\").\n *\n * Same parts as the Astro Dialog. When `[data-part=\"content\"]` is a native\n * `<dialog>`, it opens with `showModal()`: the browser puts it in the top\n * layer, makes the rest of the page inert and handles Escape. Otherwise the\n * content is a positioned element and the primitives do that work\n * (FocusTrap, markOthersInert, ScrollLock, DismissController). Content is\n * never moved out of the element, so nested elements keep working.\n *\n * Attributes:\n * open — open on connect\n * dismissible=\"false\" — ignore Escape and outside clicks\n *\n * Parts:\n * [data-part=\"trigger\"] — opens (optional; `data-as-child` supported)\n * [data-part=\"content\"] — `<dialog>` (recommended) or any element\n * [data-part=\"backdrop\"] — overlay for non-native content\n * [data-part=\"title\"] — becomes aria-labelledby\n * [data-part=\"description\"] — becomes aria-describedby\n * [data-part=\"close\"] — closes\n *\n * External triggers: any element with `data-dialog-for=\"<id>\"`, where the id\n * is the element's or the content's, opens it from anywhere on the page.\n *\n * Events: db-dialog:open, db-dialog:close (detail: { reason })\n */\nexport class DbDialog extends DogsbayElement {\n content: HTMLElement | null = null;\n private backdrop: HTMLElement | null = null;\n private trigger: HTMLElement | null = null;\n private native = false;\n private _open = false;\n private openedBy: HTMLElement | null = null;\n private focusTrap: FocusTrap | null = null;\n private dismiss: DismissController | null = null;\n private cleanupInert: (() => void) | null = null;\n\n get open(): boolean {\n return this._open;\n }\n\n private get dismissible(): boolean {\n return this.getAttribute(\"dismissible\") !== \"false\";\n }\n\n private onTriggerClick = (e: Event) => {\n e.preventDefault();\n this.toggle(e.currentTarget as HTMLElement);\n };\n\n private onHostClick = (e: Event) => {\n const close = (e.target as HTMLElement).closest(\"[data-part='close']\");\n if (close && close.closest(\"db-dialog\") === this) this.close(\"close-press\");\n };\n\n private onDocumentClick = (e: Event) => {\n const ext = (e.target as HTMLElement).closest?.(\"[data-dialog-for]\") as HTMLElement | null;\n if (!ext || ext === this.trigger) return;\n const target = ext.getAttribute(\"data-dialog-for\");\n if (target && (target === this.id || target === this.content?.id)) {\n e.preventDefault();\n this.toggle(ext);\n }\n };\n\n // Native <dialog>: Escape fires \"cancel\".\n private onCancel = (e: Event) => {\n e.preventDefault();\n if (this.dismissible) this.close(\"escape-key\");\n };\n\n // Native <dialog>: a click on the ::backdrop targets the dialog itself.\n private onNativeClick = (e: MouseEvent) => {\n if (!this.dismissible || e.target !== this.content || !this.content) return;\n const r = this.content.getBoundingClientRect();\n const inside = e.clientX >= r.left && e.clientX <= r.right && e.clientY >= r.top && e.clientY <= r.bottom;\n if (!inside && (e.clientX !== 0 || e.clientY !== 0)) this.close(\"outside-press\");\n };\n\n // Native <dialog> closed by the platform (form method=\"dialog\").\n private onNativeClose = () => {\n if (this._open) this.finishClose(\"close-press\");\n };\n\n protected setup() {\n this.content = ownOne(this, \"[data-part='content']\");\n if (!this.content) return;\n this.native = typeof HTMLDialogElement !== \"undefined\" && this.content instanceof HTMLDialogElement && typeof this.content.showModal === \"function\";\n this.backdrop = ownOne(this, \"[data-part='backdrop']\");\n this.trigger = resolveAsChild(ownOne(this, \"[data-part='trigger']\"));\n\n const content = this.content;\n if (!content.id) content.id = uid(\"db-dialog\");\n if (!this.native) {\n content.setAttribute(\"role\", content.getAttribute(\"role\") || \"dialog\");\n content.setAttribute(\"aria-modal\", \"true\");\n content.hidden = !this.hasAttribute(\"open\");\n if (this.backdrop) this.backdrop.hidden = true;\n }\n\n const title = content.querySelector<HTMLElement>(\"[data-part='title']\");\n if (title && !content.hasAttribute(\"aria-labelledby\") && !content.hasAttribute(\"aria-label\")) {\n title.id ||= uid(\"db-dialog-title\");\n content.setAttribute(\"aria-labelledby\", title.id);\n }\n const desc = content.querySelector<HTMLElement>(\"[data-part='description']\");\n if (desc && !content.hasAttribute(\"aria-describedby\")) {\n desc.id ||= uid(\"db-dialog-desc\");\n content.setAttribute(\"aria-describedby\", desc.id);\n }\n\n for (const t of this.triggers()) this.prepareTrigger(t);\n this.setState(\"closed\");\n\n if (!this.native) {\n this.focusTrap = new FocusTrap(content);\n this.dismiss = new DismissController(content, {\n onDismiss: (reason) => this.dismissible && this.close(reason),\n });\n }\n }\n\n protected connect() {\n if (!this.content) return;\n this.trigger?.addEventListener(\"click\", this.onTriggerClick);\n this.addEventListener(\"click\", this.onHostClick);\n document.addEventListener(\"click\", this.onDocumentClick);\n if (this.native) {\n this.content.addEventListener(\"cancel\", this.onCancel);\n this.content.addEventListener(\"click\", this.onNativeClick as EventListener);\n this.content.addEventListener(\"close\", this.onNativeClose);\n }\n // External triggers may come later in the document than the dialog.\n queueMicrotask(() => {\n if (!this.isConnected) return;\n for (const t of this.triggers()) if (!t.hasAttribute(\"aria-controls\")) this.prepareTrigger(t);\n if (this.hasAttribute(\"open\") && !this._open) this.show();\n });\n }\n\n protected disconnect() {\n this.trigger?.removeEventListener(\"click\", this.onTriggerClick);\n this.removeEventListener(\"click\", this.onHostClick);\n document.removeEventListener(\"click\", this.onDocumentClick);\n if (this.content && this.native) {\n this.content.removeEventListener(\"cancel\", this.onCancel);\n this.content.removeEventListener(\"click\", this.onNativeClick as EventListener);\n this.content.removeEventListener(\"close\", this.onNativeClose);\n }\n if (this._open) this.finishClose(\"api\", false);\n }\n\n /** Internal trigger plus every `[data-dialog-for]` pointing here. */\n private triggers(): HTMLElement[] {\n const out: HTMLElement[] = this.trigger ? [this.trigger] : [];\n const ids = [this.id, this.content?.id].filter(Boolean);\n for (const id of ids) document.querySelectorAll<HTMLElement>(`[data-dialog-for=\"${CSS.escape(id!)}\"]`).forEach((el) => out.push(el));\n return out;\n }\n\n private prepareTrigger(t: HTMLElement) {\n if (!t.hasAttribute(\"aria-haspopup\")) t.setAttribute(\"aria-haspopup\", \"dialog\");\n t.setAttribute(\"aria-controls\", this.content!.id);\n t.setAttribute(\"aria-expanded\", \"false\");\n }\n\n private setState(state: \"open\" | \"closed\") {\n this.setAttribute(\"data-state\", state);\n this.content?.setAttribute(\"data-state\", state);\n this.backdrop?.setAttribute(\"data-state\", state);\n }\n\n toggle(opener?: HTMLElement) {\n if (this._open) this.close(\"trigger-press\");\n else this.show(opener);\n }\n\n show(opener?: HTMLElement) {\n const content = this.content;\n if (!content || this._open) return;\n this._open = true;\n this.openedBy = opener ?? (document.activeElement as HTMLElement | null) ?? this.trigger;\n for (const t of this.triggers()) {\n this.prepareTrigger(t);\n t.setAttribute(\"aria-expanded\", \"true\");\n }\n ScrollLock.activate();\n if (this.native) {\n const d = content as HTMLDialogElement;\n if (!d.open) d.showModal();\n } else {\n content.hidden = false;\n if (this.backdrop) this.backdrop.hidden = false;\n this.cleanupInert = markOthersInert(content);\n this.focusTrap?.activate();\n this.dismiss?.activate();\n }\n this.setState(\"open\");\n this.dispatchEvent(new CustomEvent(\"db-dialog:open\", { bubbles: true }));\n }\n\n close(reason: DialogCloseReason = \"api\") {\n if (!this._open) return;\n this.finishClose(reason);\n }\n\n private finishClose(reason: DialogCloseReason, restoreFocus = true) {\n const content = this.content!;\n this._open = false;\n this.setState(\"closed\");\n for (const t of this.triggers()) t.setAttribute(\"aria-expanded\", \"false\");\n ScrollLock.deactivate();\n if (this.native) {\n const d = content as HTMLDialogElement;\n if (d.open) d.close();\n } else {\n this.dismiss?.deactivate();\n this.focusTrap?.deactivate();\n this.cleanupInert?.();\n this.cleanupInert = null;\n afterAnimations(content, () => {\n if (this._open) return;\n content.hidden = true;\n if (this.backdrop) this.backdrop.hidden = true;\n });\n }\n const back = this.openedBy;\n this.openedBy = null;\n if (restoreFocus && back && document.contains(back)) back.focus();\n this.dispatchEvent(new CustomEvent(\"db-dialog:close\", { detail: { reason }, bubbles: true }));\n }\n}\n\nensureDefaultDisplay();\n\nif (!customElements.get(\"db-dialog\")) {\n customElements.define(\"db-dialog\", DbDialog);\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-code-block.ts
7
7
  var DbCodeBlock = class extends DogsbayElement {
@@ -88,4 +88,4 @@ if (!customElements.get("db-code-block")) {
88
88
  export {
89
89
  DbCodeBlock
90
90
  };
91
- //# sourceMappingURL=chunk-RVJC6M2U.js.map
91
+ //# sourceMappingURL=chunk-V4P3UR4I.js.map
@@ -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-steps.ts
7
7
  var DbSteps = class extends DogsbayElement {
@@ -21,4 +21,4 @@ if (!customElements.get("db-steps")) {
21
21
  export {
22
22
  DbSteps
23
23
  };
24
- //# sourceMappingURL=chunk-VJXEM5O6.js.map
24
+ //# sourceMappingURL=chunk-VW7HZY2B.js.map
@@ -1,4 +1,4 @@
1
- import { D as DogsbayElement } from './base-BtvRtAsC.js';
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
2
 
3
3
  /**
4
4
  * `<db-accordion>` — Accessible accordion with single/multiple mode.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DbAccordion
3
- } from "./chunk-IMW234S2.js";
4
- import "./chunk-ABP4WEKU.js";
3
+ } from "./chunk-CLUADA3G.js";
4
+ import "./chunk-K6DPDBAG.js";
5
5
  export {
6
6
  DbAccordion
7
7
  };
package/dist/db-card.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { D as DogsbayElement } from './base-BtvRtAsC.js';
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
2
 
3
3
  /**
4
4
  * `<db-card>` — Accessible content card with optional link behavior.
package/dist/db-card.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DbCard
3
- } from "./chunk-THLTJ2HB.js";
4
- import "./chunk-ABP4WEKU.js";
3
+ } from "./chunk-ETBBSA3I.js";
4
+ import "./chunk-K6DPDBAG.js";
5
5
  export {
6
6
  DbCard
7
7
  };
@@ -1,4 +1,4 @@
1
- import { D as DogsbayElement } from './base-BtvRtAsC.js';
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
2
 
3
3
  /**
4
4
  * `<db-code-block>` — Code block with copy-to-clipboard.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DbCodeBlock
3
- } from "./chunk-RVJC6M2U.js";
4
- import "./chunk-ABP4WEKU.js";
3
+ } from "./chunk-V4P3UR4I.js";
4
+ import "./chunk-K6DPDBAG.js";
5
5
  export {
6
6
  DbCodeBlock
7
7
  };
@@ -1,4 +1,4 @@
1
- import { D as DogsbayElement } from './base-BtvRtAsC.js';
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
2
 
3
3
  /**
4
4
  * `<db-collapsible>` — Accessible expand/collapse panel.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DbCollapsible
3
- } from "./chunk-5S2MMI3R.js";
4
- import "./chunk-ABP4WEKU.js";
3
+ } from "./chunk-LAUNXWKJ.js";
4
+ import "./chunk-K6DPDBAG.js";
5
5
  export {
6
6
  DbCollapsible
7
7
  };
@@ -0,0 +1,70 @@
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
+
3
+ /**
4
+ * `<db-combobox>` — Editable combobox with a listbox (APG "Editable
5
+ * Combobox With List Autocomplete"). Focus stays in the input; the
6
+ * highlighted option is exposed with aria-activedescendant.
7
+ *
8
+ * Parts (same contract as the Astro Combobox):
9
+ * [data-part="input"] text input, role=combobox
10
+ * [data-part="listbox"] role=listbox
11
+ * [data-part="option"] role=option, data-value, data-disabled
12
+ * [data-part="empty"] shown when a query has no matches (optional)
13
+ *
14
+ * Attributes:
15
+ * filter="contains" (default) the element filters its own options by text
16
+ * filter="none" the page supplies options (search results); the element
17
+ * watches the listbox and manages highlight and ARIA
18
+ * inline the listbox is always shown (e.g. inside a search dialog);
19
+ * aria-expanded tracks whether it has options
20
+ * no-autohighlight do not highlight the first option when the list changes
21
+ *
22
+ * Choosing an option dispatches a cancelable `db-combobox:select`
23
+ * (detail: { value, text, option }). If not cancelled, a link option
24
+ * (`<a href data-part="option">`, the accessible shape for results that
25
+ * navigate: ARIA allows role=option on a link, but not a link inside an
26
+ * option) is followed; otherwise the input takes the option's text and
27
+ * `db-combobox:change` fires. Wrap link options in `<li role="none">`.
28
+ *
29
+ * Other events: db-combobox:update (detail: { count }) when the visible options change.
30
+ */
31
+ declare class DbCombobox extends DogsbayElement {
32
+ private input;
33
+ private listbox;
34
+ private empty;
35
+ private _open;
36
+ private highlighted;
37
+ private observer;
38
+ private base;
39
+ private optionSeq;
40
+ get open(): boolean;
41
+ private get inline();
42
+ private get filtering();
43
+ /** All options, in order. Read live, so page-supplied results are always current. */
44
+ options(): HTMLElement[];
45
+ private visible;
46
+ protected setup(): void;
47
+ private prepareOptions;
48
+ private onInput;
49
+ private onFocus;
50
+ private onKey;
51
+ private onListClick;
52
+ private onListPointer;
53
+ private onListDown;
54
+ private onDocDown;
55
+ protected connect(): void;
56
+ protected disconnect(): void;
57
+ /** Re-scan options after the page replaced them (filter="none"). */
58
+ refresh(): void;
59
+ private onOptionsChanged;
60
+ private filter;
61
+ private syncExpanded;
62
+ show(): void;
63
+ hide(): void;
64
+ private highlight;
65
+ private clearHighlight;
66
+ /** Returns false when a `db-combobox:select` listener cancelled the choice. */
67
+ private choose;
68
+ }
69
+
70
+ export { DbCombobox };
@@ -0,0 +1,9 @@
1
+ import {
2
+ DbCombobox
3
+ } from "./chunk-MAD6XJY4.js";
4
+ import "./chunk-3AEQ6KHV.js";
5
+ import "./chunk-K6DPDBAG.js";
6
+ export {
7
+ DbCombobox
8
+ };
9
+ //# sourceMappingURL=db-combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,62 @@
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
+
3
+ type DialogCloseReason = "escape-key" | "outside-press" | "close-press" | "trigger-press" | "api";
4
+ /**
5
+ * `<db-dialog>` — Modal dialog (WAI-ARIA APG "Dialog (Modal)").
6
+ *
7
+ * Same parts as the Astro Dialog. When `[data-part="content"]` is a native
8
+ * `<dialog>`, it opens with `showModal()`: the browser puts it in the top
9
+ * layer, makes the rest of the page inert and handles Escape. Otherwise the
10
+ * content is a positioned element and the primitives do that work
11
+ * (FocusTrap, markOthersInert, ScrollLock, DismissController). Content is
12
+ * never moved out of the element, so nested elements keep working.
13
+ *
14
+ * Attributes:
15
+ * open — open on connect
16
+ * dismissible="false" — ignore Escape and outside clicks
17
+ *
18
+ * Parts:
19
+ * [data-part="trigger"] — opens (optional; `data-as-child` supported)
20
+ * [data-part="content"] — `<dialog>` (recommended) or any element
21
+ * [data-part="backdrop"] — overlay for non-native content
22
+ * [data-part="title"] — becomes aria-labelledby
23
+ * [data-part="description"] — becomes aria-describedby
24
+ * [data-part="close"] — closes
25
+ *
26
+ * External triggers: any element with `data-dialog-for="<id>"`, where the id
27
+ * is the element's or the content's, opens it from anywhere on the page.
28
+ *
29
+ * Events: db-dialog:open, db-dialog:close (detail: { reason })
30
+ */
31
+ declare class DbDialog extends DogsbayElement {
32
+ content: HTMLElement | null;
33
+ private backdrop;
34
+ private trigger;
35
+ private native;
36
+ private _open;
37
+ private openedBy;
38
+ private focusTrap;
39
+ private dismiss;
40
+ private cleanupInert;
41
+ get open(): boolean;
42
+ private get dismissible();
43
+ private onTriggerClick;
44
+ private onHostClick;
45
+ private onDocumentClick;
46
+ private onCancel;
47
+ private onNativeClick;
48
+ private onNativeClose;
49
+ protected setup(): void;
50
+ protected connect(): void;
51
+ protected disconnect(): void;
52
+ /** Internal trigger plus every `[data-dialog-for]` pointing here. */
53
+ private triggers;
54
+ private prepareTrigger;
55
+ private setState;
56
+ toggle(opener?: HTMLElement): void;
57
+ show(opener?: HTMLElement): void;
58
+ close(reason?: DialogCloseReason): void;
59
+ private finishClose;
60
+ }
61
+
62
+ export { DbDialog, type DialogCloseReason };
@@ -0,0 +1,9 @@
1
+ import {
2
+ DbDialog
3
+ } from "./chunk-SLJG53M7.js";
4
+ import "./chunk-3AEQ6KHV.js";
5
+ import "./chunk-K6DPDBAG.js";
6
+ export {
7
+ DbDialog
8
+ };
9
+ //# sourceMappingURL=db-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,4 +1,4 @@
1
- import { D as DogsbayElement } from './base-BtvRtAsC.js';
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
2
 
3
3
  /**
4
4
  * `<db-link-button>` — Styled link that looks like a button.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DbLinkButton
3
- } from "./chunk-WTARNLNI.js";
4
- import "./chunk-ABP4WEKU.js";
3
+ } from "./chunk-QSRUT67Y.js";
4
+ import "./chunk-K6DPDBAG.js";
5
5
  export {
6
6
  DbLinkButton
7
7
  };
@@ -0,0 +1,83 @@
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
+
3
+ /**
4
+ * [label, url, children?, noCurrent?]. `noCurrent` (1): never mark this link
5
+ * as the current page even when its URL matches — an alias (a link to a page
6
+ * that lives in another section) or a #section link. The server-rendered
7
+ * tree already leaves those unmarked; lazily built groups must agree.
8
+ */
9
+ type NavData = [string, string | null, NavData[]?, 1?];
10
+ /**
11
+ * `<db-nav-tree>` — Site navigation tree (APG "Disclosure Navigation").
12
+ *
13
+ * A section that is also a page gets a real link AND a separate toggle
14
+ * button as siblings — never a link inside `<summary>`, which is nested
15
+ * interactive content (axe `nested-interactive`). A section with no page
16
+ * is a single toggle button carrying the label. Every link stays in the
17
+ * normal Tab order; arrow keys are an extra shortcut, not a replacement.
18
+ *
19
+ * Server-rendered markup works without JavaScript: links navigate, and the
20
+ * branch to the current page is rendered open.
21
+ *
22
+ * <db-nav-tree>
23
+ * <ul data-part="list">
24
+ * <li data-part="item" data-state="open">
25
+ * <div data-part="row">
26
+ * <button data-part="toggle" type="button" aria-expanded="true" aria-controls="g1" aria-label="Toggle Guides"></button>
27
+ * <a data-part="link" href="guides/index.html">Guides</a>
28
+ * </div>
29
+ * <ul data-part="group" id="g1">…</ul>
30
+ * </li>
31
+ * <li data-part="item"><div data-part="row"><a data-part="link" href="faq.html" aria-current="page">FAQ</a></div></li>
32
+ * </ul>
33
+ * </db-nav-tree>
34
+ *
35
+ * Lazy sections: a group with `data-lazy` and `data-path="0.3"` is filled
36
+ * from `navData` (or the global named by `data-source`) the first time it
37
+ * opens. URLs in the data are prefixed with the `base` attribute.
38
+ *
39
+ * Attributes:
40
+ * base — prefix for data URLs (e.g. "../../")
41
+ * data-source — name of a window global holding NavData[]
42
+ * toggle-label — accessible name template, default "Toggle {label}"
43
+ * scroll-current — scroll the current page's link into view on connect
44
+ * Built items carry `style="--db-level:N"` (0 at the top) so CSS can indent
45
+ * them; server markup should set the same.
46
+ *
47
+ * toggle-position — "start" (default) or "end": where lazily built rows put
48
+ * the toggle relative to the link. Match the server markup
49
+ * so DOM (and Tab) order follows the visual order.
50
+ *
51
+ * Keyboard (in addition to Tab): ArrowDown/ArrowUp move between visible
52
+ * rows, ArrowRight opens a section or moves into it, ArrowLeft closes it or
53
+ * moves to its parent, Home/End go to the first/last row.
54
+ *
55
+ * Events: db-nav-tree:toggle (detail: { item, open })
56
+ */
57
+ declare class DbNavTree extends DogsbayElement {
58
+ /** Nav data for lazy sections. Falls back to `window[data-source]`. */
59
+ navData: NavData[] | null;
60
+ private onClick;
61
+ private onKey;
62
+ protected setup(): void;
63
+ protected connect(): void;
64
+ protected disconnect(): void;
65
+ private prepareItem;
66
+ private groupOf;
67
+ private toggleOf;
68
+ /** The row's main focus target: its link, or its toggle for a label-only section. */
69
+ private primary;
70
+ private visibleRows;
71
+ isOpen(item: HTMLElement): boolean;
72
+ toggle(item: HTMLElement): void;
73
+ setOpen(item: HTMLElement, open: boolean): void;
74
+ private apply;
75
+ /** Expand every section on the path to the current page. */
76
+ revealCurrent(): void;
77
+ private data;
78
+ /** Fill a lazy group from nav data. */
79
+ private fill;
80
+ private build;
81
+ }
82
+
83
+ export { DbNavTree, type NavData };
@@ -0,0 +1,9 @@
1
+ import {
2
+ DbNavTree
3
+ } from "./chunk-S62ZVVO3.js";
4
+ import "./chunk-3AEQ6KHV.js";
5
+ import "./chunk-K6DPDBAG.js";
6
+ export {
7
+ DbNavTree
8
+ };
9
+ //# sourceMappingURL=db-nav-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,42 @@
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
+
3
+ /**
4
+ * `<db-popover>` — Non-modal floating panel (APG "Dialog", non-modal).
5
+ *
6
+ * Same parts as the Astro Popover. The content opens in the browser's top
7
+ * layer (Popover API) where available, so no ancestor's `overflow` clips it
8
+ * and it needs no portal, and floating-ui positions it next to the trigger.
9
+ *
10
+ * Attributes:
11
+ * placement — "bottom" (default), "top-start", … (or data-side/data-align on the content)
12
+ * offset — gap in px (default 8)
13
+ * no-autofocus — keep focus on the trigger when opening
14
+ *
15
+ * Parts: [data-part="trigger"], [data-part="content"], [data-part="close"]
16
+ *
17
+ * Focus: opening moves focus to the first focusable element in the content.
18
+ * Escape and the close part return focus to the trigger; an outside click
19
+ * leaves focus where the user clicked.
20
+ *
21
+ * Events: db-popover:open, db-popover:close (detail: { reason })
22
+ */
23
+ declare class DbPopover extends DogsbayElement {
24
+ private trigger;
25
+ private content;
26
+ private dismiss;
27
+ private cleanupFloating;
28
+ private _open;
29
+ get open(): boolean;
30
+ private onTriggerClick;
31
+ private onContentClick;
32
+ protected setup(): void;
33
+ protected connect(): void;
34
+ protected disconnect(): void;
35
+ private setState;
36
+ private placement;
37
+ toggle(): void;
38
+ show(): void;
39
+ close(reason?: string): void;
40
+ }
41
+
42
+ export { DbPopover };
@@ -0,0 +1,9 @@
1
+ import {
2
+ DbPopover
3
+ } from "./chunk-EGU66XCL.js";
4
+ import "./chunk-3AEQ6KHV.js";
5
+ import "./chunk-K6DPDBAG.js";
6
+ export {
7
+ DbPopover
8
+ };
9
+ //# sourceMappingURL=db-popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,72 @@
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
+
3
+ /**
4
+ * `<db-select>` — Select-only combobox (APG "Select-Only Combobox").
5
+ *
6
+ * Two ways to use it:
7
+ *
8
+ * 1. The Astro Select parts (same contract as `ui/src/select`):
9
+ * [data-part="trigger"] button, role=combobox (focus stays here)
10
+ * [data-part="value"] shows the selected label (data-placeholder)
11
+ * [data-part="content"] role=listbox
12
+ * [data-part="item"] role=option, data-value, aria-disabled
13
+ * [data-part="group"] / [data-part="label"]
14
+ *
15
+ * 2. Progressive enhancement of a native `<select>` inside the element.
16
+ * The element builds the parts from its options, keeps the native
17
+ * select in sync (hidden, still submitted with forms) and dispatches a
18
+ * native `change` on it, so existing listeners keep working. With no
19
+ * JavaScript the native select is what the user gets.
20
+ *
21
+ * The listbox opens in the top layer where supported. Focus never leaves
22
+ * the trigger: the highlighted option is exposed with aria-activedescendant.
23
+ *
24
+ * Attributes: name, default-value, required, disabled
25
+ * Events: db-select:change (detail: { value })
26
+ */
27
+ declare class DbSelect extends DogsbayElement {
28
+ private trigger;
29
+ private content;
30
+ private valueEl;
31
+ private items;
32
+ private nativeSelect;
33
+ private hiddenInput;
34
+ private labelEl;
35
+ private onLabelClick;
36
+ private dismiss;
37
+ private typeahead;
38
+ private cleanupFloating;
39
+ private _open;
40
+ private _value;
41
+ private highlighted;
42
+ get open(): boolean;
43
+ get value(): string;
44
+ set value(v: string);
45
+ /** Disabled when the host or the enhanced native select is. */
46
+ private get isDisabled();
47
+ private syncing;
48
+ /** Re-read the native select's value (after script changes it or a form reset). */
49
+ refresh(): void;
50
+ private onNativeChange;
51
+ private onFormReset;
52
+ private enabled;
53
+ protected setup(): void;
54
+ /** Build the trigger and listbox from a native <select>, and hide it. */
55
+ private buildFromNative;
56
+ private onTriggerClick;
57
+ private onTriggerKeyUp;
58
+ private onTriggerKey;
59
+ private onListClick;
60
+ private onListPointer;
61
+ protected connect(): void;
62
+ protected disconnect(): void;
63
+ private preventBlur;
64
+ private setState;
65
+ show(): void;
66
+ /** Close the listbox. `refocus` is false for outside presses, which keep focus where the user clicked. */
67
+ close(refocus?: boolean): void;
68
+ private highlight;
69
+ private select;
70
+ }
71
+
72
+ export { DbSelect };
@@ -0,0 +1,9 @@
1
+ import {
2
+ DbSelect
3
+ } from "./chunk-3FMXAKOU.js";
4
+ import "./chunk-3AEQ6KHV.js";
5
+ import "./chunk-K6DPDBAG.js";
6
+ export {
7
+ DbSelect
8
+ };
9
+ //# sourceMappingURL=db-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,4 +1,4 @@
1
- import { D as DogsbayElement } from './base-BtvRtAsC.js';
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
2
 
3
3
  /**
4
4
  * `<db-steps>` — Accessible step-by-step list.
package/dist/db-steps.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DbSteps
3
- } from "./chunk-VJXEM5O6.js";
4
- import "./chunk-ABP4WEKU.js";
3
+ } from "./chunk-VW7HZY2B.js";
4
+ import "./chunk-K6DPDBAG.js";
5
5
  export {
6
6
  DbSteps
7
7
  };
package/dist/db-tabs.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { D as DogsbayElement } from './base-BtvRtAsC.js';
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
2
 
3
3
  /**
4
4
  * `<db-tabs>` — Accessible tabbed interface.
@@ -25,6 +25,13 @@ declare class DbTabs extends DogsbayElement {
25
25
  private syncKey;
26
26
  private orientation;
27
27
  private handleClick;
28
+ /**
29
+ * A synced group follows only a value it HAS. Groups sharing a key need
30
+ * not share a tab set (a web-only snippet group beside an all-SDK one), and
31
+ * selecting a value with no trigger here left the group with every panel
32
+ * hidden and no tab selected.
33
+ */
34
+ private has;
28
35
  private handleStorage;
29
36
  private handleSyncEvent;
30
37
  /**
package/dist/db-tabs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DbTabs
3
- } from "./chunk-ZLIF4UYD.js";
4
- import "./chunk-ABP4WEKU.js";
3
+ } from "./chunk-4YPDR3W6.js";
4
+ import "./chunk-K6DPDBAG.js";
5
5
  export {
6
6
  DbTabs
7
7
  };
@@ -0,0 +1,32 @@
1
+ import { D as DogsbayElement } from './base-D1Rz70fn.js';
2
+
3
+ /**
4
+ * `<db-toc>` — "On this page" links that follow the reader (scroll spy).
5
+ *
6
+ * Wraps plain in-page links, so it works as a list of links without
7
+ * JavaScript. The link for the section in view gets `aria-current="location"`
8
+ * and `data-active` (the Astro TableOfContents contract).
9
+ *
10
+ * Links: `a[href^="#"]`, or `[data-toc-link][data-toc-slug]` as in the Astro component.
11
+ *
12
+ * Attributes:
13
+ * offset — px hidden under a sticky header (default 80)
14
+ *
15
+ * Events: db-toc:change (detail: { id })
16
+ */
17
+ declare class DbToc extends DogsbayElement {
18
+ private links;
19
+ private headings;
20
+ private observer;
21
+ private active;
22
+ private slugOf;
23
+ private onScroll;
24
+ protected setup(): void;
25
+ private onHash;
26
+ protected connect(): void;
27
+ protected disconnect(): void;
28
+ private lastAbove;
29
+ private setActive;
30
+ }
31
+
32
+ export { DbToc };
package/dist/db-toc.js ADDED
@@ -0,0 +1,8 @@
1
+ import {
2
+ DbToc
3
+ } from "./chunk-FIJZRZEN.js";
4
+ import "./chunk-K6DPDBAG.js";
5
+ export {
6
+ DbToc
7
+ };
8
+ //# sourceMappingURL=db-toc.js.map