diff --git a/README.md b/README.md
index d8a6ca2..c3d13a7 100644
--- a/README.md
+++ b/README.md
@@ -90,7 +90,7 @@ cp -R ../oatbase/dist ./public/vendor/oatbase
CSS-only applications can use `@oddship/oatbase/css` without loading JavaScript. For an application that already loads Oat, `@oddship/oatbase/extensions.css` and `@oddship/oatbase/extensions` provide the extension-only aggregates. Every Oatbase addition also has an independent entry point, such as `@oddship/oatbase/chart.css`, `@oddship/oatbase/drawer.css`, or `@oddship/oatbase/select` plus `@oddship/oatbase/select.css`.
-The v0.1.0 complete Oat-inclusive browser payload is 27.9 kB gzipped, and the extension-only aggregate is 18.1 kB gzipped. Individual entry points and `components.json` support selective application bundles; `examples/esgun/` demonstrates that path without making EsGun a library dependency.
+The v0.1.0 complete Oat-inclusive browser payload is 28.1 kB gzipped, and the extension-only aggregate is 18.3 kB gzipped. Individual entry points and `components.json` support selective application bundles; `examples/esgun/` demonstrates that path without making EsGun a library dependency.
The Flowctl audit added only the reusable boundaries: Repeater coordinates repeated native fields, Log Viewer coordinates a semantic live log, Combobox can create native options, and Stepper has a compact status track. Page headers, validation summaries, action rails, schedule forms, and workflow workspaces remain recipes or blocks. CodeMirror, graph layout, cron/timezone conversion, ANSI parsing, streaming, and virtualization remain application or specialist-library concerns.
diff --git a/dist/extensions.esm.js b/dist/extensions.esm.js
index aa5bfdd..a35af81 100644
--- a/dist/extensions.esm.js
+++ b/dist/extensions.esm.js
@@ -1427,26 +1427,51 @@ define("ot-scrollspy", OtScrollspy);
// src/js/footnotes.js
class OtFootnotes extends HTMLElement {
#abort;
+ #readyAbort;
+ #entries = [];
+ #revision = 0;
connectedCallback() {
- this.#abort?.abort();
- this.#abort = new AbortController;
- if (typeof HTMLElement.prototype.showPopover !== "function")
- return;
- const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')];
- references.forEach((reference) => this.#enhance(reference));
- if (references.length)
- this.toggleAttribute("data-enhanced", true);
+ this.#readyAbort?.abort();
+ this.#readyAbort = connectWhenReady(this, () => this.refresh());
}
disconnectedCallback() {
+ this.#readyAbort?.abort();
this.#abort?.abort();
+ this.#revision++;
}
- #enhance(reference) {
- const targetId = decodeURIComponent(reference.hash.slice(1));
- const definition = targetId && document.getElementById(targetId);
- if (!definition)
- return;
+ get entries() {
+ return [...this.#entries];
+ }
+ refresh() {
+ this.#abort?.abort();
+ this.#abort = new AbortController;
+ const canPopover = typeof HTMLElement.prototype.showPopover === "function";
+ const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')].filter((reference) => !reference.closest("[data-footnote-popover]"));
+ this.#entries = references.map((reference) => {
+ const targetId = decodeURIComponent(reference.hash.slice(1));
+ const definition = targetId && document.getElementById(targetId);
+ if (!definition)
+ return null;
+ if (!canPopover)
+ return { reference, definition, dropdown: null, popover: null };
+ return this.#enhance(reference, definition, targetId);
+ }).filter(Boolean);
+ this.toggleAttribute("data-enhanced", canPopover && this.#entries.some((entry) => entry.popover));
+ this.#announce(canPopover);
+ return this.entries;
+ }
+ #announce(enhanced) {
+ const revision = ++this.#revision;
+ const entries = this.entries;
+ queueMicrotask(() => {
+ if (this.isConnected && revision === this.#revision) {
+ emit(this, "oatbase:render", { entries, enhanced });
+ }
+ });
+ }
+ #enhance(reference, definition, targetId) {
let dropdown = reference.closest("ot-dropdown[data-footnote-preview]");
- let popover = dropdown?.querySelector("[data-footnote-popover]");
+ let popover = dropdown?.querySelector(":scope > [data-footnote-popover]");
if (!dropdown || !popover) {
dropdown = document.createElement("ot-dropdown");
dropdown.dataset.footnotePreview = "";
@@ -1459,21 +1484,15 @@ class OtFootnotes extends HTMLElement {
popover.dataset.footnotePopover = "";
popover.setAttribute("popover", "auto");
popover.setAttribute("role", "note");
- popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
- const content = definition.cloneNode(true);
- content.removeAttribute("id");
- content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
- content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
- content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
- const body = document.createElement("div");
- while (content.firstChild)
- body.append(content.firstChild);
- popover.append(body);
dropdown.append(popover);
- reference.setAttribute("popovertarget", popover.id);
- reference.setAttribute("aria-controls", popover.id);
parent.insertBefore(dropdown, next);
}
+ popover.dataset.footnoteFor = targetId;
+ popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
+ reference.setAttribute("popovertarget", popover.id);
+ reference.setAttribute("aria-controls", popover.id);
+ this.#render(popover, definition);
+ const entry = { reference, definition, dropdown, popover };
reference.addEventListener("click", (event) => {
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
return;
@@ -1483,6 +1502,24 @@ class OtFootnotes extends HTMLElement {
else
popover.showPopover();
}, { signal: this.#abort.signal });
+ popover.addEventListener("toggle", (event) => {
+ emit(this, "oatbase:toggle", {
+ ...entry,
+ state: event.newState || (popover.matches(":popover-open") ? "open" : "closed")
+ });
+ }, { signal: this.#abort.signal });
+ return entry;
+ }
+ #render(popover, definition) {
+ const content = definition.cloneNode(true);
+ content.removeAttribute("id");
+ content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
+ content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
+ content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
+ const body = document.createElement("div");
+ while (content.firstChild)
+ body.append(content.firstChild);
+ popover.replaceChildren(body);
}
}
define("ot-footnotes", OtFootnotes);
diff --git a/dist/extensions.js b/dist/extensions.js
index 14c5f35..a61d70b 100644
--- a/dist/extensions.js
+++ b/dist/extensions.js
@@ -1491,26 +1491,51 @@
// src/js/footnotes.js
class OtFootnotes extends HTMLElement {
#abort;
+ #readyAbort;
+ #entries = [];
+ #revision = 0;
connectedCallback() {
- this.#abort?.abort();
- this.#abort = new AbortController;
- if (typeof HTMLElement.prototype.showPopover !== "function")
- return;
- const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')];
- references.forEach((reference) => this.#enhance(reference));
- if (references.length)
- this.toggleAttribute("data-enhanced", true);
+ this.#readyAbort?.abort();
+ this.#readyAbort = connectWhenReady(this, () => this.refresh());
}
disconnectedCallback() {
+ this.#readyAbort?.abort();
this.#abort?.abort();
+ this.#revision++;
}
- #enhance(reference) {
- const targetId = decodeURIComponent(reference.hash.slice(1));
- const definition = targetId && document.getElementById(targetId);
- if (!definition)
- return;
+ get entries() {
+ return [...this.#entries];
+ }
+ refresh() {
+ this.#abort?.abort();
+ this.#abort = new AbortController;
+ const canPopover = typeof HTMLElement.prototype.showPopover === "function";
+ const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')].filter((reference) => !reference.closest("[data-footnote-popover]"));
+ this.#entries = references.map((reference) => {
+ const targetId = decodeURIComponent(reference.hash.slice(1));
+ const definition = targetId && document.getElementById(targetId);
+ if (!definition)
+ return null;
+ if (!canPopover)
+ return { reference, definition, dropdown: null, popover: null };
+ return this.#enhance(reference, definition, targetId);
+ }).filter(Boolean);
+ this.toggleAttribute("data-enhanced", canPopover && this.#entries.some((entry) => entry.popover));
+ this.#announce(canPopover);
+ return this.entries;
+ }
+ #announce(enhanced) {
+ const revision = ++this.#revision;
+ const entries = this.entries;
+ queueMicrotask(() => {
+ if (this.isConnected && revision === this.#revision) {
+ emit(this, "oatbase:render", { entries, enhanced });
+ }
+ });
+ }
+ #enhance(reference, definition, targetId) {
let dropdown = reference.closest("ot-dropdown[data-footnote-preview]");
- let popover = dropdown?.querySelector("[data-footnote-popover]");
+ let popover = dropdown?.querySelector(":scope > [data-footnote-popover]");
if (!dropdown || !popover) {
dropdown = document.createElement("ot-dropdown");
dropdown.dataset.footnotePreview = "";
@@ -1523,21 +1548,15 @@
popover.dataset.footnotePopover = "";
popover.setAttribute("popover", "auto");
popover.setAttribute("role", "note");
- popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
- const content = definition.cloneNode(true);
- content.removeAttribute("id");
- content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
- content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
- content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
- const body = document.createElement("div");
- while (content.firstChild)
- body.append(content.firstChild);
- popover.append(body);
dropdown.append(popover);
- reference.setAttribute("popovertarget", popover.id);
- reference.setAttribute("aria-controls", popover.id);
parent.insertBefore(dropdown, next);
}
+ popover.dataset.footnoteFor = targetId;
+ popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
+ reference.setAttribute("popovertarget", popover.id);
+ reference.setAttribute("aria-controls", popover.id);
+ this.#render(popover, definition);
+ const entry = { reference, definition, dropdown, popover };
reference.addEventListener("click", (event) => {
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
return;
@@ -1547,6 +1566,24 @@
else
popover.showPopover();
}, { signal: this.#abort.signal });
+ popover.addEventListener("toggle", (event) => {
+ emit(this, "oatbase:toggle", {
+ ...entry,
+ state: event.newState || (popover.matches(":popover-open") ? "open" : "closed")
+ });
+ }, { signal: this.#abort.signal });
+ return entry;
+ }
+ #render(popover, definition) {
+ const content = definition.cloneNode(true);
+ content.removeAttribute("id");
+ content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
+ content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
+ content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
+ const body = document.createElement("div");
+ while (content.firstChild)
+ body.append(content.firstChild);
+ popover.replaceChildren(body);
}
}
define("ot-footnotes", OtFootnotes);
diff --git a/dist/extensions.min.js b/dist/extensions.min.js
index fff0151..a1c1525 100644
--- a/dist/extensions.min.js
+++ b/dist/extensions.min.js
@@ -1,3 +1,3 @@
-(()=>{var{defineProperty:D,getOwnPropertyNames:P,getOwnPropertyDescriptor:F}=Object,K=Object.prototype.hasOwnProperty;function U(t){return this[t]}var z=(t)=>{var e=(_??=new WeakMap).get(t),s;if(e)return e;if(e=D({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function"){for(var i of P(t))if(!K.call(e,i))D(e,i,{get:U.bind(t,i),enumerable:!(s=F(t,i))||s.enumerable})}return _.set(t,e),e},_;var W=(t)=>t;function V(t,e){this[t]=W.bind(null,e)}var Y=(t,e)=>{for(var s in e)D(t,s,{get:e[s],enumerable:!0,configurable:!0,set:V.bind(e,s)})};var G={};Y(G,{OtTree:()=>k,OtToolbar:()=>S,OtToggle:()=>C,OtThemeSwitcher:()=>y,OtSplitter:()=>w,OtSelect:()=>x,OtScrollspy:()=>I,OtRepeater:()=>T,OtReadingProgress:()=>O,OtPassword:()=>E,OtOtp:()=>L,OtMultiselect:()=>A,OtLogViewer:()=>B,OtLightbox:()=>q,OtFootnotes:()=>M,OtDataTable:()=>H,OtCopy:()=>f,OtCommand:()=>g,OtCombobox:()=>m,OtActionField:()=>v});var X=0,c=(t="oatbase")=>`${t}-${++X}`;function n(t,e){if(!customElements.get(t))customElements.define(t,e)}function u(t,e){if(document.readyState!=="loading"){e();return}let s=new AbortController;return document.addEventListener("DOMContentLoaded",()=>{if(t.isConnected)e()},{once:!0,signal:s.signal}),s}function l(t,e){t.forEach((i,o)=>i.toggleAttribute("data-active",o===e));let s=t[e];return s?.scrollIntoView({block:"nearest"}),s}function p(t,e,s){if(!s)return-1;if(t==="ArrowDown")return(e+1+s)%s;if(t==="ArrowUp")return(e-1+s)%s;if(t==="Home")return 0;if(t==="End")return s-1;return e}function a(t,e,s){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:s}))}var N=new Set;document.addEventListener("pointerdown",(t)=>{N.forEach((e)=>{if(!e.contains(t.target))e.close()})});function b(t,e){N.add(t),e.addEventListener("abort",()=>N.delete(t),{once:!0})}class m extends HTMLElement{#t;#e;#s=-1;connectedCallback(){this.#e?.abort(),this.#e=u(this,()=>this.#i())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get value(){return this.select?.value||""}set value(t){if(!this.select)return;this.select.value=String(t),this.#d()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get visibleOptions(){return this.options.filter((t)=>!t.hidden&&t.getAttribute("aria-disabled")!=="true")}open(){if(this.input?.disabled)return;this.list.hidden=!1,this.input.setAttribute("aria-expanded","true")}close(){if(!this.list)return;this.list.hidden=!0,this.input?.setAttribute("aria-expanded","false"),this.input?.removeAttribute("aria-activedescendant"),l(this.visibleOptions,-1),this.#s=-1}#i(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.select=this.querySelector(":scope > select"),!this.select)return;this.#o(),this.input.addEventListener("input",()=>this.#r(),{signal:t}),this.input.addEventListener("focus",()=>this.open(),{signal:t}),this.input.addEventListener("keydown",(e)=>this.#n(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#a(e),{signal:t}),this.list.addEventListener("click",(e)=>this.#l(e),{signal:t}),this.select.addEventListener("change",()=>this.#d(),{signal:t}),this.select.form?.addEventListener("reset",()=>queueMicrotask(()=>this.#d()),{signal:t}),b(this,t),this.dataset.enhanced="",this.#d()}#o(){this.querySelectorAll(":scope > [data-generated]").forEach((s)=>s.remove());let t=c("oatbase-combobox");this.input=document.createElement("input"),this.input.type="search",this.input.autocomplete="off",this.input.placeholder=this.dataset.placeholder||"Search…",this.input.disabled=this.select.disabled,this.input.dataset.generated="",this.input.setAttribute("role","combobox"),this.input.setAttribute("aria-autocomplete","list"),this.input.setAttribute("aria-controls",t),this.input.setAttribute("aria-expanded","false");let e=this.select.getAttribute("aria-label");if(e)this.input.setAttribute("aria-label",e);if(this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),[...this.select.options].forEach((s,i)=>this.#h(s,i)),this.hasAttribute("data-allow-custom"))this.create=document.createElement("li"),this.create.id=`${t}-create`,this.create.dataset.create="",this.create.dataset.generated="",this.create.setAttribute("role","option"),this.create.setAttribute("aria-selected","false"),this.create.hidden=!0,this.list.append(this.create);this.empty=document.createElement("li"),this.empty.dataset.empty="",this.empty.dataset.generated="",this.empty.textContent=this.dataset.empty||"No results found.",this.empty.hidden=!0,this.list.append(this.empty),this.append(this.input,this.list)}#r(){let t=this.input.value.trim(),e=t.toLocaleLowerCase(),s=this.select.options[this.select.selectedIndex];if(s&&this.input.value!==s.textContent)this.select.selectedIndex=-1,this.options.forEach((o)=>o.setAttribute("aria-selected","false"));let i=this.options.filter((o)=>!o.hasAttribute("data-create"));if(i.forEach((o)=>{let r=`${o.textContent} ${o.dataset.keywords}`.toLocaleLowerCase();o.hidden=!r.includes(e)}),this.create){let o=i.some((r)=>{let h=r._source;return r.textContent.trim().toLocaleLowerCase()===e||h?.value.toLocaleLowerCase()===e});this.create.hidden=!t||o,this.create.dataset.value=t,this.create.textContent=(this.dataset.createLabel||"Create “{value}”").replace("{value}",t)}this.empty.hidden=this.visibleOptions.length>0,this.#s=-1,this.open()}#n(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){t.preventDefault(),this.open(),this.#s=p(t.key,this.#s,this.visibleOptions.length);let e=l(this.visibleOptions,this.#s);if(e)this.input.setAttribute("aria-activedescendant",e.id)}else if(t.key==="Enter"&&(this.#s>=0||this.create&&!this.create.hidden))t.preventDefault(),this.#c(this.#s>=0?this.visibleOptions[this.#s]:this.create);else if(t.key==="Escape")this.close()}#a(t){let e=t.target.closest('[role="option"]');if(!e||e.hidden||e.getAttribute("aria-disabled")==="true")return;this.#s=this.visibleOptions.indexOf(e),l(this.visibleOptions,this.#s)}#l(t){let e=t.target.closest('[role="option"]');if(e&&e.getAttribute("aria-disabled")!=="true")this.#c(e)}#c(t){if(!t)return;if(t.hasAttribute("data-create")){let s=t.dataset.value.trim();if(!s)return;let i=new Option(s,s,!0,!0);i.dataset.custom="",this.select.append(i);let o=this.#h(i,i.index,this.create);a(this,"oatbase:create",{value:s,option:i}),t=o}let e=t._source;this.select.selectedIndex=e.index,this.#d(),this.close(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),a(this,"oatbase:change",{value:e.value,option:e}),this.input.focus()}#h(t,e,s=null){if(!t.value&&t.disabled)return null;let i=document.createElement("li");return i.id=`${this.list.id}-option-${e+1}`,i._source=t,i.dataset.index=e,i.dataset.keywords=t.dataset.keywords||"",i.setAttribute("role","option"),i.setAttribute("aria-disabled",String(t.disabled)),i.setAttribute("aria-selected","false"),i.textContent=t.textContent,this.list.insertBefore(i,s),i}#d(){let t=this.select.options[this.select.selectedIndex];this.input.value=t&&t.value?t.textContent:"",this.input.disabled=this.select.disabled,this.options.forEach((e)=>{e.setAttribute("aria-selected",String(e._source===t))})}}n("ot-combobox",m);class g extends HTMLElement{#t;#e;#s=-1;connectedCallback(){this.#e?.abort(),this.#e=u(this,()=>this.#i())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get items(){return this.list?[...this.list.querySelectorAll("[data-command-item]")]:[]}get visibleItems(){return this.items.filter((t)=>!t.hidden&&!t.closest("li")?.hidden&&!t.hasAttribute("aria-disabled"))}get query(){return this.search?.value.trim()||""}open(){if(!this.dialog.open)this.dialog.showModal();this.search.setAttribute("aria-expanded","true"),this.search.value="",this.#o(),requestAnimationFrame(()=>this.search.focus()),a(this,"oatbase:open")}close(){if(this.dialog.open)this.dialog.close();this.search?.setAttribute("aria-expanded","false"),a(this,"oatbase:close")}#i(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.dialog=this.querySelector(":scope > dialog"),this.search=this.dialog?.querySelector("[data-command-search]"),this.list=this.dialog?.querySelector("[data-command-list]"),!this.dialog||!this.search||!this.list)return;this.list.id||=c("oatbase-command"),this.list.setAttribute("role","listbox"),this.search.setAttribute("role","combobox"),this.search.setAttribute("aria-autocomplete","list"),this.search.setAttribute("aria-expanded",String(this.dialog.open)),this.search.setAttribute("aria-controls",this.list.id),this.querySelectorAll("[data-command-open]").forEach((e)=>{e.addEventListener("click",(s)=>{s.preventDefault(),this.open()},{signal:t})}),this.querySelectorAll("[data-command-close]").forEach((e)=>{e.addEventListener("click",()=>this.close(),{signal:t})}),this.search.addEventListener("input",()=>this.#o(),{signal:t}),this.search.addEventListener("keydown",(e)=>this.#a(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#l(e),{signal:t}),this.list.addEventListener("click",(e)=>{let s=e.target.closest("[data-command-item]");if(s&&!s.hasAttribute("aria-disabled"))this.#h(s)},{signal:t}),this.dialog.addEventListener("click",(e)=>{let s=this.dialog.getBoundingClientRect();if(e.clientXs.right||e.clientYs.bottom)this.close()},{signal:t}),this.dialog.addEventListener("close",()=>this.search.setAttribute("aria-expanded","false"),{signal:t}),document.addEventListener("keydown",(e)=>{if(this.dataset.shortcut?.toLowerCase()==="mod+k"&&(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="k")e.preventDefault(),this.dialog.open?this.close():this.open()},{signal:t}),this.refresh()}refresh(){if(!this.list||!this.search)return;this.#r(),this.#n()}#o(){if(this.dispatchEvent(new CustomEvent("oatbase:query",{bubbles:!0,composed:!0,cancelable:!0,detail:{query:this.query}})))this.#r();this.#n()}#r(){if(this.dataset.filter!=="manual"){let t=this.query.toLocaleLowerCase();this.items.forEach((e)=>{let s=`${e.textContent} ${e.dataset.keywords||""}`.toLocaleLowerCase(),i=e.closest("li")||e;i.hidden=!s.includes(t)})}}#n(){this.items.forEach((s)=>{s.id||=c("oatbase-command-item"),s.setAttribute("role","option")}),this.list.querySelectorAll("[data-command-group]").forEach((s)=>{let i=s.nextElementSibling,o=!1;while(i&&!i.hasAttribute("data-command-group")){if((i.matches("[data-command-item]")||i.querySelector("[data-command-item]"))&&!i.hidden)o=!0;i=i.nextElementSibling}s.hidden=!o});let t=this.visibleItems;this.querySelector("[data-command-empty]")?.toggleAttribute("hidden",t.length>0);let e=t.findIndex((s)=>s.hasAttribute("data-active"));this.#c(e>=0?e:t.length?0:-1)}#a(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key))t.preventDefault(),this.#c(p(t.key,this.#s,this.visibleItems.length));else if(t.key==="Enter"&&this.#s>=0)t.preventDefault(),this.#h(this.visibleItems[this.#s])}#l(t){let e=t.target.closest("[data-command-item]");if(!e||e.closest("li")?.hidden||e.hasAttribute("aria-disabled"))return;this.#c(this.visibleItems.indexOf(e))}#c(t){this.#s=t;let e=this.visibleItems,s=l(e,t);if(this.items.forEach((i)=>i.setAttribute("aria-selected",String(i===s))),s)this.search.setAttribute("aria-activedescendant",s.id);else this.search.removeAttribute("aria-activedescendant")}#h(t){if(!t)return;let e=t.dataset.value||t.textContent.trim();if(!this.dispatchEvent(new CustomEvent("oatbase:select",{bubbles:!0,composed:!0,cancelable:!0,detail:{value:e,item:t}})))return;if(!t.hasAttribute("data-keep-open"))this.close()}}n("ot-command",g);class x extends HTMLElement{#t;#e;#s=-1;connectedCallback(){this.#e?.abort(),this.#e=u(this,()=>this.#i())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get value(){return this.select?.value||""}set value(t){if(!this.select)return;this.select.value=String(t),this.#l()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get enabledOptions(){return this.options.filter((t)=>t.getAttribute("aria-disabled")!=="true")}open(){if(this.select?.disabled)return;this.list.hidden=!1,this.button.setAttribute("aria-expanded","true"),this.#s=this.enabledOptions.findIndex((e)=>e.getAttribute("aria-selected")==="true");let t=l(this.enabledOptions,this.#s);if(t)this.button.setAttribute("aria-activedescendant",t.id)}close(){if(!this.list)return;this.list.hidden=!0,this.button.setAttribute("aria-expanded","false"),this.button.removeAttribute("aria-activedescendant"),l(this.enabledOptions,-1),this.#s=-1}toggle(){this.list.hidden?this.open():this.close()}#i(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.select=this.querySelector(":scope > select"),!this.select)return;this.#o(),this.button.addEventListener("click",()=>this.toggle(),{signal:t}),this.button.addEventListener("keydown",(e)=>this.#r(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#n(e),{signal:t}),this.list.addEventListener("click",(e)=>{let s=e.target.closest('[role="option"]');if(s&&s.getAttribute("aria-disabled")!=="true")this.#a(s)},{signal:t}),this.select.addEventListener("change",()=>this.#l(),{signal:t}),b(this,t),this.dataset.enhanced="",this.#l()}#o(){this.querySelectorAll(":scope > [data-generated]").forEach((s)=>s.remove());let t=c("oatbase-select");this.button=document.createElement("button"),this.button.type="button",this.button.className="outline",this.button.dataset.generated="",this.button.setAttribute("aria-haspopup","listbox"),this.button.setAttribute("aria-controls",t),this.button.setAttribute("aria-expanded","false");let e=this.select.getAttribute("aria-label");if(e)this.button.setAttribute("aria-label",e);this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),[...this.select.options].forEach((s,i)=>{if(!s.value&&s.disabled)return;let o=document.createElement("li");o.id=`${t}-option-${i+1}`,o._source=s,o.dataset.index=i,o.setAttribute("role","option"),o.setAttribute("aria-disabled",String(s.disabled)),o.textContent=s.textContent,this.list.append(o)}),this.append(this.button,this.list)}#r(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){if(t.preventDefault(),this.list.hidden)this.open();this.#s=p(t.key,this.#s,this.enabledOptions.length);let e=l(this.enabledOptions,this.#s);if(e)this.button.setAttribute("aria-activedescendant",e.id)}else if(t.key==="Enter"||t.key===" "){if(t.preventDefault(),this.list.hidden)this.open();else if(this.#s>=0)this.#a(this.enabledOptions[this.#s])}else if(t.key==="Escape")this.close()}#n(t){let e=t.target.closest('[role="option"]');if(!e||e.getAttribute("aria-disabled")==="true")return;this.#s=this.enabledOptions.indexOf(e),l(this.enabledOptions,this.#s)}#a(t){let e=t._source;if(!e||e.disabled)return;this.select.selectedIndex=e.index,this.#l(),this.close(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),a(this,"oatbase:change",{value:e.value,option:e}),this.button.focus()}#l(){let t=this.select.options[this.select.selectedIndex];this.button.textContent=t?.value?t.textContent:this.dataset.placeholder||t?.textContent||"Select an option",this.button.disabled=this.select.disabled,this.options.forEach((e)=>e.setAttribute("aria-selected",String(e._source===t)))}}n("ot-select",x);class y extends HTMLElement{#t;#e="system";connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;this.key=this.dataset.storageKey||"oatbase-theme";let e=this.dataset.default||"system";try{e=localStorage.getItem(this.key)||e}catch{}this.#e=["system","light","dark"].includes(e)?e:"system",this.buttons=[...this.querySelectorAll("[data-theme-value]")],this.toggleButton=this.buttons.length?null:this.querySelector("button"),this.toggleContents=this.toggleButton?[...this.toggleButton.querySelectorAll("[data-theme-content]")]:[],this.toggleLabel=this.toggleButton?.querySelector("[data-theme-label]"),this.toggleAttribute("data-group",this.buttons.length>1),this.buttons.forEach((s)=>s.addEventListener("click",()=>this.value=s.dataset.themeValue,{signal:t})),this.toggleButton?.addEventListener("click",()=>{let s=["system","light","dark"];this.value=s[(s.indexOf(this.#e)+1)%s.length]},{signal:t}),this.#i(!1)}disconnectedCallback(){this.#t?.abort()}get value(){return this.#e}set value(t){if(!["system","light","dark"].includes(t))return;this.#e=t,this.#i(!0)}#s(){if(!this.dataset.target)return this.ownerDocument.documentElement;try{return this.ownerDocument.querySelector(this.dataset.target)}catch{return null}}#i(t){let e=this.#s();if(e)if(e.style.colorScheme=this.#e==="system"?"light dark":this.#e,this.#e==="system")e.removeAttribute("data-theme");else e.dataset.theme=this.#e;try{localStorage.setItem(this.key,this.#e)}catch{}if(this.buttons.forEach((s)=>s.setAttribute("aria-pressed",String(s.dataset.themeValue===this.#e))),this.toggleButton){let s=this.#e==="light"?"Light":this.#e==="dark"?"Dark":"System";if(this.toggleContents.length){if(this.toggleContents.forEach((i)=>{i.hidden=i.dataset.themeContent!==this.#e}),this.toggleLabel)this.toggleLabel.textContent=s}else this.toggleButton.textContent=s;this.toggleButton.dataset.theme=this.#e,this.toggleButton.setAttribute("aria-label",`Theme: ${this.#e}. Click to change.`)}if(t)a(this,"change",{value:this.#e})}}n("ot-theme-switcher",y);class f extends HTMLElement{#t;#e;#s;#i;connectedCallback(){this.#t?.abort(),this.#t=new AbortController,this.button=this.querySelector("[data-copy-button]"),this.source=this.#o(),this.#s=this.button?.textContent?.trim()||"",this.#i=this.#r(),this.toggleAttribute("data-enhanced",Boolean(this.button&&this.source)),this.#n(this.dataset.copied||"Copied"),this.button?.addEventListener("click",()=>this.copy(),{signal:this.#t.signal})}disconnectedCallback(){if(this.#t?.abort(),clearTimeout(this.#e),this.button)this.button.textContent=this.#s;if(this.#i)this.#i.textContent=""}#o(){let t=this.button?.dataset.copyTarget||this.dataset.copyTarget;return t&&document.getElementById(t)||this.querySelector("[data-copy-source]")}#r(){if(!this.button||!this.source)return;let t=this.querySelector("[data-copy-status]");if(!t)t=document.createElement("span"),t.dataset.copyStatus="",this.append(t);return t.classList.add("visually-hidden"),t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true"),t.textContent="",t}get value(){let t=this.#o();return t&&"value"in t?t.value:t?.textContent?.trim()||""}#n(t){if(!this.button)return;let e=this.button.cloneNode(!0);e.textContent=t,e.style.cssText="position:fixed!important;inset:0 auto auto 0!important;inline-size:max-content!important;visibility:hidden!important;pointer-events:none!important",this.append(e);let s=Math.ceil(Math.max(this.button.getBoundingClientRect().width,e.getBoundingClientRect().width));e.remove(),this.button.style.minInlineSize=`${s}px`}async copy(){let t=this.value;if(!t)return;try{await navigator.clipboard.writeText(t)}catch{let s=Object.assign(document.createElement("textarea"),{value:t});document.body.append(s),s.select(),document.execCommand("copy"),s.remove()}let e=this.dataset.copied||"Copied";if(this.#n(e),this.button.textContent=e,this.#i)this.#i.textContent=e;a(this,"oatbase:copy",{value:t}),clearTimeout(this.#e),this.#e=setTimeout(()=>{if(this.button)this.button.textContent=this.#s;if(this.#i)this.#i.textContent=""},1200)}}n("ot-copy",f);class v extends f{}n("ot-action-field",v);class A extends HTMLElement{#t;#e;#s=-1;connectedCallback(){this.#e?.abort(),this.#e=u(this,()=>this.#i())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get value(){return[...this.select?.selectedOptions||[]].map((t)=>t.value)}set value(t){let e=new Set([].concat(t).map(String));[...this.select?.options||[]].forEach((s)=>{s.selected=e.has(s.value)}),this.#a()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get enabledOptions(){return this.options.filter((t)=>t.getAttribute("aria-disabled")!=="true")}open(){if(this.select?.disabled)return;this.list.hidden=!1,this.button.setAttribute("aria-expanded","true"),this.#s=0,l(this.enabledOptions,this.#s)}close(){if(!this.list)return;this.list.hidden=!0,this.button.setAttribute("aria-expanded","false"),l(this.enabledOptions,-1),this.#s=-1}toggle(){this.list.hidden?this.open():this.close()}#i(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.select=this.querySelector(":scope > select[multiple]"),!this.select)return;this.#o(),this.button.addEventListener("click",()=>this.toggle(),{signal:t}),this.button.addEventListener("keydown",(e)=>this.#r(e),{signal:t}),this.list.addEventListener("click",(e)=>{let s=e.target.closest('[role="option"]');if(s&&s.getAttribute("aria-disabled")!=="true")this.#n(s)},{signal:t}),this.select.addEventListener("change",()=>this.#a(),{signal:t}),b(this,t),this.dataset.enhanced="",this.#a()}#o(){this.querySelectorAll(":scope > [data-generated]").forEach((e)=>e.remove());let t=c("oatbase-multiselect");this.button=document.createElement("button"),this.button.type="button",this.button.className="outline",this.button.dataset.generated="",this.button.setAttribute("aria-haspopup","listbox"),this.button.setAttribute("aria-controls",t),this.button.setAttribute("aria-expanded","false"),this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),this.list.setAttribute("aria-multiselectable","true"),[...this.select.options].forEach((e,s)=>{let i=document.createElement("li");i.id=`${t}-option-${s+1}`,i._source=e,i.dataset.index=s,i.setAttribute("role","option"),i.setAttribute("aria-disabled",String(e.disabled)),i.textContent=e.textContent,this.list.append(i)}),this.append(this.button,this.list)}#r(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){if(t.preventDefault(),this.list.hidden)this.open();this.#s=p(t.key,this.#s,this.enabledOptions.length),l(this.enabledOptions,this.#s)}else if(t.key===" "||t.key==="Enter")if(t.preventDefault(),this.list.hidden)this.open();else this.#n(this.enabledOptions[this.#s]);else if(t.key==="Escape")this.close()}#n(t){let e=t?._source;if(!e||e.disabled)return;e.selected=!e.selected,this.#a(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),a(this,"oatbase:change",{value:this.value,option:e})}#a(){let t=[...this.select.selectedOptions];this.button.textContent=t.length?t.map((e)=>e.textContent).join(", "):this.dataset.placeholder||"Select options",this.button.disabled=this.select.disabled,this.options.forEach((e)=>e.setAttribute("aria-selected",String(e._source.selected)))}}n("ot-multiselect",A);class E extends HTMLElement{#t;connectedCallback(){if(this.#t?.abort(),this.#t=new AbortController,this.input=this.querySelector("input"),this.button=this.querySelector("[data-password-toggle]"),!this.input||!this.button)return;this.button.type="button",this.button.addEventListener("click",()=>this.toggle(),{signal:this.#t.signal}),this.#e()}disconnectedCallback(){this.#t?.abort()}toggle(t){let e=t??this.input.type==="password";this.input.type=e?"text":"password",this.#e(),this.input.focus()}#e(){let t=this.input.type==="text";this.button.setAttribute("aria-pressed",String(t)),this.button.setAttribute("aria-label",t?"Hide password":"Show password"),this.button.textContent=t?this.dataset.hideLabel||"Hide":this.dataset.showLabel||"Show"}}n("ot-password",E);class w extends HTMLElement{#t;#e=!1;connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.handle=this.querySelector("[data-splitter]"),!this.handle)return;this.handle.type="button",this.handle.setAttribute("role","separator"),this.handle.setAttribute("aria-orientation",this.separatorOrientation),this.handle.setAttribute("aria-valuemin",String(this.min)),this.handle.setAttribute("aria-valuemax",String(this.max)),this.handle.addEventListener("pointerdown",(e)=>{this.#e=!0,this.handle.setPointerCapture?.(e.pointerId),this.#s(e)},{signal:t}),this.handle.addEventListener("pointermove",(e)=>this.#e&&this.#s(e),{signal:t}),this.handle.addEventListener("pointerup",()=>{this.#e=!1},{signal:t}),this.handle.addEventListener("keydown",(e)=>{if(!(this.vertical?["ArrowUp","ArrowDown","Home","End"]:["ArrowLeft","ArrowRight","Home","End"]).includes(e.key))return;e.preventDefault();let i=e.key==="ArrowLeft"||e.key==="ArrowUp",o=e.key==="Home"?this.min:e.key==="End"?this.max:this.value+(i?-5:5);this.value=o},{signal:t}),this.value=Number(this.dataset.value||50)}disconnectedCallback(){this.#t?.abort()}get min(){return Number(this.dataset.min||20)}get max(){return Number(this.dataset.max||80)}get vertical(){return this.getAttribute("aria-orientation")==="vertical"}get separatorOrientation(){return this.vertical?"horizontal":"vertical"}get value(){return Number(this.handle?.getAttribute("aria-valuenow")||50)}set value(t){let e=Math.min(this.max,Math.max(this.min,Math.round(Number(t))));this.style.setProperty("--split",`${e}%`),this.handle?.setAttribute("aria-valuenow",String(e)),a(this,"oatbase:resize",{value:e})}#s(t){let e=this.getBoundingClientRect();this.value=this.vertical?(t.clientY-e.top)/e.height*100:(t.clientX-e.left)/e.width*100}}n("ot-splitter",w);class k extends HTMLElement{#t;connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.querySelector(":scope > ul");if(!t)return;t.setAttribute("role","tree"),this.querySelectorAll("li").forEach((s)=>{s.setAttribute("role","treeitem");let i=s.querySelector(":scope > ul");if(i){if(i.setAttribute("role","group"),!s.hasAttribute("aria-expanded"))s.setAttribute("aria-expanded","false")}let o=s.firstElementChild;if(o)o.tabIndex=-1});let e=this.visibleItems[0]?.firstElementChild;if(e)e.tabIndex=0;this.addEventListener("click",(s)=>{let i=s.target.closest('[role="treeitem"]');if(i?.hasAttribute("aria-expanded"))i.setAttribute("aria-expanded",String(i.getAttribute("aria-expanded")!=="true"))},{signal:this.#t.signal}),this.addEventListener("keydown",(s)=>this.#s(s),{signal:this.#t.signal})}disconnectedCallback(){this.#t?.abort()}get visibleItems(){return[...this.querySelectorAll('[role="treeitem"]')].filter((t)=>t.offsetParent!==null)}#e(t){this.querySelectorAll('[role="treeitem"] > :first-child').forEach((s)=>{s.tabIndex=-1});let e=t?.firstElementChild;if(e)e.tabIndex=0,e.focus()}#s(t){let e=t.target.closest('[role="treeitem"]');if(!e)return;let s=this.visibleItems,i=s.indexOf(e);if(t.key==="ArrowDown")this.#e(s[i+1]||s[0]);else if(t.key==="ArrowUp")this.#e(s[i-1]||s.at(-1));else if(t.key==="Home")this.#e(s[0]);else if(t.key==="End")this.#e(s.at(-1));else if(t.key==="ArrowRight"&&e.hasAttribute("aria-expanded"))e.setAttribute("aria-expanded","true");else if(t.key==="ArrowLeft"&&e.getAttribute("aria-expanded")==="true")e.setAttribute("aria-expanded","false");else return;t.preventDefault()}}n("ot-tree",k);class C extends HTMLElement{connectedCallback(){if(this.button=this.querySelector(":scope > button"),!this.button)return;this.button.type="button",this.pressed=this.hasAttribute("pressed")||this.button.getAttribute("aria-pressed")==="true",this.button.addEventListener("click",this)}disconnectedCallback(){this.button?.removeEventListener("click",this)}handleEvent(){if(this.button.disabled||this.button.getAttribute("aria-disabled")==="true")return;this.pressed=!this.pressed,a(this,"oatbase:change",{pressed:this.pressed})}get pressed(){return this.hasAttribute("pressed")}set pressed(t){this.toggleAttribute("pressed",Boolean(t)),this.button?.setAttribute("aria-pressed",String(Boolean(t)))}}n("ot-toggle",C);class S extends HTMLElement{connectedCallback(){if(!this.hasAttribute("role"))this.setAttribute("role","toolbar");if(!this.hasAttribute("aria-orientation"))this.setAttribute("aria-orientation","horizontal");this.refresh(),this.addEventListener("focusin",this),this.addEventListener("keydown",this)}disconnectedCallback(){this.removeEventListener("focusin",this),this.removeEventListener("keydown",this)}handleEvent(t){if(t.type==="keydown")return this.#e(t);let e=this.items.indexOf(t.target);if(e>=0)this.#t(e,!1)}refresh(){this.items=[...this.children].map((e)=>e.matches("ot-toggle")?e.querySelector("button"):e).filter((e)=>e?.matches("button:not(:disabled), a[href], [data-toolbar-item]")&&e.getAttribute("aria-disabled")!=="true");let t=Math.max(0,this.items.findIndex((e)=>e.tabIndex===0));this.items.forEach((e,s)=>{e.tabIndex=s===t?0:-1})}#t(t,e=!0){if(!this.items.length)return;let s=(t+this.items.length)%this.items.length;if(this.items.forEach((i,o)=>{i.tabIndex=o===s?0:-1}),e)this.items[s].focus()}#e(t){let e=this.items.indexOf(t.target);if(e<0)return;let s=this.getAttribute("aria-orientation")==="vertical",i=e;if(t.key==="Home")i=0;else if(t.key==="End")i=this.items.length-1;else if(s&&t.key==="ArrowDown")i=e+1;else if(s&&t.key==="ArrowUp")i=e-1;else if(!s&&t.key==="ArrowRight")i=e+1;else if(!s&&t.key==="ArrowLeft")i=e-1;else return;t.preventDefault(),this.#t(i)}}n("ot-toolbar",S);class L extends HTMLElement{#t=!1;connectedCallback(){if(this.input=this.querySelector(":scope > input"),!this.input)return;if(this.length=Math.min(12,Math.max(1,Number(this.dataset.length||this.input.maxLength||6))),this.input.maxLength<1)this.input.maxLength=this.length;if(this.slots=this.querySelector(":scope > [data-otp-slots]")||document.createElement("span"),this.slots.dataset.otpSlots="",this.slots.setAttribute("aria-hidden","true"),this.slots.style.setProperty("--otp-length",this.length),!this.slots.isConnected)this.append(this.slots);this.slots.replaceChildren(...Array.from({length:this.length},()=>document.createElement("span"))),this.input.addEventListener("input",this),this.form=this.input.form,this.form?.addEventListener("reset",this),this.dataset.enhanced="",this.#e(!1)}disconnectedCallback(){this.input?.removeEventListener("input",this),this.form?.removeEventListener("reset",this)}handleEvent(t){if(t.type==="reset")setTimeout(()=>this.#e(!1));else this.#e(!0)}get value(){return this.input?.value||""}set value(t){if(!this.input)return;this.input.value=String(t).slice(0,this.length),this.#e(!1)}#e(t){if(!this.input||!this.slots)return;if(this.input.inputMode==="numeric"){let o=this.input.value.replace(/\D/g,"").slice(0,this.length);if(o!==this.input.value)this.input.value=o}else if(this.input.value.length>this.length)this.input.value=this.input.value.slice(0,this.length);let e=this.input.value,s=Math.min(this.length-1,e.length);[...this.slots.children].forEach((o,r)=>{o.textContent=e[r]||" ",o.toggleAttribute("data-filled",r dialog[data-lightbox-dialog]"),this.image=this.dialog?.querySelector("[data-lightbox-image]"),this.caption=this.dialog?.querySelector("[data-lightbox-caption]"),this.status=this.dialog?.querySelector("[data-lightbox-status]"),this.previousButton=this.dialog?.querySelector("[data-lightbox-previous]"),this.nextButton=this.dialog?.querySelector("[data-lightbox-next]"),this.closeButton=this.dialog?.querySelector("[data-lightbox-close]"),!this.dialog||!this.image||typeof this.dialog.showModal!=="function")return;let t={signal:this.#t.signal};this.addEventListener("click",(e)=>this.#i(e),t),this.dialog.addEventListener("keydown",(e)=>this.#o(e),t),this.dialog.addEventListener("close",()=>this.#a(),t),this.previousButton?.addEventListener("click",()=>this.previous(),t),this.nextButton?.addEventListener("click",()=>this.next(),t),this.closeButton?.addEventListener("click",()=>this.close(),t),this.toggleAttribute("data-enhanced",!0)}disconnectedCallback(){this.#t?.abort()}get items(){return[...this.querySelectorAll("[data-lightbox-item]")].filter((t)=>!this.dialog?.contains(t))}get currentIndex(){return this.#e}open(t=0){let e=this.items,s=typeof t==="number"?t:e.indexOf(t);if(!e.length||s<0||s>=e.length||!this.dialog||!this.image)return;if(this.#s=e[s],this.#r(s),!this.dialog.open)this.dialog.showModal();a(this,"oatbase:open",{index:s,item:e[s]})}close(){this.dialog?.close()}next(){let t=this.items.length;if(t)this.#r((this.#e+1+t)%t)}previous(){let t=this.items.length;if(t)this.#r((this.#e-1+t)%t)}#i(t){let e=t.target.closest?.("[data-lightbox-item]");if(!e||this.dialog.contains(e))return;if(t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;t.preventDefault(),this.open(e)}#o(t){if(t.key==="ArrowRight")this.next();else if(t.key==="ArrowLeft")this.previous();else if(t.key==="Home")this.#r(0);else if(t.key==="End")this.#r(this.items.length-1);else return;t.preventDefault()}#r(t){let e=this.items,s=e[t];if(!s)return;let i=s.matches("img")?s:s.querySelector("img"),o=s.dataset.lightboxSrc||s.getAttribute("href")||i?.currentSrc||i?.src;if(!o)return;let r=s.closest("figure"),h=s.dataset.lightboxCaption??r?.querySelector("figcaption")?.textContent.trim()??"";if(this.image.src=o,this.image.alt=s.dataset.lightboxAlt??i?.alt??"",this.caption)this.caption.textContent=h,this.caption.hidden=!h;if(this.status)this.status.textContent=`${t+1} of ${e.length}`;if(this.previousButton)this.previousButton.disabled=e.length<2;if(this.nextButton)this.nextButton.disabled=e.length<2;this.#e=t,this.#n(e[(t-1+e.length)%e.length]),this.#n(e[(t+1)%e.length]),a(this,"oatbase:change",{index:t,item:s,source:o})}#n(t){if(!t||this.items.length<2)return;let e=t.matches("img")?t:t.querySelector("img"),s=t.dataset.lightboxSrc||t.getAttribute("href")||e?.currentSrc||e?.src;if(s)Object.assign(new Image,{src:s})}#a(){let t=this.#s;this.#s=null,t?.focus?.({preventScroll:!0}),a(this,"oatbase:close",{index:this.#e,item:this.items[this.#e]})}}n("ot-lightbox",q);class I extends HTMLElement{#t;#e;#s;#i;#o="";connectedCallback(){this.#t?.abort(),this.#t=new AbortController,this.#s?.disconnect(),this.#s=new MutationObserver(()=>this.refresh()),this.#s.observe(this,{childList:!0,subtree:!0}),this.refresh()}disconnectedCallback(){this.#t?.abort(),this.#e?.abort(),this.#s?.disconnect(),cancelAnimationFrame(this.#i)}get activeId(){return this.#o}refresh(){this.#e?.abort(),this.#e=new AbortController;let t=this.#r(this.dataset.target)||document;if(this.links=[...this.querySelectorAll('a[href^="#"]')],this.targets=this.links.map((s)=>{let i=decodeURIComponent(s.hash.slice(1)),o=i?document.getElementById(i):null;return o&&(t===document||t.contains(o))?o:null}).filter(Boolean),this.root=this.#r(this.dataset.scrollRoot),!this.targets.length){this.removeAttribute("data-enhanced");return}let e={passive:!0,signal:this.#e.signal};(this.root||window).addEventListener("scroll",()=>this.#n(),e),window.addEventListener("resize",()=>this.#n(),e),this.toggleAttribute("data-enhanced",!0),this.#a()}#r(t){if(!t)return null;try{return document.querySelector(t)}catch{return null}}#n(){cancelAnimationFrame(this.#i),this.#i=requestAnimationFrame(()=>this.#a())}#a(){if(!this.targets?.length)return;let t=Number.parseFloat(this.dataset.offset||"16")||0,s=(this.root?.getBoundingClientRect().top||0)+t,i=this.targets[0];for(let r of this.targets)if(r.getBoundingClientRect().top<=s+1)i=r;else break;if(this.root?this.root.scrollTop+this.root.clientHeight>=this.root.scrollHeight-1:window.scrollY+window.innerHeight>=document.documentElement.scrollHeight-1)i=this.targets.at(-1);if(!i||i.id===this.#o)return;this.#o=i.id,this.links.forEach((r)=>{let h=decodeURIComponent(r.hash.slice(1))===i.id;if(h)r.setAttribute("aria-current","location");else r.removeAttribute("aria-current");r.toggleAttribute("data-active",h)}),a(this,"oatbase:change",{id:i.id,target:i})}}n("ot-scrollspy",I);class M extends HTMLElement{#t;connectedCallback(){if(this.#t?.abort(),this.#t=new AbortController,typeof HTMLElement.prototype.showPopover!=="function")return;let t=[...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')];if(t.forEach((e)=>this.#e(e)),t.length)this.toggleAttribute("data-enhanced",!0)}disconnectedCallback(){this.#t?.abort()}#e(t){let e=decodeURIComponent(t.hash.slice(1)),s=e&&document.getElementById(e);if(!s)return;let i=t.closest("ot-dropdown[data-footnote-preview]"),o=i?.querySelector("[data-footnote-popover]");if(!i||!o){i=document.createElement("ot-dropdown"),i.dataset.footnotePreview="";let{parentNode:r,nextSibling:h}=t;i.append(t),o=document.createElement("aside"),o.id=c("oatbase-footnote"),o.className="card",o.dataset.footnotePopover="",o.setAttribute("popover","auto"),o.setAttribute("role","note"),o.setAttribute("aria-label",`Footnote ${t.textContent.trim()}`);let d=s.cloneNode(!0);d.removeAttribute("id"),d.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove(),d.querySelectorAll("[id]").forEach((R)=>R.removeAttribute("id")),d.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((R)=>R.remove());let $=document.createElement("div");while(d.firstChild)$.append(d.firstChild);o.append($),i.append(o),t.setAttribute("popovertarget",o.id),t.setAttribute("aria-controls",o.id),r.insertBefore(i,h)}t.addEventListener("click",(r)=>{if(r.metaKey||r.ctrlKey||r.shiftKey||r.altKey)return;if(r.preventDefault(),o.matches(":popover-open"))o.hidePopover();else o.showPopover()},{signal:this.#t.signal})}}n("ot-footnotes",M);class O extends HTMLElement{#t;#e;connectedCallback(){this.#t?.abort(),this.#t=new AbortController,this.refresh()}disconnectedCallback(){this.#t?.abort(),cancelAnimationFrame(this.#e)}refresh(){if(this.#t?.abort(),this.#t=new AbortController,this.progress=this.querySelector("progress"),this.target=this.#s(this.dataset.target),this.root=this.#s(this.dataset.scrollRoot),!this.progress||!this.target)return;this.progress.max=100;let t={passive:!0,signal:this.#t.signal};(this.root||window).addEventListener("scroll",()=>this.#i(),t),window.addEventListener("resize",()=>this.#i(),t),this.toggleAttribute("data-enhanced",!0),this.#o()}#s(t){if(!t)return null;try{return document.querySelector(t)}catch{return null}}#i(){cancelAnimationFrame(this.#e),this.#e=requestAnimationFrame(()=>this.#o())}#o(){let t=this.root?.getBoundingClientRect(),e=this.target.getBoundingClientRect(),s=this.root?.scrollTop||window.scrollY,i=this.root?.clientHeight||window.innerHeight,o=s+e.top-(t?.top||0),r=Math.max(1,this.target.scrollHeight-i),h=Math.min(100,Math.max(0,(s-o)/r*100));this.progress.value=h}}n("ot-reading-progress",O);var j=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});class H extends HTMLElement{#t;#e=new WeakMap;#s={index:-1,direction:"none"};connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.table=this.querySelector(":scope > table, :scope > .scroll-area > table"),!this.table)return;this.filter=this.querySelector("[data-table-filter]"),this.selectAll=this.querySelector("[data-table-select-all]"),this.status=this.querySelector("[data-table-status]"),this.selectedStatus=this.querySelector("[data-table-selected]"),this.empty=this.querySelector("[data-table-empty]"),this.#i(t),this.refresh(),this.filter?.addEventListener("input",()=>this.#a(),{signal:t}),this.table.addEventListener("change",(e)=>{if(e.target.matches("[data-table-select-row]"))this.#c(e.target);else if(e.target.matches("[data-table-select-all]"))this.#l(e.target.checked)},{signal:t}),this.addEventListener("oatbase:refresh",()=>this.refresh(),{signal:t}),this.dataset.enhanced=""}disconnectedCallback(){this.#t?.abort()}get rows(){return[...this.table?.tBodies[0]?.rows||[]]}get visibleRows(){return this.rows.filter((t)=>!t.hidden)}get selectedRows(){return this.rows.filter((t)=>t.querySelector("[data-table-select-row]:checked"))}refresh(){this.rows.forEach((t,e)=>{if(!this.#e.has(t))this.#e.set(t,e)}),this.#a(!1)}#i(t){[...this.table.tHead?.rows[0]?.cells||[]].forEach((e,s)=>{if(!e.hasAttribute("data-sort"))return;let i=e.querySelector(":scope > [data-table-sort]");if(!i)i=document.createElement("button"),i.type="button",i.dataset.tableSort="",i.className="ghost",i.append(...e.childNodes),e.append(i);e.setAttribute("aria-sort","none"),i.addEventListener("click",()=>this.#o(e,s),{signal:t})})}#o(t,e){let s=this.#s.index!==e||this.#s.direction==="none"?"ascending":this.#s.direction==="ascending"?"descending":"none";this.#s={index:e,direction:s},[...this.table.tHead?.rows[0]?.cells||[]].filter((r)=>r.hasAttribute("data-sort")).forEach((r)=>r.setAttribute("aria-sort",r===t?s:"none"));let i=t.dataset.sort||"text",o=[...this.rows].sort((r,h)=>{if(s==="none")return this.#e.get(r)-this.#e.get(h);let d=this.#n(this.#r(r,e),this.#r(h,e),i);return s==="ascending"?d:-d});this.table.tBodies[0].append(...o),a(this,"oatbase:sort",{index:e,direction:s,type:i,header:t})}#r(t,e){let s=t.cells[e];return s?.dataset.sortValue??s?.textContent.trim()??""}#n(t,e,s){if(s==="number")return(Number(t)||0)-(Number(e)||0);if(s==="date")return(Date.parse(t)||0)-(Date.parse(e)||0);return j.compare(t,e)}#a(t=!0){let e=this.filter?.value.trim().toLocaleLowerCase()||"";this.rows.forEach((o)=>{let r=(o.dataset.filterValue||o.textContent).toLocaleLowerCase();o.hidden=Boolean(e&&!r.includes(e))});let s=this.visibleRows.length,i=this.rows.length;if(this.status)this.status.value=e?`${s} of ${i} rows`:`${i} rows`;if(this.empty)this.empty.hidden=s>0;if(this.#h(),t)a(this,"oatbase:filter",{query:e,visible:s,total:i})}#l(t){this.visibleRows.forEach((e)=>{let s=e.querySelector("[data-table-select-row]:not(:disabled)");if(s)s.checked=t}),this.#h(),this.#d()}#c(t){t.closest("tr")?.toggleAttribute("data-selected",t.checked),this.#h(),this.#d()}#h(){this.rows.forEach((s)=>s.toggleAttribute("data-selected",Boolean(s.querySelector("[data-table-select-row]:checked"))));let t=this.visibleRows.map((s)=>s.querySelector("[data-table-select-row]:not(:disabled)")).filter(Boolean),e=t.filter((s)=>s.checked).length;if(this.selectAll)this.selectAll.checked=t.length>0&&e===t.length,this.selectAll.indeterminate=e>0&&et.querySelector("[data-table-select-row]")?.value).filter((t)=>t!=null)})}}n("ot-data-table",H);class T extends HTMLElement{#t;#e;#s=0;connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.list=this.querySelector(":scope > [data-repeater-list]"),this.template=this.querySelector(":scope > template[data-repeater-template]"),!this.list||!this.template)return;if(this.#e==null)this.#e=this.list.innerHTML;this.#i(),this.addEventListener("click",(e)=>this.#o(e),{signal:t}),this.closest("form")?.addEventListener("reset",()=>queueMicrotask(()=>this.#r()),{signal:t}),this.dataset.enhanced="",this.refresh()}disconnectedCallback(){this.#t?.abort()}get items(){return[...this.list?.querySelectorAll(":scope > [data-repeater-item]")||[]]}get min(){return Math.max(0,Number(this.dataset.min)||0)}get max(){return Math.max(this.min,Number(this.dataset.max)||1/0)}add(){if(!this.template||this.items.length>=this.max)return null;let t=this.#s++,e=this.template.content.cloneNode(!0);[...e.querySelectorAll("*")].forEach((o)=>{if([...o.attributes].forEach((r)=>{if(r.value.includes("__index__"))o.setAttribute(r.name,r.value.replaceAll("__index__",String(t)))}),o.hasAttribute("data-repeater-number"))o.textContent=String(t+1)});let i=e.querySelector("[data-repeater-item]");if(!i)return null;return i.dataset.repeaterIndex=t,this.list.append(e),this.refresh(),i.querySelector('[data-repeater-focus], input:not([type="hidden"]), select, textarea, button')?.focus(),a(this,"oatbase:add",{item:i,index:t}),i}remove(t){if(!t?.matches?.("[data-repeater-item]")||!this.list?.contains(t)||this.items.length<=this.min)return!1;let e=Number(t.dataset.repeaterIndex),s=t.previousElementSibling?.querySelector("[data-repeater-remove]")||t.nextElementSibling?.querySelector("[data-repeater-remove]")||this.querySelector("[data-repeater-add]");return t.remove(),this.refresh(),s?.focus(),a(this,"oatbase:remove",{item:t,index:e}),!0}refresh(){let t=this.items,e=t.length<=this.min,s=t.length>=this.max;this.querySelectorAll("[data-repeater-add]").forEach((i)=>{i.disabled=s}),t.forEach((i,o)=>{i.querySelectorAll("[data-repeater-remove]").forEach((r)=>{r.disabled=e}),i.querySelectorAll("[data-repeater-position]").forEach((r)=>{r.value=String(o+1)})}),this.toggleAttribute("data-empty",t.length===0)}#i(){this.#s=0,this.items.forEach((t)=>{let e=Number(t.dataset.repeaterIndex),s=Number.isFinite(e)?e:this.#s;t.dataset.repeaterIndex=s,this.#s=Math.max(this.#s,s+1)})}#o(t){let e=t.target.closest("[data-repeater-add]");if(e&&this.contains(e)){t.preventDefault(),this.add();return}let s=t.target.closest("[data-repeater-remove]");if(s&&this.contains(s))t.preventDefault(),this.remove(s.closest("[data-repeater-item]"))}#r(){this.list.innerHTML=this.#e,this.#i(),this.refresh(),a(this,"oatbase:reset",{items:this.items})}}n("ot-repeater",T);class B extends HTMLElement{#t;#e;#s;connectedCallback(){this.#t?.abort(),this.#e?.disconnect(),this.#t=new AbortController;let t=this.#t.signal;if(this.log=this.querySelector(':scope > [role="log"], :scope > .scroll-area[role="log"]'),!this.log)return;this.content=this.log.querySelector("[data-log-content]")||this.log,this.follow=this.querySelector("[data-log-follow]"),this.status=this.querySelector("[data-log-status]"),this.log.setAttribute("aria-relevant",this.log.getAttribute("aria-relevant")||"additions text"),this.follow?.addEventListener("change",()=>{if(this.toggleAttribute("data-following",this.follow.checked),this.follow.checked)this.#o();a(this,"oatbase:follow",{following:this.follow.checked})},{signal:t}),this.log.addEventListener("scroll",()=>this.#r(),{signal:t,passive:!0}),this.#e=new MutationObserver(()=>this.#i()),this.#e.observe(this.content,{childList:!0,subtree:!0,characterData:!0}),this.dataset.enhanced="",this.refresh()}disconnectedCallback(){if(this.#t?.abort(),this.#e?.disconnect(),this.#s)cancelAnimationFrame(this.#s)}get lineCount(){let t=this.content?.querySelectorAll?.("[data-log-line]");if(t?.length)return t.length;let e=this.content?.textContent||"";return e?e.replace(/\r\n?/g,`
+(()=>{var{defineProperty:R,getOwnPropertyNames:$,getOwnPropertyDescriptor:P}=Object,_=Object.prototype.hasOwnProperty;function F(t){return this[t]}var K=(t)=>{var e=(N??=new WeakMap).get(t),s;if(e)return e;if(e=R({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function"){for(var i of $(t))if(!_.call(e,i))R(e,i,{get:F.bind(t,i),enumerable:!(s=P(t,i))||s.enumerable})}return N.set(t,e),e},N;var U=(t)=>t;function z(t,e){this[t]=U.bind(null,e)}var W=(t,e)=>{for(var s in e)R(t,s,{get:e[s],enumerable:!0,configurable:!0,set:z.bind(e,s)})};var X={};W(X,{OtTree:()=>k,OtToolbar:()=>S,OtToggle:()=>C,OtThemeSwitcher:()=>v,OtSplitter:()=>E,OtSelect:()=>x,OtScrollspy:()=>I,OtRepeater:()=>B,OtReadingProgress:()=>O,OtPassword:()=>w,OtOtp:()=>L,OtMultiselect:()=>A,OtLogViewer:()=>T,OtLightbox:()=>q,OtFootnotes:()=>M,OtDataTable:()=>H,OtCopy:()=>b,OtCommand:()=>g,OtCombobox:()=>m,OtActionField:()=>y});var V=0,c=(t="oatbase")=>`${t}-${++V}`;function a(t,e){if(!customElements.get(t))customElements.define(t,e)}function d(t,e){if(document.readyState!=="loading"){e();return}let s=new AbortController;return document.addEventListener("DOMContentLoaded",()=>{if(t.isConnected)e()},{once:!0,signal:s.signal}),s}function h(t,e){t.forEach((i,o)=>i.toggleAttribute("data-active",o===e));let s=t[e];return s?.scrollIntoView({block:"nearest"}),s}function u(t,e,s){if(!s)return-1;if(t==="ArrowDown")return(e+1+s)%s;if(t==="ArrowUp")return(e-1+s)%s;if(t==="Home")return 0;if(t==="End")return s-1;return e}function n(t,e,s){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:s}))}var D=new Set;document.addEventListener("pointerdown",(t)=>{D.forEach((e)=>{if(!e.contains(t.target))e.close()})});function p(t,e){D.add(t),e.addEventListener("abort",()=>D.delete(t),{once:!0})}class m extends HTMLElement{#e;#t;#s=-1;connectedCallback(){this.#t?.abort(),this.#t=d(this,()=>this.#i())}disconnectedCallback(){this.#t?.abort(),this.#e?.abort()}get value(){return this.select?.value||""}set value(t){if(!this.select)return;this.select.value=String(t),this.#d()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get visibleOptions(){return this.options.filter((t)=>!t.hidden&&t.getAttribute("aria-disabled")!=="true")}open(){if(this.input?.disabled)return;this.list.hidden=!1,this.input.setAttribute("aria-expanded","true")}close(){if(!this.list)return;this.list.hidden=!0,this.input?.setAttribute("aria-expanded","false"),this.input?.removeAttribute("aria-activedescendant"),h(this.visibleOptions,-1),this.#s=-1}#i(){this.#e?.abort(),this.#e=new AbortController;let t=this.#e.signal;if(this.select=this.querySelector(":scope > select"),!this.select)return;this.#o(),this.input.addEventListener("input",()=>this.#r(),{signal:t}),this.input.addEventListener("focus",()=>this.open(),{signal:t}),this.input.addEventListener("keydown",(e)=>this.#n(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#a(e),{signal:t}),this.list.addEventListener("click",(e)=>this.#l(e),{signal:t}),this.select.addEventListener("change",()=>this.#d(),{signal:t}),this.select.form?.addEventListener("reset",()=>queueMicrotask(()=>this.#d()),{signal:t}),p(this,t),this.dataset.enhanced="",this.#d()}#o(){this.querySelectorAll(":scope > [data-generated]").forEach((s)=>s.remove());let t=c("oatbase-combobox");this.input=document.createElement("input"),this.input.type="search",this.input.autocomplete="off",this.input.placeholder=this.dataset.placeholder||"Search…",this.input.disabled=this.select.disabled,this.input.dataset.generated="",this.input.setAttribute("role","combobox"),this.input.setAttribute("aria-autocomplete","list"),this.input.setAttribute("aria-controls",t),this.input.setAttribute("aria-expanded","false");let e=this.select.getAttribute("aria-label");if(e)this.input.setAttribute("aria-label",e);if(this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),[...this.select.options].forEach((s,i)=>this.#h(s,i)),this.hasAttribute("data-allow-custom"))this.create=document.createElement("li"),this.create.id=`${t}-create`,this.create.dataset.create="",this.create.dataset.generated="",this.create.setAttribute("role","option"),this.create.setAttribute("aria-selected","false"),this.create.hidden=!0,this.list.append(this.create);this.empty=document.createElement("li"),this.empty.dataset.empty="",this.empty.dataset.generated="",this.empty.textContent=this.dataset.empty||"No results found.",this.empty.hidden=!0,this.list.append(this.empty),this.append(this.input,this.list)}#r(){let t=this.input.value.trim(),e=t.toLocaleLowerCase(),s=this.select.options[this.select.selectedIndex];if(s&&this.input.value!==s.textContent)this.select.selectedIndex=-1,this.options.forEach((o)=>o.setAttribute("aria-selected","false"));let i=this.options.filter((o)=>!o.hasAttribute("data-create"));if(i.forEach((o)=>{let r=`${o.textContent} ${o.dataset.keywords}`.toLocaleLowerCase();o.hidden=!r.includes(e)}),this.create){let o=i.some((r)=>{let l=r._source;return r.textContent.trim().toLocaleLowerCase()===e||l?.value.toLocaleLowerCase()===e});this.create.hidden=!t||o,this.create.dataset.value=t,this.create.textContent=(this.dataset.createLabel||"Create “{value}”").replace("{value}",t)}this.empty.hidden=this.visibleOptions.length>0,this.#s=-1,this.open()}#n(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){t.preventDefault(),this.open(),this.#s=u(t.key,this.#s,this.visibleOptions.length);let e=h(this.visibleOptions,this.#s);if(e)this.input.setAttribute("aria-activedescendant",e.id)}else if(t.key==="Enter"&&(this.#s>=0||this.create&&!this.create.hidden))t.preventDefault(),this.#c(this.#s>=0?this.visibleOptions[this.#s]:this.create);else if(t.key==="Escape")this.close()}#a(t){let e=t.target.closest('[role="option"]');if(!e||e.hidden||e.getAttribute("aria-disabled")==="true")return;this.#s=this.visibleOptions.indexOf(e),h(this.visibleOptions,this.#s)}#l(t){let e=t.target.closest('[role="option"]');if(e&&e.getAttribute("aria-disabled")!=="true")this.#c(e)}#c(t){if(!t)return;if(t.hasAttribute("data-create")){let s=t.dataset.value.trim();if(!s)return;let i=new Option(s,s,!0,!0);i.dataset.custom="",this.select.append(i);let o=this.#h(i,i.index,this.create);n(this,"oatbase:create",{value:s,option:i}),t=o}let e=t._source;this.select.selectedIndex=e.index,this.#d(),this.close(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),n(this,"oatbase:change",{value:e.value,option:e}),this.input.focus()}#h(t,e,s=null){if(!t.value&&t.disabled)return null;let i=document.createElement("li");return i.id=`${this.list.id}-option-${e+1}`,i._source=t,i.dataset.index=e,i.dataset.keywords=t.dataset.keywords||"",i.setAttribute("role","option"),i.setAttribute("aria-disabled",String(t.disabled)),i.setAttribute("aria-selected","false"),i.textContent=t.textContent,this.list.insertBefore(i,s),i}#d(){let t=this.select.options[this.select.selectedIndex];this.input.value=t&&t.value?t.textContent:"",this.input.disabled=this.select.disabled,this.options.forEach((e)=>{e.setAttribute("aria-selected",String(e._source===t))})}}a("ot-combobox",m);class g extends HTMLElement{#e;#t;#s=-1;connectedCallback(){this.#t?.abort(),this.#t=d(this,()=>this.#i())}disconnectedCallback(){this.#t?.abort(),this.#e?.abort()}get items(){return this.list?[...this.list.querySelectorAll("[data-command-item]")]:[]}get visibleItems(){return this.items.filter((t)=>!t.hidden&&!t.closest("li")?.hidden&&!t.hasAttribute("aria-disabled"))}get query(){return this.search?.value.trim()||""}open(){if(!this.dialog.open)this.dialog.showModal();this.search.setAttribute("aria-expanded","true"),this.search.value="",this.#o(),requestAnimationFrame(()=>this.search.focus()),n(this,"oatbase:open")}close(){if(this.dialog.open)this.dialog.close();this.search?.setAttribute("aria-expanded","false"),n(this,"oatbase:close")}#i(){this.#e?.abort(),this.#e=new AbortController;let t=this.#e.signal;if(this.dialog=this.querySelector(":scope > dialog"),this.search=this.dialog?.querySelector("[data-command-search]"),this.list=this.dialog?.querySelector("[data-command-list]"),!this.dialog||!this.search||!this.list)return;this.list.id||=c("oatbase-command"),this.list.setAttribute("role","listbox"),this.search.setAttribute("role","combobox"),this.search.setAttribute("aria-autocomplete","list"),this.search.setAttribute("aria-expanded",String(this.dialog.open)),this.search.setAttribute("aria-controls",this.list.id),this.querySelectorAll("[data-command-open]").forEach((e)=>{e.addEventListener("click",(s)=>{s.preventDefault(),this.open()},{signal:t})}),this.querySelectorAll("[data-command-close]").forEach((e)=>{e.addEventListener("click",()=>this.close(),{signal:t})}),this.search.addEventListener("input",()=>this.#o(),{signal:t}),this.search.addEventListener("keydown",(e)=>this.#a(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#l(e),{signal:t}),this.list.addEventListener("click",(e)=>{let s=e.target.closest("[data-command-item]");if(s&&!s.hasAttribute("aria-disabled"))this.#h(s)},{signal:t}),this.dialog.addEventListener("click",(e)=>{let s=this.dialog.getBoundingClientRect();if(e.clientXs.right||e.clientYs.bottom)this.close()},{signal:t}),this.dialog.addEventListener("close",()=>this.search.setAttribute("aria-expanded","false"),{signal:t}),document.addEventListener("keydown",(e)=>{if(this.dataset.shortcut?.toLowerCase()==="mod+k"&&(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="k")e.preventDefault(),this.dialog.open?this.close():this.open()},{signal:t}),this.refresh()}refresh(){if(!this.list||!this.search)return;this.#r(),this.#n()}#o(){if(this.dispatchEvent(new CustomEvent("oatbase:query",{bubbles:!0,composed:!0,cancelable:!0,detail:{query:this.query}})))this.#r();this.#n()}#r(){if(this.dataset.filter!=="manual"){let t=this.query.toLocaleLowerCase();this.items.forEach((e)=>{let s=`${e.textContent} ${e.dataset.keywords||""}`.toLocaleLowerCase(),i=e.closest("li")||e;i.hidden=!s.includes(t)})}}#n(){this.items.forEach((s)=>{s.id||=c("oatbase-command-item"),s.setAttribute("role","option")}),this.list.querySelectorAll("[data-command-group]").forEach((s)=>{let i=s.nextElementSibling,o=!1;while(i&&!i.hasAttribute("data-command-group")){if((i.matches("[data-command-item]")||i.querySelector("[data-command-item]"))&&!i.hidden)o=!0;i=i.nextElementSibling}s.hidden=!o});let t=this.visibleItems;this.querySelector("[data-command-empty]")?.toggleAttribute("hidden",t.length>0);let e=t.findIndex((s)=>s.hasAttribute("data-active"));this.#c(e>=0?e:t.length?0:-1)}#a(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key))t.preventDefault(),this.#c(u(t.key,this.#s,this.visibleItems.length));else if(t.key==="Enter"&&this.#s>=0)t.preventDefault(),this.#h(this.visibleItems[this.#s])}#l(t){let e=t.target.closest("[data-command-item]");if(!e||e.closest("li")?.hidden||e.hasAttribute("aria-disabled"))return;this.#c(this.visibleItems.indexOf(e))}#c(t){this.#s=t;let e=this.visibleItems,s=h(e,t);if(this.items.forEach((i)=>i.setAttribute("aria-selected",String(i===s))),s)this.search.setAttribute("aria-activedescendant",s.id);else this.search.removeAttribute("aria-activedescendant")}#h(t){if(!t)return;let e=t.dataset.value||t.textContent.trim();if(!this.dispatchEvent(new CustomEvent("oatbase:select",{bubbles:!0,composed:!0,cancelable:!0,detail:{value:e,item:t}})))return;if(!t.hasAttribute("data-keep-open"))this.close()}}a("ot-command",g);class x extends HTMLElement{#e;#t;#s=-1;connectedCallback(){this.#t?.abort(),this.#t=d(this,()=>this.#i())}disconnectedCallback(){this.#t?.abort(),this.#e?.abort()}get value(){return this.select?.value||""}set value(t){if(!this.select)return;this.select.value=String(t),this.#l()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get enabledOptions(){return this.options.filter((t)=>t.getAttribute("aria-disabled")!=="true")}open(){if(this.select?.disabled)return;this.list.hidden=!1,this.button.setAttribute("aria-expanded","true"),this.#s=this.enabledOptions.findIndex((e)=>e.getAttribute("aria-selected")==="true");let t=h(this.enabledOptions,this.#s);if(t)this.button.setAttribute("aria-activedescendant",t.id)}close(){if(!this.list)return;this.list.hidden=!0,this.button.setAttribute("aria-expanded","false"),this.button.removeAttribute("aria-activedescendant"),h(this.enabledOptions,-1),this.#s=-1}toggle(){this.list.hidden?this.open():this.close()}#i(){this.#e?.abort(),this.#e=new AbortController;let t=this.#e.signal;if(this.select=this.querySelector(":scope > select"),!this.select)return;this.#o(),this.button.addEventListener("click",()=>this.toggle(),{signal:t}),this.button.addEventListener("keydown",(e)=>this.#r(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#n(e),{signal:t}),this.list.addEventListener("click",(e)=>{let s=e.target.closest('[role="option"]');if(s&&s.getAttribute("aria-disabled")!=="true")this.#a(s)},{signal:t}),this.select.addEventListener("change",()=>this.#l(),{signal:t}),p(this,t),this.dataset.enhanced="",this.#l()}#o(){this.querySelectorAll(":scope > [data-generated]").forEach((s)=>s.remove());let t=c("oatbase-select");this.button=document.createElement("button"),this.button.type="button",this.button.className="outline",this.button.dataset.generated="",this.button.setAttribute("aria-haspopup","listbox"),this.button.setAttribute("aria-controls",t),this.button.setAttribute("aria-expanded","false");let e=this.select.getAttribute("aria-label");if(e)this.button.setAttribute("aria-label",e);this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),[...this.select.options].forEach((s,i)=>{if(!s.value&&s.disabled)return;let o=document.createElement("li");o.id=`${t}-option-${i+1}`,o._source=s,o.dataset.index=i,o.setAttribute("role","option"),o.setAttribute("aria-disabled",String(s.disabled)),o.textContent=s.textContent,this.list.append(o)}),this.append(this.button,this.list)}#r(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){if(t.preventDefault(),this.list.hidden)this.open();this.#s=u(t.key,this.#s,this.enabledOptions.length);let e=h(this.enabledOptions,this.#s);if(e)this.button.setAttribute("aria-activedescendant",e.id)}else if(t.key==="Enter"||t.key===" "){if(t.preventDefault(),this.list.hidden)this.open();else if(this.#s>=0)this.#a(this.enabledOptions[this.#s])}else if(t.key==="Escape")this.close()}#n(t){let e=t.target.closest('[role="option"]');if(!e||e.getAttribute("aria-disabled")==="true")return;this.#s=this.enabledOptions.indexOf(e),h(this.enabledOptions,this.#s)}#a(t){let e=t._source;if(!e||e.disabled)return;this.select.selectedIndex=e.index,this.#l(),this.close(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),n(this,"oatbase:change",{value:e.value,option:e}),this.button.focus()}#l(){let t=this.select.options[this.select.selectedIndex];this.button.textContent=t?.value?t.textContent:this.dataset.placeholder||t?.textContent||"Select an option",this.button.disabled=this.select.disabled,this.options.forEach((e)=>e.setAttribute("aria-selected",String(e._source===t)))}}a("ot-select",x);class v extends HTMLElement{#e;#t="system";connectedCallback(){this.#e?.abort(),this.#e=new AbortController;let t=this.#e.signal;this.key=this.dataset.storageKey||"oatbase-theme";let e=this.dataset.default||"system";try{e=localStorage.getItem(this.key)||e}catch{}this.#t=["system","light","dark"].includes(e)?e:"system",this.buttons=[...this.querySelectorAll("[data-theme-value]")],this.toggleButton=this.buttons.length?null:this.querySelector("button"),this.toggleContents=this.toggleButton?[...this.toggleButton.querySelectorAll("[data-theme-content]")]:[],this.toggleLabel=this.toggleButton?.querySelector("[data-theme-label]"),this.toggleAttribute("data-group",this.buttons.length>1),this.buttons.forEach((s)=>s.addEventListener("click",()=>this.value=s.dataset.themeValue,{signal:t})),this.toggleButton?.addEventListener("click",()=>{let s=["system","light","dark"];this.value=s[(s.indexOf(this.#t)+1)%s.length]},{signal:t}),this.#i(!1)}disconnectedCallback(){this.#e?.abort()}get value(){return this.#t}set value(t){if(!["system","light","dark"].includes(t))return;this.#t=t,this.#i(!0)}#s(){if(!this.dataset.target)return this.ownerDocument.documentElement;try{return this.ownerDocument.querySelector(this.dataset.target)}catch{return null}}#i(t){let e=this.#s();if(e)if(e.style.colorScheme=this.#t==="system"?"light dark":this.#t,this.#t==="system")e.removeAttribute("data-theme");else e.dataset.theme=this.#t;try{localStorage.setItem(this.key,this.#t)}catch{}if(this.buttons.forEach((s)=>s.setAttribute("aria-pressed",String(s.dataset.themeValue===this.#t))),this.toggleButton){let s=this.#t==="light"?"Light":this.#t==="dark"?"Dark":"System";if(this.toggleContents.length){if(this.toggleContents.forEach((i)=>{i.hidden=i.dataset.themeContent!==this.#t}),this.toggleLabel)this.toggleLabel.textContent=s}else this.toggleButton.textContent=s;this.toggleButton.dataset.theme=this.#t,this.toggleButton.setAttribute("aria-label",`Theme: ${this.#t}. Click to change.`)}if(t)n(this,"change",{value:this.#t})}}a("ot-theme-switcher",v);class b extends HTMLElement{#e;#t;#s;#i;connectedCallback(){this.#e?.abort(),this.#e=new AbortController,this.button=this.querySelector("[data-copy-button]"),this.source=this.#o(),this.#s=this.button?.textContent?.trim()||"",this.#i=this.#r(),this.toggleAttribute("data-enhanced",Boolean(this.button&&this.source)),this.#n(this.dataset.copied||"Copied"),this.button?.addEventListener("click",()=>this.copy(),{signal:this.#e.signal})}disconnectedCallback(){if(this.#e?.abort(),clearTimeout(this.#t),this.button)this.button.textContent=this.#s;if(this.#i)this.#i.textContent=""}#o(){let t=this.button?.dataset.copyTarget||this.dataset.copyTarget;return t&&document.getElementById(t)||this.querySelector("[data-copy-source]")}#r(){if(!this.button||!this.source)return;let t=this.querySelector("[data-copy-status]");if(!t)t=document.createElement("span"),t.dataset.copyStatus="",this.append(t);return t.classList.add("visually-hidden"),t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true"),t.textContent="",t}get value(){let t=this.#o();return t&&"value"in t?t.value:t?.textContent?.trim()||""}#n(t){if(!this.button)return;let e=this.button.cloneNode(!0);e.textContent=t,e.style.cssText="position:fixed!important;inset:0 auto auto 0!important;inline-size:max-content!important;visibility:hidden!important;pointer-events:none!important",this.append(e);let s=Math.ceil(Math.max(this.button.getBoundingClientRect().width,e.getBoundingClientRect().width));e.remove(),this.button.style.minInlineSize=`${s}px`}async copy(){let t=this.value;if(!t)return;try{await navigator.clipboard.writeText(t)}catch{let s=Object.assign(document.createElement("textarea"),{value:t});document.body.append(s),s.select(),document.execCommand("copy"),s.remove()}let e=this.dataset.copied||"Copied";if(this.#n(e),this.button.textContent=e,this.#i)this.#i.textContent=e;n(this,"oatbase:copy",{value:t}),clearTimeout(this.#t),this.#t=setTimeout(()=>{if(this.button)this.button.textContent=this.#s;if(this.#i)this.#i.textContent=""},1200)}}a("ot-copy",b);class y extends b{}a("ot-action-field",y);class A extends HTMLElement{#e;#t;#s=-1;connectedCallback(){this.#t?.abort(),this.#t=d(this,()=>this.#i())}disconnectedCallback(){this.#t?.abort(),this.#e?.abort()}get value(){return[...this.select?.selectedOptions||[]].map((t)=>t.value)}set value(t){let e=new Set([].concat(t).map(String));[...this.select?.options||[]].forEach((s)=>{s.selected=e.has(s.value)}),this.#a()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get enabledOptions(){return this.options.filter((t)=>t.getAttribute("aria-disabled")!=="true")}open(){if(this.select?.disabled)return;this.list.hidden=!1,this.button.setAttribute("aria-expanded","true"),this.#s=0,h(this.enabledOptions,this.#s)}close(){if(!this.list)return;this.list.hidden=!0,this.button.setAttribute("aria-expanded","false"),h(this.enabledOptions,-1),this.#s=-1}toggle(){this.list.hidden?this.open():this.close()}#i(){this.#e?.abort(),this.#e=new AbortController;let t=this.#e.signal;if(this.select=this.querySelector(":scope > select[multiple]"),!this.select)return;this.#o(),this.button.addEventListener("click",()=>this.toggle(),{signal:t}),this.button.addEventListener("keydown",(e)=>this.#r(e),{signal:t}),this.list.addEventListener("click",(e)=>{let s=e.target.closest('[role="option"]');if(s&&s.getAttribute("aria-disabled")!=="true")this.#n(s)},{signal:t}),this.select.addEventListener("change",()=>this.#a(),{signal:t}),p(this,t),this.dataset.enhanced="",this.#a()}#o(){this.querySelectorAll(":scope > [data-generated]").forEach((e)=>e.remove());let t=c("oatbase-multiselect");this.button=document.createElement("button"),this.button.type="button",this.button.className="outline",this.button.dataset.generated="",this.button.setAttribute("aria-haspopup","listbox"),this.button.setAttribute("aria-controls",t),this.button.setAttribute("aria-expanded","false"),this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),this.list.setAttribute("aria-multiselectable","true"),[...this.select.options].forEach((e,s)=>{let i=document.createElement("li");i.id=`${t}-option-${s+1}`,i._source=e,i.dataset.index=s,i.setAttribute("role","option"),i.setAttribute("aria-disabled",String(e.disabled)),i.textContent=e.textContent,this.list.append(i)}),this.append(this.button,this.list)}#r(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){if(t.preventDefault(),this.list.hidden)this.open();this.#s=u(t.key,this.#s,this.enabledOptions.length),h(this.enabledOptions,this.#s)}else if(t.key===" "||t.key==="Enter")if(t.preventDefault(),this.list.hidden)this.open();else this.#n(this.enabledOptions[this.#s]);else if(t.key==="Escape")this.close()}#n(t){let e=t?._source;if(!e||e.disabled)return;e.selected=!e.selected,this.#a(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),n(this,"oatbase:change",{value:this.value,option:e})}#a(){let t=[...this.select.selectedOptions];this.button.textContent=t.length?t.map((e)=>e.textContent).join(", "):this.dataset.placeholder||"Select options",this.button.disabled=this.select.disabled,this.options.forEach((e)=>e.setAttribute("aria-selected",String(e._source.selected)))}}a("ot-multiselect",A);class w extends HTMLElement{#e;connectedCallback(){if(this.#e?.abort(),this.#e=new AbortController,this.input=this.querySelector("input"),this.button=this.querySelector("[data-password-toggle]"),!this.input||!this.button)return;this.button.type="button",this.button.addEventListener("click",()=>this.toggle(),{signal:this.#e.signal}),this.#t()}disconnectedCallback(){this.#e?.abort()}toggle(t){let e=t??this.input.type==="password";this.input.type=e?"text":"password",this.#t(),this.input.focus()}#t(){let t=this.input.type==="text";this.button.setAttribute("aria-pressed",String(t)),this.button.setAttribute("aria-label",t?"Hide password":"Show password"),this.button.textContent=t?this.dataset.hideLabel||"Hide":this.dataset.showLabel||"Show"}}a("ot-password",w);class E extends HTMLElement{#e;#t=!1;connectedCallback(){this.#e?.abort(),this.#e=new AbortController;let t=this.#e.signal;if(this.handle=this.querySelector("[data-splitter]"),!this.handle)return;this.handle.type="button",this.handle.setAttribute("role","separator"),this.handle.setAttribute("aria-orientation",this.separatorOrientation),this.handle.setAttribute("aria-valuemin",String(this.min)),this.handle.setAttribute("aria-valuemax",String(this.max)),this.handle.addEventListener("pointerdown",(e)=>{this.#t=!0,this.handle.setPointerCapture?.(e.pointerId),this.#s(e)},{signal:t}),this.handle.addEventListener("pointermove",(e)=>this.#t&&this.#s(e),{signal:t}),this.handle.addEventListener("pointerup",()=>{this.#t=!1},{signal:t}),this.handle.addEventListener("keydown",(e)=>{if(!(this.vertical?["ArrowUp","ArrowDown","Home","End"]:["ArrowLeft","ArrowRight","Home","End"]).includes(e.key))return;e.preventDefault();let i=e.key==="ArrowLeft"||e.key==="ArrowUp",o=e.key==="Home"?this.min:e.key==="End"?this.max:this.value+(i?-5:5);this.value=o},{signal:t}),this.value=Number(this.dataset.value||50)}disconnectedCallback(){this.#e?.abort()}get min(){return Number(this.dataset.min||20)}get max(){return Number(this.dataset.max||80)}get vertical(){return this.getAttribute("aria-orientation")==="vertical"}get separatorOrientation(){return this.vertical?"horizontal":"vertical"}get value(){return Number(this.handle?.getAttribute("aria-valuenow")||50)}set value(t){let e=Math.min(this.max,Math.max(this.min,Math.round(Number(t))));this.style.setProperty("--split",`${e}%`),this.handle?.setAttribute("aria-valuenow",String(e)),n(this,"oatbase:resize",{value:e})}#s(t){let e=this.getBoundingClientRect();this.value=this.vertical?(t.clientY-e.top)/e.height*100:(t.clientX-e.left)/e.width*100}}a("ot-splitter",E);class k extends HTMLElement{#e;connectedCallback(){this.#e?.abort(),this.#e=new AbortController;let t=this.querySelector(":scope > ul");if(!t)return;t.setAttribute("role","tree"),this.querySelectorAll("li").forEach((s)=>{s.setAttribute("role","treeitem");let i=s.querySelector(":scope > ul");if(i){if(i.setAttribute("role","group"),!s.hasAttribute("aria-expanded"))s.setAttribute("aria-expanded","false")}let o=s.firstElementChild;if(o)o.tabIndex=-1});let e=this.visibleItems[0]?.firstElementChild;if(e)e.tabIndex=0;this.addEventListener("click",(s)=>{let i=s.target.closest('[role="treeitem"]');if(i?.hasAttribute("aria-expanded"))i.setAttribute("aria-expanded",String(i.getAttribute("aria-expanded")!=="true"))},{signal:this.#e.signal}),this.addEventListener("keydown",(s)=>this.#s(s),{signal:this.#e.signal})}disconnectedCallback(){this.#e?.abort()}get visibleItems(){return[...this.querySelectorAll('[role="treeitem"]')].filter((t)=>t.offsetParent!==null)}#t(t){this.querySelectorAll('[role="treeitem"] > :first-child').forEach((s)=>{s.tabIndex=-1});let e=t?.firstElementChild;if(e)e.tabIndex=0,e.focus()}#s(t){let e=t.target.closest('[role="treeitem"]');if(!e)return;let s=this.visibleItems,i=s.indexOf(e);if(t.key==="ArrowDown")this.#t(s[i+1]||s[0]);else if(t.key==="ArrowUp")this.#t(s[i-1]||s.at(-1));else if(t.key==="Home")this.#t(s[0]);else if(t.key==="End")this.#t(s.at(-1));else if(t.key==="ArrowRight"&&e.hasAttribute("aria-expanded"))e.setAttribute("aria-expanded","true");else if(t.key==="ArrowLeft"&&e.getAttribute("aria-expanded")==="true")e.setAttribute("aria-expanded","false");else return;t.preventDefault()}}a("ot-tree",k);class C extends HTMLElement{connectedCallback(){if(this.button=this.querySelector(":scope > button"),!this.button)return;this.button.type="button",this.pressed=this.hasAttribute("pressed")||this.button.getAttribute("aria-pressed")==="true",this.button.addEventListener("click",this)}disconnectedCallback(){this.button?.removeEventListener("click",this)}handleEvent(){if(this.button.disabled||this.button.getAttribute("aria-disabled")==="true")return;this.pressed=!this.pressed,n(this,"oatbase:change",{pressed:this.pressed})}get pressed(){return this.hasAttribute("pressed")}set pressed(t){this.toggleAttribute("pressed",Boolean(t)),this.button?.setAttribute("aria-pressed",String(Boolean(t)))}}a("ot-toggle",C);class S extends HTMLElement{connectedCallback(){if(!this.hasAttribute("role"))this.setAttribute("role","toolbar");if(!this.hasAttribute("aria-orientation"))this.setAttribute("aria-orientation","horizontal");this.refresh(),this.addEventListener("focusin",this),this.addEventListener("keydown",this)}disconnectedCallback(){this.removeEventListener("focusin",this),this.removeEventListener("keydown",this)}handleEvent(t){if(t.type==="keydown")return this.#t(t);let e=this.items.indexOf(t.target);if(e>=0)this.#e(e,!1)}refresh(){this.items=[...this.children].map((e)=>e.matches("ot-toggle")?e.querySelector("button"):e).filter((e)=>e?.matches("button:not(:disabled), a[href], [data-toolbar-item]")&&e.getAttribute("aria-disabled")!=="true");let t=Math.max(0,this.items.findIndex((e)=>e.tabIndex===0));this.items.forEach((e,s)=>{e.tabIndex=s===t?0:-1})}#e(t,e=!0){if(!this.items.length)return;let s=(t+this.items.length)%this.items.length;if(this.items.forEach((i,o)=>{i.tabIndex=o===s?0:-1}),e)this.items[s].focus()}#t(t){let e=this.items.indexOf(t.target);if(e<0)return;let s=this.getAttribute("aria-orientation")==="vertical",i=e;if(t.key==="Home")i=0;else if(t.key==="End")i=this.items.length-1;else if(s&&t.key==="ArrowDown")i=e+1;else if(s&&t.key==="ArrowUp")i=e-1;else if(!s&&t.key==="ArrowRight")i=e+1;else if(!s&&t.key==="ArrowLeft")i=e-1;else return;t.preventDefault(),this.#e(i)}}a("ot-toolbar",S);class L extends HTMLElement{#e=!1;connectedCallback(){if(this.input=this.querySelector(":scope > input"),!this.input)return;if(this.length=Math.min(12,Math.max(1,Number(this.dataset.length||this.input.maxLength||6))),this.input.maxLength<1)this.input.maxLength=this.length;if(this.slots=this.querySelector(":scope > [data-otp-slots]")||document.createElement("span"),this.slots.dataset.otpSlots="",this.slots.setAttribute("aria-hidden","true"),this.slots.style.setProperty("--otp-length",this.length),!this.slots.isConnected)this.append(this.slots);this.slots.replaceChildren(...Array.from({length:this.length},()=>document.createElement("span"))),this.input.addEventListener("input",this),this.form=this.input.form,this.form?.addEventListener("reset",this),this.dataset.enhanced="",this.#t(!1)}disconnectedCallback(){this.input?.removeEventListener("input",this),this.form?.removeEventListener("reset",this)}handleEvent(t){if(t.type==="reset")setTimeout(()=>this.#t(!1));else this.#t(!0)}get value(){return this.input?.value||""}set value(t){if(!this.input)return;this.input.value=String(t).slice(0,this.length),this.#t(!1)}#t(t){if(!this.input||!this.slots)return;if(this.input.inputMode==="numeric"){let o=this.input.value.replace(/\D/g,"").slice(0,this.length);if(o!==this.input.value)this.input.value=o}else if(this.input.value.length>this.length)this.input.value=this.input.value.slice(0,this.length);let e=this.input.value,s=Math.min(this.length-1,e.length);[...this.slots.children].forEach((o,r)=>{o.textContent=e[r]||" ",o.toggleAttribute("data-filled",r dialog[data-lightbox-dialog]"),this.image=this.dialog?.querySelector("[data-lightbox-image]"),this.caption=this.dialog?.querySelector("[data-lightbox-caption]"),this.status=this.dialog?.querySelector("[data-lightbox-status]"),this.previousButton=this.dialog?.querySelector("[data-lightbox-previous]"),this.nextButton=this.dialog?.querySelector("[data-lightbox-next]"),this.closeButton=this.dialog?.querySelector("[data-lightbox-close]"),!this.dialog||!this.image||typeof this.dialog.showModal!=="function")return;let t={signal:this.#e.signal};this.addEventListener("click",(e)=>this.#i(e),t),this.dialog.addEventListener("keydown",(e)=>this.#o(e),t),this.dialog.addEventListener("close",()=>this.#a(),t),this.previousButton?.addEventListener("click",()=>this.previous(),t),this.nextButton?.addEventListener("click",()=>this.next(),t),this.closeButton?.addEventListener("click",()=>this.close(),t),this.toggleAttribute("data-enhanced",!0)}disconnectedCallback(){this.#e?.abort()}get items(){return[...this.querySelectorAll("[data-lightbox-item]")].filter((t)=>!this.dialog?.contains(t))}get currentIndex(){return this.#t}open(t=0){let e=this.items,s=typeof t==="number"?t:e.indexOf(t);if(!e.length||s<0||s>=e.length||!this.dialog||!this.image)return;if(this.#s=e[s],this.#r(s),!this.dialog.open)this.dialog.showModal();n(this,"oatbase:open",{index:s,item:e[s]})}close(){this.dialog?.close()}next(){let t=this.items.length;if(t)this.#r((this.#t+1+t)%t)}previous(){let t=this.items.length;if(t)this.#r((this.#t-1+t)%t)}#i(t){let e=t.target.closest?.("[data-lightbox-item]");if(!e||this.dialog.contains(e))return;if(t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;t.preventDefault(),this.open(e)}#o(t){if(t.key==="ArrowRight")this.next();else if(t.key==="ArrowLeft")this.previous();else if(t.key==="Home")this.#r(0);else if(t.key==="End")this.#r(this.items.length-1);else return;t.preventDefault()}#r(t){let e=this.items,s=e[t];if(!s)return;let i=s.matches("img")?s:s.querySelector("img"),o=s.dataset.lightboxSrc||s.getAttribute("href")||i?.currentSrc||i?.src;if(!o)return;let r=s.closest("figure"),l=s.dataset.lightboxCaption??r?.querySelector("figcaption")?.textContent.trim()??"";if(this.image.src=o,this.image.alt=s.dataset.lightboxAlt??i?.alt??"",this.caption)this.caption.textContent=l,this.caption.hidden=!l;if(this.status)this.status.textContent=`${t+1} of ${e.length}`;if(this.previousButton)this.previousButton.disabled=e.length<2;if(this.nextButton)this.nextButton.disabled=e.length<2;this.#t=t,this.#n(e[(t-1+e.length)%e.length]),this.#n(e[(t+1)%e.length]),n(this,"oatbase:change",{index:t,item:s,source:o})}#n(t){if(!t||this.items.length<2)return;let e=t.matches("img")?t:t.querySelector("img"),s=t.dataset.lightboxSrc||t.getAttribute("href")||e?.currentSrc||e?.src;if(s)Object.assign(new Image,{src:s})}#a(){let t=this.#s;this.#s=null,t?.focus?.({preventScroll:!0}),n(this,"oatbase:close",{index:this.#t,item:this.items[this.#t]})}}a("ot-lightbox",q);class I extends HTMLElement{#e;#t;#s;#i;#o="";connectedCallback(){this.#e?.abort(),this.#e=new AbortController,this.#s?.disconnect(),this.#s=new MutationObserver(()=>this.refresh()),this.#s.observe(this,{childList:!0,subtree:!0}),this.refresh()}disconnectedCallback(){this.#e?.abort(),this.#t?.abort(),this.#s?.disconnect(),cancelAnimationFrame(this.#i)}get activeId(){return this.#o}refresh(){this.#t?.abort(),this.#t=new AbortController;let t=this.#r(this.dataset.target)||document;if(this.links=[...this.querySelectorAll('a[href^="#"]')],this.targets=this.links.map((s)=>{let i=decodeURIComponent(s.hash.slice(1)),o=i?document.getElementById(i):null;return o&&(t===document||t.contains(o))?o:null}).filter(Boolean),this.root=this.#r(this.dataset.scrollRoot),!this.targets.length){this.removeAttribute("data-enhanced");return}let e={passive:!0,signal:this.#t.signal};(this.root||window).addEventListener("scroll",()=>this.#n(),e),window.addEventListener("resize",()=>this.#n(),e),this.toggleAttribute("data-enhanced",!0),this.#a()}#r(t){if(!t)return null;try{return document.querySelector(t)}catch{return null}}#n(){cancelAnimationFrame(this.#i),this.#i=requestAnimationFrame(()=>this.#a())}#a(){if(!this.targets?.length)return;let t=Number.parseFloat(this.dataset.offset||"16")||0,s=(this.root?.getBoundingClientRect().top||0)+t,i=this.targets[0];for(let r of this.targets)if(r.getBoundingClientRect().top<=s+1)i=r;else break;if(this.root?this.root.scrollTop+this.root.clientHeight>=this.root.scrollHeight-1:window.scrollY+window.innerHeight>=document.documentElement.scrollHeight-1)i=this.targets.at(-1);if(!i||i.id===this.#o)return;this.#o=i.id,this.links.forEach((r)=>{let l=decodeURIComponent(r.hash.slice(1))===i.id;if(l)r.setAttribute("aria-current","location");else r.removeAttribute("aria-current");r.toggleAttribute("data-active",l)}),n(this,"oatbase:change",{id:i.id,target:i})}}a("ot-scrollspy",I);class M extends HTMLElement{#e;#t;#s=[];#i=0;connectedCallback(){this.#t?.abort(),this.#t=d(this,()=>this.refresh())}disconnectedCallback(){this.#t?.abort(),this.#e?.abort(),this.#i++}get entries(){return[...this.#s]}refresh(){this.#e?.abort(),this.#e=new AbortController;let t=typeof HTMLElement.prototype.showPopover==="function",e=[...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')].filter((s)=>!s.closest("[data-footnote-popover]"));return this.#s=e.map((s)=>{let i=decodeURIComponent(s.hash.slice(1)),o=i&&document.getElementById(i);if(!o)return null;if(!t)return{reference:s,definition:o,dropdown:null,popover:null};return this.#r(s,o,i)}).filter(Boolean),this.toggleAttribute("data-enhanced",t&&this.#s.some((s)=>s.popover)),this.#o(t),this.entries}#o(t){let e=++this.#i,s=this.entries;queueMicrotask(()=>{if(this.isConnected&&e===this.#i)n(this,"oatbase:render",{entries:s,enhanced:t})})}#r(t,e,s){let i=t.closest("ot-dropdown[data-footnote-preview]"),o=i?.querySelector(":scope > [data-footnote-popover]");if(!i||!o){i=document.createElement("ot-dropdown"),i.dataset.footnotePreview="";let{parentNode:l,nextSibling:f}=t;i.append(t),o=document.createElement("aside"),o.id=c("oatbase-footnote"),o.className="card",o.dataset.footnotePopover="",o.setAttribute("popover","auto"),o.setAttribute("role","note"),i.append(o),l.insertBefore(i,f)}o.dataset.footnoteFor=s,o.setAttribute("aria-label",`Footnote ${t.textContent.trim()}`),t.setAttribute("popovertarget",o.id),t.setAttribute("aria-controls",o.id),this.#n(o,e);let r={reference:t,definition:e,dropdown:i,popover:o};return t.addEventListener("click",(l)=>{if(l.metaKey||l.ctrlKey||l.shiftKey||l.altKey)return;if(l.preventDefault(),o.matches(":popover-open"))o.hidePopover();else o.showPopover()},{signal:this.#e.signal}),o.addEventListener("toggle",(l)=>{n(this,"oatbase:toggle",{...r,state:l.newState||(o.matches(":popover-open")?"open":"closed")})},{signal:this.#e.signal}),r}#n(t,e){let s=e.cloneNode(!0);s.removeAttribute("id"),s.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove(),s.querySelectorAll("[id]").forEach((o)=>o.removeAttribute("id")),s.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((o)=>o.remove());let i=document.createElement("div");while(s.firstChild)i.append(s.firstChild);t.replaceChildren(i)}}a("ot-footnotes",M);class O extends HTMLElement{#e;#t;connectedCallback(){this.#e?.abort(),this.#e=new AbortController,this.refresh()}disconnectedCallback(){this.#e?.abort(),cancelAnimationFrame(this.#t)}refresh(){if(this.#e?.abort(),this.#e=new AbortController,this.progress=this.querySelector("progress"),this.target=this.#s(this.dataset.target),this.root=this.#s(this.dataset.scrollRoot),!this.progress||!this.target)return;this.progress.max=100;let t={passive:!0,signal:this.#e.signal};(this.root||window).addEventListener("scroll",()=>this.#i(),t),window.addEventListener("resize",()=>this.#i(),t),this.toggleAttribute("data-enhanced",!0),this.#o()}#s(t){if(!t)return null;try{return document.querySelector(t)}catch{return null}}#i(){cancelAnimationFrame(this.#t),this.#t=requestAnimationFrame(()=>this.#o())}#o(){let t=this.root?.getBoundingClientRect(),e=this.target.getBoundingClientRect(),s=this.root?.scrollTop||window.scrollY,i=this.root?.clientHeight||window.innerHeight,o=s+e.top-(t?.top||0),r=Math.max(1,this.target.scrollHeight-i),l=Math.min(100,Math.max(0,(s-o)/r*100));this.progress.value=l}}a("ot-reading-progress",O);var Y=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});class H extends HTMLElement{#e;#t=new WeakMap;#s={index:-1,direction:"none"};connectedCallback(){this.#e?.abort(),this.#e=new AbortController;let t=this.#e.signal;if(this.table=this.querySelector(":scope > table, :scope > .scroll-area > table"),!this.table)return;this.filter=this.querySelector("[data-table-filter]"),this.selectAll=this.querySelector("[data-table-select-all]"),this.status=this.querySelector("[data-table-status]"),this.selectedStatus=this.querySelector("[data-table-selected]"),this.empty=this.querySelector("[data-table-empty]"),this.#i(t),this.refresh(),this.filter?.addEventListener("input",()=>this.#a(),{signal:t}),this.table.addEventListener("change",(e)=>{if(e.target.matches("[data-table-select-row]"))this.#c(e.target);else if(e.target.matches("[data-table-select-all]"))this.#l(e.target.checked)},{signal:t}),this.addEventListener("oatbase:refresh",()=>this.refresh(),{signal:t}),this.dataset.enhanced=""}disconnectedCallback(){this.#e?.abort()}get rows(){return[...this.table?.tBodies[0]?.rows||[]]}get visibleRows(){return this.rows.filter((t)=>!t.hidden)}get selectedRows(){return this.rows.filter((t)=>t.querySelector("[data-table-select-row]:checked"))}refresh(){this.rows.forEach((t,e)=>{if(!this.#t.has(t))this.#t.set(t,e)}),this.#a(!1)}#i(t){[...this.table.tHead?.rows[0]?.cells||[]].forEach((e,s)=>{if(!e.hasAttribute("data-sort"))return;let i=e.querySelector(":scope > [data-table-sort]");if(!i)i=document.createElement("button"),i.type="button",i.dataset.tableSort="",i.className="ghost",i.append(...e.childNodes),e.append(i);e.setAttribute("aria-sort","none"),i.addEventListener("click",()=>this.#o(e,s),{signal:t})})}#o(t,e){let s=this.#s.index!==e||this.#s.direction==="none"?"ascending":this.#s.direction==="ascending"?"descending":"none";this.#s={index:e,direction:s},[...this.table.tHead?.rows[0]?.cells||[]].filter((r)=>r.hasAttribute("data-sort")).forEach((r)=>r.setAttribute("aria-sort",r===t?s:"none"));let i=t.dataset.sort||"text",o=[...this.rows].sort((r,l)=>{if(s==="none")return this.#t.get(r)-this.#t.get(l);let f=this.#n(this.#r(r,e),this.#r(l,e),i);return s==="ascending"?f:-f});this.table.tBodies[0].append(...o),n(this,"oatbase:sort",{index:e,direction:s,type:i,header:t})}#r(t,e){let s=t.cells[e];return s?.dataset.sortValue??s?.textContent.trim()??""}#n(t,e,s){if(s==="number")return(Number(t)||0)-(Number(e)||0);if(s==="date")return(Date.parse(t)||0)-(Date.parse(e)||0);return Y.compare(t,e)}#a(t=!0){let e=this.filter?.value.trim().toLocaleLowerCase()||"";this.rows.forEach((o)=>{let r=(o.dataset.filterValue||o.textContent).toLocaleLowerCase();o.hidden=Boolean(e&&!r.includes(e))});let s=this.visibleRows.length,i=this.rows.length;if(this.status)this.status.value=e?`${s} of ${i} rows`:`${i} rows`;if(this.empty)this.empty.hidden=s>0;if(this.#h(),t)n(this,"oatbase:filter",{query:e,visible:s,total:i})}#l(t){this.visibleRows.forEach((e)=>{let s=e.querySelector("[data-table-select-row]:not(:disabled)");if(s)s.checked=t}),this.#h(),this.#d()}#c(t){t.closest("tr")?.toggleAttribute("data-selected",t.checked),this.#h(),this.#d()}#h(){this.rows.forEach((s)=>s.toggleAttribute("data-selected",Boolean(s.querySelector("[data-table-select-row]:checked"))));let t=this.visibleRows.map((s)=>s.querySelector("[data-table-select-row]:not(:disabled)")).filter(Boolean),e=t.filter((s)=>s.checked).length;if(this.selectAll)this.selectAll.checked=t.length>0&&e===t.length,this.selectAll.indeterminate=e>0&&et.querySelector("[data-table-select-row]")?.value).filter((t)=>t!=null)})}}a("ot-data-table",H);class B extends HTMLElement{#e;#t;#s=0;connectedCallback(){this.#e?.abort(),this.#e=new AbortController;let t=this.#e.signal;if(this.list=this.querySelector(":scope > [data-repeater-list]"),this.template=this.querySelector(":scope > template[data-repeater-template]"),!this.list||!this.template)return;if(this.#t==null)this.#t=this.list.innerHTML;this.#i(),this.addEventListener("click",(e)=>this.#o(e),{signal:t}),this.closest("form")?.addEventListener("reset",()=>queueMicrotask(()=>this.#r()),{signal:t}),this.dataset.enhanced="",this.refresh()}disconnectedCallback(){this.#e?.abort()}get items(){return[...this.list?.querySelectorAll(":scope > [data-repeater-item]")||[]]}get min(){return Math.max(0,Number(this.dataset.min)||0)}get max(){return Math.max(this.min,Number(this.dataset.max)||1/0)}add(){if(!this.template||this.items.length>=this.max)return null;let t=this.#s++,e=this.template.content.cloneNode(!0);[...e.querySelectorAll("*")].forEach((o)=>{if([...o.attributes].forEach((r)=>{if(r.value.includes("__index__"))o.setAttribute(r.name,r.value.replaceAll("__index__",String(t)))}),o.hasAttribute("data-repeater-number"))o.textContent=String(t+1)});let i=e.querySelector("[data-repeater-item]");if(!i)return null;return i.dataset.repeaterIndex=t,this.list.append(e),this.refresh(),i.querySelector('[data-repeater-focus], input:not([type="hidden"]), select, textarea, button')?.focus(),n(this,"oatbase:add",{item:i,index:t}),i}remove(t){if(!t?.matches?.("[data-repeater-item]")||!this.list?.contains(t)||this.items.length<=this.min)return!1;let e=Number(t.dataset.repeaterIndex),s=t.previousElementSibling?.querySelector("[data-repeater-remove]")||t.nextElementSibling?.querySelector("[data-repeater-remove]")||this.querySelector("[data-repeater-add]");return t.remove(),this.refresh(),s?.focus(),n(this,"oatbase:remove",{item:t,index:e}),!0}refresh(){let t=this.items,e=t.length<=this.min,s=t.length>=this.max;this.querySelectorAll("[data-repeater-add]").forEach((i)=>{i.disabled=s}),t.forEach((i,o)=>{i.querySelectorAll("[data-repeater-remove]").forEach((r)=>{r.disabled=e}),i.querySelectorAll("[data-repeater-position]").forEach((r)=>{r.value=String(o+1)})}),this.toggleAttribute("data-empty",t.length===0)}#i(){this.#s=0,this.items.forEach((t)=>{let e=Number(t.dataset.repeaterIndex),s=Number.isFinite(e)?e:this.#s;t.dataset.repeaterIndex=s,this.#s=Math.max(this.#s,s+1)})}#o(t){let e=t.target.closest("[data-repeater-add]");if(e&&this.contains(e)){t.preventDefault(),this.add();return}let s=t.target.closest("[data-repeater-remove]");if(s&&this.contains(s))t.preventDefault(),this.remove(s.closest("[data-repeater-item]"))}#r(){this.list.innerHTML=this.#t,this.#i(),this.refresh(),n(this,"oatbase:reset",{items:this.items})}}a("ot-repeater",B);class T extends HTMLElement{#e;#t;#s;connectedCallback(){this.#e?.abort(),this.#t?.disconnect(),this.#e=new AbortController;let t=this.#e.signal;if(this.log=this.querySelector(':scope > [role="log"], :scope > .scroll-area[role="log"]'),!this.log)return;this.content=this.log.querySelector("[data-log-content]")||this.log,this.follow=this.querySelector("[data-log-follow]"),this.status=this.querySelector("[data-log-status]"),this.log.setAttribute("aria-relevant",this.log.getAttribute("aria-relevant")||"additions text"),this.follow?.addEventListener("change",()=>{if(this.toggleAttribute("data-following",this.follow.checked),this.follow.checked)this.#o();n(this,"oatbase:follow",{following:this.follow.checked})},{signal:t}),this.log.addEventListener("scroll",()=>this.#r(),{signal:t,passive:!0}),this.#t=new MutationObserver(()=>this.#i()),this.#t.observe(this.content,{childList:!0,subtree:!0,characterData:!0}),this.dataset.enhanced="",this.refresh()}disconnectedCallback(){if(this.#e?.abort(),this.#t?.disconnect(),this.#s)cancelAnimationFrame(this.#s)}get lineCount(){let t=this.content?.querySelectorAll?.("[data-log-line]");if(t?.length)return t.length;let e=this.content?.textContent||"";return e?e.replace(/\r\n?/g,`
`).replace(/\n$/,"").split(`
-`).length:0}append(t){if(!this.content)return;if(this.content.querySelector("[data-log-line]")){String(t).replace(/^\r?\n/,"").split(/\r?\n/).forEach((e)=>{let s=document.createElement("span");s.dataset.logLine="",s.textContent=e,this.content.append(s)}),this.#i();return}this.content.append(document.createTextNode(String(t))),this.#i()}refresh(){let t=this.lineCount;if(this.status)this.status.value=`${t} ${t===1?"line":"lines"}`;let e=Boolean(this.follow?.checked);if(this.toggleAttribute("data-following",e),e)this.#o();a(this,"oatbase:update",{lines:t,following:e})}#i(){if(this.#s)return;this.#s=requestAnimationFrame(()=>{this.#s=0,this.refresh()})}#o(){if(this.log)this.log.scrollTop=this.log.scrollHeight}#r(){if(!this.follow?.checked)return;if(this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<=2)return;this.follow.checked=!1,this.toggleAttribute("data-following",!1),a(this,"oatbase:follow",{following:!1,reason:"scroll"})}}n("ot-log-viewer",B);})();
+`).length:0}append(t){if(!this.content)return;if(this.content.querySelector("[data-log-line]")){String(t).replace(/^\r?\n/,"").split(/\r?\n/).forEach((e)=>{let s=document.createElement("span");s.dataset.logLine="",s.textContent=e,this.content.append(s)}),this.#i();return}this.content.append(document.createTextNode(String(t))),this.#i()}refresh(){let t=this.lineCount;if(this.status)this.status.value=`${t} ${t===1?"line":"lines"}`;let e=Boolean(this.follow?.checked);if(this.toggleAttribute("data-following",e),e)this.#o();n(this,"oatbase:update",{lines:t,following:e})}#i(){if(this.#s)return;this.#s=requestAnimationFrame(()=>{this.#s=0,this.refresh()})}#o(){if(this.log)this.log.scrollTop=this.log.scrollHeight}#r(){if(!this.follow?.checked)return;if(this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<=2)return;this.follow.checked=!1,this.toggleAttribute("data-following",!1),n(this,"oatbase:follow",{following:!1,reason:"scroll"})}}a("ot-log-viewer",T);})();
diff --git a/dist/footnotes.esm.js b/dist/footnotes.esm.js
index 8f69cdd..608f4bc 100644
--- a/dist/footnotes.esm.js
+++ b/dist/footnotes.esm.js
@@ -5,30 +5,74 @@ function define(name, constructor) {
if (!customElements.get(name))
customElements.define(name, constructor);
}
+function connectWhenReady(element, connect) {
+ if (document.readyState !== "loading") {
+ connect();
+ return;
+ }
+ const controller = new AbortController;
+ document.addEventListener("DOMContentLoaded", () => {
+ if (element.isConnected)
+ connect();
+ }, { once: true, signal: controller.signal });
+ return controller;
+}
+function emit(element, name, detail) {
+ element.dispatchEvent(new CustomEvent(name, {
+ bubbles: true,
+ composed: true,
+ detail
+ }));
+}
// src/js/footnotes.js
class OtFootnotes extends HTMLElement {
#abort;
+ #readyAbort;
+ #entries = [];
+ #revision = 0;
connectedCallback() {
- this.#abort?.abort();
- this.#abort = new AbortController;
- if (typeof HTMLElement.prototype.showPopover !== "function")
- return;
- const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')];
- references.forEach((reference) => this.#enhance(reference));
- if (references.length)
- this.toggleAttribute("data-enhanced", true);
+ this.#readyAbort?.abort();
+ this.#readyAbort = connectWhenReady(this, () => this.refresh());
}
disconnectedCallback() {
+ this.#readyAbort?.abort();
+ this.#abort?.abort();
+ this.#revision++;
+ }
+ get entries() {
+ return [...this.#entries];
+ }
+ refresh() {
this.#abort?.abort();
+ this.#abort = new AbortController;
+ const canPopover = typeof HTMLElement.prototype.showPopover === "function";
+ const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')].filter((reference) => !reference.closest("[data-footnote-popover]"));
+ this.#entries = references.map((reference) => {
+ const targetId = decodeURIComponent(reference.hash.slice(1));
+ const definition = targetId && document.getElementById(targetId);
+ if (!definition)
+ return null;
+ if (!canPopover)
+ return { reference, definition, dropdown: null, popover: null };
+ return this.#enhance(reference, definition, targetId);
+ }).filter(Boolean);
+ this.toggleAttribute("data-enhanced", canPopover && this.#entries.some((entry) => entry.popover));
+ this.#announce(canPopover);
+ return this.entries;
}
- #enhance(reference) {
- const targetId = decodeURIComponent(reference.hash.slice(1));
- const definition = targetId && document.getElementById(targetId);
- if (!definition)
- return;
+ #announce(enhanced) {
+ const revision = ++this.#revision;
+ const entries = this.entries;
+ queueMicrotask(() => {
+ if (this.isConnected && revision === this.#revision) {
+ emit(this, "oatbase:render", { entries, enhanced });
+ }
+ });
+ }
+ #enhance(reference, definition, targetId) {
let dropdown = reference.closest("ot-dropdown[data-footnote-preview]");
- let popover = dropdown?.querySelector("[data-footnote-popover]");
+ let popover = dropdown?.querySelector(":scope > [data-footnote-popover]");
if (!dropdown || !popover) {
dropdown = document.createElement("ot-dropdown");
dropdown.dataset.footnotePreview = "";
@@ -41,21 +85,15 @@ class OtFootnotes extends HTMLElement {
popover.dataset.footnotePopover = "";
popover.setAttribute("popover", "auto");
popover.setAttribute("role", "note");
- popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
- const content = definition.cloneNode(true);
- content.removeAttribute("id");
- content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
- content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
- content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
- const body = document.createElement("div");
- while (content.firstChild)
- body.append(content.firstChild);
- popover.append(body);
dropdown.append(popover);
- reference.setAttribute("popovertarget", popover.id);
- reference.setAttribute("aria-controls", popover.id);
parent.insertBefore(dropdown, next);
}
+ popover.dataset.footnoteFor = targetId;
+ popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
+ reference.setAttribute("popovertarget", popover.id);
+ reference.setAttribute("aria-controls", popover.id);
+ this.#render(popover, definition);
+ const entry = { reference, definition, dropdown, popover };
reference.addEventListener("click", (event) => {
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
return;
@@ -65,6 +103,24 @@ class OtFootnotes extends HTMLElement {
else
popover.showPopover();
}, { signal: this.#abort.signal });
+ popover.addEventListener("toggle", (event) => {
+ emit(this, "oatbase:toggle", {
+ ...entry,
+ state: event.newState || (popover.matches(":popover-open") ? "open" : "closed")
+ });
+ }, { signal: this.#abort.signal });
+ return entry;
+ }
+ #render(popover, definition) {
+ const content = definition.cloneNode(true);
+ content.removeAttribute("id");
+ content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
+ content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
+ content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
+ const body = document.createElement("div");
+ while (content.firstChild)
+ body.append(content.firstChild);
+ popover.replaceChildren(body);
}
}
define("ot-footnotes", OtFootnotes);
diff --git a/dist/footnotes.js b/dist/footnotes.js
index e6a56e9..241d847 100644
--- a/dist/footnotes.js
+++ b/dist/footnotes.js
@@ -50,30 +50,74 @@
if (!customElements.get(name))
customElements.define(name, constructor);
}
+ function connectWhenReady(element, connect) {
+ if (document.readyState !== "loading") {
+ connect();
+ return;
+ }
+ const controller = new AbortController;
+ document.addEventListener("DOMContentLoaded", () => {
+ if (element.isConnected)
+ connect();
+ }, { once: true, signal: controller.signal });
+ return controller;
+ }
+ function emit(element, name, detail) {
+ element.dispatchEvent(new CustomEvent(name, {
+ bubbles: true,
+ composed: true,
+ detail
+ }));
+ }
// src/js/footnotes.js
class OtFootnotes extends HTMLElement {
#abort;
+ #readyAbort;
+ #entries = [];
+ #revision = 0;
connectedCallback() {
- this.#abort?.abort();
- this.#abort = new AbortController;
- if (typeof HTMLElement.prototype.showPopover !== "function")
- return;
- const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')];
- references.forEach((reference) => this.#enhance(reference));
- if (references.length)
- this.toggleAttribute("data-enhanced", true);
+ this.#readyAbort?.abort();
+ this.#readyAbort = connectWhenReady(this, () => this.refresh());
}
disconnectedCallback() {
+ this.#readyAbort?.abort();
+ this.#abort?.abort();
+ this.#revision++;
+ }
+ get entries() {
+ return [...this.#entries];
+ }
+ refresh() {
this.#abort?.abort();
+ this.#abort = new AbortController;
+ const canPopover = typeof HTMLElement.prototype.showPopover === "function";
+ const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')].filter((reference) => !reference.closest("[data-footnote-popover]"));
+ this.#entries = references.map((reference) => {
+ const targetId = decodeURIComponent(reference.hash.slice(1));
+ const definition = targetId && document.getElementById(targetId);
+ if (!definition)
+ return null;
+ if (!canPopover)
+ return { reference, definition, dropdown: null, popover: null };
+ return this.#enhance(reference, definition, targetId);
+ }).filter(Boolean);
+ this.toggleAttribute("data-enhanced", canPopover && this.#entries.some((entry) => entry.popover));
+ this.#announce(canPopover);
+ return this.entries;
+ }
+ #announce(enhanced) {
+ const revision = ++this.#revision;
+ const entries = this.entries;
+ queueMicrotask(() => {
+ if (this.isConnected && revision === this.#revision) {
+ emit(this, "oatbase:render", { entries, enhanced });
+ }
+ });
}
- #enhance(reference) {
- const targetId = decodeURIComponent(reference.hash.slice(1));
- const definition = targetId && document.getElementById(targetId);
- if (!definition)
- return;
+ #enhance(reference, definition, targetId) {
let dropdown = reference.closest("ot-dropdown[data-footnote-preview]");
- let popover = dropdown?.querySelector("[data-footnote-popover]");
+ let popover = dropdown?.querySelector(":scope > [data-footnote-popover]");
if (!dropdown || !popover) {
dropdown = document.createElement("ot-dropdown");
dropdown.dataset.footnotePreview = "";
@@ -86,21 +130,15 @@
popover.dataset.footnotePopover = "";
popover.setAttribute("popover", "auto");
popover.setAttribute("role", "note");
- popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
- const content = definition.cloneNode(true);
- content.removeAttribute("id");
- content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
- content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
- content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
- const body = document.createElement("div");
- while (content.firstChild)
- body.append(content.firstChild);
- popover.append(body);
dropdown.append(popover);
- reference.setAttribute("popovertarget", popover.id);
- reference.setAttribute("aria-controls", popover.id);
parent.insertBefore(dropdown, next);
}
+ popover.dataset.footnoteFor = targetId;
+ popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
+ reference.setAttribute("popovertarget", popover.id);
+ reference.setAttribute("aria-controls", popover.id);
+ this.#render(popover, definition);
+ const entry = { reference, definition, dropdown, popover };
reference.addEventListener("click", (event) => {
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
return;
@@ -110,6 +148,24 @@
else
popover.showPopover();
}, { signal: this.#abort.signal });
+ popover.addEventListener("toggle", (event) => {
+ emit(this, "oatbase:toggle", {
+ ...entry,
+ state: event.newState || (popover.matches(":popover-open") ? "open" : "closed")
+ });
+ }, { signal: this.#abort.signal });
+ return entry;
+ }
+ #render(popover, definition) {
+ const content = definition.cloneNode(true);
+ content.removeAttribute("id");
+ content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
+ content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
+ content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
+ const body = document.createElement("div");
+ while (content.firstChild)
+ body.append(content.firstChild);
+ popover.replaceChildren(body);
}
}
define("ot-footnotes", OtFootnotes);
diff --git a/dist/oatbase.esm.js b/dist/oatbase.esm.js
index ffefcb4..431fbf8 100644
--- a/dist/oatbase.esm.js
+++ b/dist/oatbase.esm.js
@@ -1753,26 +1753,51 @@ define("ot-scrollspy", OtScrollspy);
// src/js/footnotes.js
class OtFootnotes extends HTMLElement {
#abort;
+ #readyAbort;
+ #entries = [];
+ #revision = 0;
connectedCallback() {
- this.#abort?.abort();
- this.#abort = new AbortController;
- if (typeof HTMLElement.prototype.showPopover !== "function")
- return;
- const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')];
- references.forEach((reference) => this.#enhance(reference));
- if (references.length)
- this.toggleAttribute("data-enhanced", true);
+ this.#readyAbort?.abort();
+ this.#readyAbort = connectWhenReady(this, () => this.refresh());
}
disconnectedCallback() {
+ this.#readyAbort?.abort();
this.#abort?.abort();
+ this.#revision++;
}
- #enhance(reference) {
- const targetId = decodeURIComponent(reference.hash.slice(1));
- const definition = targetId && document.getElementById(targetId);
- if (!definition)
- return;
+ get entries() {
+ return [...this.#entries];
+ }
+ refresh() {
+ this.#abort?.abort();
+ this.#abort = new AbortController;
+ const canPopover = typeof HTMLElement.prototype.showPopover === "function";
+ const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')].filter((reference) => !reference.closest("[data-footnote-popover]"));
+ this.#entries = references.map((reference) => {
+ const targetId = decodeURIComponent(reference.hash.slice(1));
+ const definition = targetId && document.getElementById(targetId);
+ if (!definition)
+ return null;
+ if (!canPopover)
+ return { reference, definition, dropdown: null, popover: null };
+ return this.#enhance(reference, definition, targetId);
+ }).filter(Boolean);
+ this.toggleAttribute("data-enhanced", canPopover && this.#entries.some((entry) => entry.popover));
+ this.#announce(canPopover);
+ return this.entries;
+ }
+ #announce(enhanced) {
+ const revision = ++this.#revision;
+ const entries = this.entries;
+ queueMicrotask(() => {
+ if (this.isConnected && revision === this.#revision) {
+ emit(this, "oatbase:render", { entries, enhanced });
+ }
+ });
+ }
+ #enhance(reference, definition, targetId) {
let dropdown = reference.closest("ot-dropdown[data-footnote-preview]");
- let popover = dropdown?.querySelector("[data-footnote-popover]");
+ let popover = dropdown?.querySelector(":scope > [data-footnote-popover]");
if (!dropdown || !popover) {
dropdown = document.createElement("ot-dropdown");
dropdown.dataset.footnotePreview = "";
@@ -1785,21 +1810,15 @@ class OtFootnotes extends HTMLElement {
popover.dataset.footnotePopover = "";
popover.setAttribute("popover", "auto");
popover.setAttribute("role", "note");
- popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
- const content = definition.cloneNode(true);
- content.removeAttribute("id");
- content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
- content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
- content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
- const body = document.createElement("div");
- while (content.firstChild)
- body.append(content.firstChild);
- popover.append(body);
dropdown.append(popover);
- reference.setAttribute("popovertarget", popover.id);
- reference.setAttribute("aria-controls", popover.id);
parent.insertBefore(dropdown, next);
}
+ popover.dataset.footnoteFor = targetId;
+ popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
+ reference.setAttribute("popovertarget", popover.id);
+ reference.setAttribute("aria-controls", popover.id);
+ this.#render(popover, definition);
+ const entry = { reference, definition, dropdown, popover };
reference.addEventListener("click", (event) => {
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
return;
@@ -1809,6 +1828,24 @@ class OtFootnotes extends HTMLElement {
else
popover.showPopover();
}, { signal: this.#abort.signal });
+ popover.addEventListener("toggle", (event) => {
+ emit(this, "oatbase:toggle", {
+ ...entry,
+ state: event.newState || (popover.matches(":popover-open") ? "open" : "closed")
+ });
+ }, { signal: this.#abort.signal });
+ return entry;
+ }
+ #render(popover, definition) {
+ const content = definition.cloneNode(true);
+ content.removeAttribute("id");
+ content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
+ content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
+ content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
+ const body = document.createElement("div");
+ while (content.firstChild)
+ body.append(content.firstChild);
+ popover.replaceChildren(body);
}
}
define("ot-footnotes", OtFootnotes);
diff --git a/dist/oatbase.js b/dist/oatbase.js
index e9f1327..ba0e300 100644
--- a/dist/oatbase.js
+++ b/dist/oatbase.js
@@ -1817,26 +1817,51 @@
// src/js/footnotes.js
class OtFootnotes extends HTMLElement {
#abort;
+ #readyAbort;
+ #entries = [];
+ #revision = 0;
connectedCallback() {
- this.#abort?.abort();
- this.#abort = new AbortController;
- if (typeof HTMLElement.prototype.showPopover !== "function")
- return;
- const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')];
- references.forEach((reference) => this.#enhance(reference));
- if (references.length)
- this.toggleAttribute("data-enhanced", true);
+ this.#readyAbort?.abort();
+ this.#readyAbort = connectWhenReady(this, () => this.refresh());
}
disconnectedCallback() {
+ this.#readyAbort?.abort();
this.#abort?.abort();
+ this.#revision++;
}
- #enhance(reference) {
- const targetId = decodeURIComponent(reference.hash.slice(1));
- const definition = targetId && document.getElementById(targetId);
- if (!definition)
- return;
+ get entries() {
+ return [...this.#entries];
+ }
+ refresh() {
+ this.#abort?.abort();
+ this.#abort = new AbortController;
+ const canPopover = typeof HTMLElement.prototype.showPopover === "function";
+ const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')].filter((reference) => !reference.closest("[data-footnote-popover]"));
+ this.#entries = references.map((reference) => {
+ const targetId = decodeURIComponent(reference.hash.slice(1));
+ const definition = targetId && document.getElementById(targetId);
+ if (!definition)
+ return null;
+ if (!canPopover)
+ return { reference, definition, dropdown: null, popover: null };
+ return this.#enhance(reference, definition, targetId);
+ }).filter(Boolean);
+ this.toggleAttribute("data-enhanced", canPopover && this.#entries.some((entry) => entry.popover));
+ this.#announce(canPopover);
+ return this.entries;
+ }
+ #announce(enhanced) {
+ const revision = ++this.#revision;
+ const entries = this.entries;
+ queueMicrotask(() => {
+ if (this.isConnected && revision === this.#revision) {
+ emit(this, "oatbase:render", { entries, enhanced });
+ }
+ });
+ }
+ #enhance(reference, definition, targetId) {
let dropdown = reference.closest("ot-dropdown[data-footnote-preview]");
- let popover = dropdown?.querySelector("[data-footnote-popover]");
+ let popover = dropdown?.querySelector(":scope > [data-footnote-popover]");
if (!dropdown || !popover) {
dropdown = document.createElement("ot-dropdown");
dropdown.dataset.footnotePreview = "";
@@ -1849,21 +1874,15 @@
popover.dataset.footnotePopover = "";
popover.setAttribute("popover", "auto");
popover.setAttribute("role", "note");
- popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
- const content = definition.cloneNode(true);
- content.removeAttribute("id");
- content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
- content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
- content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
- const body = document.createElement("div");
- while (content.firstChild)
- body.append(content.firstChild);
- popover.append(body);
dropdown.append(popover);
- reference.setAttribute("popovertarget", popover.id);
- reference.setAttribute("aria-controls", popover.id);
parent.insertBefore(dropdown, next);
}
+ popover.dataset.footnoteFor = targetId;
+ popover.setAttribute("aria-label", `Footnote ${reference.textContent.trim()}`);
+ reference.setAttribute("popovertarget", popover.id);
+ reference.setAttribute("aria-controls", popover.id);
+ this.#render(popover, definition);
+ const entry = { reference, definition, dropdown, popover };
reference.addEventListener("click", (event) => {
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
return;
@@ -1873,6 +1892,24 @@
else
popover.showPopover();
}, { signal: this.#abort.signal });
+ popover.addEventListener("toggle", (event) => {
+ emit(this, "oatbase:toggle", {
+ ...entry,
+ state: event.newState || (popover.matches(":popover-open") ? "open" : "closed")
+ });
+ }, { signal: this.#abort.signal });
+ return entry;
+ }
+ #render(popover, definition) {
+ const content = definition.cloneNode(true);
+ content.removeAttribute("id");
+ content.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove();
+ content.querySelectorAll("[id]").forEach((element) => element.removeAttribute("id"));
+ content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((element) => element.remove());
+ const body = document.createElement("div");
+ while (content.firstChild)
+ body.append(content.firstChild);
+ popover.replaceChildren(body);
}
}
define("ot-footnotes", OtFootnotes);
diff --git a/dist/oatbase.min.js b/dist/oatbase.min.js
index de200ec..41aedad 100644
--- a/dist/oatbase.min.js
+++ b/dist/oatbase.min.js
@@ -1,3 +1,3 @@
-(()=>{var{defineProperty:V,getOwnPropertyNames:Z,getOwnPropertyDescriptor:tt}=Object,et=Object.prototype.hasOwnProperty;function it(t){return this[t]}var st=(t)=>{var e=(Y??=new WeakMap).get(t),i;if(e)return e;if(e=V({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function"){for(var n of Z(t))if(!et.call(e,n))V(e,n,{get:it.bind(t,n),enumerable:!(i=tt(t,n))||i.enumerable})}return Y.set(t,e),e},Y;var nt=(t)=>t;function rt(t,e){this[t]=nt.bind(null,e)}var ot=(t,e)=>{for(var i in e)V(t,i,{get:e[i],enumerable:!0,configurable:!0,set:rt.bind(e,i)})};var ht={};ot(ht,{OtTree:()=>D,OtToolbar:()=>R,OtToggle:()=>B,OtThemeSwitcher:()=>M,OtSplitter:()=>T,OtSelect:()=>q,OtScrollspy:()=>P,OtRepeater:()=>U,OtReadingProgress:()=>_,OtPassword:()=>H,OtOtp:()=>N,OtMultiselect:()=>O,OtLogViewer:()=>z,OtLightbox:()=>$,OtFootnotes:()=>F,OtDataTable:()=>K,OtCopy:()=>k,OtCommand:()=>L,OtCombobox:()=>S,OtActionField:()=>I});(()=>{var t=class extends HTMLElement{#t=!1;connectedCallback(){this.#t||(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.#e(),{once:!0}):this.#e())}#e(){this.#t||(this.#t=!0,this.init())}disconnectedCallback(){this.cleanup()}cleanup(){}handleEvent(s){let r=this[`on${s.type}`];r&&r.call(this,s)}keyNav(s,r,a,l,u,p=!1){let{key:g}=s,y=-1;return g===u?y=(r+1)%a:g===l?y=(r-1+a)%a:p&&(g==="Home"?y=0:g==="End"&&(y=a-1)),y>=0&&s.preventDefault(),y}emit(s,r=null){return this.dispatchEvent(new CustomEvent(s,{bubbles:!0,composed:!0,cancelable:!0,detail:r}))}uid(){return Math.random().toString(36).slice(2,10)}};"commandForElement"in HTMLButtonElement.prototype||document.addEventListener("click",(s)=>{let r=s.target.closest("button[commandfor]");if(!r)return;let a=document.getElementById(r.getAttribute("commandfor"));if(!a)return;let l=r.getAttribute("command")||"toggle";a instanceof HTMLDialogElement&&(l==="show-modal"?a.showModal():l==="close"||a.open?a.close():a.showModal())}),document.addEventListener("touchstart",(s)=>{s.target instanceof HTMLDialogElement&&(s.preventDefault(),s.target.close())},{passive:!1});var e=class extends t{#t=[];#e=[];#i;#s=[];init(){let s=this.querySelector(':scope > [role="tablist"]');if(this.#t=s?[...s.querySelectorAll('[role="tab"]')]:[],this.#e=[...this.querySelectorAll(':scope > [role="tabpanel"]')],this.#t.length===0||this.#e.length===0){console.warn("ot-tabs: Missing tab or tabpanel elements");return}this.#i=this.dataset.anchor,this.#t.forEach((l,u)=>{let p=this.#e[u];p&&(this.#s[u]=l.id||"",l.id||=`ot-tab-${this.uid()}`,p.id||=`ot-panel-${this.uid()}`,l.setAttribute("aria-controls",p.id),p.setAttribute("aria-labelledby",l.id))}),s.addEventListener("click",this),s.addEventListener("keydown",this),this.#i&&window.addEventListener("hashchange",this);let r=this.#t.findIndex((l)=>l.ariaSelected==="true"),a=this.#r();this.#n(Math.max(0,a>=0?a:r),!1)}cleanup(){window.removeEventListener("hashchange",this)}onclick(s){let r=this.#t.indexOf(s.target.closest('[role="tab"]'));r>=0&&this.#n(r)}onkeydown(s){if(!s.target.closest('[role="tab"]'))return;let r=this.keyNav(s,this.activeIndex,this.#t.length,"ArrowLeft","ArrowRight");r>=0&&(this.#n(r),this.#t[r].focus())}onhashchange(){let s=this.#r();s>=0&&this.#n(s,!1)}#n(s,r=!0){this.#t.forEach((a,l)=>{let u=l===s;a.ariaSelected=String(u),a.tabIndex=u?0:-1}),this.#e.forEach((a,l)=>a.hidden=l!==s),r&&this.#o(s),this.emit("ot-tab-change",{index:s,tab:this.#t[s]})}#r(){let s=this.#i&&new URLSearchParams(location.hash.slice(1)).get(this.#i);return s?this.#s.indexOf(s):-1}#o(s){if(!this.#i)return;let r=new URLSearchParams(location.hash.slice(1));r.set(this.#i,this.#s[s]);for(let[l,u]of[...r])u||r.delete(l);let a=r.toString();history.replaceState(null,"",a?`#${a}`:location.pathname+location.search)}get activeIndex(){return this.#t.findIndex((s)=>s.ariaSelected==="true")}set activeIndex(s){s>=0&&s{let s=this.#e.getBoundingClientRect(),r=this.#t.getBoundingClientRect();this.#t.style.top=`${s.bottom+r.height>window.innerHeight?s.top-r.height:s.bottom}px`,this.#t.style.left=`${s.left+r.width>window.innerWidth?s.right-r.width:s.left}px`})}ontoggle(s){s.newState==="open"?(this.#i(),window.addEventListener("scroll",this.#i,!0),window.addEventListener("resize",this.#i),this.#s=[...this.querySelectorAll('[role="menuitem"]')],this.#s[0]?.focus(),this.#e.ariaExpanded="true"):(this.cleanup(),this.#s=null,this.#e.ariaExpanded="false",this.#e.focus())}onkeydown(s){if(!s.target.matches('[role="menuitem"]'))return;let r=this.#s.indexOf(s.target),a=this.keyNav(s,r,this.#s.length,"ArrowUp","ArrowDown",!0);a>=0&&this.#s[a].focus()}cleanup(){window.removeEventListener("scroll",this.#i,!0),window.removeEventListener("resize",this.#i)}};customElements.define("ot-dropdown",i);var n=class extends t{#t;#e;#i;init(){if(this.#t=this.querySelector('input[type="file"]'),!!this.#t){this.#e=this.querySelector("[data-files]"),this.#i=this.#e?[...this.#e.childNodes]:[],this.classList.add("card","vstack","align-center"),this.#e?.classList.add("hstack","justify-center");for(let s of["click","dragover","dragleave","drop","change"])this.addEventListener(s,this)}}onclick(s){if(this.#t.disabled)return;let r=s.target.closest("button");if(r&&this.#e?.contains(r))return this.#s([...this.#t.files].filter((a,l)=>l!==[...this.#e.children].indexOf(r.parentElement)));s.target!==this.#t&&this.#t.click()}ondragover(s){this.#t.disabled||(s.preventDefault(),s.dataTransfer.dropEffect="copy",this.toggleAttribute("data-drag",!0))}ondragleave(s){this.contains(s.relatedTarget)||this.removeAttribute("data-drag")}ondrop(s){this.#t.disabled||(s.preventDefault(),this.removeAttribute("data-drag"),this.#s([...s.dataTransfer.files].slice(0,this.#t.multiple?1/0:1)))}onchange(){if(!this.#e)return;let s=[...this.#t.files].map((r)=>{let a=document.createElement("span");a.className="badge",a.dataset.variant="secondary",a.textContent=r.name;let l=document.createElement("button");return l.type="button",l.ariaLabel=`Remove ${r.name}`,l.textContent="×",a.append(l),a});this.#e.replaceChildren(...s.length?s:this.#i)}#s(s){let r=new DataTransfer;s.forEach((a)=>r.items.add(a)),this.#t.files=r.files,this.#t.dispatchEvent(new Event("change",{bubbles:!0}))}};customElements.define("ot-upload",n),document.addEventListener("DOMContentLoaded",()=>{let s="title",r="[title]",a=(l)=>{let u=l.getAttribute(s);u&&(l.setAttribute("data-tooltip",u),l.hasAttribute("aria-label")||l.setAttribute("aria-label",u),l.removeAttribute(s))};document.querySelectorAll(r).forEach(a),new MutationObserver((l)=>{for(let u of l){a(u.target);for(let p of u.addedNodes)p.nodeType===1&&(a(p),p.querySelectorAll(r).forEach(a))}}).observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[s]})}),document.addEventListener("click",(s)=>{let r=s.target.closest("[data-sidebar-toggle]");if(r){r.closest("[data-sidebar-layout]")?.toggleAttribute("data-sidebar-open");return}if(!s.target.closest("[data-sidebar]")){let a=document.querySelector("[data-sidebar-layout][data-sidebar-open]");a&&window.matchMedia("(max-width: 768px)").matches&&a.removeAttribute("data-sidebar-open")}});var o=(s)=>document.createElement(s),h=(s)=>String(s).trim(),b=class extends t{static observedAttributes=["disabled"];#t=new WeakMap;init(){if(this.input=this.querySelector("input"),!this.input)return;this.input.readOnly||(this.input.addEventListener("keydown",this),this.input.addEventListener("input",(r)=>{r.stopPropagation();let a=this.input.value,l=this.input.list,u=l&&(r.inputType==="insertReplacementText"||a.length-(this.prev||"").length>1);if(this.prev=a,u){let p=[...l.options].find((g)=>g.value===a);if(p)return requestAnimationFrame(()=>this.add(p.data??a))}}),this.input.addEventListener("change",(r)=>r.stopPropagation()),this.input.addEventListener("focus",this),this.addEventListener("click",this));let s=this.getAttribute("value");s&&(this.value=[s]),this.attributeChangedCallback()}attributeChangedCallback(){this.input&&(this.input.disabled=this.disabled),this.setAttribute("aria-disabled",this.disabled)}get disabled(){return this.hasAttribute("disabled")}set disabled(s){this.toggleAttribute("disabled",!!s)}onkeydown(s){if(s.key==="Backspace"&&!this.input.value)return this.remove(this.input.previousElementSibling);(s.key==="Enter"||s.key===",")&&(s.preventDefault(),this.add(this.input.value))}onfocus(){this.input.list&&(this.input.dispatchEvent(new Event("input",{bubbles:!0})),requestAnimationFrame(()=>{try{this.input.showPicker()}catch{}}))}onclick(s){if(this.disabled)return;let r=s.target.closest("button");r?this.remove(r.parentElement):this.input.focus()}add(s,r){let a=h(s);if(!a||this.value.some((u)=>h(u)===a))return;let l=o("span");if(l.className="badge",l.dataset.variant="secondary",l.textContent=a,s&&typeof s=="object"&&this.#t.set(l,s),this.input.readOnly)this.insertBefore(l,this.input);else{let u=o("button");u.type="button",u.ariaLabel=`Remove ${a}`,u.textContent="×",l.appendChild(u),this.insertBefore(l,this.input),this.input.value=this.prev="",this.input.list?.replaceChildren()}r||this.emit("input",this.value)}remove(s){s&&(s.remove(),this.emit("input",this.value))}get value(){return[...this.querySelectorAll(".badge")].map((s)=>this.#t.get(s)??s.firstChild.data)}set value(s){this.input??=this.querySelector("input"),this.querySelectorAll(".badge").forEach((r)=>r.remove()),(Array.isArray(s)?s:[]).forEach((r)=>{typeof r=="string"?r.split(",").forEach((a)=>this.add(a,!0)):this.add(r,!0)})}};customElements.define("ot-taginput",b);var f={};function C(s){if(!f[s]){let r=document.createElement("div");r.className="toast-container",r.setAttribute("popover","manual"),r.setAttribute("data-placement",s),document.body.appendChild(r),f[s]=r}return f[s]}function E(s,r={}){let{placement:a="top-right",duration:l=4000}=r,u=C(a);s.classList.add("toast");let p,g=()=>{l>0&&(p=setTimeout(()=>X(s,u),l))};return s.onmouseenter=()=>clearTimeout(p),s.onmouseleave=g,s.setAttribute("data-entering",""),u.appendChild(s),u.showPopover(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{s.removeAttribute("data-entering")})}),g(),s}function X(s,r){if(s.hasAttribute("data-exiting"))return;s.setAttribute("data-exiting","");let a=()=>{s.remove(),r.children.length||r.hidePopover()};s.addEventListener("transitionend",a,{once:!0});let l=getComputedStyle(s).getPropertyValue("--transition").trim(),u=parseFloat(l),p=l.endsWith("ms")?u:u*1000;setTimeout(a,p)}function G(s,r,a={}){let{variant:l="info",...u}=a,p=document.createElement("output");if(p.setAttribute("data-variant",l),r){let y=document.createElement("h6");y.className="toast-title",y.textContent=r,p.appendChild(y)}let g=document.createElement("div");return g.className="toast-message",g.textContent=s,p.appendChild(g),E(p,u)}function J(s,r={}){let a;if(s instanceof HTMLTemplateElement?a=s.content.firstElementChild?.cloneNode(!0):s&&(a=s.cloneNode(!0)),!!a)return a.removeAttribute("id"),E(a,r)}function Q(s){(s?[f[s]]:Object.values(f)).forEach((r)=>{r&&(r.innerHTML="",r.hidePopover())})}var W=window.ot||(window.ot={});W.toast=G,W.toast.el=J,W.toast.clear=Q})();var at=0,v=(t="oatbase")=>`${t}-${++at}`;function d(t,e){if(!customElements.get(t))customElements.define(t,e)}function x(t,e){if(document.readyState!=="loading"){e();return}let i=new AbortController;return document.addEventListener("DOMContentLoaded",()=>{if(t.isConnected)e()},{once:!0,signal:i.signal}),i}function m(t,e){t.forEach((n,o)=>n.toggleAttribute("data-active",o===e));let i=t[e];return i?.scrollIntoView({block:"nearest"}),i}function A(t,e,i){if(!i)return-1;if(t==="ArrowDown")return(e+1+i)%i;if(t==="ArrowUp")return(e-1+i)%i;if(t==="Home")return 0;if(t==="End")return i-1;return e}function c(t,e,i){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:i}))}var j=new Set;document.addEventListener("pointerdown",(t)=>{j.forEach((e)=>{if(!e.contains(t.target))e.close()})});function w(t,e){j.add(t),e.addEventListener("abort",()=>j.delete(t),{once:!0})}class S extends HTMLElement{#t;#e;#i=-1;connectedCallback(){this.#e?.abort(),this.#e=x(this,()=>this.#s())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get value(){return this.select?.value||""}set value(t){if(!this.select)return;this.select.value=String(t),this.#c()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get visibleOptions(){return this.options.filter((t)=>!t.hidden&&t.getAttribute("aria-disabled")!=="true")}open(){if(this.input?.disabled)return;this.list.hidden=!1,this.input.setAttribute("aria-expanded","true")}close(){if(!this.list)return;this.list.hidden=!0,this.input?.setAttribute("aria-expanded","false"),this.input?.removeAttribute("aria-activedescendant"),m(this.visibleOptions,-1),this.#i=-1}#s(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.select=this.querySelector(":scope > select"),!this.select)return;this.#n(),this.input.addEventListener("input",()=>this.#r(),{signal:t}),this.input.addEventListener("focus",()=>this.open(),{signal:t}),this.input.addEventListener("keydown",(e)=>this.#o(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#a(e),{signal:t}),this.list.addEventListener("click",(e)=>this.#l(e),{signal:t}),this.select.addEventListener("change",()=>this.#c(),{signal:t}),this.select.form?.addEventListener("reset",()=>queueMicrotask(()=>this.#c()),{signal:t}),w(this,t),this.dataset.enhanced="",this.#c()}#n(){this.querySelectorAll(":scope > [data-generated]").forEach((i)=>i.remove());let t=v("oatbase-combobox");this.input=document.createElement("input"),this.input.type="search",this.input.autocomplete="off",this.input.placeholder=this.dataset.placeholder||"Search…",this.input.disabled=this.select.disabled,this.input.dataset.generated="",this.input.setAttribute("role","combobox"),this.input.setAttribute("aria-autocomplete","list"),this.input.setAttribute("aria-controls",t),this.input.setAttribute("aria-expanded","false");let e=this.select.getAttribute("aria-label");if(e)this.input.setAttribute("aria-label",e);if(this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),[...this.select.options].forEach((i,n)=>this.#h(i,n)),this.hasAttribute("data-allow-custom"))this.create=document.createElement("li"),this.create.id=`${t}-create`,this.create.dataset.create="",this.create.dataset.generated="",this.create.setAttribute("role","option"),this.create.setAttribute("aria-selected","false"),this.create.hidden=!0,this.list.append(this.create);this.empty=document.createElement("li"),this.empty.dataset.empty="",this.empty.dataset.generated="",this.empty.textContent=this.dataset.empty||"No results found.",this.empty.hidden=!0,this.list.append(this.empty),this.append(this.input,this.list)}#r(){let t=this.input.value.trim(),e=t.toLocaleLowerCase(),i=this.select.options[this.select.selectedIndex];if(i&&this.input.value!==i.textContent)this.select.selectedIndex=-1,this.options.forEach((o)=>o.setAttribute("aria-selected","false"));let n=this.options.filter((o)=>!o.hasAttribute("data-create"));if(n.forEach((o)=>{let h=`${o.textContent} ${o.dataset.keywords}`.toLocaleLowerCase();o.hidden=!h.includes(e)}),this.create){let o=n.some((h)=>{let b=h._source;return h.textContent.trim().toLocaleLowerCase()===e||b?.value.toLocaleLowerCase()===e});this.create.hidden=!t||o,this.create.dataset.value=t,this.create.textContent=(this.dataset.createLabel||"Create “{value}”").replace("{value}",t)}this.empty.hidden=this.visibleOptions.length>0,this.#i=-1,this.open()}#o(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){t.preventDefault(),this.open(),this.#i=A(t.key,this.#i,this.visibleOptions.length);let e=m(this.visibleOptions,this.#i);if(e)this.input.setAttribute("aria-activedescendant",e.id)}else if(t.key==="Enter"&&(this.#i>=0||this.create&&!this.create.hidden))t.preventDefault(),this.#d(this.#i>=0?this.visibleOptions[this.#i]:this.create);else if(t.key==="Escape")this.close()}#a(t){let e=t.target.closest('[role="option"]');if(!e||e.hidden||e.getAttribute("aria-disabled")==="true")return;this.#i=this.visibleOptions.indexOf(e),m(this.visibleOptions,this.#i)}#l(t){let e=t.target.closest('[role="option"]');if(e&&e.getAttribute("aria-disabled")!=="true")this.#d(e)}#d(t){if(!t)return;if(t.hasAttribute("data-create")){let i=t.dataset.value.trim();if(!i)return;let n=new Option(i,i,!0,!0);n.dataset.custom="",this.select.append(n);let o=this.#h(n,n.index,this.create);c(this,"oatbase:create",{value:i,option:n}),t=o}let e=t._source;this.select.selectedIndex=e.index,this.#c(),this.close(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),c(this,"oatbase:change",{value:e.value,option:e}),this.input.focus()}#h(t,e,i=null){if(!t.value&&t.disabled)return null;let n=document.createElement("li");return n.id=`${this.list.id}-option-${e+1}`,n._source=t,n.dataset.index=e,n.dataset.keywords=t.dataset.keywords||"",n.setAttribute("role","option"),n.setAttribute("aria-disabled",String(t.disabled)),n.setAttribute("aria-selected","false"),n.textContent=t.textContent,this.list.insertBefore(n,i),n}#c(){let t=this.select.options[this.select.selectedIndex];this.input.value=t&&t.value?t.textContent:"",this.input.disabled=this.select.disabled,this.options.forEach((e)=>{e.setAttribute("aria-selected",String(e._source===t))})}}d("ot-combobox",S);class L extends HTMLElement{#t;#e;#i=-1;connectedCallback(){this.#e?.abort(),this.#e=x(this,()=>this.#s())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get items(){return this.list?[...this.list.querySelectorAll("[data-command-item]")]:[]}get visibleItems(){return this.items.filter((t)=>!t.hidden&&!t.closest("li")?.hidden&&!t.hasAttribute("aria-disabled"))}get query(){return this.search?.value.trim()||""}open(){if(!this.dialog.open)this.dialog.showModal();this.search.setAttribute("aria-expanded","true"),this.search.value="",this.#n(),requestAnimationFrame(()=>this.search.focus()),c(this,"oatbase:open")}close(){if(this.dialog.open)this.dialog.close();this.search?.setAttribute("aria-expanded","false"),c(this,"oatbase:close")}#s(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.dialog=this.querySelector(":scope > dialog"),this.search=this.dialog?.querySelector("[data-command-search]"),this.list=this.dialog?.querySelector("[data-command-list]"),!this.dialog||!this.search||!this.list)return;this.list.id||=v("oatbase-command"),this.list.setAttribute("role","listbox"),this.search.setAttribute("role","combobox"),this.search.setAttribute("aria-autocomplete","list"),this.search.setAttribute("aria-expanded",String(this.dialog.open)),this.search.setAttribute("aria-controls",this.list.id),this.querySelectorAll("[data-command-open]").forEach((e)=>{e.addEventListener("click",(i)=>{i.preventDefault(),this.open()},{signal:t})}),this.querySelectorAll("[data-command-close]").forEach((e)=>{e.addEventListener("click",()=>this.close(),{signal:t})}),this.search.addEventListener("input",()=>this.#n(),{signal:t}),this.search.addEventListener("keydown",(e)=>this.#a(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#l(e),{signal:t}),this.list.addEventListener("click",(e)=>{let i=e.target.closest("[data-command-item]");if(i&&!i.hasAttribute("aria-disabled"))this.#h(i)},{signal:t}),this.dialog.addEventListener("click",(e)=>{let i=this.dialog.getBoundingClientRect();if(e.clientXi.right||e.clientYi.bottom)this.close()},{signal:t}),this.dialog.addEventListener("close",()=>this.search.setAttribute("aria-expanded","false"),{signal:t}),document.addEventListener("keydown",(e)=>{if(this.dataset.shortcut?.toLowerCase()==="mod+k"&&(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="k")e.preventDefault(),this.dialog.open?this.close():this.open()},{signal:t}),this.refresh()}refresh(){if(!this.list||!this.search)return;this.#r(),this.#o()}#n(){if(this.dispatchEvent(new CustomEvent("oatbase:query",{bubbles:!0,composed:!0,cancelable:!0,detail:{query:this.query}})))this.#r();this.#o()}#r(){if(this.dataset.filter!=="manual"){let t=this.query.toLocaleLowerCase();this.items.forEach((e)=>{let i=`${e.textContent} ${e.dataset.keywords||""}`.toLocaleLowerCase(),n=e.closest("li")||e;n.hidden=!i.includes(t)})}}#o(){this.items.forEach((i)=>{i.id||=v("oatbase-command-item"),i.setAttribute("role","option")}),this.list.querySelectorAll("[data-command-group]").forEach((i)=>{let n=i.nextElementSibling,o=!1;while(n&&!n.hasAttribute("data-command-group")){if((n.matches("[data-command-item]")||n.querySelector("[data-command-item]"))&&!n.hidden)o=!0;n=n.nextElementSibling}i.hidden=!o});let t=this.visibleItems;this.querySelector("[data-command-empty]")?.toggleAttribute("hidden",t.length>0);let e=t.findIndex((i)=>i.hasAttribute("data-active"));this.#d(e>=0?e:t.length?0:-1)}#a(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key))t.preventDefault(),this.#d(A(t.key,this.#i,this.visibleItems.length));else if(t.key==="Enter"&&this.#i>=0)t.preventDefault(),this.#h(this.visibleItems[this.#i])}#l(t){let e=t.target.closest("[data-command-item]");if(!e||e.closest("li")?.hidden||e.hasAttribute("aria-disabled"))return;this.#d(this.visibleItems.indexOf(e))}#d(t){this.#i=t;let e=this.visibleItems,i=m(e,t);if(this.items.forEach((n)=>n.setAttribute("aria-selected",String(n===i))),i)this.search.setAttribute("aria-activedescendant",i.id);else this.search.removeAttribute("aria-activedescendant")}#h(t){if(!t)return;let e=t.dataset.value||t.textContent.trim();if(!this.dispatchEvent(new CustomEvent("oatbase:select",{bubbles:!0,composed:!0,cancelable:!0,detail:{value:e,item:t}})))return;if(!t.hasAttribute("data-keep-open"))this.close()}}d("ot-command",L);class q extends HTMLElement{#t;#e;#i=-1;connectedCallback(){this.#e?.abort(),this.#e=x(this,()=>this.#s())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get value(){return this.select?.value||""}set value(t){if(!this.select)return;this.select.value=String(t),this.#l()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get enabledOptions(){return this.options.filter((t)=>t.getAttribute("aria-disabled")!=="true")}open(){if(this.select?.disabled)return;this.list.hidden=!1,this.button.setAttribute("aria-expanded","true"),this.#i=this.enabledOptions.findIndex((e)=>e.getAttribute("aria-selected")==="true");let t=m(this.enabledOptions,this.#i);if(t)this.button.setAttribute("aria-activedescendant",t.id)}close(){if(!this.list)return;this.list.hidden=!0,this.button.setAttribute("aria-expanded","false"),this.button.removeAttribute("aria-activedescendant"),m(this.enabledOptions,-1),this.#i=-1}toggle(){this.list.hidden?this.open():this.close()}#s(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.select=this.querySelector(":scope > select"),!this.select)return;this.#n(),this.button.addEventListener("click",()=>this.toggle(),{signal:t}),this.button.addEventListener("keydown",(e)=>this.#r(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#o(e),{signal:t}),this.list.addEventListener("click",(e)=>{let i=e.target.closest('[role="option"]');if(i&&i.getAttribute("aria-disabled")!=="true")this.#a(i)},{signal:t}),this.select.addEventListener("change",()=>this.#l(),{signal:t}),w(this,t),this.dataset.enhanced="",this.#l()}#n(){this.querySelectorAll(":scope > [data-generated]").forEach((i)=>i.remove());let t=v("oatbase-select");this.button=document.createElement("button"),this.button.type="button",this.button.className="outline",this.button.dataset.generated="",this.button.setAttribute("aria-haspopup","listbox"),this.button.setAttribute("aria-controls",t),this.button.setAttribute("aria-expanded","false");let e=this.select.getAttribute("aria-label");if(e)this.button.setAttribute("aria-label",e);this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),[...this.select.options].forEach((i,n)=>{if(!i.value&&i.disabled)return;let o=document.createElement("li");o.id=`${t}-option-${n+1}`,o._source=i,o.dataset.index=n,o.setAttribute("role","option"),o.setAttribute("aria-disabled",String(i.disabled)),o.textContent=i.textContent,this.list.append(o)}),this.append(this.button,this.list)}#r(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){if(t.preventDefault(),this.list.hidden)this.open();this.#i=A(t.key,this.#i,this.enabledOptions.length);let e=m(this.enabledOptions,this.#i);if(e)this.button.setAttribute("aria-activedescendant",e.id)}else if(t.key==="Enter"||t.key===" "){if(t.preventDefault(),this.list.hidden)this.open();else if(this.#i>=0)this.#a(this.enabledOptions[this.#i])}else if(t.key==="Escape")this.close()}#o(t){let e=t.target.closest('[role="option"]');if(!e||e.getAttribute("aria-disabled")==="true")return;this.#i=this.enabledOptions.indexOf(e),m(this.enabledOptions,this.#i)}#a(t){let e=t._source;if(!e||e.disabled)return;this.select.selectedIndex=e.index,this.#l(),this.close(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),c(this,"oatbase:change",{value:e.value,option:e}),this.button.focus()}#l(){let t=this.select.options[this.select.selectedIndex];this.button.textContent=t?.value?t.textContent:this.dataset.placeholder||t?.textContent||"Select an option",this.button.disabled=this.select.disabled,this.options.forEach((e)=>e.setAttribute("aria-selected",String(e._source===t)))}}d("ot-select",q);class M extends HTMLElement{#t;#e="system";connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;this.key=this.dataset.storageKey||"oatbase-theme";let e=this.dataset.default||"system";try{e=localStorage.getItem(this.key)||e}catch{}this.#e=["system","light","dark"].includes(e)?e:"system",this.buttons=[...this.querySelectorAll("[data-theme-value]")],this.toggleButton=this.buttons.length?null:this.querySelector("button"),this.toggleContents=this.toggleButton?[...this.toggleButton.querySelectorAll("[data-theme-content]")]:[],this.toggleLabel=this.toggleButton?.querySelector("[data-theme-label]"),this.toggleAttribute("data-group",this.buttons.length>1),this.buttons.forEach((i)=>i.addEventListener("click",()=>this.value=i.dataset.themeValue,{signal:t})),this.toggleButton?.addEventListener("click",()=>{let i=["system","light","dark"];this.value=i[(i.indexOf(this.#e)+1)%i.length]},{signal:t}),this.#s(!1)}disconnectedCallback(){this.#t?.abort()}get value(){return this.#e}set value(t){if(!["system","light","dark"].includes(t))return;this.#e=t,this.#s(!0)}#i(){if(!this.dataset.target)return this.ownerDocument.documentElement;try{return this.ownerDocument.querySelector(this.dataset.target)}catch{return null}}#s(t){let e=this.#i();if(e)if(e.style.colorScheme=this.#e==="system"?"light dark":this.#e,this.#e==="system")e.removeAttribute("data-theme");else e.dataset.theme=this.#e;try{localStorage.setItem(this.key,this.#e)}catch{}if(this.buttons.forEach((i)=>i.setAttribute("aria-pressed",String(i.dataset.themeValue===this.#e))),this.toggleButton){let i=this.#e==="light"?"Light":this.#e==="dark"?"Dark":"System";if(this.toggleContents.length){if(this.toggleContents.forEach((n)=>{n.hidden=n.dataset.themeContent!==this.#e}),this.toggleLabel)this.toggleLabel.textContent=i}else this.toggleButton.textContent=i;this.toggleButton.dataset.theme=this.#e,this.toggleButton.setAttribute("aria-label",`Theme: ${this.#e}. Click to change.`)}if(t)c(this,"change",{value:this.#e})}}d("ot-theme-switcher",M);class k extends HTMLElement{#t;#e;#i;#s;connectedCallback(){this.#t?.abort(),this.#t=new AbortController,this.button=this.querySelector("[data-copy-button]"),this.source=this.#n(),this.#i=this.button?.textContent?.trim()||"",this.#s=this.#r(),this.toggleAttribute("data-enhanced",Boolean(this.button&&this.source)),this.#o(this.dataset.copied||"Copied"),this.button?.addEventListener("click",()=>this.copy(),{signal:this.#t.signal})}disconnectedCallback(){if(this.#t?.abort(),clearTimeout(this.#e),this.button)this.button.textContent=this.#i;if(this.#s)this.#s.textContent=""}#n(){let t=this.button?.dataset.copyTarget||this.dataset.copyTarget;return t&&document.getElementById(t)||this.querySelector("[data-copy-source]")}#r(){if(!this.button||!this.source)return;let t=this.querySelector("[data-copy-status]");if(!t)t=document.createElement("span"),t.dataset.copyStatus="",this.append(t);return t.classList.add("visually-hidden"),t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true"),t.textContent="",t}get value(){let t=this.#n();return t&&"value"in t?t.value:t?.textContent?.trim()||""}#o(t){if(!this.button)return;let e=this.button.cloneNode(!0);e.textContent=t,e.style.cssText="position:fixed!important;inset:0 auto auto 0!important;inline-size:max-content!important;visibility:hidden!important;pointer-events:none!important",this.append(e);let i=Math.ceil(Math.max(this.button.getBoundingClientRect().width,e.getBoundingClientRect().width));e.remove(),this.button.style.minInlineSize=`${i}px`}async copy(){let t=this.value;if(!t)return;try{await navigator.clipboard.writeText(t)}catch{let i=Object.assign(document.createElement("textarea"),{value:t});document.body.append(i),i.select(),document.execCommand("copy"),i.remove()}let e=this.dataset.copied||"Copied";if(this.#o(e),this.button.textContent=e,this.#s)this.#s.textContent=e;c(this,"oatbase:copy",{value:t}),clearTimeout(this.#e),this.#e=setTimeout(()=>{if(this.button)this.button.textContent=this.#i;if(this.#s)this.#s.textContent=""},1200)}}d("ot-copy",k);class I extends k{}d("ot-action-field",I);class O extends HTMLElement{#t;#e;#i=-1;connectedCallback(){this.#e?.abort(),this.#e=x(this,()=>this.#s())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get value(){return[...this.select?.selectedOptions||[]].map((t)=>t.value)}set value(t){let e=new Set([].concat(t).map(String));[...this.select?.options||[]].forEach((i)=>{i.selected=e.has(i.value)}),this.#a()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get enabledOptions(){return this.options.filter((t)=>t.getAttribute("aria-disabled")!=="true")}open(){if(this.select?.disabled)return;this.list.hidden=!1,this.button.setAttribute("aria-expanded","true"),this.#i=0,m(this.enabledOptions,this.#i)}close(){if(!this.list)return;this.list.hidden=!0,this.button.setAttribute("aria-expanded","false"),m(this.enabledOptions,-1),this.#i=-1}toggle(){this.list.hidden?this.open():this.close()}#s(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.select=this.querySelector(":scope > select[multiple]"),!this.select)return;this.#n(),this.button.addEventListener("click",()=>this.toggle(),{signal:t}),this.button.addEventListener("keydown",(e)=>this.#r(e),{signal:t}),this.list.addEventListener("click",(e)=>{let i=e.target.closest('[role="option"]');if(i&&i.getAttribute("aria-disabled")!=="true")this.#o(i)},{signal:t}),this.select.addEventListener("change",()=>this.#a(),{signal:t}),w(this,t),this.dataset.enhanced="",this.#a()}#n(){this.querySelectorAll(":scope > [data-generated]").forEach((e)=>e.remove());let t=v("oatbase-multiselect");this.button=document.createElement("button"),this.button.type="button",this.button.className="outline",this.button.dataset.generated="",this.button.setAttribute("aria-haspopup","listbox"),this.button.setAttribute("aria-controls",t),this.button.setAttribute("aria-expanded","false"),this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),this.list.setAttribute("aria-multiselectable","true"),[...this.select.options].forEach((e,i)=>{let n=document.createElement("li");n.id=`${t}-option-${i+1}`,n._source=e,n.dataset.index=i,n.setAttribute("role","option"),n.setAttribute("aria-disabled",String(e.disabled)),n.textContent=e.textContent,this.list.append(n)}),this.append(this.button,this.list)}#r(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){if(t.preventDefault(),this.list.hidden)this.open();this.#i=A(t.key,this.#i,this.enabledOptions.length),m(this.enabledOptions,this.#i)}else if(t.key===" "||t.key==="Enter")if(t.preventDefault(),this.list.hidden)this.open();else this.#o(this.enabledOptions[this.#i]);else if(t.key==="Escape")this.close()}#o(t){let e=t?._source;if(!e||e.disabled)return;e.selected=!e.selected,this.#a(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),c(this,"oatbase:change",{value:this.value,option:e})}#a(){let t=[...this.select.selectedOptions];this.button.textContent=t.length?t.map((e)=>e.textContent).join(", "):this.dataset.placeholder||"Select options",this.button.disabled=this.select.disabled,this.options.forEach((e)=>e.setAttribute("aria-selected",String(e._source.selected)))}}d("ot-multiselect",O);class H extends HTMLElement{#t;connectedCallback(){if(this.#t?.abort(),this.#t=new AbortController,this.input=this.querySelector("input"),this.button=this.querySelector("[data-password-toggle]"),!this.input||!this.button)return;this.button.type="button",this.button.addEventListener("click",()=>this.toggle(),{signal:this.#t.signal}),this.#e()}disconnectedCallback(){this.#t?.abort()}toggle(t){let e=t??this.input.type==="password";this.input.type=e?"text":"password",this.#e(),this.input.focus()}#e(){let t=this.input.type==="text";this.button.setAttribute("aria-pressed",String(t)),this.button.setAttribute("aria-label",t?"Hide password":"Show password"),this.button.textContent=t?this.dataset.hideLabel||"Hide":this.dataset.showLabel||"Show"}}d("ot-password",H);class T extends HTMLElement{#t;#e=!1;connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.handle=this.querySelector("[data-splitter]"),!this.handle)return;this.handle.type="button",this.handle.setAttribute("role","separator"),this.handle.setAttribute("aria-orientation",this.separatorOrientation),this.handle.setAttribute("aria-valuemin",String(this.min)),this.handle.setAttribute("aria-valuemax",String(this.max)),this.handle.addEventListener("pointerdown",(e)=>{this.#e=!0,this.handle.setPointerCapture?.(e.pointerId),this.#i(e)},{signal:t}),this.handle.addEventListener("pointermove",(e)=>this.#e&&this.#i(e),{signal:t}),this.handle.addEventListener("pointerup",()=>{this.#e=!1},{signal:t}),this.handle.addEventListener("keydown",(e)=>{if(!(this.vertical?["ArrowUp","ArrowDown","Home","End"]:["ArrowLeft","ArrowRight","Home","End"]).includes(e.key))return;e.preventDefault();let n=e.key==="ArrowLeft"||e.key==="ArrowUp",o=e.key==="Home"?this.min:e.key==="End"?this.max:this.value+(n?-5:5);this.value=o},{signal:t}),this.value=Number(this.dataset.value||50)}disconnectedCallback(){this.#t?.abort()}get min(){return Number(this.dataset.min||20)}get max(){return Number(this.dataset.max||80)}get vertical(){return this.getAttribute("aria-orientation")==="vertical"}get separatorOrientation(){return this.vertical?"horizontal":"vertical"}get value(){return Number(this.handle?.getAttribute("aria-valuenow")||50)}set value(t){let e=Math.min(this.max,Math.max(this.min,Math.round(Number(t))));this.style.setProperty("--split",`${e}%`),this.handle?.setAttribute("aria-valuenow",String(e)),c(this,"oatbase:resize",{value:e})}#i(t){let e=this.getBoundingClientRect();this.value=this.vertical?(t.clientY-e.top)/e.height*100:(t.clientX-e.left)/e.width*100}}d("ot-splitter",T);class D extends HTMLElement{#t;connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.querySelector(":scope > ul");if(!t)return;t.setAttribute("role","tree"),this.querySelectorAll("li").forEach((i)=>{i.setAttribute("role","treeitem");let n=i.querySelector(":scope > ul");if(n){if(n.setAttribute("role","group"),!i.hasAttribute("aria-expanded"))i.setAttribute("aria-expanded","false")}let o=i.firstElementChild;if(o)o.tabIndex=-1});let e=this.visibleItems[0]?.firstElementChild;if(e)e.tabIndex=0;this.addEventListener("click",(i)=>{let n=i.target.closest('[role="treeitem"]');if(n?.hasAttribute("aria-expanded"))n.setAttribute("aria-expanded",String(n.getAttribute("aria-expanded")!=="true"))},{signal:this.#t.signal}),this.addEventListener("keydown",(i)=>this.#i(i),{signal:this.#t.signal})}disconnectedCallback(){this.#t?.abort()}get visibleItems(){return[...this.querySelectorAll('[role="treeitem"]')].filter((t)=>t.offsetParent!==null)}#e(t){this.querySelectorAll('[role="treeitem"] > :first-child').forEach((i)=>{i.tabIndex=-1});let e=t?.firstElementChild;if(e)e.tabIndex=0,e.focus()}#i(t){let e=t.target.closest('[role="treeitem"]');if(!e)return;let i=this.visibleItems,n=i.indexOf(e);if(t.key==="ArrowDown")this.#e(i[n+1]||i[0]);else if(t.key==="ArrowUp")this.#e(i[n-1]||i.at(-1));else if(t.key==="Home")this.#e(i[0]);else if(t.key==="End")this.#e(i.at(-1));else if(t.key==="ArrowRight"&&e.hasAttribute("aria-expanded"))e.setAttribute("aria-expanded","true");else if(t.key==="ArrowLeft"&&e.getAttribute("aria-expanded")==="true")e.setAttribute("aria-expanded","false");else return;t.preventDefault()}}d("ot-tree",D);class B extends HTMLElement{connectedCallback(){if(this.button=this.querySelector(":scope > button"),!this.button)return;this.button.type="button",this.pressed=this.hasAttribute("pressed")||this.button.getAttribute("aria-pressed")==="true",this.button.addEventListener("click",this)}disconnectedCallback(){this.button?.removeEventListener("click",this)}handleEvent(){if(this.button.disabled||this.button.getAttribute("aria-disabled")==="true")return;this.pressed=!this.pressed,c(this,"oatbase:change",{pressed:this.pressed})}get pressed(){return this.hasAttribute("pressed")}set pressed(t){this.toggleAttribute("pressed",Boolean(t)),this.button?.setAttribute("aria-pressed",String(Boolean(t)))}}d("ot-toggle",B);class R extends HTMLElement{connectedCallback(){if(!this.hasAttribute("role"))this.setAttribute("role","toolbar");if(!this.hasAttribute("aria-orientation"))this.setAttribute("aria-orientation","horizontal");this.refresh(),this.addEventListener("focusin",this),this.addEventListener("keydown",this)}disconnectedCallback(){this.removeEventListener("focusin",this),this.removeEventListener("keydown",this)}handleEvent(t){if(t.type==="keydown")return this.#e(t);let e=this.items.indexOf(t.target);if(e>=0)this.#t(e,!1)}refresh(){this.items=[...this.children].map((e)=>e.matches("ot-toggle")?e.querySelector("button"):e).filter((e)=>e?.matches("button:not(:disabled), a[href], [data-toolbar-item]")&&e.getAttribute("aria-disabled")!=="true");let t=Math.max(0,this.items.findIndex((e)=>e.tabIndex===0));this.items.forEach((e,i)=>{e.tabIndex=i===t?0:-1})}#t(t,e=!0){if(!this.items.length)return;let i=(t+this.items.length)%this.items.length;if(this.items.forEach((n,o)=>{n.tabIndex=o===i?0:-1}),e)this.items[i].focus()}#e(t){let e=this.items.indexOf(t.target);if(e<0)return;let i=this.getAttribute("aria-orientation")==="vertical",n=e;if(t.key==="Home")n=0;else if(t.key==="End")n=this.items.length-1;else if(i&&t.key==="ArrowDown")n=e+1;else if(i&&t.key==="ArrowUp")n=e-1;else if(!i&&t.key==="ArrowRight")n=e+1;else if(!i&&t.key==="ArrowLeft")n=e-1;else return;t.preventDefault(),this.#t(n)}}d("ot-toolbar",R);class N extends HTMLElement{#t=!1;connectedCallback(){if(this.input=this.querySelector(":scope > input"),!this.input)return;if(this.length=Math.min(12,Math.max(1,Number(this.dataset.length||this.input.maxLength||6))),this.input.maxLength<1)this.input.maxLength=this.length;if(this.slots=this.querySelector(":scope > [data-otp-slots]")||document.createElement("span"),this.slots.dataset.otpSlots="",this.slots.setAttribute("aria-hidden","true"),this.slots.style.setProperty("--otp-length",this.length),!this.slots.isConnected)this.append(this.slots);this.slots.replaceChildren(...Array.from({length:this.length},()=>document.createElement("span"))),this.input.addEventListener("input",this),this.form=this.input.form,this.form?.addEventListener("reset",this),this.dataset.enhanced="",this.#e(!1)}disconnectedCallback(){this.input?.removeEventListener("input",this),this.form?.removeEventListener("reset",this)}handleEvent(t){if(t.type==="reset")setTimeout(()=>this.#e(!1));else this.#e(!0)}get value(){return this.input?.value||""}set value(t){if(!this.input)return;this.input.value=String(t).slice(0,this.length),this.#e(!1)}#e(t){if(!this.input||!this.slots)return;if(this.input.inputMode==="numeric"){let o=this.input.value.replace(/\D/g,"").slice(0,this.length);if(o!==this.input.value)this.input.value=o}else if(this.input.value.length>this.length)this.input.value=this.input.value.slice(0,this.length);let e=this.input.value,i=Math.min(this.length-1,e.length);[...this.slots.children].forEach((o,h)=>{o.textContent=e[h]||" ",o.toggleAttribute("data-filled",h dialog[data-lightbox-dialog]"),this.image=this.dialog?.querySelector("[data-lightbox-image]"),this.caption=this.dialog?.querySelector("[data-lightbox-caption]"),this.status=this.dialog?.querySelector("[data-lightbox-status]"),this.previousButton=this.dialog?.querySelector("[data-lightbox-previous]"),this.nextButton=this.dialog?.querySelector("[data-lightbox-next]"),this.closeButton=this.dialog?.querySelector("[data-lightbox-close]"),!this.dialog||!this.image||typeof this.dialog.showModal!=="function")return;let t={signal:this.#t.signal};this.addEventListener("click",(e)=>this.#s(e),t),this.dialog.addEventListener("keydown",(e)=>this.#n(e),t),this.dialog.addEventListener("close",()=>this.#a(),t),this.previousButton?.addEventListener("click",()=>this.previous(),t),this.nextButton?.addEventListener("click",()=>this.next(),t),this.closeButton?.addEventListener("click",()=>this.close(),t),this.toggleAttribute("data-enhanced",!0)}disconnectedCallback(){this.#t?.abort()}get items(){return[...this.querySelectorAll("[data-lightbox-item]")].filter((t)=>!this.dialog?.contains(t))}get currentIndex(){return this.#e}open(t=0){let e=this.items,i=typeof t==="number"?t:e.indexOf(t);if(!e.length||i<0||i>=e.length||!this.dialog||!this.image)return;if(this.#i=e[i],this.#r(i),!this.dialog.open)this.dialog.showModal();c(this,"oatbase:open",{index:i,item:e[i]})}close(){this.dialog?.close()}next(){let t=this.items.length;if(t)this.#r((this.#e+1+t)%t)}previous(){let t=this.items.length;if(t)this.#r((this.#e-1+t)%t)}#s(t){let e=t.target.closest?.("[data-lightbox-item]");if(!e||this.dialog.contains(e))return;if(t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;t.preventDefault(),this.open(e)}#n(t){if(t.key==="ArrowRight")this.next();else if(t.key==="ArrowLeft")this.previous();else if(t.key==="Home")this.#r(0);else if(t.key==="End")this.#r(this.items.length-1);else return;t.preventDefault()}#r(t){let e=this.items,i=e[t];if(!i)return;let n=i.matches("img")?i:i.querySelector("img"),o=i.dataset.lightboxSrc||i.getAttribute("href")||n?.currentSrc||n?.src;if(!o)return;let h=i.closest("figure"),b=i.dataset.lightboxCaption??h?.querySelector("figcaption")?.textContent.trim()??"";if(this.image.src=o,this.image.alt=i.dataset.lightboxAlt??n?.alt??"",this.caption)this.caption.textContent=b,this.caption.hidden=!b;if(this.status)this.status.textContent=`${t+1} of ${e.length}`;if(this.previousButton)this.previousButton.disabled=e.length<2;if(this.nextButton)this.nextButton.disabled=e.length<2;this.#e=t,this.#o(e[(t-1+e.length)%e.length]),this.#o(e[(t+1)%e.length]),c(this,"oatbase:change",{index:t,item:i,source:o})}#o(t){if(!t||this.items.length<2)return;let e=t.matches("img")?t:t.querySelector("img"),i=t.dataset.lightboxSrc||t.getAttribute("href")||e?.currentSrc||e?.src;if(i)Object.assign(new Image,{src:i})}#a(){let t=this.#i;this.#i=null,t?.focus?.({preventScroll:!0}),c(this,"oatbase:close",{index:this.#e,item:this.items[this.#e]})}}d("ot-lightbox",$);class P extends HTMLElement{#t;#e;#i;#s;#n="";connectedCallback(){this.#t?.abort(),this.#t=new AbortController,this.#i?.disconnect(),this.#i=new MutationObserver(()=>this.refresh()),this.#i.observe(this,{childList:!0,subtree:!0}),this.refresh()}disconnectedCallback(){this.#t?.abort(),this.#e?.abort(),this.#i?.disconnect(),cancelAnimationFrame(this.#s)}get activeId(){return this.#n}refresh(){this.#e?.abort(),this.#e=new AbortController;let t=this.#r(this.dataset.target)||document;if(this.links=[...this.querySelectorAll('a[href^="#"]')],this.targets=this.links.map((i)=>{let n=decodeURIComponent(i.hash.slice(1)),o=n?document.getElementById(n):null;return o&&(t===document||t.contains(o))?o:null}).filter(Boolean),this.root=this.#r(this.dataset.scrollRoot),!this.targets.length){this.removeAttribute("data-enhanced");return}let e={passive:!0,signal:this.#e.signal};(this.root||window).addEventListener("scroll",()=>this.#o(),e),window.addEventListener("resize",()=>this.#o(),e),this.toggleAttribute("data-enhanced",!0),this.#a()}#r(t){if(!t)return null;try{return document.querySelector(t)}catch{return null}}#o(){cancelAnimationFrame(this.#s),this.#s=requestAnimationFrame(()=>this.#a())}#a(){if(!this.targets?.length)return;let t=Number.parseFloat(this.dataset.offset||"16")||0,i=(this.root?.getBoundingClientRect().top||0)+t,n=this.targets[0];for(let h of this.targets)if(h.getBoundingClientRect().top<=i+1)n=h;else break;if(this.root?this.root.scrollTop+this.root.clientHeight>=this.root.scrollHeight-1:window.scrollY+window.innerHeight>=document.documentElement.scrollHeight-1)n=this.targets.at(-1);if(!n||n.id===this.#n)return;this.#n=n.id,this.links.forEach((h)=>{let b=decodeURIComponent(h.hash.slice(1))===n.id;if(b)h.setAttribute("aria-current","location");else h.removeAttribute("aria-current");h.toggleAttribute("data-active",b)}),c(this,"oatbase:change",{id:n.id,target:n})}}d("ot-scrollspy",P);class F extends HTMLElement{#t;connectedCallback(){if(this.#t?.abort(),this.#t=new AbortController,typeof HTMLElement.prototype.showPopover!=="function")return;let t=[...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')];if(t.forEach((e)=>this.#e(e)),t.length)this.toggleAttribute("data-enhanced",!0)}disconnectedCallback(){this.#t?.abort()}#e(t){let e=decodeURIComponent(t.hash.slice(1)),i=e&&document.getElementById(e);if(!i)return;let n=t.closest("ot-dropdown[data-footnote-preview]"),o=n?.querySelector("[data-footnote-popover]");if(!n||!o){n=document.createElement("ot-dropdown"),n.dataset.footnotePreview="";let{parentNode:h,nextSibling:b}=t;n.append(t),o=document.createElement("aside"),o.id=v("oatbase-footnote"),o.className="card",o.dataset.footnotePopover="",o.setAttribute("popover","auto"),o.setAttribute("role","note"),o.setAttribute("aria-label",`Footnote ${t.textContent.trim()}`);let f=i.cloneNode(!0);f.removeAttribute("id"),f.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove(),f.querySelectorAll("[id]").forEach((E)=>E.removeAttribute("id")),f.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((E)=>E.remove());let C=document.createElement("div");while(f.firstChild)C.append(f.firstChild);o.append(C),n.append(o),t.setAttribute("popovertarget",o.id),t.setAttribute("aria-controls",o.id),h.insertBefore(n,b)}t.addEventListener("click",(h)=>{if(h.metaKey||h.ctrlKey||h.shiftKey||h.altKey)return;if(h.preventDefault(),o.matches(":popover-open"))o.hidePopover();else o.showPopover()},{signal:this.#t.signal})}}d("ot-footnotes",F);class _ extends HTMLElement{#t;#e;connectedCallback(){this.#t?.abort(),this.#t=new AbortController,this.refresh()}disconnectedCallback(){this.#t?.abort(),cancelAnimationFrame(this.#e)}refresh(){if(this.#t?.abort(),this.#t=new AbortController,this.progress=this.querySelector("progress"),this.target=this.#i(this.dataset.target),this.root=this.#i(this.dataset.scrollRoot),!this.progress||!this.target)return;this.progress.max=100;let t={passive:!0,signal:this.#t.signal};(this.root||window).addEventListener("scroll",()=>this.#s(),t),window.addEventListener("resize",()=>this.#s(),t),this.toggleAttribute("data-enhanced",!0),this.#n()}#i(t){if(!t)return null;try{return document.querySelector(t)}catch{return null}}#s(){cancelAnimationFrame(this.#e),this.#e=requestAnimationFrame(()=>this.#n())}#n(){let t=this.root?.getBoundingClientRect(),e=this.target.getBoundingClientRect(),i=this.root?.scrollTop||window.scrollY,n=this.root?.clientHeight||window.innerHeight,o=i+e.top-(t?.top||0),h=Math.max(1,this.target.scrollHeight-n),b=Math.min(100,Math.max(0,(i-o)/h*100));this.progress.value=b}}d("ot-reading-progress",_);var lt=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});class K extends HTMLElement{#t;#e=new WeakMap;#i={index:-1,direction:"none"};connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.table=this.querySelector(":scope > table, :scope > .scroll-area > table"),!this.table)return;this.filter=this.querySelector("[data-table-filter]"),this.selectAll=this.querySelector("[data-table-select-all]"),this.status=this.querySelector("[data-table-status]"),this.selectedStatus=this.querySelector("[data-table-selected]"),this.empty=this.querySelector("[data-table-empty]"),this.#s(t),this.refresh(),this.filter?.addEventListener("input",()=>this.#a(),{signal:t}),this.table.addEventListener("change",(e)=>{if(e.target.matches("[data-table-select-row]"))this.#d(e.target);else if(e.target.matches("[data-table-select-all]"))this.#l(e.target.checked)},{signal:t}),this.addEventListener("oatbase:refresh",()=>this.refresh(),{signal:t}),this.dataset.enhanced=""}disconnectedCallback(){this.#t?.abort()}get rows(){return[...this.table?.tBodies[0]?.rows||[]]}get visibleRows(){return this.rows.filter((t)=>!t.hidden)}get selectedRows(){return this.rows.filter((t)=>t.querySelector("[data-table-select-row]:checked"))}refresh(){this.rows.forEach((t,e)=>{if(!this.#e.has(t))this.#e.set(t,e)}),this.#a(!1)}#s(t){[...this.table.tHead?.rows[0]?.cells||[]].forEach((e,i)=>{if(!e.hasAttribute("data-sort"))return;let n=e.querySelector(":scope > [data-table-sort]");if(!n)n=document.createElement("button"),n.type="button",n.dataset.tableSort="",n.className="ghost",n.append(...e.childNodes),e.append(n);e.setAttribute("aria-sort","none"),n.addEventListener("click",()=>this.#n(e,i),{signal:t})})}#n(t,e){let i=this.#i.index!==e||this.#i.direction==="none"?"ascending":this.#i.direction==="ascending"?"descending":"none";this.#i={index:e,direction:i},[...this.table.tHead?.rows[0]?.cells||[]].filter((h)=>h.hasAttribute("data-sort")).forEach((h)=>h.setAttribute("aria-sort",h===t?i:"none"));let n=t.dataset.sort||"text",o=[...this.rows].sort((h,b)=>{if(i==="none")return this.#e.get(h)-this.#e.get(b);let f=this.#o(this.#r(h,e),this.#r(b,e),n);return i==="ascending"?f:-f});this.table.tBodies[0].append(...o),c(this,"oatbase:sort",{index:e,direction:i,type:n,header:t})}#r(t,e){let i=t.cells[e];return i?.dataset.sortValue??i?.textContent.trim()??""}#o(t,e,i){if(i==="number")return(Number(t)||0)-(Number(e)||0);if(i==="date")return(Date.parse(t)||0)-(Date.parse(e)||0);return lt.compare(t,e)}#a(t=!0){let e=this.filter?.value.trim().toLocaleLowerCase()||"";this.rows.forEach((o)=>{let h=(o.dataset.filterValue||o.textContent).toLocaleLowerCase();o.hidden=Boolean(e&&!h.includes(e))});let i=this.visibleRows.length,n=this.rows.length;if(this.status)this.status.value=e?`${i} of ${n} rows`:`${n} rows`;if(this.empty)this.empty.hidden=i>0;if(this.#h(),t)c(this,"oatbase:filter",{query:e,visible:i,total:n})}#l(t){this.visibleRows.forEach((e)=>{let i=e.querySelector("[data-table-select-row]:not(:disabled)");if(i)i.checked=t}),this.#h(),this.#c()}#d(t){t.closest("tr")?.toggleAttribute("data-selected",t.checked),this.#h(),this.#c()}#h(){this.rows.forEach((i)=>i.toggleAttribute("data-selected",Boolean(i.querySelector("[data-table-select-row]:checked"))));let t=this.visibleRows.map((i)=>i.querySelector("[data-table-select-row]:not(:disabled)")).filter(Boolean),e=t.filter((i)=>i.checked).length;if(this.selectAll)this.selectAll.checked=t.length>0&&e===t.length,this.selectAll.indeterminate=e>0&&et.querySelector("[data-table-select-row]")?.value).filter((t)=>t!=null)})}}d("ot-data-table",K);class U extends HTMLElement{#t;#e;#i=0;connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.list=this.querySelector(":scope > [data-repeater-list]"),this.template=this.querySelector(":scope > template[data-repeater-template]"),!this.list||!this.template)return;if(this.#e==null)this.#e=this.list.innerHTML;this.#s(),this.addEventListener("click",(e)=>this.#n(e),{signal:t}),this.closest("form")?.addEventListener("reset",()=>queueMicrotask(()=>this.#r()),{signal:t}),this.dataset.enhanced="",this.refresh()}disconnectedCallback(){this.#t?.abort()}get items(){return[...this.list?.querySelectorAll(":scope > [data-repeater-item]")||[]]}get min(){return Math.max(0,Number(this.dataset.min)||0)}get max(){return Math.max(this.min,Number(this.dataset.max)||1/0)}add(){if(!this.template||this.items.length>=this.max)return null;let t=this.#i++,e=this.template.content.cloneNode(!0);[...e.querySelectorAll("*")].forEach((o)=>{if([...o.attributes].forEach((h)=>{if(h.value.includes("__index__"))o.setAttribute(h.name,h.value.replaceAll("__index__",String(t)))}),o.hasAttribute("data-repeater-number"))o.textContent=String(t+1)});let n=e.querySelector("[data-repeater-item]");if(!n)return null;return n.dataset.repeaterIndex=t,this.list.append(e),this.refresh(),n.querySelector('[data-repeater-focus], input:not([type="hidden"]), select, textarea, button')?.focus(),c(this,"oatbase:add",{item:n,index:t}),n}remove(t){if(!t?.matches?.("[data-repeater-item]")||!this.list?.contains(t)||this.items.length<=this.min)return!1;let e=Number(t.dataset.repeaterIndex),i=t.previousElementSibling?.querySelector("[data-repeater-remove]")||t.nextElementSibling?.querySelector("[data-repeater-remove]")||this.querySelector("[data-repeater-add]");return t.remove(),this.refresh(),i?.focus(),c(this,"oatbase:remove",{item:t,index:e}),!0}refresh(){let t=this.items,e=t.length<=this.min,i=t.length>=this.max;this.querySelectorAll("[data-repeater-add]").forEach((n)=>{n.disabled=i}),t.forEach((n,o)=>{n.querySelectorAll("[data-repeater-remove]").forEach((h)=>{h.disabled=e}),n.querySelectorAll("[data-repeater-position]").forEach((h)=>{h.value=String(o+1)})}),this.toggleAttribute("data-empty",t.length===0)}#s(){this.#i=0,this.items.forEach((t)=>{let e=Number(t.dataset.repeaterIndex),i=Number.isFinite(e)?e:this.#i;t.dataset.repeaterIndex=i,this.#i=Math.max(this.#i,i+1)})}#n(t){let e=t.target.closest("[data-repeater-add]");if(e&&this.contains(e)){t.preventDefault(),this.add();return}let i=t.target.closest("[data-repeater-remove]");if(i&&this.contains(i))t.preventDefault(),this.remove(i.closest("[data-repeater-item]"))}#r(){this.list.innerHTML=this.#e,this.#s(),this.refresh(),c(this,"oatbase:reset",{items:this.items})}}d("ot-repeater",U);class z extends HTMLElement{#t;#e;#i;connectedCallback(){this.#t?.abort(),this.#e?.disconnect(),this.#t=new AbortController;let t=this.#t.signal;if(this.log=this.querySelector(':scope > [role="log"], :scope > .scroll-area[role="log"]'),!this.log)return;this.content=this.log.querySelector("[data-log-content]")||this.log,this.follow=this.querySelector("[data-log-follow]"),this.status=this.querySelector("[data-log-status]"),this.log.setAttribute("aria-relevant",this.log.getAttribute("aria-relevant")||"additions text"),this.follow?.addEventListener("change",()=>{if(this.toggleAttribute("data-following",this.follow.checked),this.follow.checked)this.#n();c(this,"oatbase:follow",{following:this.follow.checked})},{signal:t}),this.log.addEventListener("scroll",()=>this.#r(),{signal:t,passive:!0}),this.#e=new MutationObserver(()=>this.#s()),this.#e.observe(this.content,{childList:!0,subtree:!0,characterData:!0}),this.dataset.enhanced="",this.refresh()}disconnectedCallback(){if(this.#t?.abort(),this.#e?.disconnect(),this.#i)cancelAnimationFrame(this.#i)}get lineCount(){let t=this.content?.querySelectorAll?.("[data-log-line]");if(t?.length)return t.length;let e=this.content?.textContent||"";return e?e.replace(/\r\n?/g,`
+(()=>{var{defineProperty:z,getOwnPropertyNames:Z,getOwnPropertyDescriptor:tt}=Object,et=Object.prototype.hasOwnProperty;function it(t){return this[t]}var st=(t)=>{var e=(j??=new WeakMap).get(t),i;if(e)return e;if(e=z({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function"){for(var s of Z(t))if(!et.call(e,s))z(e,s,{get:it.bind(t,s),enumerable:!(i=tt(t,s))||i.enumerable})}return j.set(t,e),e},j;var nt=(t)=>t;function rt(t,e){this[t]=nt.bind(null,e)}var ot=(t,e)=>{for(var i in e)z(t,i,{get:e[i],enumerable:!0,configurable:!0,set:rt.bind(e,i)})};var ht={};ot(ht,{OtTree:()=>H,OtToolbar:()=>D,OtToggle:()=>T,OtThemeSwitcher:()=>L,OtSplitter:()=>O,OtSelect:()=>S,OtScrollspy:()=>N,OtRepeater:()=>_,OtReadingProgress:()=>P,OtPassword:()=>I,OtOtp:()=>B,OtMultiselect:()=>M,OtLogViewer:()=>K,OtLightbox:()=>R,OtFootnotes:()=>$,OtDataTable:()=>F,OtCopy:()=>w,OtCommand:()=>C,OtCombobox:()=>k,OtActionField:()=>q});(()=>{var t=class extends HTMLElement{#t=!1;connectedCallback(){this.#t||(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.#e(),{once:!0}):this.#e())}#e(){this.#t||(this.#t=!0,this.init())}disconnectedCallback(){this.cleanup()}cleanup(){}handleEvent(n){let o=this[`on${n.type}`];o&&o.call(this,n)}keyNav(n,o,a,l,u,b=!1){let{key:m}=n,y=-1;return m===u?y=(o+1)%a:m===l?y=(o-1+a)%a:b&&(m==="Home"?y=0:m==="End"&&(y=a-1)),y>=0&&n.preventDefault(),y}emit(n,o=null){return this.dispatchEvent(new CustomEvent(n,{bubbles:!0,composed:!0,cancelable:!0,detail:o}))}uid(){return Math.random().toString(36).slice(2,10)}};"commandForElement"in HTMLButtonElement.prototype||document.addEventListener("click",(n)=>{let o=n.target.closest("button[commandfor]");if(!o)return;let a=document.getElementById(o.getAttribute("commandfor"));if(!a)return;let l=o.getAttribute("command")||"toggle";a instanceof HTMLDialogElement&&(l==="show-modal"?a.showModal():l==="close"||a.open?a.close():a.showModal())}),document.addEventListener("touchstart",(n)=>{n.target instanceof HTMLDialogElement&&(n.preventDefault(),n.target.close())},{passive:!1});var e=class extends t{#t=[];#e=[];#i;#s=[];init(){let n=this.querySelector(':scope > [role="tablist"]');if(this.#t=n?[...n.querySelectorAll('[role="tab"]')]:[],this.#e=[...this.querySelectorAll(':scope > [role="tabpanel"]')],this.#t.length===0||this.#e.length===0){console.warn("ot-tabs: Missing tab or tabpanel elements");return}this.#i=this.dataset.anchor,this.#t.forEach((l,u)=>{let b=this.#e[u];b&&(this.#s[u]=l.id||"",l.id||=`ot-tab-${this.uid()}`,b.id||=`ot-panel-${this.uid()}`,l.setAttribute("aria-controls",b.id),b.setAttribute("aria-labelledby",l.id))}),n.addEventListener("click",this),n.addEventListener("keydown",this),this.#i&&window.addEventListener("hashchange",this);let o=this.#t.findIndex((l)=>l.ariaSelected==="true"),a=this.#r();this.#n(Math.max(0,a>=0?a:o),!1)}cleanup(){window.removeEventListener("hashchange",this)}onclick(n){let o=this.#t.indexOf(n.target.closest('[role="tab"]'));o>=0&&this.#n(o)}onkeydown(n){if(!n.target.closest('[role="tab"]'))return;let o=this.keyNav(n,this.activeIndex,this.#t.length,"ArrowLeft","ArrowRight");o>=0&&(this.#n(o),this.#t[o].focus())}onhashchange(){let n=this.#r();n>=0&&this.#n(n,!1)}#n(n,o=!0){this.#t.forEach((a,l)=>{let u=l===n;a.ariaSelected=String(u),a.tabIndex=u?0:-1}),this.#e.forEach((a,l)=>a.hidden=l!==n),o&&this.#o(n),this.emit("ot-tab-change",{index:n,tab:this.#t[n]})}#r(){let n=this.#i&&new URLSearchParams(location.hash.slice(1)).get(this.#i);return n?this.#s.indexOf(n):-1}#o(n){if(!this.#i)return;let o=new URLSearchParams(location.hash.slice(1));o.set(this.#i,this.#s[n]);for(let[l,u]of[...o])u||o.delete(l);let a=o.toString();history.replaceState(null,"",a?`#${a}`:location.pathname+location.search)}get activeIndex(){return this.#t.findIndex((n)=>n.ariaSelected==="true")}set activeIndex(n){n>=0&&n{let n=this.#e.getBoundingClientRect(),o=this.#t.getBoundingClientRect();this.#t.style.top=`${n.bottom+o.height>window.innerHeight?n.top-o.height:n.bottom}px`,this.#t.style.left=`${n.left+o.width>window.innerWidth?n.right-o.width:n.left}px`})}ontoggle(n){n.newState==="open"?(this.#i(),window.addEventListener("scroll",this.#i,!0),window.addEventListener("resize",this.#i),this.#s=[...this.querySelectorAll('[role="menuitem"]')],this.#s[0]?.focus(),this.#e.ariaExpanded="true"):(this.cleanup(),this.#s=null,this.#e.ariaExpanded="false",this.#e.focus())}onkeydown(n){if(!n.target.matches('[role="menuitem"]'))return;let o=this.#s.indexOf(n.target),a=this.keyNav(n,o,this.#s.length,"ArrowUp","ArrowDown",!0);a>=0&&this.#s[a].focus()}cleanup(){window.removeEventListener("scroll",this.#i,!0),window.removeEventListener("resize",this.#i)}};customElements.define("ot-dropdown",i);var s=class extends t{#t;#e;#i;init(){if(this.#t=this.querySelector('input[type="file"]'),!!this.#t){this.#e=this.querySelector("[data-files]"),this.#i=this.#e?[...this.#e.childNodes]:[],this.classList.add("card","vstack","align-center"),this.#e?.classList.add("hstack","justify-center");for(let n of["click","dragover","dragleave","drop","change"])this.addEventListener(n,this)}}onclick(n){if(this.#t.disabled)return;let o=n.target.closest("button");if(o&&this.#e?.contains(o))return this.#s([...this.#t.files].filter((a,l)=>l!==[...this.#e.children].indexOf(o.parentElement)));n.target!==this.#t&&this.#t.click()}ondragover(n){this.#t.disabled||(n.preventDefault(),n.dataTransfer.dropEffect="copy",this.toggleAttribute("data-drag",!0))}ondragleave(n){this.contains(n.relatedTarget)||this.removeAttribute("data-drag")}ondrop(n){this.#t.disabled||(n.preventDefault(),this.removeAttribute("data-drag"),this.#s([...n.dataTransfer.files].slice(0,this.#t.multiple?1/0:1)))}onchange(){if(!this.#e)return;let n=[...this.#t.files].map((o)=>{let a=document.createElement("span");a.className="badge",a.dataset.variant="secondary",a.textContent=o.name;let l=document.createElement("button");return l.type="button",l.ariaLabel=`Remove ${o.name}`,l.textContent="×",a.append(l),a});this.#e.replaceChildren(...n.length?n:this.#i)}#s(n){let o=new DataTransfer;n.forEach((a)=>o.items.add(a)),this.#t.files=o.files,this.#t.dispatchEvent(new Event("change",{bubbles:!0}))}};customElements.define("ot-upload",s),document.addEventListener("DOMContentLoaded",()=>{let n="title",o="[title]",a=(l)=>{let u=l.getAttribute(n);u&&(l.setAttribute("data-tooltip",u),l.hasAttribute("aria-label")||l.setAttribute("aria-label",u),l.removeAttribute(n))};document.querySelectorAll(o).forEach(a),new MutationObserver((l)=>{for(let u of l){a(u.target);for(let b of u.addedNodes)b.nodeType===1&&(a(b),b.querySelectorAll(o).forEach(a))}}).observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[n]})}),document.addEventListener("click",(n)=>{let o=n.target.closest("[data-sidebar-toggle]");if(o){o.closest("[data-sidebar-layout]")?.toggleAttribute("data-sidebar-open");return}if(!n.target.closest("[data-sidebar]")){let a=document.querySelector("[data-sidebar-layout][data-sidebar-open]");a&&window.matchMedia("(max-width: 768px)").matches&&a.removeAttribute("data-sidebar-open")}});var r=(n)=>document.createElement(n),h=(n)=>String(n).trim(),p=class extends t{static observedAttributes=["disabled"];#t=new WeakMap;init(){if(this.input=this.querySelector("input"),!this.input)return;this.input.readOnly||(this.input.addEventListener("keydown",this),this.input.addEventListener("input",(o)=>{o.stopPropagation();let a=this.input.value,l=this.input.list,u=l&&(o.inputType==="insertReplacementText"||a.length-(this.prev||"").length>1);if(this.prev=a,u){let b=[...l.options].find((m)=>m.value===a);if(b)return requestAnimationFrame(()=>this.add(b.data??a))}}),this.input.addEventListener("change",(o)=>o.stopPropagation()),this.input.addEventListener("focus",this),this.addEventListener("click",this));let n=this.getAttribute("value");n&&(this.value=[n]),this.attributeChangedCallback()}attributeChangedCallback(){this.input&&(this.input.disabled=this.disabled),this.setAttribute("aria-disabled",this.disabled)}get disabled(){return this.hasAttribute("disabled")}set disabled(n){this.toggleAttribute("disabled",!!n)}onkeydown(n){if(n.key==="Backspace"&&!this.input.value)return this.remove(this.input.previousElementSibling);(n.key==="Enter"||n.key===",")&&(n.preventDefault(),this.add(this.input.value))}onfocus(){this.input.list&&(this.input.dispatchEvent(new Event("input",{bubbles:!0})),requestAnimationFrame(()=>{try{this.input.showPicker()}catch{}}))}onclick(n){if(this.disabled)return;let o=n.target.closest("button");o?this.remove(o.parentElement):this.input.focus()}add(n,o){let a=h(n);if(!a||this.value.some((u)=>h(u)===a))return;let l=r("span");if(l.className="badge",l.dataset.variant="secondary",l.textContent=a,n&&typeof n=="object"&&this.#t.set(l,n),this.input.readOnly)this.insertBefore(l,this.input);else{let u=r("button");u.type="button",u.ariaLabel=`Remove ${a}`,u.textContent="×",l.appendChild(u),this.insertBefore(l,this.input),this.input.value=this.prev="",this.input.list?.replaceChildren()}o||this.emit("input",this.value)}remove(n){n&&(n.remove(),this.emit("input",this.value))}get value(){return[...this.querySelectorAll(".badge")].map((n)=>this.#t.get(n)??n.firstChild.data)}set value(n){this.input??=this.querySelector("input"),this.querySelectorAll(".badge").forEach((o)=>o.remove()),(Array.isArray(n)?n:[]).forEach((o)=>{typeof o=="string"?o.split(",").forEach((a)=>this.add(a,!0)):this.add(o,!0)})}};customElements.define("ot-taginput",p);var v={};function Y(n){if(!v[n]){let o=document.createElement("div");o.className="toast-container",o.setAttribute("popover","manual"),o.setAttribute("data-placement",n),document.body.appendChild(o),v[n]=o}return v[n]}function V(n,o={}){let{placement:a="top-right",duration:l=4000}=o,u=Y(a);n.classList.add("toast");let b,m=()=>{l>0&&(b=setTimeout(()=>X(n,u),l))};return n.onmouseenter=()=>clearTimeout(b),n.onmouseleave=m,n.setAttribute("data-entering",""),u.appendChild(n),u.showPopover(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{n.removeAttribute("data-entering")})}),m(),n}function X(n,o){if(n.hasAttribute("data-exiting"))return;n.setAttribute("data-exiting","");let a=()=>{n.remove(),o.children.length||o.hidePopover()};n.addEventListener("transitionend",a,{once:!0});let l=getComputedStyle(n).getPropertyValue("--transition").trim(),u=parseFloat(l),b=l.endsWith("ms")?u:u*1000;setTimeout(a,b)}function G(n,o,a={}){let{variant:l="info",...u}=a,b=document.createElement("output");if(b.setAttribute("data-variant",l),o){let y=document.createElement("h6");y.className="toast-title",y.textContent=o,b.appendChild(y)}let m=document.createElement("div");return m.className="toast-message",m.textContent=n,b.appendChild(m),V(b,u)}function J(n,o={}){let a;if(n instanceof HTMLTemplateElement?a=n.content.firstElementChild?.cloneNode(!0):n&&(a=n.cloneNode(!0)),!!a)return a.removeAttribute("id"),V(a,o)}function Q(n){(n?[v[n]]:Object.values(v)).forEach((o)=>{o&&(o.innerHTML="",o.hidePopover())})}var U=window.ot||(window.ot={});U.toast=G,U.toast.el=J,U.toast.clear=Q})();var at=0,g=(t="oatbase")=>`${t}-${++at}`;function c(t,e){if(!customElements.get(t))customElements.define(t,e)}function x(t,e){if(document.readyState!=="loading"){e();return}let i=new AbortController;return document.addEventListener("DOMContentLoaded",()=>{if(t.isConnected)e()},{once:!0,signal:i.signal}),i}function f(t,e){t.forEach((s,r)=>s.toggleAttribute("data-active",r===e));let i=t[e];return i?.scrollIntoView({block:"nearest"}),i}function A(t,e,i){if(!i)return-1;if(t==="ArrowDown")return(e+1+i)%i;if(t==="ArrowUp")return(e-1+i)%i;if(t==="Home")return 0;if(t==="End")return i-1;return e}function d(t,e,i){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:i}))}var W=new Set;document.addEventListener("pointerdown",(t)=>{W.forEach((e)=>{if(!e.contains(t.target))e.close()})});function E(t,e){W.add(t),e.addEventListener("abort",()=>W.delete(t),{once:!0})}class k extends HTMLElement{#t;#e;#i=-1;connectedCallback(){this.#e?.abort(),this.#e=x(this,()=>this.#s())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get value(){return this.select?.value||""}set value(t){if(!this.select)return;this.select.value=String(t),this.#c()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get visibleOptions(){return this.options.filter((t)=>!t.hidden&&t.getAttribute("aria-disabled")!=="true")}open(){if(this.input?.disabled)return;this.list.hidden=!1,this.input.setAttribute("aria-expanded","true")}close(){if(!this.list)return;this.list.hidden=!0,this.input?.setAttribute("aria-expanded","false"),this.input?.removeAttribute("aria-activedescendant"),f(this.visibleOptions,-1),this.#i=-1}#s(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.select=this.querySelector(":scope > select"),!this.select)return;this.#n(),this.input.addEventListener("input",()=>this.#r(),{signal:t}),this.input.addEventListener("focus",()=>this.open(),{signal:t}),this.input.addEventListener("keydown",(e)=>this.#o(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#a(e),{signal:t}),this.list.addEventListener("click",(e)=>this.#l(e),{signal:t}),this.select.addEventListener("change",()=>this.#c(),{signal:t}),this.select.form?.addEventListener("reset",()=>queueMicrotask(()=>this.#c()),{signal:t}),E(this,t),this.dataset.enhanced="",this.#c()}#n(){this.querySelectorAll(":scope > [data-generated]").forEach((i)=>i.remove());let t=g("oatbase-combobox");this.input=document.createElement("input"),this.input.type="search",this.input.autocomplete="off",this.input.placeholder=this.dataset.placeholder||"Search…",this.input.disabled=this.select.disabled,this.input.dataset.generated="",this.input.setAttribute("role","combobox"),this.input.setAttribute("aria-autocomplete","list"),this.input.setAttribute("aria-controls",t),this.input.setAttribute("aria-expanded","false");let e=this.select.getAttribute("aria-label");if(e)this.input.setAttribute("aria-label",e);if(this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),[...this.select.options].forEach((i,s)=>this.#h(i,s)),this.hasAttribute("data-allow-custom"))this.create=document.createElement("li"),this.create.id=`${t}-create`,this.create.dataset.create="",this.create.dataset.generated="",this.create.setAttribute("role","option"),this.create.setAttribute("aria-selected","false"),this.create.hidden=!0,this.list.append(this.create);this.empty=document.createElement("li"),this.empty.dataset.empty="",this.empty.dataset.generated="",this.empty.textContent=this.dataset.empty||"No results found.",this.empty.hidden=!0,this.list.append(this.empty),this.append(this.input,this.list)}#r(){let t=this.input.value.trim(),e=t.toLocaleLowerCase(),i=this.select.options[this.select.selectedIndex];if(i&&this.input.value!==i.textContent)this.select.selectedIndex=-1,this.options.forEach((r)=>r.setAttribute("aria-selected","false"));let s=this.options.filter((r)=>!r.hasAttribute("data-create"));if(s.forEach((r)=>{let h=`${r.textContent} ${r.dataset.keywords}`.toLocaleLowerCase();r.hidden=!h.includes(e)}),this.create){let r=s.some((h)=>{let p=h._source;return h.textContent.trim().toLocaleLowerCase()===e||p?.value.toLocaleLowerCase()===e});this.create.hidden=!t||r,this.create.dataset.value=t,this.create.textContent=(this.dataset.createLabel||"Create “{value}”").replace("{value}",t)}this.empty.hidden=this.visibleOptions.length>0,this.#i=-1,this.open()}#o(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){t.preventDefault(),this.open(),this.#i=A(t.key,this.#i,this.visibleOptions.length);let e=f(this.visibleOptions,this.#i);if(e)this.input.setAttribute("aria-activedescendant",e.id)}else if(t.key==="Enter"&&(this.#i>=0||this.create&&!this.create.hidden))t.preventDefault(),this.#d(this.#i>=0?this.visibleOptions[this.#i]:this.create);else if(t.key==="Escape")this.close()}#a(t){let e=t.target.closest('[role="option"]');if(!e||e.hidden||e.getAttribute("aria-disabled")==="true")return;this.#i=this.visibleOptions.indexOf(e),f(this.visibleOptions,this.#i)}#l(t){let e=t.target.closest('[role="option"]');if(e&&e.getAttribute("aria-disabled")!=="true")this.#d(e)}#d(t){if(!t)return;if(t.hasAttribute("data-create")){let i=t.dataset.value.trim();if(!i)return;let s=new Option(i,i,!0,!0);s.dataset.custom="",this.select.append(s);let r=this.#h(s,s.index,this.create);d(this,"oatbase:create",{value:i,option:s}),t=r}let e=t._source;this.select.selectedIndex=e.index,this.#c(),this.close(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),d(this,"oatbase:change",{value:e.value,option:e}),this.input.focus()}#h(t,e,i=null){if(!t.value&&t.disabled)return null;let s=document.createElement("li");return s.id=`${this.list.id}-option-${e+1}`,s._source=t,s.dataset.index=e,s.dataset.keywords=t.dataset.keywords||"",s.setAttribute("role","option"),s.setAttribute("aria-disabled",String(t.disabled)),s.setAttribute("aria-selected","false"),s.textContent=t.textContent,this.list.insertBefore(s,i),s}#c(){let t=this.select.options[this.select.selectedIndex];this.input.value=t&&t.value?t.textContent:"",this.input.disabled=this.select.disabled,this.options.forEach((e)=>{e.setAttribute("aria-selected",String(e._source===t))})}}c("ot-combobox",k);class C extends HTMLElement{#t;#e;#i=-1;connectedCallback(){this.#e?.abort(),this.#e=x(this,()=>this.#s())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get items(){return this.list?[...this.list.querySelectorAll("[data-command-item]")]:[]}get visibleItems(){return this.items.filter((t)=>!t.hidden&&!t.closest("li")?.hidden&&!t.hasAttribute("aria-disabled"))}get query(){return this.search?.value.trim()||""}open(){if(!this.dialog.open)this.dialog.showModal();this.search.setAttribute("aria-expanded","true"),this.search.value="",this.#n(),requestAnimationFrame(()=>this.search.focus()),d(this,"oatbase:open")}close(){if(this.dialog.open)this.dialog.close();this.search?.setAttribute("aria-expanded","false"),d(this,"oatbase:close")}#s(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.dialog=this.querySelector(":scope > dialog"),this.search=this.dialog?.querySelector("[data-command-search]"),this.list=this.dialog?.querySelector("[data-command-list]"),!this.dialog||!this.search||!this.list)return;this.list.id||=g("oatbase-command"),this.list.setAttribute("role","listbox"),this.search.setAttribute("role","combobox"),this.search.setAttribute("aria-autocomplete","list"),this.search.setAttribute("aria-expanded",String(this.dialog.open)),this.search.setAttribute("aria-controls",this.list.id),this.querySelectorAll("[data-command-open]").forEach((e)=>{e.addEventListener("click",(i)=>{i.preventDefault(),this.open()},{signal:t})}),this.querySelectorAll("[data-command-close]").forEach((e)=>{e.addEventListener("click",()=>this.close(),{signal:t})}),this.search.addEventListener("input",()=>this.#n(),{signal:t}),this.search.addEventListener("keydown",(e)=>this.#a(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#l(e),{signal:t}),this.list.addEventListener("click",(e)=>{let i=e.target.closest("[data-command-item]");if(i&&!i.hasAttribute("aria-disabled"))this.#h(i)},{signal:t}),this.dialog.addEventListener("click",(e)=>{let i=this.dialog.getBoundingClientRect();if(e.clientXi.right||e.clientYi.bottom)this.close()},{signal:t}),this.dialog.addEventListener("close",()=>this.search.setAttribute("aria-expanded","false"),{signal:t}),document.addEventListener("keydown",(e)=>{if(this.dataset.shortcut?.toLowerCase()==="mod+k"&&(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="k")e.preventDefault(),this.dialog.open?this.close():this.open()},{signal:t}),this.refresh()}refresh(){if(!this.list||!this.search)return;this.#r(),this.#o()}#n(){if(this.dispatchEvent(new CustomEvent("oatbase:query",{bubbles:!0,composed:!0,cancelable:!0,detail:{query:this.query}})))this.#r();this.#o()}#r(){if(this.dataset.filter!=="manual"){let t=this.query.toLocaleLowerCase();this.items.forEach((e)=>{let i=`${e.textContent} ${e.dataset.keywords||""}`.toLocaleLowerCase(),s=e.closest("li")||e;s.hidden=!i.includes(t)})}}#o(){this.items.forEach((i)=>{i.id||=g("oatbase-command-item"),i.setAttribute("role","option")}),this.list.querySelectorAll("[data-command-group]").forEach((i)=>{let s=i.nextElementSibling,r=!1;while(s&&!s.hasAttribute("data-command-group")){if((s.matches("[data-command-item]")||s.querySelector("[data-command-item]"))&&!s.hidden)r=!0;s=s.nextElementSibling}i.hidden=!r});let t=this.visibleItems;this.querySelector("[data-command-empty]")?.toggleAttribute("hidden",t.length>0);let e=t.findIndex((i)=>i.hasAttribute("data-active"));this.#d(e>=0?e:t.length?0:-1)}#a(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key))t.preventDefault(),this.#d(A(t.key,this.#i,this.visibleItems.length));else if(t.key==="Enter"&&this.#i>=0)t.preventDefault(),this.#h(this.visibleItems[this.#i])}#l(t){let e=t.target.closest("[data-command-item]");if(!e||e.closest("li")?.hidden||e.hasAttribute("aria-disabled"))return;this.#d(this.visibleItems.indexOf(e))}#d(t){this.#i=t;let e=this.visibleItems,i=f(e,t);if(this.items.forEach((s)=>s.setAttribute("aria-selected",String(s===i))),i)this.search.setAttribute("aria-activedescendant",i.id);else this.search.removeAttribute("aria-activedescendant")}#h(t){if(!t)return;let e=t.dataset.value||t.textContent.trim();if(!this.dispatchEvent(new CustomEvent("oatbase:select",{bubbles:!0,composed:!0,cancelable:!0,detail:{value:e,item:t}})))return;if(!t.hasAttribute("data-keep-open"))this.close()}}c("ot-command",C);class S extends HTMLElement{#t;#e;#i=-1;connectedCallback(){this.#e?.abort(),this.#e=x(this,()=>this.#s())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get value(){return this.select?.value||""}set value(t){if(!this.select)return;this.select.value=String(t),this.#l()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get enabledOptions(){return this.options.filter((t)=>t.getAttribute("aria-disabled")!=="true")}open(){if(this.select?.disabled)return;this.list.hidden=!1,this.button.setAttribute("aria-expanded","true"),this.#i=this.enabledOptions.findIndex((e)=>e.getAttribute("aria-selected")==="true");let t=f(this.enabledOptions,this.#i);if(t)this.button.setAttribute("aria-activedescendant",t.id)}close(){if(!this.list)return;this.list.hidden=!0,this.button.setAttribute("aria-expanded","false"),this.button.removeAttribute("aria-activedescendant"),f(this.enabledOptions,-1),this.#i=-1}toggle(){this.list.hidden?this.open():this.close()}#s(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.select=this.querySelector(":scope > select"),!this.select)return;this.#n(),this.button.addEventListener("click",()=>this.toggle(),{signal:t}),this.button.addEventListener("keydown",(e)=>this.#r(e),{signal:t}),this.list.addEventListener("pointermove",(e)=>this.#o(e),{signal:t}),this.list.addEventListener("click",(e)=>{let i=e.target.closest('[role="option"]');if(i&&i.getAttribute("aria-disabled")!=="true")this.#a(i)},{signal:t}),this.select.addEventListener("change",()=>this.#l(),{signal:t}),E(this,t),this.dataset.enhanced="",this.#l()}#n(){this.querySelectorAll(":scope > [data-generated]").forEach((i)=>i.remove());let t=g("oatbase-select");this.button=document.createElement("button"),this.button.type="button",this.button.className="outline",this.button.dataset.generated="",this.button.setAttribute("aria-haspopup","listbox"),this.button.setAttribute("aria-controls",t),this.button.setAttribute("aria-expanded","false");let e=this.select.getAttribute("aria-label");if(e)this.button.setAttribute("aria-label",e);this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),[...this.select.options].forEach((i,s)=>{if(!i.value&&i.disabled)return;let r=document.createElement("li");r.id=`${t}-option-${s+1}`,r._source=i,r.dataset.index=s,r.setAttribute("role","option"),r.setAttribute("aria-disabled",String(i.disabled)),r.textContent=i.textContent,this.list.append(r)}),this.append(this.button,this.list)}#r(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){if(t.preventDefault(),this.list.hidden)this.open();this.#i=A(t.key,this.#i,this.enabledOptions.length);let e=f(this.enabledOptions,this.#i);if(e)this.button.setAttribute("aria-activedescendant",e.id)}else if(t.key==="Enter"||t.key===" "){if(t.preventDefault(),this.list.hidden)this.open();else if(this.#i>=0)this.#a(this.enabledOptions[this.#i])}else if(t.key==="Escape")this.close()}#o(t){let e=t.target.closest('[role="option"]');if(!e||e.getAttribute("aria-disabled")==="true")return;this.#i=this.enabledOptions.indexOf(e),f(this.enabledOptions,this.#i)}#a(t){let e=t._source;if(!e||e.disabled)return;this.select.selectedIndex=e.index,this.#l(),this.close(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),d(this,"oatbase:change",{value:e.value,option:e}),this.button.focus()}#l(){let t=this.select.options[this.select.selectedIndex];this.button.textContent=t?.value?t.textContent:this.dataset.placeholder||t?.textContent||"Select an option",this.button.disabled=this.select.disabled,this.options.forEach((e)=>e.setAttribute("aria-selected",String(e._source===t)))}}c("ot-select",S);class L extends HTMLElement{#t;#e="system";connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;this.key=this.dataset.storageKey||"oatbase-theme";let e=this.dataset.default||"system";try{e=localStorage.getItem(this.key)||e}catch{}this.#e=["system","light","dark"].includes(e)?e:"system",this.buttons=[...this.querySelectorAll("[data-theme-value]")],this.toggleButton=this.buttons.length?null:this.querySelector("button"),this.toggleContents=this.toggleButton?[...this.toggleButton.querySelectorAll("[data-theme-content]")]:[],this.toggleLabel=this.toggleButton?.querySelector("[data-theme-label]"),this.toggleAttribute("data-group",this.buttons.length>1),this.buttons.forEach((i)=>i.addEventListener("click",()=>this.value=i.dataset.themeValue,{signal:t})),this.toggleButton?.addEventListener("click",()=>{let i=["system","light","dark"];this.value=i[(i.indexOf(this.#e)+1)%i.length]},{signal:t}),this.#s(!1)}disconnectedCallback(){this.#t?.abort()}get value(){return this.#e}set value(t){if(!["system","light","dark"].includes(t))return;this.#e=t,this.#s(!0)}#i(){if(!this.dataset.target)return this.ownerDocument.documentElement;try{return this.ownerDocument.querySelector(this.dataset.target)}catch{return null}}#s(t){let e=this.#i();if(e)if(e.style.colorScheme=this.#e==="system"?"light dark":this.#e,this.#e==="system")e.removeAttribute("data-theme");else e.dataset.theme=this.#e;try{localStorage.setItem(this.key,this.#e)}catch{}if(this.buttons.forEach((i)=>i.setAttribute("aria-pressed",String(i.dataset.themeValue===this.#e))),this.toggleButton){let i=this.#e==="light"?"Light":this.#e==="dark"?"Dark":"System";if(this.toggleContents.length){if(this.toggleContents.forEach((s)=>{s.hidden=s.dataset.themeContent!==this.#e}),this.toggleLabel)this.toggleLabel.textContent=i}else this.toggleButton.textContent=i;this.toggleButton.dataset.theme=this.#e,this.toggleButton.setAttribute("aria-label",`Theme: ${this.#e}. Click to change.`)}if(t)d(this,"change",{value:this.#e})}}c("ot-theme-switcher",L);class w extends HTMLElement{#t;#e;#i;#s;connectedCallback(){this.#t?.abort(),this.#t=new AbortController,this.button=this.querySelector("[data-copy-button]"),this.source=this.#n(),this.#i=this.button?.textContent?.trim()||"",this.#s=this.#r(),this.toggleAttribute("data-enhanced",Boolean(this.button&&this.source)),this.#o(this.dataset.copied||"Copied"),this.button?.addEventListener("click",()=>this.copy(),{signal:this.#t.signal})}disconnectedCallback(){if(this.#t?.abort(),clearTimeout(this.#e),this.button)this.button.textContent=this.#i;if(this.#s)this.#s.textContent=""}#n(){let t=this.button?.dataset.copyTarget||this.dataset.copyTarget;return t&&document.getElementById(t)||this.querySelector("[data-copy-source]")}#r(){if(!this.button||!this.source)return;let t=this.querySelector("[data-copy-status]");if(!t)t=document.createElement("span"),t.dataset.copyStatus="",this.append(t);return t.classList.add("visually-hidden"),t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true"),t.textContent="",t}get value(){let t=this.#n();return t&&"value"in t?t.value:t?.textContent?.trim()||""}#o(t){if(!this.button)return;let e=this.button.cloneNode(!0);e.textContent=t,e.style.cssText="position:fixed!important;inset:0 auto auto 0!important;inline-size:max-content!important;visibility:hidden!important;pointer-events:none!important",this.append(e);let i=Math.ceil(Math.max(this.button.getBoundingClientRect().width,e.getBoundingClientRect().width));e.remove(),this.button.style.minInlineSize=`${i}px`}async copy(){let t=this.value;if(!t)return;try{await navigator.clipboard.writeText(t)}catch{let i=Object.assign(document.createElement("textarea"),{value:t});document.body.append(i),i.select(),document.execCommand("copy"),i.remove()}let e=this.dataset.copied||"Copied";if(this.#o(e),this.button.textContent=e,this.#s)this.#s.textContent=e;d(this,"oatbase:copy",{value:t}),clearTimeout(this.#e),this.#e=setTimeout(()=>{if(this.button)this.button.textContent=this.#i;if(this.#s)this.#s.textContent=""},1200)}}c("ot-copy",w);class q extends w{}c("ot-action-field",q);class M extends HTMLElement{#t;#e;#i=-1;connectedCallback(){this.#e?.abort(),this.#e=x(this,()=>this.#s())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort()}get value(){return[...this.select?.selectedOptions||[]].map((t)=>t.value)}set value(t){let e=new Set([].concat(t).map(String));[...this.select?.options||[]].forEach((i)=>{i.selected=e.has(i.value)}),this.#a()}get options(){return[...this.list?.querySelectorAll('[role="option"]')||[]]}get enabledOptions(){return this.options.filter((t)=>t.getAttribute("aria-disabled")!=="true")}open(){if(this.select?.disabled)return;this.list.hidden=!1,this.button.setAttribute("aria-expanded","true"),this.#i=0,f(this.enabledOptions,this.#i)}close(){if(!this.list)return;this.list.hidden=!0,this.button.setAttribute("aria-expanded","false"),f(this.enabledOptions,-1),this.#i=-1}toggle(){this.list.hidden?this.open():this.close()}#s(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.select=this.querySelector(":scope > select[multiple]"),!this.select)return;this.#n(),this.button.addEventListener("click",()=>this.toggle(),{signal:t}),this.button.addEventListener("keydown",(e)=>this.#r(e),{signal:t}),this.list.addEventListener("click",(e)=>{let i=e.target.closest('[role="option"]');if(i&&i.getAttribute("aria-disabled")!=="true")this.#o(i)},{signal:t}),this.select.addEventListener("change",()=>this.#a(),{signal:t}),E(this,t),this.dataset.enhanced="",this.#a()}#n(){this.querySelectorAll(":scope > [data-generated]").forEach((e)=>e.remove());let t=g("oatbase-multiselect");this.button=document.createElement("button"),this.button.type="button",this.button.className="outline",this.button.dataset.generated="",this.button.setAttribute("aria-haspopup","listbox"),this.button.setAttribute("aria-controls",t),this.button.setAttribute("aria-expanded","false"),this.list=document.createElement("ul"),this.list.id=t,this.list.hidden=!0,this.list.dataset.generated="",this.list.setAttribute("role","listbox"),this.list.setAttribute("aria-multiselectable","true"),[...this.select.options].forEach((e,i)=>{let s=document.createElement("li");s.id=`${t}-option-${i+1}`,s._source=e,s.dataset.index=i,s.setAttribute("role","option"),s.setAttribute("aria-disabled",String(e.disabled)),s.textContent=e.textContent,this.list.append(s)}),this.append(this.button,this.list)}#r(t){if(["ArrowDown","ArrowUp","Home","End"].includes(t.key)){if(t.preventDefault(),this.list.hidden)this.open();this.#i=A(t.key,this.#i,this.enabledOptions.length),f(this.enabledOptions,this.#i)}else if(t.key===" "||t.key==="Enter")if(t.preventDefault(),this.list.hidden)this.open();else this.#o(this.enabledOptions[this.#i]);else if(t.key==="Escape")this.close()}#o(t){let e=t?._source;if(!e||e.disabled)return;e.selected=!e.selected,this.#a(),this.select.dispatchEvent(new Event("change",{bubbles:!0})),d(this,"oatbase:change",{value:this.value,option:e})}#a(){let t=[...this.select.selectedOptions];this.button.textContent=t.length?t.map((e)=>e.textContent).join(", "):this.dataset.placeholder||"Select options",this.button.disabled=this.select.disabled,this.options.forEach((e)=>e.setAttribute("aria-selected",String(e._source.selected)))}}c("ot-multiselect",M);class I extends HTMLElement{#t;connectedCallback(){if(this.#t?.abort(),this.#t=new AbortController,this.input=this.querySelector("input"),this.button=this.querySelector("[data-password-toggle]"),!this.input||!this.button)return;this.button.type="button",this.button.addEventListener("click",()=>this.toggle(),{signal:this.#t.signal}),this.#e()}disconnectedCallback(){this.#t?.abort()}toggle(t){let e=t??this.input.type==="password";this.input.type=e?"text":"password",this.#e(),this.input.focus()}#e(){let t=this.input.type==="text";this.button.setAttribute("aria-pressed",String(t)),this.button.setAttribute("aria-label",t?"Hide password":"Show password"),this.button.textContent=t?this.dataset.hideLabel||"Hide":this.dataset.showLabel||"Show"}}c("ot-password",I);class O extends HTMLElement{#t;#e=!1;connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.handle=this.querySelector("[data-splitter]"),!this.handle)return;this.handle.type="button",this.handle.setAttribute("role","separator"),this.handle.setAttribute("aria-orientation",this.separatorOrientation),this.handle.setAttribute("aria-valuemin",String(this.min)),this.handle.setAttribute("aria-valuemax",String(this.max)),this.handle.addEventListener("pointerdown",(e)=>{this.#e=!0,this.handle.setPointerCapture?.(e.pointerId),this.#i(e)},{signal:t}),this.handle.addEventListener("pointermove",(e)=>this.#e&&this.#i(e),{signal:t}),this.handle.addEventListener("pointerup",()=>{this.#e=!1},{signal:t}),this.handle.addEventListener("keydown",(e)=>{if(!(this.vertical?["ArrowUp","ArrowDown","Home","End"]:["ArrowLeft","ArrowRight","Home","End"]).includes(e.key))return;e.preventDefault();let s=e.key==="ArrowLeft"||e.key==="ArrowUp",r=e.key==="Home"?this.min:e.key==="End"?this.max:this.value+(s?-5:5);this.value=r},{signal:t}),this.value=Number(this.dataset.value||50)}disconnectedCallback(){this.#t?.abort()}get min(){return Number(this.dataset.min||20)}get max(){return Number(this.dataset.max||80)}get vertical(){return this.getAttribute("aria-orientation")==="vertical"}get separatorOrientation(){return this.vertical?"horizontal":"vertical"}get value(){return Number(this.handle?.getAttribute("aria-valuenow")||50)}set value(t){let e=Math.min(this.max,Math.max(this.min,Math.round(Number(t))));this.style.setProperty("--split",`${e}%`),this.handle?.setAttribute("aria-valuenow",String(e)),d(this,"oatbase:resize",{value:e})}#i(t){let e=this.getBoundingClientRect();this.value=this.vertical?(t.clientY-e.top)/e.height*100:(t.clientX-e.left)/e.width*100}}c("ot-splitter",O);class H extends HTMLElement{#t;connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.querySelector(":scope > ul");if(!t)return;t.setAttribute("role","tree"),this.querySelectorAll("li").forEach((i)=>{i.setAttribute("role","treeitem");let s=i.querySelector(":scope > ul");if(s){if(s.setAttribute("role","group"),!i.hasAttribute("aria-expanded"))i.setAttribute("aria-expanded","false")}let r=i.firstElementChild;if(r)r.tabIndex=-1});let e=this.visibleItems[0]?.firstElementChild;if(e)e.tabIndex=0;this.addEventListener("click",(i)=>{let s=i.target.closest('[role="treeitem"]');if(s?.hasAttribute("aria-expanded"))s.setAttribute("aria-expanded",String(s.getAttribute("aria-expanded")!=="true"))},{signal:this.#t.signal}),this.addEventListener("keydown",(i)=>this.#i(i),{signal:this.#t.signal})}disconnectedCallback(){this.#t?.abort()}get visibleItems(){return[...this.querySelectorAll('[role="treeitem"]')].filter((t)=>t.offsetParent!==null)}#e(t){this.querySelectorAll('[role="treeitem"] > :first-child').forEach((i)=>{i.tabIndex=-1});let e=t?.firstElementChild;if(e)e.tabIndex=0,e.focus()}#i(t){let e=t.target.closest('[role="treeitem"]');if(!e)return;let i=this.visibleItems,s=i.indexOf(e);if(t.key==="ArrowDown")this.#e(i[s+1]||i[0]);else if(t.key==="ArrowUp")this.#e(i[s-1]||i.at(-1));else if(t.key==="Home")this.#e(i[0]);else if(t.key==="End")this.#e(i.at(-1));else if(t.key==="ArrowRight"&&e.hasAttribute("aria-expanded"))e.setAttribute("aria-expanded","true");else if(t.key==="ArrowLeft"&&e.getAttribute("aria-expanded")==="true")e.setAttribute("aria-expanded","false");else return;t.preventDefault()}}c("ot-tree",H);class T extends HTMLElement{connectedCallback(){if(this.button=this.querySelector(":scope > button"),!this.button)return;this.button.type="button",this.pressed=this.hasAttribute("pressed")||this.button.getAttribute("aria-pressed")==="true",this.button.addEventListener("click",this)}disconnectedCallback(){this.button?.removeEventListener("click",this)}handleEvent(){if(this.button.disabled||this.button.getAttribute("aria-disabled")==="true")return;this.pressed=!this.pressed,d(this,"oatbase:change",{pressed:this.pressed})}get pressed(){return this.hasAttribute("pressed")}set pressed(t){this.toggleAttribute("pressed",Boolean(t)),this.button?.setAttribute("aria-pressed",String(Boolean(t)))}}c("ot-toggle",T);class D extends HTMLElement{connectedCallback(){if(!this.hasAttribute("role"))this.setAttribute("role","toolbar");if(!this.hasAttribute("aria-orientation"))this.setAttribute("aria-orientation","horizontal");this.refresh(),this.addEventListener("focusin",this),this.addEventListener("keydown",this)}disconnectedCallback(){this.removeEventListener("focusin",this),this.removeEventListener("keydown",this)}handleEvent(t){if(t.type==="keydown")return this.#e(t);let e=this.items.indexOf(t.target);if(e>=0)this.#t(e,!1)}refresh(){this.items=[...this.children].map((e)=>e.matches("ot-toggle")?e.querySelector("button"):e).filter((e)=>e?.matches("button:not(:disabled), a[href], [data-toolbar-item]")&&e.getAttribute("aria-disabled")!=="true");let t=Math.max(0,this.items.findIndex((e)=>e.tabIndex===0));this.items.forEach((e,i)=>{e.tabIndex=i===t?0:-1})}#t(t,e=!0){if(!this.items.length)return;let i=(t+this.items.length)%this.items.length;if(this.items.forEach((s,r)=>{s.tabIndex=r===i?0:-1}),e)this.items[i].focus()}#e(t){let e=this.items.indexOf(t.target);if(e<0)return;let i=this.getAttribute("aria-orientation")==="vertical",s=e;if(t.key==="Home")s=0;else if(t.key==="End")s=this.items.length-1;else if(i&&t.key==="ArrowDown")s=e+1;else if(i&&t.key==="ArrowUp")s=e-1;else if(!i&&t.key==="ArrowRight")s=e+1;else if(!i&&t.key==="ArrowLeft")s=e-1;else return;t.preventDefault(),this.#t(s)}}c("ot-toolbar",D);class B extends HTMLElement{#t=!1;connectedCallback(){if(this.input=this.querySelector(":scope > input"),!this.input)return;if(this.length=Math.min(12,Math.max(1,Number(this.dataset.length||this.input.maxLength||6))),this.input.maxLength<1)this.input.maxLength=this.length;if(this.slots=this.querySelector(":scope > [data-otp-slots]")||document.createElement("span"),this.slots.dataset.otpSlots="",this.slots.setAttribute("aria-hidden","true"),this.slots.style.setProperty("--otp-length",this.length),!this.slots.isConnected)this.append(this.slots);this.slots.replaceChildren(...Array.from({length:this.length},()=>document.createElement("span"))),this.input.addEventListener("input",this),this.form=this.input.form,this.form?.addEventListener("reset",this),this.dataset.enhanced="",this.#e(!1)}disconnectedCallback(){this.input?.removeEventListener("input",this),this.form?.removeEventListener("reset",this)}handleEvent(t){if(t.type==="reset")setTimeout(()=>this.#e(!1));else this.#e(!0)}get value(){return this.input?.value||""}set value(t){if(!this.input)return;this.input.value=String(t).slice(0,this.length),this.#e(!1)}#e(t){if(!this.input||!this.slots)return;if(this.input.inputMode==="numeric"){let r=this.input.value.replace(/\D/g,"").slice(0,this.length);if(r!==this.input.value)this.input.value=r}else if(this.input.value.length>this.length)this.input.value=this.input.value.slice(0,this.length);let e=this.input.value,i=Math.min(this.length-1,e.length);[...this.slots.children].forEach((r,h)=>{r.textContent=e[h]||" ",r.toggleAttribute("data-filled",h dialog[data-lightbox-dialog]"),this.image=this.dialog?.querySelector("[data-lightbox-image]"),this.caption=this.dialog?.querySelector("[data-lightbox-caption]"),this.status=this.dialog?.querySelector("[data-lightbox-status]"),this.previousButton=this.dialog?.querySelector("[data-lightbox-previous]"),this.nextButton=this.dialog?.querySelector("[data-lightbox-next]"),this.closeButton=this.dialog?.querySelector("[data-lightbox-close]"),!this.dialog||!this.image||typeof this.dialog.showModal!=="function")return;let t={signal:this.#t.signal};this.addEventListener("click",(e)=>this.#s(e),t),this.dialog.addEventListener("keydown",(e)=>this.#n(e),t),this.dialog.addEventListener("close",()=>this.#a(),t),this.previousButton?.addEventListener("click",()=>this.previous(),t),this.nextButton?.addEventListener("click",()=>this.next(),t),this.closeButton?.addEventListener("click",()=>this.close(),t),this.toggleAttribute("data-enhanced",!0)}disconnectedCallback(){this.#t?.abort()}get items(){return[...this.querySelectorAll("[data-lightbox-item]")].filter((t)=>!this.dialog?.contains(t))}get currentIndex(){return this.#e}open(t=0){let e=this.items,i=typeof t==="number"?t:e.indexOf(t);if(!e.length||i<0||i>=e.length||!this.dialog||!this.image)return;if(this.#i=e[i],this.#r(i),!this.dialog.open)this.dialog.showModal();d(this,"oatbase:open",{index:i,item:e[i]})}close(){this.dialog?.close()}next(){let t=this.items.length;if(t)this.#r((this.#e+1+t)%t)}previous(){let t=this.items.length;if(t)this.#r((this.#e-1+t)%t)}#s(t){let e=t.target.closest?.("[data-lightbox-item]");if(!e||this.dialog.contains(e))return;if(t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;t.preventDefault(),this.open(e)}#n(t){if(t.key==="ArrowRight")this.next();else if(t.key==="ArrowLeft")this.previous();else if(t.key==="Home")this.#r(0);else if(t.key==="End")this.#r(this.items.length-1);else return;t.preventDefault()}#r(t){let e=this.items,i=e[t];if(!i)return;let s=i.matches("img")?i:i.querySelector("img"),r=i.dataset.lightboxSrc||i.getAttribute("href")||s?.currentSrc||s?.src;if(!r)return;let h=i.closest("figure"),p=i.dataset.lightboxCaption??h?.querySelector("figcaption")?.textContent.trim()??"";if(this.image.src=r,this.image.alt=i.dataset.lightboxAlt??s?.alt??"",this.caption)this.caption.textContent=p,this.caption.hidden=!p;if(this.status)this.status.textContent=`${t+1} of ${e.length}`;if(this.previousButton)this.previousButton.disabled=e.length<2;if(this.nextButton)this.nextButton.disabled=e.length<2;this.#e=t,this.#o(e[(t-1+e.length)%e.length]),this.#o(e[(t+1)%e.length]),d(this,"oatbase:change",{index:t,item:i,source:r})}#o(t){if(!t||this.items.length<2)return;let e=t.matches("img")?t:t.querySelector("img"),i=t.dataset.lightboxSrc||t.getAttribute("href")||e?.currentSrc||e?.src;if(i)Object.assign(new Image,{src:i})}#a(){let t=this.#i;this.#i=null,t?.focus?.({preventScroll:!0}),d(this,"oatbase:close",{index:this.#e,item:this.items[this.#e]})}}c("ot-lightbox",R);class N extends HTMLElement{#t;#e;#i;#s;#n="";connectedCallback(){this.#t?.abort(),this.#t=new AbortController,this.#i?.disconnect(),this.#i=new MutationObserver(()=>this.refresh()),this.#i.observe(this,{childList:!0,subtree:!0}),this.refresh()}disconnectedCallback(){this.#t?.abort(),this.#e?.abort(),this.#i?.disconnect(),cancelAnimationFrame(this.#s)}get activeId(){return this.#n}refresh(){this.#e?.abort(),this.#e=new AbortController;let t=this.#r(this.dataset.target)||document;if(this.links=[...this.querySelectorAll('a[href^="#"]')],this.targets=this.links.map((i)=>{let s=decodeURIComponent(i.hash.slice(1)),r=s?document.getElementById(s):null;return r&&(t===document||t.contains(r))?r:null}).filter(Boolean),this.root=this.#r(this.dataset.scrollRoot),!this.targets.length){this.removeAttribute("data-enhanced");return}let e={passive:!0,signal:this.#e.signal};(this.root||window).addEventListener("scroll",()=>this.#o(),e),window.addEventListener("resize",()=>this.#o(),e),this.toggleAttribute("data-enhanced",!0),this.#a()}#r(t){if(!t)return null;try{return document.querySelector(t)}catch{return null}}#o(){cancelAnimationFrame(this.#s),this.#s=requestAnimationFrame(()=>this.#a())}#a(){if(!this.targets?.length)return;let t=Number.parseFloat(this.dataset.offset||"16")||0,i=(this.root?.getBoundingClientRect().top||0)+t,s=this.targets[0];for(let h of this.targets)if(h.getBoundingClientRect().top<=i+1)s=h;else break;if(this.root?this.root.scrollTop+this.root.clientHeight>=this.root.scrollHeight-1:window.scrollY+window.innerHeight>=document.documentElement.scrollHeight-1)s=this.targets.at(-1);if(!s||s.id===this.#n)return;this.#n=s.id,this.links.forEach((h)=>{let p=decodeURIComponent(h.hash.slice(1))===s.id;if(p)h.setAttribute("aria-current","location");else h.removeAttribute("aria-current");h.toggleAttribute("data-active",p)}),d(this,"oatbase:change",{id:s.id,target:s})}}c("ot-scrollspy",N);class $ extends HTMLElement{#t;#e;#i=[];#s=0;connectedCallback(){this.#e?.abort(),this.#e=x(this,()=>this.refresh())}disconnectedCallback(){this.#e?.abort(),this.#t?.abort(),this.#s++}get entries(){return[...this.#i]}refresh(){this.#t?.abort(),this.#t=new AbortController;let t=typeof HTMLElement.prototype.showPopover==="function",e=[...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')].filter((i)=>!i.closest("[data-footnote-popover]"));return this.#i=e.map((i)=>{let s=decodeURIComponent(i.hash.slice(1)),r=s&&document.getElementById(s);if(!r)return null;if(!t)return{reference:i,definition:r,dropdown:null,popover:null};return this.#r(i,r,s)}).filter(Boolean),this.toggleAttribute("data-enhanced",t&&this.#i.some((i)=>i.popover)),this.#n(t),this.entries}#n(t){let e=++this.#s,i=this.entries;queueMicrotask(()=>{if(this.isConnected&&e===this.#s)d(this,"oatbase:render",{entries:i,enhanced:t})})}#r(t,e,i){let s=t.closest("ot-dropdown[data-footnote-preview]"),r=s?.querySelector(":scope > [data-footnote-popover]");if(!s||!r){s=document.createElement("ot-dropdown"),s.dataset.footnotePreview="";let{parentNode:p,nextSibling:v}=t;s.append(t),r=document.createElement("aside"),r.id=g("oatbase-footnote"),r.className="card",r.dataset.footnotePopover="",r.setAttribute("popover","auto"),r.setAttribute("role","note"),s.append(r),p.insertBefore(s,v)}r.dataset.footnoteFor=i,r.setAttribute("aria-label",`Footnote ${t.textContent.trim()}`),t.setAttribute("popovertarget",r.id),t.setAttribute("aria-controls",r.id),this.#o(r,e);let h={reference:t,definition:e,dropdown:s,popover:r};return t.addEventListener("click",(p)=>{if(p.metaKey||p.ctrlKey||p.shiftKey||p.altKey)return;if(p.preventDefault(),r.matches(":popover-open"))r.hidePopover();else r.showPopover()},{signal:this.#t.signal}),r.addEventListener("toggle",(p)=>{d(this,"oatbase:toggle",{...h,state:p.newState||(r.matches(":popover-open")?"open":"closed")})},{signal:this.#t.signal}),h}#o(t,e){let i=e.cloneNode(!0);i.removeAttribute("id"),i.querySelector(".footnote-definition-label, [data-footnote-label]")?.remove(),i.querySelectorAll("[id]").forEach((r)=>r.removeAttribute("id")),i.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach((r)=>r.remove());let s=document.createElement("div");while(i.firstChild)s.append(i.firstChild);t.replaceChildren(s)}}c("ot-footnotes",$);class P extends HTMLElement{#t;#e;connectedCallback(){this.#t?.abort(),this.#t=new AbortController,this.refresh()}disconnectedCallback(){this.#t?.abort(),cancelAnimationFrame(this.#e)}refresh(){if(this.#t?.abort(),this.#t=new AbortController,this.progress=this.querySelector("progress"),this.target=this.#i(this.dataset.target),this.root=this.#i(this.dataset.scrollRoot),!this.progress||!this.target)return;this.progress.max=100;let t={passive:!0,signal:this.#t.signal};(this.root||window).addEventListener("scroll",()=>this.#s(),t),window.addEventListener("resize",()=>this.#s(),t),this.toggleAttribute("data-enhanced",!0),this.#n()}#i(t){if(!t)return null;try{return document.querySelector(t)}catch{return null}}#s(){cancelAnimationFrame(this.#e),this.#e=requestAnimationFrame(()=>this.#n())}#n(){let t=this.root?.getBoundingClientRect(),e=this.target.getBoundingClientRect(),i=this.root?.scrollTop||window.scrollY,s=this.root?.clientHeight||window.innerHeight,r=i+e.top-(t?.top||0),h=Math.max(1,this.target.scrollHeight-s),p=Math.min(100,Math.max(0,(i-r)/h*100));this.progress.value=p}}c("ot-reading-progress",P);var lt=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});class F extends HTMLElement{#t;#e=new WeakMap;#i={index:-1,direction:"none"};connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.table=this.querySelector(":scope > table, :scope > .scroll-area > table"),!this.table)return;this.filter=this.querySelector("[data-table-filter]"),this.selectAll=this.querySelector("[data-table-select-all]"),this.status=this.querySelector("[data-table-status]"),this.selectedStatus=this.querySelector("[data-table-selected]"),this.empty=this.querySelector("[data-table-empty]"),this.#s(t),this.refresh(),this.filter?.addEventListener("input",()=>this.#a(),{signal:t}),this.table.addEventListener("change",(e)=>{if(e.target.matches("[data-table-select-row]"))this.#d(e.target);else if(e.target.matches("[data-table-select-all]"))this.#l(e.target.checked)},{signal:t}),this.addEventListener("oatbase:refresh",()=>this.refresh(),{signal:t}),this.dataset.enhanced=""}disconnectedCallback(){this.#t?.abort()}get rows(){return[...this.table?.tBodies[0]?.rows||[]]}get visibleRows(){return this.rows.filter((t)=>!t.hidden)}get selectedRows(){return this.rows.filter((t)=>t.querySelector("[data-table-select-row]:checked"))}refresh(){this.rows.forEach((t,e)=>{if(!this.#e.has(t))this.#e.set(t,e)}),this.#a(!1)}#s(t){[...this.table.tHead?.rows[0]?.cells||[]].forEach((e,i)=>{if(!e.hasAttribute("data-sort"))return;let s=e.querySelector(":scope > [data-table-sort]");if(!s)s=document.createElement("button"),s.type="button",s.dataset.tableSort="",s.className="ghost",s.append(...e.childNodes),e.append(s);e.setAttribute("aria-sort","none"),s.addEventListener("click",()=>this.#n(e,i),{signal:t})})}#n(t,e){let i=this.#i.index!==e||this.#i.direction==="none"?"ascending":this.#i.direction==="ascending"?"descending":"none";this.#i={index:e,direction:i},[...this.table.tHead?.rows[0]?.cells||[]].filter((h)=>h.hasAttribute("data-sort")).forEach((h)=>h.setAttribute("aria-sort",h===t?i:"none"));let s=t.dataset.sort||"text",r=[...this.rows].sort((h,p)=>{if(i==="none")return this.#e.get(h)-this.#e.get(p);let v=this.#o(this.#r(h,e),this.#r(p,e),s);return i==="ascending"?v:-v});this.table.tBodies[0].append(...r),d(this,"oatbase:sort",{index:e,direction:i,type:s,header:t})}#r(t,e){let i=t.cells[e];return i?.dataset.sortValue??i?.textContent.trim()??""}#o(t,e,i){if(i==="number")return(Number(t)||0)-(Number(e)||0);if(i==="date")return(Date.parse(t)||0)-(Date.parse(e)||0);return lt.compare(t,e)}#a(t=!0){let e=this.filter?.value.trim().toLocaleLowerCase()||"";this.rows.forEach((r)=>{let h=(r.dataset.filterValue||r.textContent).toLocaleLowerCase();r.hidden=Boolean(e&&!h.includes(e))});let i=this.visibleRows.length,s=this.rows.length;if(this.status)this.status.value=e?`${i} of ${s} rows`:`${s} rows`;if(this.empty)this.empty.hidden=i>0;if(this.#h(),t)d(this,"oatbase:filter",{query:e,visible:i,total:s})}#l(t){this.visibleRows.forEach((e)=>{let i=e.querySelector("[data-table-select-row]:not(:disabled)");if(i)i.checked=t}),this.#h(),this.#c()}#d(t){t.closest("tr")?.toggleAttribute("data-selected",t.checked),this.#h(),this.#c()}#h(){this.rows.forEach((i)=>i.toggleAttribute("data-selected",Boolean(i.querySelector("[data-table-select-row]:checked"))));let t=this.visibleRows.map((i)=>i.querySelector("[data-table-select-row]:not(:disabled)")).filter(Boolean),e=t.filter((i)=>i.checked).length;if(this.selectAll)this.selectAll.checked=t.length>0&&e===t.length,this.selectAll.indeterminate=e>0&&et.querySelector("[data-table-select-row]")?.value).filter((t)=>t!=null)})}}c("ot-data-table",F);class _ extends HTMLElement{#t;#e;#i=0;connectedCallback(){this.#t?.abort(),this.#t=new AbortController;let t=this.#t.signal;if(this.list=this.querySelector(":scope > [data-repeater-list]"),this.template=this.querySelector(":scope > template[data-repeater-template]"),!this.list||!this.template)return;if(this.#e==null)this.#e=this.list.innerHTML;this.#s(),this.addEventListener("click",(e)=>this.#n(e),{signal:t}),this.closest("form")?.addEventListener("reset",()=>queueMicrotask(()=>this.#r()),{signal:t}),this.dataset.enhanced="",this.refresh()}disconnectedCallback(){this.#t?.abort()}get items(){return[...this.list?.querySelectorAll(":scope > [data-repeater-item]")||[]]}get min(){return Math.max(0,Number(this.dataset.min)||0)}get max(){return Math.max(this.min,Number(this.dataset.max)||1/0)}add(){if(!this.template||this.items.length>=this.max)return null;let t=this.#i++,e=this.template.content.cloneNode(!0);[...e.querySelectorAll("*")].forEach((r)=>{if([...r.attributes].forEach((h)=>{if(h.value.includes("__index__"))r.setAttribute(h.name,h.value.replaceAll("__index__",String(t)))}),r.hasAttribute("data-repeater-number"))r.textContent=String(t+1)});let s=e.querySelector("[data-repeater-item]");if(!s)return null;return s.dataset.repeaterIndex=t,this.list.append(e),this.refresh(),s.querySelector('[data-repeater-focus], input:not([type="hidden"]), select, textarea, button')?.focus(),d(this,"oatbase:add",{item:s,index:t}),s}remove(t){if(!t?.matches?.("[data-repeater-item]")||!this.list?.contains(t)||this.items.length<=this.min)return!1;let e=Number(t.dataset.repeaterIndex),i=t.previousElementSibling?.querySelector("[data-repeater-remove]")||t.nextElementSibling?.querySelector("[data-repeater-remove]")||this.querySelector("[data-repeater-add]");return t.remove(),this.refresh(),i?.focus(),d(this,"oatbase:remove",{item:t,index:e}),!0}refresh(){let t=this.items,e=t.length<=this.min,i=t.length>=this.max;this.querySelectorAll("[data-repeater-add]").forEach((s)=>{s.disabled=i}),t.forEach((s,r)=>{s.querySelectorAll("[data-repeater-remove]").forEach((h)=>{h.disabled=e}),s.querySelectorAll("[data-repeater-position]").forEach((h)=>{h.value=String(r+1)})}),this.toggleAttribute("data-empty",t.length===0)}#s(){this.#i=0,this.items.forEach((t)=>{let e=Number(t.dataset.repeaterIndex),i=Number.isFinite(e)?e:this.#i;t.dataset.repeaterIndex=i,this.#i=Math.max(this.#i,i+1)})}#n(t){let e=t.target.closest("[data-repeater-add]");if(e&&this.contains(e)){t.preventDefault(),this.add();return}let i=t.target.closest("[data-repeater-remove]");if(i&&this.contains(i))t.preventDefault(),this.remove(i.closest("[data-repeater-item]"))}#r(){this.list.innerHTML=this.#e,this.#s(),this.refresh(),d(this,"oatbase:reset",{items:this.items})}}c("ot-repeater",_);class K extends HTMLElement{#t;#e;#i;connectedCallback(){this.#t?.abort(),this.#e?.disconnect(),this.#t=new AbortController;let t=this.#t.signal;if(this.log=this.querySelector(':scope > [role="log"], :scope > .scroll-area[role="log"]'),!this.log)return;this.content=this.log.querySelector("[data-log-content]")||this.log,this.follow=this.querySelector("[data-log-follow]"),this.status=this.querySelector("[data-log-status]"),this.log.setAttribute("aria-relevant",this.log.getAttribute("aria-relevant")||"additions text"),this.follow?.addEventListener("change",()=>{if(this.toggleAttribute("data-following",this.follow.checked),this.follow.checked)this.#n();d(this,"oatbase:follow",{following:this.follow.checked})},{signal:t}),this.log.addEventListener("scroll",()=>this.#r(),{signal:t,passive:!0}),this.#e=new MutationObserver(()=>this.#s()),this.#e.observe(this.content,{childList:!0,subtree:!0,characterData:!0}),this.dataset.enhanced="",this.refresh()}disconnectedCallback(){if(this.#t?.abort(),this.#e?.disconnect(),this.#i)cancelAnimationFrame(this.#i)}get lineCount(){let t=this.content?.querySelectorAll?.("[data-log-line]");if(t?.length)return t.length;let e=this.content?.textContent||"";return e?e.replace(/\r\n?/g,`
`).replace(/\n$/,"").split(`
-`).length:0}append(t){if(!this.content)return;if(this.content.querySelector("[data-log-line]")){String(t).replace(/^\r?\n/,"").split(/\r?\n/).forEach((e)=>{let i=document.createElement("span");i.dataset.logLine="",i.textContent=e,this.content.append(i)}),this.#s();return}this.content.append(document.createTextNode(String(t))),this.#s()}refresh(){let t=this.lineCount;if(this.status)this.status.value=`${t} ${t===1?"line":"lines"}`;let e=Boolean(this.follow?.checked);if(this.toggleAttribute("data-following",e),e)this.#n();c(this,"oatbase:update",{lines:t,following:e})}#s(){if(this.#i)return;this.#i=requestAnimationFrame(()=>{this.#i=0,this.refresh()})}#n(){if(this.log)this.log.scrollTop=this.log.scrollHeight}#r(){if(!this.follow?.checked)return;if(this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<=2)return;this.follow.checked=!1,this.toggleAttribute("data-following",!1),c(this,"oatbase:follow",{following:!1,reason:"scroll"})}}d("ot-log-viewer",z);})();
+`).length:0}append(t){if(!this.content)return;if(this.content.querySelector("[data-log-line]")){String(t).replace(/^\r?\n/,"").split(/\r?\n/).forEach((e)=>{let i=document.createElement("span");i.dataset.logLine="",i.textContent=e,this.content.append(i)}),this.#s();return}this.content.append(document.createTextNode(String(t))),this.#s()}refresh(){let t=this.lineCount;if(this.status)this.status.value=`${t} ${t===1?"line":"lines"}`;let e=Boolean(this.follow?.checked);if(this.toggleAttribute("data-following",e),e)this.#n();d(this,"oatbase:update",{lines:t,following:e})}#s(){if(this.#i)return;this.#i=requestAnimationFrame(()=>{this.#i=0,this.refresh()})}#n(){if(this.log)this.log.scrollTop=this.log.scrollHeight}#r(){if(!this.follow?.checked)return;if(this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<=2)return;this.follow.checked=!1,this.toggleAttribute("data-following",!1),d(this,"oatbase:follow",{following:!1,reason:"scroll"})}}c("ot-log-viewer",K);})();
diff --git a/docs/components.js b/docs/components.js
index f98853f..2a0fbdc 100644
--- a/docs/components.js
+++ b/docs/components.js
@@ -562,13 +562,23 @@ appendButton.addEventListener('click', () => {
{
slug: 'footnotes', name: 'Footnotes', source: 'Oatbase', js: true,
description: 'Adds Oat popover previews to native footnote references without hiding definitions.',
+ usageNote: 'References and source definitions remain ordinary document content when Popover is unavailable. Layout integrations can attach at any time, then call refresh() to receive the current mappings through oatbase:render.',
markup: `
Oatbase prefers useful native fallbacks.
`,
- api: [['data-footnote-ref', 'Marks a native anchor whose hash references a definition.'], ['data-footnote', 'Optionally identifies definitions; ordinary id targets also work.'], ['.footnote-reference a', 'Supports Zola’s generated reference markup by default.'], ['.footnote-definition', 'Supports Zola’s generated definition markup by default.']]
+ javascript: `const footnotes = document.querySelector('ot-footnotes');
+
+footnotes.addEventListener('oatbase:render', event => {
+ event.detail.entries.forEach(({ reference, definition, popover }) => {
+ positionSidenote({ reference, definition, popover });
+ });
+});
+
+footnotes.refresh();`,
+ api: [['data-footnote-ref', 'Marks a native anchor whose hash references a definition.'], ['data-footnote', 'Optionally identifies definitions; ordinary id targets also work.'], ['.footnote-reference a', 'Supports Zola’s generated reference markup by default.'], ['.footnote-definition', 'Supports Zola’s generated definition markup by default.'], ['data-footnote-for', 'Identifies the source definition id on each generated popover.'], ['entries', 'Returns { reference, definition, dropdown, popover } mappings without private DOM queries.'], ['refresh()', 'Discovers new references, refreshes preview content, and emits a new render lifecycle event.'], ['oatbase:render', 'Emits { entries, enhanced } after previews are ready; call refresh() after attaching a late listener.'], ['oatbase:toggle', 'Emits { state, reference, definition, dropdown, popover } when a preview opens or closes.']]
},
{
slug: 'reading-progress', name: 'Reading Progress', source: 'Oatbase', js: true,
diff --git a/docs/index.html b/docs/index.html
index a9be14c..4000c73 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -117,7 +117,7 @@ Oat core patterns Keep Oat’s semantic HTML, tiny footprint, and token system. Add Oatbase when a product needs richer selection, navigation, content, or application patterns. The complete Oat-inclusive CSS and JavaScript stays under 28 kB gzipped; the extension-only layer stays under 19 kB. Individual entries let applications pay only for the pieces they use.
+ Keep Oat’s semantic HTML, tiny footprint, and token system. Add Oatbase when a product needs richer selection, navigation, content, or application patterns. The complete Oat-inclusive CSS and JavaScript stays under 30 kB gzipped; the extension-only layer stays under 20 kB. Individual entries let applications pay only for the pieces they use.
Browse additions
Install Oatbase
diff --git a/src/js/footnotes.js b/src/js/footnotes.js
index 021b39c..23a2e83 100644
--- a/src/js/footnotes.js
+++ b/src/js/footnotes.js
@@ -1,26 +1,57 @@
-import { define, uid } from './base.js';
+import { connectWhenReady, define, emit, uid } from './base.js';
class OtFootnotes extends HTMLElement {
#abort;
+ #readyAbort;
+ #entries = [];
+ #revision = 0;
connectedCallback() {
+ this.#readyAbort?.abort();
+ this.#readyAbort = connectWhenReady(this, () => this.refresh());
+ }
+
+ disconnectedCallback() {
+ this.#readyAbort?.abort();
this.#abort?.abort();
- this.#abort = new AbortController();
- if (typeof HTMLElement.prototype.showPopover !== 'function') return;
- const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')];
- references.forEach(reference => this.#enhance(reference));
- if (references.length) this.toggleAttribute('data-enhanced', true);
+ this.#revision++;
}
- disconnectedCallback() { this.#abort?.abort(); }
+ get entries() { return [...this.#entries]; }
+
+ refresh() {
+ this.#abort?.abort();
+ this.#abort = new AbortController();
+ const canPopover = typeof HTMLElement.prototype.showPopover === 'function';
+ const references = [...this.querySelectorAll('[data-footnote-ref], .footnote-reference a[href^="#"]')]
+ .filter(reference => !reference.closest('[data-footnote-popover]'));
+
+ this.#entries = references.map(reference => {
+ const targetId = decodeURIComponent(reference.hash.slice(1));
+ const definition = targetId && document.getElementById(targetId);
+ if (!definition) return null;
+ if (!canPopover) return { reference, definition, dropdown: null, popover: null };
+ return this.#enhance(reference, definition, targetId);
+ }).filter(Boolean);
- #enhance(reference) {
- const targetId = decodeURIComponent(reference.hash.slice(1));
- const definition = targetId && document.getElementById(targetId);
- if (!definition) return;
+ this.toggleAttribute('data-enhanced', canPopover && this.#entries.some(entry => entry.popover));
+ this.#announce(canPopover);
+ return this.entries;
+ }
+
+ #announce(enhanced) {
+ const revision = ++this.#revision;
+ const entries = this.entries;
+ queueMicrotask(() => {
+ if (this.isConnected && revision === this.#revision) {
+ emit(this, 'oatbase:render', { entries, enhanced });
+ }
+ });
+ }
+ #enhance(reference, definition, targetId) {
let dropdown = reference.closest('ot-dropdown[data-footnote-preview]');
- let popover = dropdown?.querySelector('[data-footnote-popover]');
+ let popover = dropdown?.querySelector(':scope > [data-footnote-popover]');
if (!dropdown || !popover) {
dropdown = document.createElement('ot-dropdown');
dropdown.dataset.footnotePreview = '';
@@ -34,28 +65,41 @@ class OtFootnotes extends HTMLElement {
popover.dataset.footnotePopover = '';
popover.setAttribute('popover', 'auto');
popover.setAttribute('role', 'note');
- popover.setAttribute('aria-label', `Footnote ${reference.textContent.trim()}`);
-
- const content = definition.cloneNode(true);
- content.removeAttribute('id');
- content.querySelector('.footnote-definition-label, [data-footnote-label]')?.remove();
- content.querySelectorAll('[id]').forEach(element => element.removeAttribute('id'));
- content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach(element => element.remove());
- const body = document.createElement('div');
- while (content.firstChild) body.append(content.firstChild);
- popover.append(body);
dropdown.append(popover);
- reference.setAttribute('popovertarget', popover.id);
- reference.setAttribute('aria-controls', popover.id);
parent.insertBefore(dropdown, next);
}
+ popover.dataset.footnoteFor = targetId;
+ popover.setAttribute('aria-label', `Footnote ${reference.textContent.trim()}`);
+ reference.setAttribute('popovertarget', popover.id);
+ reference.setAttribute('aria-controls', popover.id);
+ this.#render(popover, definition);
+
+ const entry = { reference, definition, dropdown, popover };
reference.addEventListener('click', event => {
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
event.preventDefault();
if (popover.matches(':popover-open')) popover.hidePopover();
else popover.showPopover();
}, { signal: this.#abort.signal });
+ popover.addEventListener('toggle', event => {
+ emit(this, 'oatbase:toggle', {
+ ...entry,
+ state: event.newState || (popover.matches(':popover-open') ? 'open' : 'closed')
+ });
+ }, { signal: this.#abort.signal });
+ return entry;
+ }
+
+ #render(popover, definition) {
+ const content = definition.cloneNode(true);
+ content.removeAttribute('id');
+ content.querySelector('.footnote-definition-label, [data-footnote-label]')?.remove();
+ content.querySelectorAll('[id]').forEach(element => element.removeAttribute('id'));
+ content.querySelectorAll('[data-footnote-backref], a[rev="footnote"]').forEach(element => element.remove());
+ const body = document.createElement('div');
+ while (content.firstChild) body.append(content.firstChild);
+ popover.replaceChildren(body);
}
}
diff --git a/tests/docs.test.js b/tests/docs.test.js
index 83fa4b4..8ba6a01 100644
--- a/tests/docs.test.js
+++ b/tests/docs.test.js
@@ -196,6 +196,18 @@ describe('component coverage', () => {
expect(stat).toMatch(/
[^<]+/);
});
+ test('documents the Footnotes lifecycle and layout integration surface', () => {
+ const footnotes = components.find(component => component.slug === 'footnotes');
+ const api = footnotes.api.flat().join(' ');
+ for (const surface of ['data-footnote-for', 'entries', 'refresh()', 'oatbase:render', 'oatbase:toggle']) {
+ expect(api).toContain(surface);
+ }
+ expect(footnotes.javascript).toContain("addEventListener('oatbase:render'");
+ expect(footnotes.javascript).toContain('positionSidenote({ reference, definition, popover })');
+ expect(footnotes.javascript).toContain('footnotes.refresh()');
+ expect(footnotes.usageNote).toContain('when Popover is unavailable');
+ });
+
test('ships complete iframe examples with visible, copyable source', async () => {
const [docs, examples, script, styles] = await Promise.all([
readFile(new URL('../docs/index.html', import.meta.url), 'utf8'),
@@ -347,8 +359,8 @@ describe('component coverage', () => {
readFile(new URL('../docs/docs.css', import.meta.url), 'utf8')
]);
expect(docs).toContain('class="card row gap-6 items-center docs-home-install"');
- expect(docs).toContain('complete Oat-inclusive CSS and JavaScript stays under 28 kB gzipped');
- expect(docs).toContain('extension-only layer stays under 19 kB');
+ expect(docs).toContain('complete Oat-inclusive CSS and JavaScript stays under 30 kB gzipped');
+ expect(docs).toContain('extension-only layer stays under 20 kB');
expect(docs).toContain('Individual entries let applications pay only for the pieces they use.');
expect(docs).toContain('class="row gap-2 mt-6 docs-home-layers"');
expect(docs).toContain('class="item col-6" data-variant="outline"');
diff --git a/tests/e2e/components.pw.js b/tests/e2e/components.pw.js
index 68bb61f..4303e2a 100644
--- a/tests/e2e/components.pw.js
+++ b/tests/e2e/components.pw.js
@@ -21,6 +21,7 @@ test('retains useful native controls without JavaScript', async ({ browser }) =>
await expect(page.locator('#fixture-lightbox [data-lightbox-item]')).toHaveCount(2);
await expect(page.locator('#fixture-scrollspy a')).toHaveCount(2);
await expect(page.locator('#fixture-note')).toBeVisible();
+ await expect(page.locator('#fixture-footnotes [data-footnote-ref]')).toHaveAttribute('href', '#fixture-note');
await expect(page.locator('#fixture-reading progress')).toBeVisible();
await expect(page.locator('#fixture-creatable select')).toBeVisible();
await expect(page.locator('#fixture-repeater [data-repeater-item]')).toHaveCount(1);
@@ -220,12 +221,53 @@ test('scrollspy and reading progress follow a supplied scroll container', async
test('footnotes compose Oat popovers while preserving their original definitions', async ({ page }) => {
const footnotes = page.locator('#fixture-footnotes');
+ await footnotes.evaluate(element => {
+ window.footnoteLifecycle = [];
+ element.addEventListener('oatbase:render', event => {
+ window.footnoteLifecycle.push({
+ type: 'render',
+ enhanced: event.detail.enhanced,
+ entries: event.detail.entries.map(entry => ({
+ reference: entry.reference.getAttribute('href'),
+ definition: entry.definition.id,
+ popover: entry.popover?.dataset.footnoteFor
+ }))
+ });
+ });
+ element.addEventListener('oatbase:toggle', event => {
+ window.footnoteLifecycle.push({ type: 'toggle', state: event.detail.state, definition: event.detail.definition.id });
+ });
+ element.refresh();
+ });
+ await expect.poll(() => page.evaluate(() => window.footnoteLifecycle[0])).toEqual({
+ type: 'render',
+ enhanced: true,
+ entries: [{ reference: '#fixture-note', definition: 'fixture-note', popover: 'fixture-note' }]
+ });
+ await expect(footnotes.locator('[data-footnote-popover]')).toHaveAttribute('data-footnote-for', 'fixture-note');
await footnotes.locator('[data-footnote-ref]').click();
await expect(footnotes.locator('[data-footnote-popover]')).toBeVisible();
await expect(footnotes.locator('[data-footnote-popover]')).toContainText('original definition remains available');
+ await expect.poll(() => page.evaluate(() => window.footnoteLifecycle.some(event => event.type === 'toggle' && event.state === 'open'))).toBe(true);
await page.keyboard.press('Escape');
await expect(footnotes.locator('[data-footnote-popover]')).not.toBeVisible();
await expect(page.locator('#fixture-note')).toBeVisible();
+
+ await footnotes.evaluate(element => {
+ element.querySelector('#fixture-note p').textContent = 'The refreshed source definition.';
+ const paragraph = document.createElement('p');
+ paragraph.innerHTML = 'A later note2.';
+ const definition = document.createElement('li');
+ definition.id = 'fixture-note-two';
+ definition.dataset.footnote = '';
+ definition.innerHTML = 'A dynamically inserted definition.
';
+ element.prepend(paragraph);
+ element.querySelector('ol').append(definition);
+ element.refresh();
+ });
+ await expect(footnotes.locator('[data-footnote-popover]')).toHaveCount(2);
+ await expect(footnotes.locator('[data-footnote-for="fixture-note"]')).toContainText('The refreshed source definition.');
+ await expect.poll(() => footnotes.evaluate(element => element.entries.length)).toBe(2);
});
test('exposes a stable accessible tree', async ({ page }) => {
diff --git a/tests/source.test.js b/tests/source.test.js
index 26f1e7d..1e2c0c7 100644
--- a/tests/source.test.js
+++ b/tests/source.test.js
@@ -27,18 +27,18 @@ describe('package', () => {
expect(manifest.optIns.find(component => component.name === 'tooltip-compat')).toBeTruthy();
});
- test('keeps the complete browser payload below 28 KB compressed', async () => {
+ test('keeps the complete browser payload below 30 KB compressed', async () => {
const css = await Bun.file(new URL('dist/oatbase.min.css', root)).arrayBuffer();
const js = await Bun.file(new URL('dist/oatbase.min.js', root)).arrayBuffer();
const compressedBytes = gzipSync(Buffer.concat([Buffer.from(css), Buffer.from(js)])).byteLength;
- expect(compressedBytes).toBeLessThan(28_000);
+ expect(compressedBytes).toBeLessThan(30_000);
});
- test('keeps the extension-only browser payload below 19 KB compressed', async () => {
+ test('keeps the extension-only browser payload below 20 KB compressed', async () => {
const css = await Bun.file(new URL('dist/extensions.min.css', root)).arrayBuffer();
const js = await Bun.file(new URL('dist/extensions.min.js', root)).arrayBuffer();
const compressedBytes = gzipSync(Buffer.concat([Buffer.from(css), Buffer.from(js)])).byteLength;
- expect(compressedBytes).toBeLessThan(19_000);
+ expect(compressedBytes).toBeLessThan(20_000);
});
});
@@ -365,6 +365,12 @@ describe('source', () => {
expect(scrollspy).toContain("setAttribute('aria-current', 'location')");
expect(footnotes).toContain("document.createElement('ot-dropdown')");
expect(footnotes).toContain("setAttribute('popover', 'auto')");
+ expect(footnotes).toContain('refresh()');
+ expect(footnotes).toContain("emit(this, 'oatbase:render'");
+ expect(footnotes).toContain("emit(this, 'oatbase:toggle'");
+ expect(footnotes).toContain('popover.dataset.footnoteFor = targetId');
+ expect(footnotes).toContain('get entries()');
+ expect(footnotes).toContain("typeof HTMLElement.prototype.showPopover === 'function'");
expect(reading).toContain("querySelector('progress')");
});
});