PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.11
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.11
1.1.11 1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 All 35 releases
← All changes | assets/js/app-runtime.min.js +5 -5 1.1.9 → 1.1.11 View file →
@@ -1,17 +1,17 @@
1 -var openStationAppRuntime=function(O){"use strict";function qe(){const e=window.wp?.hooks;if(!e)throw new Error("[openstation] `window.wp.hooks` is not available. The plugin declares `wp-hooks` as a script dependency; if you are seeing this error, verify the enqueue order.");return e}function ue(e,...n){qe().doAction(e,...n)}function He(e,n){const t=s=>{if(!(s.target instanceof Node&&e.contains(s.target))){if(s.target instanceof Node)for(const i of n.siblingSelectors??[]){const r=Array.from(document.querySelectorAll(i));for(const d of r)if(d.contains(s.target))return}n.excludeOutsideTarget&&s.target instanceof Node&&n.excludeOutsideTarget.contains(s.target)||n.close()}},o=s=>{s.key==="Escape"&&n.close()};return document.addEventListener("mousedown",t,{capture:!0}),document.addEventListener("keydown",o),()=>{document.removeEventListener("mousedown",t,{capture:!0}),document.removeEventListener("keydown",o)}}let J=null;function R(){return!!window.openStationShellOverlays}function Fe(e){return new Promise((n,t)=>{const o=document.querySelector('script[data-os-shell-overlays="1"]'),s=()=>{if(R()){n();return}t(new Error("[openstation] shell-overlays bundle loaded but did not set `window.openStationShellOverlays`."))};if(o){R()?s():(o.addEventListener("load",s),o.addEventListener("error",()=>t(new Error("failed to load shell-overlays bundle"))));return}const i=document.createElement("script");i.src=e,i.async=!0,i.dataset.osShellOverlays="1",i.addEventListener("load",s),i.addEventListener("error",()=>t(new Error("failed to load shell-overlays bundle"))),document.head.appendChild(i)})}function Ve(e){return R()||!e?Promise.resolve():(J||(J=Fe(e)),J)}function Ue(){return window.openStationConfig?.shellOverlaysBundleUrl??""}function Xe(e,n){const t=Ue();if(R()||!t){n();return}Ve(t).then(()=>{e()&&n()}).catch(o=>{typeof console<"u"&&console.warn("[openstation] shell-overlays failed to load; menu/dialog suppressed:",o)})}const de=8;function ze(e,n){e.style.visibility="hidden";const t=()=>{e.isConnected&&(n(e.getBoundingClientRect()),e.style.visibility="")};typeof requestAnimationFrame=="function"?requestAnimationFrame(t):t()}function Ge(e){ze(e,n=>{n.right>window.innerWidth&&(e.style.left=`${Math.max(0,window.innerWidth-n.width-de)}px`),n.bottom>window.innerHeight&&(e.style.top=`${Math.max(0,window.innerHeight-n.height-de)}px`)})}const Ze="os-wallpaper-menu";let I=null,Y=null,fe=0;function Q(){if(!I)return;const e=I.dataset.menuScope??"selection",n=Y;I.dispatchEvent(new CustomEvent("tile-menu-closed")),I.remove(),I=null,Y=null,n?.(),ue(`os.${e}.menu.closed`,{})}function Je(e,n){Q();const t=++fe;Xe(()=>t===fe,()=>Ye(e,n))}function Ye(e,{actions:n,dataset:t,className:o,scope:s="selection",onOpened:i,onClosed:r}){if(n.length===0)return;const d=document.createElement("os-context-menu");d.setAttribute("open",""),d.classList.add(Ze),o&&d.classList.add(o),d.dataset.menuScope=s;for(const[u,h]of Object.entries(t??{}))d.dataset[u]=h;d.style.left=`${e.x}px`,d.style.top=`${e.y}px`;const f=new Map;for(const u of n){f.set(u.id,u);const h=document.createElement("os-context-menu-option");h.dataset.menuItemId=u.id,h.setAttribute("value",u.id),u.danger&&h.setAttribute("danger",""),u.disabled&&h.setAttribute("disabled",""),u.icon&&h.setAttribute("icon",Qe(u.icon)),h.textContent=u.label,d.appendChild(h)}d.addEventListener("os-context-menu-pick",u=>{const h=u.detail,b=f.get(h.id);b&&(Q(),Promise.resolve(b.onClick(new MouseEvent("click"))).catch(y=>{console.error(`[openstation] menu action '${b.id}' threw:`,y)}))}),document.body.appendChild(d),I=d,Y=r??null,Ge(d);const c=He(d,{close:()=>Q()});d.addEventListener("tile-menu-closed",c);const l=n.map(u=>u.id);i?.(l),ue(`os.${s}.menu.opened`,{items:l,count:n.length})}function Qe(e){return e.replace(/[^a-zA-Z0-9_-]/g,"")}const ee="desktop-mode";function j(){return window.wp?.i18n}function pe(e,n=ee){return j()?.__(e,n)??e}function et(e,n,t=ee){return j()?._x(e,n,t)??e}function tt(e,n,t,o=ee){return j()?._n(e,n,t,o)??(t===1?e:n)}function me(e,...n){const t=j()?.sprintf;if(t)return t(e,...n);let o=0;return e.replace(/%(?:(\d+)\$)?[sd]/g,(s,i)=>{const r=i?Number.parseInt(i,10)-1:o++;return String(n[r]??"")})}function M(e,...n){return{__wpdHtml:!0,strings:e,values:n}}function nt(e){return!!e&&e.__wpdHtml===!0}const ot="$$wpd$$",x=/\$\$wpd\$\$(\d+)\$\$/g,st="$$wpd-node$$",it=/^\$\$wpd-node\$\$(\d+)\$\$$/,rt=new Set(["style","script","textarea","title"]);function at(e){let n="",t=!1,o=null,s=!1,i=null,r="",d=!1;for(let f=0;f<e.length;f++){const c=e[f];n+=c;for(let l=0;l<c.length;l++){const u=c[l];if(s){c.startsWith("-->",l)&&(s=!1,l+=2);continue}if(i!==null){u==="<"&&c[l+1]==="/"&&c.slice(l+2,l+2+i.length).toLowerCase()===i&&(l+=1+i.length,i=null,t=!0,d=!1,r="");continue}if(o!==null){u===o&&(o=null);continue}if(t){u==='"'||u==="'"?(o=u,d=!1):u===">"?(t=!1,d=!1,rt.has(r)&&(i=r),r=""):d&&(/[a-zA-Z0-9-]/.test(u)?r+=u.toLowerCase():d=!1);continue}if(c.startsWith("<!--",l)){s=!0,l+=3;continue}const h=c[l+1]??"";u==="<"&&/[a-zA-Z/!]/.test(h)&&(t=!0,r="",d=/[a-zA-Z]/.test(h))}f<e.length-1&&(n+=t||s||i!==null?`${ot}${f}$$`:`<!--${st}${f}$$-->`)}return n}const he=new WeakMap;function ge(e){const n=he.get(e);if(n)return n;const t=document.createElement("template");t.innerHTML=at(e);const o=[],s=(d,f)=>{if(d.nodeType===Node.ELEMENT_NODE){const u=d;for(const h of Array.from(u.attributes)){const b=h.name,y=h.value,m=b[0];if(x.test(y))if(x.lastIndex=0,m==="@"){const w=x.exec(y);x.lastIndex=0,o.push({path:f,kind:"event",name:b.slice(1),valueIndex:w?Number(w[1]):0}),u.removeAttribute(b)}else if(m==="."){const w=x.exec(y);x.lastIndex=0,o.push({path:f,kind:"prop",name:b.slice(1),valueIndex:w?Number(w[1]):0}),u.removeAttribute(b)}else if(m==="?"){const w=x.exec(y);x.lastIndex=0,o.push({path:f,kind:"bool",name:b.slice(1),valueIndex:w?Number(w[1]):0}),u.removeAttribute(b)}else{const w=[],v=[];let A=0,N;for(x.lastIndex=0;(N=x.exec(y))!==null;)w.push(y.slice(A,N.index)),v.push(Number(N[1])),A=N.index+N[0].length;w.push(y.slice(A)),o.push({path:f,kind:"attr",name:b,template:w,valueIndices:v}),u.setAttribute(b,"")}}}const c=Array.from(d.childNodes);let l=0;for(let u=0;u<c.length;u++){const h=c[u],b=u+l;if(h.nodeType===Node.COMMENT_NODE){const y=it.exec(h.data);if(y){const m=document.createTextNode("");h.parentNode.replaceChild(m,h),o.push({path:[...f,b],kind:"node",valueIndex:Number(y[1])})}continue}if(h.nodeType===Node.TEXT_NODE){const y=h.textContent||"";if(!x.test(y)){x.lastIndex=0;continue}x.lastIndex=0;const m=h.parentNode;let w=0,v;const A=[],N=[];for(x.lastIndex=0;(v=x.exec(y))!==null;){v.index>w&&A.push(document.createTextNode(y.slice(w,v.index)));const B=document.createTextNode("");A.push(B),N.push({path:[...f,b+A.length-1],kind:"node",valueIndex:Number(v[1])}),w=v.index+v[0].length}w<y.length&&A.push(document.createTextNode(y.slice(w)));for(const B of A)m.insertBefore(B,h);m.removeChild(h),l+=A.length-1,o.push(...N)}else s(h,[...f,b])}};s(t.content,[]);const r={template:t,buildParts:d=>{const f=[];for(const c of o){let l=d;for(const u of c.path)l=l.childNodes[u];c.kind==="node"?f.push({kind:"node",valueIndex:c.valueIndex,child:{anchor:l,state:null}}):c.kind==="attr"?f.push({kind:"attr",element:l,name:c.name,template:c.template,valueIndices:c.valueIndices}):c.kind==="event"?f.push({kind:"event",valueIndex:c.valueIndex,element:l,name:c.name}):c.kind==="prop"?f.push({kind:"prop",valueIndex:c.valueIndex,element:l,name:c.name}):c.kind==="bool"&&f.push({kind:"bool",valueIndex:c.valueIndex,element:l,name:c.name})}return f}};return he.set(e,r),r}const ye=new WeakMap;function ct(e,n){for(const t of e.nodes)if(t.parentNode!==n)return!1;return!0}function lt(e,n){const t=ye.get(n);if(t&&t.strings===e.strings&&ct(t,n)){K(t.parts,e.values);return}const o=ge(e.strings),s=o.template.content.cloneNode(!0),i=o.buildParts(s),r=Array.from(s.childNodes);for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(s),K(i,e.values),ye.set(n,{strings:e.strings,parts:i,nodes:r})}function K(e,n){for(const t of e)if(t.kind==="node")q(t.child,n[t.valueIndex]);else if(t.kind==="attr"){let o=t.template[0];for(let s=0;s<t.valueIndices.length;s++)o+=we(n[t.valueIndices[s]]),o+=t.template[s+1];o!==t.last&&(t.last=o,o===""?t.element.removeAttribute(t.name):t.element.setAttribute(t.name,o))}else if(t.kind==="event"){const o=n[t.valueIndex];o!==t.current&&(t.current&&t.element.removeEventListener(t.name,t.current),o&&t.element.addEventListener(t.name,o),t.current=o)}else if(t.kind==="prop"){const o=n[t.valueIndex];o!==t.last&&(t.last=o,t.element[t.name]=o)}else if(t.kind==="bool"){const o=!!n[t.valueIndex];o!==t.last&&(t.last=o,o?t.element.setAttribute(t.name,""):t.element.removeAttribute(t.name))}}function q(e,n){if(n==null||n===!1){e.state&&(C(e.state),e.state=null);return}if(Array.isArray(n)){pt(e,n);return}if(nt(n)){ft(e,n);return}if(n instanceof Node){ut(e,n);return}dt(e,we(n))}function ut(e,n){const t=e.state;t?.shape==="node"&&t.node===n||(t&&C(t),P(e,[n]),e.state={shape:"node",node:n})}function dt(e,n){const t=e.state;if(t?.shape==="text"){t.text!==n&&(t.node.textContent=n,t.text=n);return}t&&C(t);const o=document.createTextNode(n);P(e,[o]),e.state={shape:"text",node:o,text:n}}function ft(e,n){const t=e.state;if(t?.shape==="template"&&t.strings===n.strings){K(t.parts,n.values);return}t&&C(t);const o=ge(n.strings),s=o.template.content.cloneNode(!0),i=o.buildParts(s),r=Array.from(s.childNodes);P(e,[s]),K(i,n.values),e.state={shape:"template",strings:n.strings,parts:i,nodes:r}}function pt(e,n){const t=e.state;if(t?.shape==="array"){const s=Math.min(t.entries.length,n.length);for(let i=0;i<s;i++)q(t.entries[i],n[i]);if(n.length<t.entries.length){for(let i=n.length;i<t.entries.length;i++){const r=t.entries[i];r.state&&C(r.state),r.anchor.remove()}t.entries.length=n.length}else for(let i=t.entries.length;i<n.length;i++){const r=document.createTextNode("");P(e,[r]);const d={anchor:r,state:null};q(d,n[i]),t.entries.push(d)}return}t&&C(t);const o=[];for(const s of n){const i=document.createTextNode("");P(e,[i]);const r={anchor:i,state:null};q(r,s),o.push(r)}e.state={shape:"array",entries:o}}function P(e,n){const t=e.anchor.parentNode;if(t)for(const o of n)t.insertBefore(o,e.anchor)}function C(e){if(e.shape==="text"){e.node.remove();return}if(e.shape==="template"){for(const n of e.parts)n.kind==="node"&&n.child.state&&(C(n.child.state),n.child.state=null);for(const n of e.nodes)n.parentNode&&n.parentNode.removeChild(n);return}if(e.shape==="node"){e.node.parentNode&&e.node.parentNode.removeChild(e.node);return}for(const n of e.entries)n.state&&C(n.state),n.anchor.remove()}function we(e){return e==null||e===!1?"":String(e)}function mt(e){if(!Number.isFinite(e)||e<=0)return"0 B";const n=["B","KB","MB","GB","TB"];let t=e,o=0;for(;t>=1024&&o<n.length-1;)t/=1024,o++;const s=t>=100||o===0?0:1;return`${t.toFixed(s)} ${n[o]}`}function ht(e,n="short"){if(e===""||e===null||e===void 0)return"";const t=typeof e=="string"&&/^\d{4}-\d{2}$/.test(e)?`${e}-01T00:00:00`:e,o=t instanceof Date?t:new Date(t);if(Number.isNaN(o.getTime()))return String(e);try{switch(n){case"long":return o.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"});case"month":return o.toLocaleDateString(void 0,{year:"numeric",month:"long"});case"datetime":return o.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"});case"iso":return o.toISOString();default:return o.toLocaleDateString(void 0,{month:"short",day:"numeric"})}}catch{return String(e)}}function gt(){let e="";const n=new Map;let t=0,o=1,s=0,i=!1,r=!0,d=null,f,c=async()=>{},l=()=>{};const u=()=>{const y=[],m=new Set;for(const w of Array.from(n.keys()).sort((v,A)=>v-A))for(const v of n.get(w)??[])m.has(v.id)||(m.add(v.id),y.push(v));return y},h=()=>o>Math.max(...Array.from(n.keys()),1),b=y=>{!y.some(m=>m.isIntersecting)||i||!r||(r=!1,i=!0,s=Math.max(1,...Array.from(n.keys()))+1,l(),c().finally(()=>{i=!1,s=0,l()}))};return{accumulate(y,m){return m?(e!==y&&(e=y,n.clear()),n.set(m.page,m.items),t=m.total,o=m.pages,u()):(e="",n.clear(),t=0,o=1,[])},items:u,get total(){return t},get pageCount(){return o},get loadingPage(){return s},hasMore:h,ghosts(y){return s===0||n.has(s)||!h()?0:Math.max(1,Math.min(y,t-u().length))},sync(y){c=y.load,l=y.repaint,!f&&typeof IntersectionObserver<"u"&&(f=new IntersectionObserver(b)),f?.disconnect(),y.sentinel&&f?.observe(y.sentinel),y.canvas!==d&&(d=y.canvas,d?.addEventListener("scroll",()=>{r=!0},{passive:!0})),d&&d.scrollHeight<=d.clientHeight+4&&(r=!0)},dispose(){f?.disconnect(),f=void 0}}}function yt(e,n,t,o){if(o.shift&&e.length>0){const s=e[e.length-1],i=n.indexOf(s),r=n.indexOf(t);if(i!==-1&&r!==-1){const d=n.slice(Math.min(i,r),Math.max(i,r)+1),f=new Set([...e,...d]);return Array.from(f)}}return o.ctrl?e.includes(t)?e.filter(s=>s!==t):[...e,t]:[t]}function wt(e){const{root:n,select:t}=e,o=e.item??"[data-item-id]";let s=null;const i=f=>{if(f.button!==0||!f.target?.closest(e.canvas)||f.target.closest(o))return;const l=document.createElement("div");l.className=e.className??"os-app__marquee",document.body.appendChild(l),s={x:f.clientX,y:f.clientY,box:l},!f.ctrlKey&&!f.metaKey&&!f.shiftKey&&t([])},r=f=>{if(!s)return;const c=Math.min(s.x,f.clientX),l=Math.min(s.y,f.clientY),u=Math.abs(f.clientX-s.x),h=Math.abs(f.clientY-s.y);Object.assign(s.box.style,{left:`${c}px`,top:`${l}px`,width:`${u}px`,height:`${h}px`});const b=[];for(const y of Array.from(n.querySelectorAll(o))){const m=y.getBoundingClientRect();m.left<c+u&&m.right>c&&m.top<l+h&&m.bottom>l&&b.push(Number(y.getAttribute("data-item-id")))}t(b)},d=()=>{s&&(s.box.remove(),s=null)};return n.addEventListener("pointerdown",i),document.addEventListener("pointermove",r),document.addEventListener("pointerup",d),()=>{n.removeEventListener("pointerdown",i),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",d),d()}}async function bt(e){if(e==="")return!1;const n=globalThis.navigator?.clipboard;if(n?.writeText)try{return await n.writeText(e),!0}catch{}return vt(e)}function vt(e){const n=globalThis.document;if(!n?.body||typeof n.execCommand!="function")return!1;const t=n.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.setAttribute("aria-hidden","true"),t.style.position="fixed",t.style.insetInlineStart="-9999px",t.style.opacity="0",n.body.appendChild(t);const o=n.activeElement;t.select();let s=!1;try{s=n.execCommand("copy")}catch{s=!1}return t.remove(),o?.focus?.(),s}const At="data-os-mode";function be(e=typeof document<"u"?document.documentElement:null){return!!e&&e.getAttribute(At)==="mobile"}function kt(e){return e.phone??be()?M`<os-select
1 +var openStationAppRuntime=function(I){"use strict";const he="__openStationSharedStores";function ze(){const e=window;let n=e[he];return n||(n=new Map,e[he]=n),n}function Ge(e,n){const t=ze();let o=t.get(e);o||(o={state:n(),listeners:new Set,rebuild:n},t.set(e,o));const s={get state(){return o.state},set state(i){o.state=i},getState(){return o.state},notify(){for(const i of Array.from(o.listeners))try{i(o.state)}catch(r){console.error(`[desktop-mode/shared-store:${e}] subscriber threw:`,r)}},subscribe(i){return o.listeners.add(i),()=>{o.listeners.delete(i)}},setState(i){const r=o.state;if(typeof r!="object"||r===null){console.warn(`[desktop-mode/shared-store:${e}] setState called on a primitive store; use the state setter instead.`);return}Object.assign(r,i),s.notify()},reset(){const i=o.rebuild(),r=o.state;if(typeof r=="object"&&r!==null&&typeof i=="object"&&i!==null){const l=r;for(const u of Object.keys(l))delete l[u];Object.assign(l,i)}else o.state=i;o.listeners.clear()}};return s}const Ye="os_tab",Ze=Ge("desktop-mode/native-url-remap",()=>({remaps:[],deps:null}));function Je(e,n={}){const{deps:t,remaps:o}=Ze.state;if(!t||!e)return!1;let s;try{s=new URL(e,t.adminUrl)}catch{return!1}const i=t.getSnapshot();for(const r of o){if(!r.matches(e,s)||r.enabled&&!r.enabled(i))continue;if(r.onMatch)try{r.onMatch(e,s)}catch(d){console.warn(`[openstation] URL remap onMatch hook threw for "${r.id}":`,d)}let l;const u=s.searchParams.get(Ye);if(r.params)try{l=r.params(e,s)??void 0}catch(d){console.warn(`[openstation] URL remap params hook threw for "${r.id}":`,d)}u&&/^[a-z0-9_-]+$/.test(u)&&(l={...l??{},tab:u});const c=n.newInstance&&t.openNewById?t.openNewById:t.openById;if(l?c(r.nativeWindowId,{params:l}):c(r.nativeWindowId))return!0}return!1}function Qe(){const e=window.wp?.hooks;if(!e)throw new Error("[openstation] `window.wp.hooks` is not available. The plugin declares `wp-hooks` as a script dependency; if you are seeing this error, verify the enqueue order.");return e}function ge(e,...n){Qe().doAction(e,...n)}function et(e,n){const t=s=>{if(!(s.target instanceof Node&&e.contains(s.target))){if(s.target instanceof Node)for(const i of n.siblingSelectors??[]){const r=Array.from(document.querySelectorAll(i));for(const l of r)if(l.contains(s.target))return}n.excludeOutsideTarget&&s.target instanceof Node&&n.excludeOutsideTarget.contains(s.target)||n.close()}},o=s=>{s.key==="Escape"&&n.close()};return document.addEventListener("mousedown",t,{capture:!0}),document.addEventListener("keydown",o),()=>{document.removeEventListener("mousedown",t,{capture:!0}),document.removeEventListener("keydown",o)}}let J=null;function F(){return!!window.openStationShellOverlays}function tt(e){return new Promise((n,t)=>{const o=document.querySelector('script[data-os-shell-overlays="1"]'),s=()=>{if(F()){n();return}t(new Error("[openstation] shell-overlays bundle loaded but did not set `window.openStationShellOverlays`."))};if(o){F()?s():(o.addEventListener("load",s),o.addEventListener("error",()=>t(new Error("failed to load shell-overlays bundle"))));return}const i=document.createElement("script");i.src=e,i.async=!0,i.dataset.osShellOverlays="1",i.addEventListener("load",s),i.addEventListener("error",()=>t(new Error("failed to load shell-overlays bundle"))),document.head.appendChild(i)})}function nt(e){return F()||!e?Promise.resolve():(J||(J=tt(e)),J)}function ot(){return window.openStationConfig?.shellOverlaysBundleUrl??""}function st(e,n){const t=ot();if(F()||!t){n();return}nt(t).then(()=>{e()&&n()}).catch(o=>{typeof console<"u"&&console.warn("[openstation] shell-overlays failed to load; menu/dialog suppressed:",o)})}const ye=8;function rt(e,n){e.style.visibility="hidden";const t=()=>{e.isConnected&&(n(e.getBoundingClientRect()),e.style.visibility="")};typeof requestAnimationFrame=="function"?requestAnimationFrame(t):t()}function it(e){rt(e,n=>{n.right>window.innerWidth&&(e.style.left=`${Math.max(0,window.innerWidth-n.width-ye)}px`),n.bottom>window.innerHeight&&(e.style.top=`${Math.max(0,window.innerHeight-n.height-ye)}px`)})}const at="os-wallpaper-menu";let O=null,Q=null,we=0;function ee(){if(!O)return;const e=O.dataset.menuScope??"selection",n=Q;O.dispatchEvent(new CustomEvent("tile-menu-closed")),O.remove(),O=null,Q=null,n?.(),ge(`os.${e}.menu.closed`,{})}function ct(e,n){ee();const t=++we;st(()=>t===we,()=>lt(e,n))}function lt(e,{actions:n,dataset:t,className:o,scope:s="selection",onOpened:i,onClosed:r}){if(n.length===0)return;const l=document.createElement("os-context-menu");l.setAttribute("open",""),l.classList.add(at),o&&l.classList.add(o),l.dataset.menuScope=s;for(const[d,h]of Object.entries(t??{}))l.dataset[d]=h;l.style.left=`${e.x}px`,l.style.top=`${e.y}px`;const u=new Map;for(const d of n){u.set(d.id,d);const h=document.createElement("os-context-menu-option");h.dataset.menuItemId=d.id,h.setAttribute("value",d.id),d.danger&&h.setAttribute("danger",""),d.disabled&&h.setAttribute("disabled",""),d.icon&&h.setAttribute("icon",ut(d.icon)),h.textContent=d.label,l.appendChild(h)}l.addEventListener("os-context-menu-pick",d=>{const h=d.detail,b=u.get(h.id);b&&(ee(),Promise.resolve(b.onClick(new MouseEvent("click"))).catch(y=>{console.error(`[openstation] menu action '${b.id}' threw:`,y)}))}),document.body.appendChild(l),O=l,Q=r??null,it(l);const c=et(l,{close:()=>ee()});l.addEventListener("tile-menu-closed",c);const f=n.map(d=>d.id);i?.(f),ge(`os.${s}.menu.opened`,{items:f,count:n.length})}function ut(e){return e.replace(/[^a-zA-Z0-9_-]/g,"")}const te="desktop-mode";function H(){return window.wp?.i18n}function T(e,n=te){return H()?.__(e,n)??e}function dt(e,n,t=te){return H()?._x(e,n,t)??e}function ft(e,n,t,o=te){return H()?._n(e,n,t,o)??(t===1?e:n)}function ne(e,...n){const t=H()?.sprintf;if(t)return t(e,...n);let o=0;return e.replace(/%(?:(\d+)\$)?[sd]/g,(s,i)=>{const r=i?Number.parseInt(i,10)-1:o++;return String(n[r]??"")})}function _(e,...n){return{__wpdHtml:!0,strings:e,values:n}}function pt(e){return!!e&&e.__wpdHtml===!0}const mt="$$wpd$$",x=/\$\$wpd\$\$(\d+)\$\$/g,ht="$$wpd-node$$",gt=/^\$\$wpd-node\$\$(\d+)\$\$$/,yt=new Set(["style","script","textarea","title"]);function wt(e){let n="",t=!1,o=null,s=!1,i=null,r="",l=!1;for(let u=0;u<e.length;u++){const c=e[u];n+=c;for(let f=0;f<c.length;f++){const d=c[f];if(s){c.startsWith("-->",f)&&(s=!1,f+=2);continue}if(i!==null){d==="<"&&c[f+1]==="/"&&c.slice(f+2,f+2+i.length).toLowerCase()===i&&(f+=1+i.length,i=null,t=!0,l=!1,r="");continue}if(o!==null){d===o&&(o=null);continue}if(t){d==='"'||d==="'"?(o=d,l=!1):d===">"?(t=!1,l=!1,yt.has(r)&&(i=r),r=""):l&&(/[a-zA-Z0-9-]/.test(d)?r+=d.toLowerCase():l=!1);continue}if(c.startsWith("<!--",f)){s=!0,f+=3;continue}const h=c[f+1]??"";d==="<"&&/[a-zA-Z/!]/.test(h)&&(t=!0,r="",l=/[a-zA-Z]/.test(h))}u<e.length-1&&(n+=t||s||i!==null?`${mt}${u}$$`:`<!--${ht}${u}$$-->`)}return n}const be=new WeakMap;function ve(e){const n=be.get(e);if(n)return n;const t=document.createElement("template");t.innerHTML=wt(e);const o=[],s=(l,u)=>{if(l.nodeType===Node.ELEMENT_NODE){const d=l;for(const h of Array.from(d.attributes)){const b=h.name,y=h.value,m=b[0];if(x.test(y))if(x.lastIndex=0,m==="@"){const w=x.exec(y);x.lastIndex=0,o.push({path:u,kind:"event",name:b.slice(1),valueIndex:w?Number(w[1]):0}),d.removeAttribute(b)}else if(m==="."){const w=x.exec(y);x.lastIndex=0,o.push({path:u,kind:"prop",name:b.slice(1),valueIndex:w?Number(w[1]):0}),d.removeAttribute(b)}else if(m==="?"){const w=x.exec(y);x.lastIndex=0,o.push({path:u,kind:"bool",name:b.slice(1),valueIndex:w?Number(w[1]):0}),d.removeAttribute(b)}else{const w=[],v=[];let k=0,S;for(x.lastIndex=0;(S=x.exec(y))!==null;)w.push(y.slice(k,S.index)),v.push(Number(S[1])),k=S.index+S[0].length;w.push(y.slice(k)),o.push({path:u,kind:"attr",name:b,template:w,valueIndices:v}),d.setAttribute(b,"")}}}const c=Array.from(l.childNodes);let f=0;for(let d=0;d<c.length;d++){const h=c[d],b=d+f;if(h.nodeType===Node.COMMENT_NODE){const y=gt.exec(h.data);if(y){const m=document.createTextNode("");h.parentNode.replaceChild(m,h),o.push({path:[...u,b],kind:"node",valueIndex:Number(y[1])})}continue}if(h.nodeType===Node.TEXT_NODE){const y=h.textContent||"";if(!x.test(y)){x.lastIndex=0;continue}x.lastIndex=0;const m=h.parentNode;let w=0,v;const k=[],S=[];for(x.lastIndex=0;(v=x.exec(y))!==null;){v.index>w&&k.push(document.createTextNode(y.slice(w,v.index)));const W=document.createTextNode("");k.push(W),S.push({path:[...u,b+k.length-1],kind:"node",valueIndex:Number(v[1])}),w=v.index+v[0].length}w<y.length&&k.push(document.createTextNode(y.slice(w)));for(const W of k)m.insertBefore(W,h);m.removeChild(h),f+=k.length-1,o.push(...S)}else s(h,[...u,b])}};s(t.content,[]);const r={template:t,buildParts:l=>{const u=[];for(const c of o){let f=l;for(const d of c.path)f=f.childNodes[d];c.kind==="node"?u.push({kind:"node",valueIndex:c.valueIndex,child:{anchor:f,state:null}}):c.kind==="attr"?u.push({kind:"attr",element:f,name:c.name,template:c.template,valueIndices:c.valueIndices}):c.kind==="event"?u.push({kind:"event",valueIndex:c.valueIndex,element:f,name:c.name}):c.kind==="prop"?u.push({kind:"prop",valueIndex:c.valueIndex,element:f,name:c.name}):c.kind==="bool"&&u.push({kind:"bool",valueIndex:c.valueIndex,element:f,name:c.name})}return u}};return be.set(e,r),r}const ke=new WeakMap;function bt(e,n){for(const t of e.nodes)if(t.parentNode!==n)return!1;return!0}function vt(e,n){const t=ke.get(n);if(t&&t.strings===e.strings&&bt(t,n)){K(t.parts,e.values);return}const o=ve(e.strings),s=o.template.content.cloneNode(!0),i=o.buildParts(s),r=Array.from(s.childNodes);for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(s),K(i,e.values),ke.set(n,{strings:e.strings,parts:i,nodes:r})}function K(e,n){for(const t of e)if(t.kind==="node")q(t.child,n[t.valueIndex]);else if(t.kind==="attr"){let o=t.template[0];for(let s=0;s<t.valueIndices.length;s++)o+=Ae(n[t.valueIndices[s]]),o+=t.template[s+1];o!==t.last&&(t.last=o,o===""?t.element.removeAttribute(t.name):t.element.setAttribute(t.name,o))}else if(t.kind==="event"){const o=n[t.valueIndex];o!==t.current&&(t.current&&t.element.removeEventListener(t.name,t.current),o&&t.element.addEventListener(t.name,o),t.current=o)}else if(t.kind==="prop"){const o=n[t.valueIndex];o!==t.last&&(t.last=o,t.element[t.name]=o)}else if(t.kind==="bool"){const o=!!n[t.valueIndex];o!==t.last&&(t.last=o,o?t.element.setAttribute(t.name,""):t.element.removeAttribute(t.name))}}function q(e,n){if(n==null||n===!1){e.state&&(C(e.state),e.state=null);return}if(Array.isArray(n)){xt(e,n);return}if(pt(n)){Et(e,n);return}if(n instanceof Node){kt(e,n);return}At(e,Ae(n))}function kt(e,n){const t=e.state;t?.shape==="node"&&t.node===n||(t&&C(t),R(e,[n]),e.state={shape:"node",node:n})}function At(e,n){const t=e.state;if(t?.shape==="text"){t.text!==n&&(t.node.textContent=n,t.text=n);return}t&&C(t);const o=document.createTextNode(n);R(e,[o]),e.state={shape:"text",node:o,text:n}}function Et(e,n){const t=e.state;if(t?.shape==="template"&&t.strings===n.strings){K(t.parts,n.values);return}t&&C(t);const o=ve(n.strings),s=o.template.content.cloneNode(!0),i=o.buildParts(s),r=Array.from(s.childNodes);R(e,[s]),K(i,n.values),e.state={shape:"template",strings:n.strings,parts:i,nodes:r}}function xt(e,n){const t=e.state;if(t?.shape==="array"){const s=Math.min(t.entries.length,n.length);for(let i=0;i<s;i++)q(t.entries[i],n[i]);if(n.length<t.entries.length){for(let i=n.length;i<t.entries.length;i++){const r=t.entries[i];r.state&&C(r.state),r.anchor.remove()}t.entries.length=n.length}else for(let i=t.entries.length;i<n.length;i++){const r=document.createTextNode("");R(e,[r]);const l={anchor:r,state:null};q(l,n[i]),t.entries.push(l)}return}t&&C(t);const o=[];for(const s of n){const i=document.createTextNode("");R(e,[i]);const r={anchor:i,state:null};q(r,s),o.push(r)}e.state={shape:"array",entries:o}}function R(e,n){const t=e.anchor.parentNode;if(t)for(const o of n)t.insertBefore(o,e.anchor)}function C(e){if(e.shape==="text"){e.node.remove();return}if(e.shape==="template"){for(const n of e.parts)n.kind==="node"&&n.child.state&&(C(n.child.state),n.child.state=null);for(const n of e.nodes)n.parentNode&&n.parentNode.removeChild(n);return}if(e.shape==="node"){e.node.parentNode&&e.node.parentNode.removeChild(e.node);return}for(const n of e.entries)n.state&&C(n.state),n.anchor.remove()}function Ae(e){return e==null||e===!1?"":String(e)}function St(e){if(!Number.isFinite(e)||e<=0)return"0 B";const n=["B","KB","MB","GB","TB"];let t=e,o=0;for(;t>=1024&&o<n.length-1;)t/=1024,o++;const s=t>=100||o===0?0:1;return`${t.toFixed(s)} ${n[o]}`}function $t(e,n="short"){if(e===""||e===null||e===void 0)return"";const t=typeof e=="string"&&/^\d{4}-\d{2}$/.test(e)?`${e}-01T00:00:00`:e,o=t instanceof Date?t:new Date(t);if(Number.isNaN(o.getTime()))return String(e);try{switch(n){case"long":return o.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"});case"month":return o.toLocaleDateString(void 0,{year:"numeric",month:"long"});case"datetime":return o.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"});case"iso":return o.toISOString();default:return o.toLocaleDateString(void 0,{month:"short",day:"numeric"})}}catch{return String(e)}}function Nt(){let e="";const n=new Map;let t=0,o=1,s=0,i=!1,r=!0,l=null,u,c=async()=>{},f=()=>{};const d=()=>{const y=[],m=new Set;for(const w of Array.from(n.keys()).sort((v,k)=>v-k))for(const v of n.get(w)??[])m.has(v.id)||(m.add(v.id),y.push(v));return y},h=()=>o>Math.max(...Array.from(n.keys()),1),b=y=>{!y.some(m=>m.isIntersecting)||i||!r||(r=!1,i=!0,s=Math.max(1,...Array.from(n.keys()))+1,f(),c().finally(()=>{i=!1,s=0,f()}))};return{accumulate(y,m){return m?(e!==y&&(e=y,n.clear()),n.set(m.page,m.items),t=m.total,o=m.pages,d()):(e="",n.clear(),t=0,o=1,[])},items:d,get total(){return t},get pageCount(){return o},get loadingPage(){return s},hasMore:h,ghosts(y){return s===0||n.has(s)||!h()?0:Math.max(1,Math.min(y,t-d().length))},sync(y){c=y.load,f=y.repaint,!u&&typeof IntersectionObserver<"u"&&(u=new IntersectionObserver(b)),u?.disconnect(),y.sentinel&&u?.observe(y.sentinel),y.canvas!==l&&(l=y.canvas,l?.addEventListener("scroll",()=>{r=!0},{passive:!0})),l&&l.scrollHeight<=l.clientHeight+4&&(r=!0)},dispose(){u?.disconnect(),u=void 0}}}function Tt(e,n,t,o){if(o.shift&&e.length>0){const s=e[e.length-1],i=n.indexOf(s),r=n.indexOf(t);if(i!==-1&&r!==-1){const l=n.slice(Math.min(i,r),Math.max(i,r)+1),u=new Set([...e,...l]);return Array.from(u)}}return o.ctrl?e.includes(t)?e.filter(s=>s!==t):[...e,t]:[t]}function Ct(e){const{root:n,select:t}=e,o=e.item??"[data-item-id]";let s=null;const i=u=>{if(u.button!==0||!u.target?.closest(e.canvas)||u.target.closest(o))return;const f=document.createElement("div");f.className=e.className??"os-app__marquee",document.body.appendChild(f),s={x:u.clientX,y:u.clientY,box:f},!u.ctrlKey&&!u.metaKey&&!u.shiftKey&&t([])},r=u=>{if(!s)return;const c=Math.min(s.x,u.clientX),f=Math.min(s.y,u.clientY),d=Math.abs(u.clientX-s.x),h=Math.abs(u.clientY-s.y);Object.assign(s.box.style,{left:`${c}px`,top:`${f}px`,width:`${d}px`,height:`${h}px`});const b=[];for(const y of Array.from(n.querySelectorAll(o))){const m=y.getBoundingClientRect();m.left<c+d&&m.right>c&&m.top<f+h&&m.bottom>f&&b.push(Number(y.getAttribute("data-item-id")))}t(b)},l=()=>{s&&(s.box.remove(),s=null)};return n.addEventListener("pointerdown",i),document.addEventListener("pointermove",r),document.addEventListener("pointerup",l),()=>{n.removeEventListener("pointerdown",i),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",l),l()}}async function Mt(e){if(e==="")return!1;const n=globalThis.navigator?.clipboard;if(n?.writeText)try{return await n.writeText(e),!0}catch{}return _t(e)}function _t(e){const n=globalThis.document;if(!n?.body||typeof n.execCommand!="function")return!1;const t=n.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.setAttribute("aria-hidden","true"),t.style.position="fixed",t.style.insetInlineStart="-9999px",t.style.opacity="0",n.body.appendChild(t);const o=n.activeElement;t.select();let s=!1;try{s=n.execCommand("copy")}catch{s=!1}return t.remove(),o?.focus?.(),s}const Lt="data-os-mode";function Ee(e=typeof document<"u"?document.documentElement:null){return!!e&&e.getAttribute(Lt)==="mobile"}function It(e){return e.phone??Ee()?_`<os-select
2 2 class="os-app-list__status"
3 3 os-bind=${e.bind}
4 4 os-action=${e.action}
5 5 .value=${e.value}
6 6 aria-label=${e.label}
7 - >${e.segments.map(t=>M`<os-option .value=${t.value}>${t.label}</os-option>`)}</os-select>`:M`<os-segmented
7 + >${e.segments.map(t=>_`<os-option .value=${t.value}>${t.label}</os-option>`)}</os-select>`:_`<os-segmented
8 8 class="os-app-list__status"
9 9 os-bind=${e.bind}
10 10 os-action=${e.action}
11 11 value=${e.value}
12 12 label=${e.label}
13 - >${e.segments.map(t=>M`<os-segment value=${t.value}>${t.label}</os-segment>`)}</os-segmented>`}function Et(e){const n=Math.max(1,e.page),t=Math.max(0,e.pages),o=Number(e.perPage)||20,s=e.pageAction??"page",i=e.perPageOptions??[10,20,50,100];return M`<footer class="os-app-list__pager">
13 + >${e.segments.map(t=>_`<os-segment value=${t.value}>${t.label}</os-segment>`)}</os-segmented>`}function Ot(e){const n=Math.max(1,e.page),t=Math.max(0,e.pages),o=Number(e.perPage)||20,s=e.pageAction??"page",i=e.perPageOptions??[10,20,50,100];return _`<footer class="os-app-list__pager">
14 14 <div class="os-app-list__pager-meta">
15 15 <span>${e.summary}</span>
16 16 </div>
17 17 <div class="os-app-list__pager-nav">
@@ -39,8 +39,8 @@
39 39 os-bind=${e.perPageBind??"perPage"}
40 40 os-action=${e.perPageAction??"filter"}
41 41 value=${String(o)}
42 42 aria-label=${e.labels.perPage}
43 - >${i.map(r=>M`<os-option value=${r}>${r}</os-option>`)}</os-select>
43 + >${i.map(r=>_`<os-option value=${r}>${r}</os-option>`)}</os-select>
44 44 </label>
45 45 </div>
46 - </footer>`}function xt(e,n){const o=e.closest(".os-window")?.querySelector(".os-window__menu-panel")??null;if(!o||n.items.length===0)return null;const s=`${n.prefix}:`,i="data-os-app-menu-section";o.querySelectorAll(`[${i}="${n.prefix}"]`).forEach(l=>l.remove());const r=document.createElement("div");r.className="os-app__menu-section",r.setAttribute("role","presentation"),r.setAttribute(i,n.prefix),r.textContent=n.section,o.appendChild(r);const d=new Map;for(const l of n.items){const u=document.createElement("os-menu-item");u.setAttribute("role","menuitemcheckbox"),u.setAttribute("value",s+l.key),u.setAttribute(i,n.prefix),u.classList.add("os-window__menu-item","os-app__menu-item"),u.textContent=l.label||l.key,o.appendChild(u),d.set(l.key,u)}const f=()=>{for(const[l,u]of d)n.isChecked(l)?u.setAttribute("checked",""):u.removeAttribute("checked")};f();const c=l=>{const u=l.detail?.value;if(typeof u!="string"||!u.startsWith(s))return;const h=u.slice(s.length);d.has(h)&&(n.onToggle(h),f())};return o.addEventListener("os-menu-item-click",c),{refresh:f,dispose:()=>{o.removeEventListener("os-menu-item-click",c),r.remove();for(const l of d.values())l.remove();d.clear()}}}function Nt(e,n=null){const t=n??(typeof document<"u"?document.documentElement:null);if(!!t&&be(t)){e.hasAttribute("stacked")||e.setAttribute("stacked","");const i=e.getAttribute("sticky-columns");return i!==null&&(e.setAttribute("data-os-sticky-columns",i),e.removeAttribute("sticky-columns")),!0}e.hasAttribute("stacked")&&e.removeAttribute("stacked");const s=e.getAttribute("data-os-sticky-columns");return s!==null&&(e.setAttribute("sticky-columns",s),e.removeAttribute("data-os-sticky-columns")),!1}function ve(e){return Array.from(e.selection??[],String)}function $t(){let e=null,n=!1,t=null,o=null;return{invalidateColumns(){e=null},invalidateData(){o=null},sync(s){const i={phone:!1,columnsChanged:!1,dataChanged:!1,selectionChanged:!1},r=s.table;if(!r)return i;const d=s.rowId??(c=>c.id),f=Nt(r);if(i.phone=f,f!==e&&(e=f,r.columns=s.columns(f),i.columnsChanged=!0),n||(n=!0,s.wire?.(r)),s.listKey!==t&&(t=s.listKey,ve(r).length>0&&(r.clearSelection(),i.selectionChanged=!0,s.onSelection?.([]))),s.fingerprint!==o){o=s.fingerprint,r.data=s.rows,i.dataChanged=!0;const c=new Set(s.rows.map(h=>String(d(h)))),l=ve(r),u=l.filter(h=>c.has(h));u.length!==l.length&&(r.selection=u,i.selectionChanged=!0,s.onSelection?.(u))}return i}}}function St(e,n){const t=n.local??{},o={id:e,hasLocal:r=>Object.prototype.hasOwnProperty.call(t,r),runLocal:(r,d,f,c)=>{const l=t[r];if(!l)return d;const u={...d},h=l(u,f,c);return h===void 0?u:h},render:r=>{lt(n.view(r),r.root),n.updated?.(r)},mounted:r=>n.mounted?.(r)},{placeholder:s}=n;s&&(o.placeholder=r=>s(r));const i=window;return(i.openStationApps??(i.openStationApps={}))[e]=o,o}function Tt(e){return window.openStationApps?.[e]}const Ae=3e4,H=new Map;function Ct(e,n){const t=H.get(e.id);if(t&&Date.now()-t.at<Ae)return!1;const o={Accept:"application/json","Content-Type":"application/json"};e.restNonce&&(o["X-WP-Nonce"]=e.restNonce);const s=n(e.endpoint,{method:"POST",headers:o,body:JSON.stringify({action:"mount",view:"main",state:{...e.state},args:{},params:{},client:{width:0,height:0}})},{source:`openstation/app/${e.id}/prewarm`,silent:!0}).then(async i=>{if(!i.ok)return null;const r=await i.json();return r&&r.ok===!0?r:null}).catch(()=>null);return H.set(e.id,{promise:s,at:Date.now()}),!0}function Mt(e){const n=H.get(e);if(n)return H.delete(e),Date.now()-n.at<Ae?n.promise:void 0}const Lt=["os-avatar-click","os-button-activate","os-cancel","os-card-click","os-categories-change","os-categories-close","os-categories-create","os-categories-delete","os-categories-open","os-chain-remove","os-chain-segment-click","os-chain-segment-dragstart","os-checkbox-change","os-chip-dismiss","os-color-change","os-confirm","os-context-menu-pick","os-copy","os-disclosure-toggle","os-flyout-dismiss","os-form-input","os-form-reset","os-form-submit","os-input-change","os-input-commit","os-log-append","os-menu-item-click","os-modal-cancel","os-multiselect-close","os-multiselect-load-more","os-multiselect-open","os-notice-dismiss","os-pick","os-range-change","os-repeater-add","os-repeater-move","os-repeater-remove","os-role-toggle","os-save-status-change","os-segment-pick","os-series-toggle","os-step-click","os-submit","os-switch-change","os-tab-change","os-tab-pick","os-table-expand-change","os-table-filter-change","os-table-row-click","os-table-selection-change","os-table-sort-change","os-tag-add","os-tag-close","os-tag-open","os-tag-remove","os-tag-suggest","os-toast-action","os-toast-dismiss","os-toast-hold","os-token-field-input","os-token-insert","os-user-pick"],It=["click","dblclick","change","input","submit","keydown","contextmenu","toggle"],ke={"os-button":"click",button:"click",a:"click","os-avatar":"os-avatar-click","os-card":"os-card-click","os-tile":"click","os-select":"os-pick","os-segmented":"os-pick","os-swatch-grid":"os-pick","os-multiselect":"os-pick","os-tabs":"os-tab-change","os-text-field":"os-input-change","os-textarea":"os-input-change","os-number-field":"os-input-change","os-token-field":"os-token-field-input","os-color-field":"os-color-change","os-range-field":"os-range-change","os-switch":"os-switch-change","os-checkbox":"os-checkbox-change","os-disclosure":"os-disclosure-toggle","os-histogram":"os-series-toggle","os-chip":"os-chip-dismiss","os-tag-input":"os-tag-add","os-menu":"os-menu-item-click","os-context-menu":"os-context-menu-pick","os-table":"os-table-row-click","os-category-picker":"os-categories-change","os-role-picker":"os-role-toggle","os-user-search":"os-user-pick","os-repeater":"os-repeater-add","os-crumb-chain":"os-chain-segment-click","os-notice":"os-notice-dismiss","os-flyout":"os-flyout-dismiss","os-modal":"os-modal-cancel","os-confirm-dialog":"os-confirm","os-steps":"os-step-click","os-window-button":"os-button-activate","os-form":"os-form-submit","os-code":"os-copy",details:"toggle",form:"submit",select:"change",input:"change",textarea:"change"},_t=new Set(["os-input-change","os-form-input","os-token-field-input","os-range-change","input"]),Ot=250,Pt=Array.from(new Set([...Lt,...It,...Object.values(ke)])),Dt=new Set(["toggle"]);function Ee(e){const n=e.getAttribute("os-on");return n||(ke[e.tagName.toLowerCase()]??"click")}function Wt(e){return e.hasAttribute("os-action")||e.hasAttribute("os-bind")}function Bt(e,n,t){let o=e;for(;o&&o!==t;){if(Wt(o)&&Ee(o)===n)return o;o=o.parentElement}return null}function Rt(e){const n={};for(const[t,o]of Object.entries(e))t==="originalEvent"||o instanceof Event||o instanceof Node||typeof o!="function"&&(n[t]=o);return n}function jt(e,n){if(e instanceof CustomEvent){const o=e.detail;if(o&&typeof o=="object"&&!Array.isArray(o))return Rt(o);if(o!=null&&typeof o!="object")return{value:o}}if(e instanceof KeyboardEvent)return{key:e.key,code:e.code,alt:e.altKey,ctrl:e.ctrlKey,meta:e.metaKey,shift:e.shiftKey};const t=n.tagName.toLowerCase();if(t==="form"){const o={};return new FormData(n).forEach((s,i)=>{if(typeof s=="string")if(i in o){const r=o[i];o[i]=Array.isArray(r)?[...r,s]:[r,s]}else o[i]=s}),{values:o}}if(t==="details")return{open:n.open};if(t==="input"){const o=n;return o.type==="checkbox"||o.type==="radio"?{checked:o.checked,value:o.value}:{value:o.value}}return t==="select"||t==="textarea"?{value:n.value}:{}}function xe(e){const n={};for(const t of Array.from(e.attributes))t.name.startsWith("os-arg-")&&(n[t.name.slice(7)]=t.value);return n}function Kt(e){if("checked"in e)return e.checked;if("value"in e)return e.value;if("open"in e)return e.open}function qt(e){const n=e.getAttribute("os-confirm");return n?{message:n,title:e.getAttribute("os-confirm-title")??void 0,label:e.getAttribute("os-confirm-label")??void 0,danger:e.hasAttribute("os-confirm-danger")}:null}function Ht(e,n){const t=e.getAttribute("os-bind"),o=e.getAttribute("os-action")??"set",s=n?n.type:Ee(e),i=e.getAttribute("os-debounce");let r=0;return i!==null?r=Math.max(0,parseInt(i,10)||0):_t.has(s)&&(r=Ot),{action:o,args:{...xe(e),...n?jt(n,e):{}},bind:t&&t!==""?t:null,debounce:r,confirm:qt(e)}}function Ft(e){const n=new Map;for(const t of Array.from(e.querySelectorAll("[os-poll]"))){const o=parseInt(t.getAttribute("os-poll")??"",10),s=t.getAttribute("os-action");if(!s||!Number.isFinite(o)||o<250)continue;const i=xe(t),r=`${s}|${o}|${JSON.stringify(i)}`;n.has(r)||n.set(r,{key:r,action:s,args:i,intervalMs:o})}return Array.from(n.values())}function Vt(e){return e.slice(8).replace(/-([a-z])/g,(n,t)=>t.toUpperCase())}function Ne(e,n){let t=0;for(const o of Array.from(e.querySelectorAll("*"))){let s=n.get(o);for(const i of Array.from(o.attributes)){if(!i.name.startsWith("os-prop-")||s&&s[i.name]===i.value)continue;let r=i.value;try{r=JSON.parse(i.value)}catch{}o[Vt(i.name)]=r,s||(s={},n.set(o,s)),s[i.name]=i.value,t++}}return t}function Ut(e,n){const t=document.createElement("template");t.innerHTML=n,Se(e,Array.from(t.content.childNodes))}function te(e){if(e.nodeType!==Node.ELEMENT_NODE)return null;const n=e,t=n.getAttribute("os-key");return t!==null&&t!==""?t:n.id!==""?`#${n.id}`:null}function $e(e,n){return e.nodeType!==n.nodeType?!1:e.nodeType===Node.ELEMENT_NODE?e.tagName===n.tagName:!0}function Se(e,n){const t=e.ownerDocument.activeElement,o=new Map;for(const i of Array.from(e.childNodes)){const r=te(i);r!==null&&!o.has(r)&&o.set(r,i)}let s=0;for(const i of n){const r=e.childNodes[s]??null,d=te(i);let f=null;if(d!==null){const c=o.get(d);c&&$e(c,i)&&(f=c,o.delete(d),c!==r&&e.insertBefore(c,r))}else r&&te(r)===null&&$e(r,i)&&(f=r);if(!f){e.insertBefore(document.importNode(i,!0),r),s++;continue}Xt(f,i,t),s++}for(;e.childNodes.length>s;)e.removeChild(e.childNodes[s])}function Xt(e,n,t){if(e.nodeType!==Node.ELEMENT_NODE){e.nodeValue!==n.nodeValue&&(e.nodeValue=n.nodeValue);return}const o=e,s=n;if(o.hasAttribute("os-preserve"))return;const i=!!t&&(o===t||o.contains(t));zt(o,s,i),Se(o,Array.from(s.childNodes)),Gt(o,s,i)}function zt(e,n,t){for(const o of Array.from(n.attributes))t&&o.name==="value"||e.getAttribute(o.name)!==o.value&&e.setAttribute(o.name,o.value);for(const o of Array.from(e.attributes))n.hasAttribute(o.name)||t&&o.name==="value"||e.removeAttribute(o.name)}function Gt(e,n,t){t||(e instanceof HTMLInputElement&&n instanceof HTMLInputElement?e.type==="checkbox"||e.type==="radio"?e.checked=n.checked:e.value!==n.value&&(e.value=n.value):(e instanceof HTMLTextAreaElement&&n instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement&&n instanceof HTMLSelectElement)&&e.value!==n.value&&(e.value=n.value))}function Te(e){return`openstation-app-runtime:${e}`}const F=new Set;function Zt(e,n=!0){n?F.add(e):F.delete(e)}const Ce=new Set;function ne(e,n){Ce.has(e)||(Ce.add(e),console.warn(n))}function Jt(e){const{root:n,config:t,windowId:o,host:s,signal:i,client:r}=e,d=e.view??"main";let f=e.params??{},c={...t.state},l,u=!1,h,b=!1,y=!1,m=0,w=Promise.resolve(),v={x:0,y:0};const A=new Map,N=new Map,B=new WeakMap,X=[],Be=new Set(Object.keys(t.state??{})),on=new Set(["mount","set","refresh",...t.actions??[],...t.lifecycle??[]]),oe=()=>F.has("*")||F.has(o),sn=()=>{if(!(!t.actions||t.actions.length===0))for(const a of Array.from(n.querySelectorAll("[os-action]"))){const p=a.getAttribute("os-action")??"";p===""||on.has(p)||(r?.hasLocal(p)??!1)||ne(`${t.id}:action:${p}`,`[openstation] app "${t.id}": os-action="${p}" names no server action, no local reducer and no built-in — dispatching it will fail. Declare ->action( '${p}' ) in the .os.php, or a local reducer in the .os.ts.`)}},rn=a=>{for(const p of Object.keys(c))Be.has(p)||ne(`${t.id}:key:${p}`,`[openstation] app "${t.id}": ${a} wrote state.${p}, which App::state() does not declare — the next server response silently drops it. Declare it in ->state(), or keep client-only values in ctx.ui().`)},an=async(a,p,g)=>{if(b)return!1;const E=Date.now();m++,n.setAttribute("aria-busy","true"),g&&g.tagName.toLowerCase()==="os-button"&&g.setAttribute("busy","");const k=c;try{if(a==="mount"&&d==="main"&&Object.keys(f).length===0){const S=await Mt(t.id);if(b)return!1;if(S)return se(S,k),!0}const $={Accept:"application/json","Content-Type":"application/json"};t.restNonce&&($["X-WP-Nonce"]=t.restNonce);const L=await s.fetch(t.endpoint,{method:"POST",headers:$,body:JSON.stringify({action:a,view:d,state:k,args:p,params:f,client:{width:n.clientWidth,height:n.clientHeight}}),signal:i},{windowId:o,source:`openstation/app/${t.id}`});if(!L.ok){let S=String(L.status);try{const T=await L.json();T&&T.message&&(S=T.message)}catch{}throw new Error(S)}const Z=await L.json();if(b||!Z||Z.ok!==!0)return!1;if(se(Z,k),oe()){const S=Object.keys(c).filter(T=>c[T]!==k[T]);console.groupCollapsed(`[openstation:${t.id}] ${a} · ${Date.now()-E}ms`),console.log("args",p),console.log("state Δ",S,S.length>0?Object.fromEntries(S.map(T=>[T,c[T]])):""),console.log("effects",Z.effects??[]),console.groupEnd()}return!0}catch($){return b||i?.aborted||(oe()&&console.warn(`[openstation:${t.id}] ${a} FAILED after ${Date.now()-E}ms:`,$),s.toast?.({message:me(pe("The window could not update: %s"),$ instanceof Error?$.message:String($))})),!1}finally{m--,m===0&&n.removeAttribute("aria-busy"),g&&g.isConnected&&g.removeAttribute("busy")}},_=async(a,p={},g={})=>{if(b||g.confirm&&(!s.confirm||!await s.confirm({title:g.confirm.title,message:g.confirm.message,confirmLabel:g.confirm.label,danger:!!g.confirm.danger})||b))return!1;const E=w.then(()=>an(a,p,g.trigger??null));return w=E.catch(()=>{}),E},z=()=>{Ne(n,B),dn(),pn(),sn()},se=(a,p,g=!1)=>{const E={...a.state};for(const k of Object.keys(c))c[k]!==p[k]&&(E[k]=c[k]);if(c=E,r){l=a.data,u=g;const k=h===void 0;if(r.render(G()),z(),k){const $=r.mounted(G());h=typeof $=="function"?$:null}}else Ut(n,a.html),z();for(const k of a.effects??[])fn(k)};let ie;const cn=a=>(ie===void 0&&(ie=a()),ie),ln=()=>{!r||b||(r.render(G()),z())},un=(a,p={},g={})=>{const E=/^https?:\/\//i.test(a)?a:String(t.restRoot??"")+a.replace(/^\//,""),k=new Headers(p.headers);return k.has("Accept")||k.set("Accept","application/json"),t.restNonce&&!k.has("X-WP-Nonce")&&k.set("X-WP-Nonce",t.restNonce),s.fetch(E,{credentials:"same-origin",signal:i,...p,headers:k},{windowId:o,source:`openstation/app/${t.id}`,...g})},G=()=>({get state(){return c},get data(){return l},get loading(){return u},root:n,windowId:o,dispatch:(a,p={},g={})=>_(a,p,{confirm:g.confirm??null}),local:(a,p={})=>re(a,p),ui:cn,repaint:ln,fetch:un,host:s,extra:t.extra??{}}),re=(a,p)=>{!r||b||(r.hasLocal(a)&&(c=r.runLocal(a,c,p,l),rn(`local action "${a}"`),oe()&&console.debug(`[openstation:${t.id}] local ${a}`,p)),r.render(G()),z())},Re=new Set,dn=async()=>{if(!s.loadComponents)return;const a=new Set;for(const p of Array.from(n.querySelectorAll("*"))){const g=p.tagName.toLowerCase();!g.startsWith("os-")||customElements.get(g)||p.closest("[os-preserve]")||Re.has(g)||(a.add(g),Re.add(g))}a.size>0&&(await s.loadComponents(Array.from(a)),Ne(n,new WeakMap))},fn=a=>{switch(a.type){case"toast":s.toast?.({message:String(a.message)});return;case"title":s.setTitle?.(o,String(a.title));return;case"close":s.closeWindow?.(o);return;case"open":s.openWindow?.(String(a.window));return;case"open_url":s.openUrl?.(String(a.url),String(a.title??""),String(a.icon??""));return;case"badge":s.setBadge?.(t.id,Number(a.count)||0);return;case"icon":s.setIcon?.(t.id,String(a.icon));return;case"announce":{const p=a;s.announce?.(p.contentType,p.action,p.ids);return}case"menu":{const p=a.items??[];s.menu?.(v,p,g=>{_(g.action,g.args)});return}case"send":{const p=a;s.send?.(p.channel,p.payload);return}case"refresh_menu":s.refreshMenu?.();return;default:n.dispatchEvent(new CustomEvent("os-app-effect",{bubbles:!0,composed:!0,detail:{appId:t.id,windowId:o,view:d,effect:a}}))}},pn=()=>{const a=new Map(Ft(n).map(p=>[p.key,p]));for(const[p,g]of N)a.has(p)||(window.clearInterval(g),N.delete(p));for(const[p,g]of a)N.has(p)||N.set(p,window.setInterval(()=>{y||document.hidden||m>0||b||_(g.action,g.args)},g.intervalMs))},mn=(a,p)=>{if(a.bind){Be.has(a.bind)||ne(`${t.id}:bind:${a.bind}`,`[openstation] app "${t.id}": os-bind="${a.bind}" writes a key App::state() does not declare — the server drops it on the next round trip. Declare it in ->state(), or keep client-only values in ctx.ui().`);const L=Kt(a.args);L!==void 0&&(c={...c,[a.bind]:L})}const g=!!r&&(r.hasLocal(a.action)||a.action==="set"&&a.bind!==null),E=()=>{if(g){re(a.action,a.args);return}_(a.action,a.args,{confirm:a.confirm,trigger:p})};if(a.debounce<=0){E();return}const k=a.bind??a.action,$=A.get(k);$!==void 0&&window.clearTimeout($),A.set(k,window.setTimeout(()=>{A.delete(k),E()},a.debounce))},je=a=>{if(b)return;a instanceof MouseEvent&&(v={x:a.clientX,y:a.clientY});const p=a.target instanceof Element?a.target:null,g=Bt(p,a.type,n);if(g&&!((a.type==="click"||a.type==="dblclick")&&g.hasAttribute("disabled"))){if((a.type==="submit"||a.type==="contextmenu")&&a.preventDefault(),a.type==="keydown"){const E=g.getAttribute("os-keys");if(E&&!E.split(/\s+/).includes(a.key))return;a.preventDefault()}mn(Ht(g,a),g)}};for(const a of Pt){const p=Dt.has(a);n.addEventListener(a,je,p),X.push(()=>n.removeEventListener(a,je,p))}let ae=!1,ce=!1;const le=()=>{if(!(b||ce)){if(y){ae=!0;return}ce=!0,_("set").finally(()=>{ce=!1})}},hn=Te(o),Ke=a=>!!a&&typeof a=="object"&&a.source===hn;if(s.onBroadcast)for(const a of t.watch??[]){if(a==="*"){X.push(s.onBroadcast("*",(p,g)=>{/^os\..+\.changed$/.test(p)&&!Ke(g)&&le()}));continue}X.push(s.onBroadcast(`os.${a}.changed`,(p,g)=>{Ke(g)||le()}))}return{appId:t.id,windowId:o,view:d,get state(){return c},get data(){return l},dispatch:_,local:(a,p={})=>re(a,p),paintEagerly(){if(!r||b||h!==void 0)return!1;const a=t.data!==void 0;if(!a&&!r.placeholder)return!1;const p={...t.state},g=a?t.data:r.placeholder?.(p);return se({state:p,html:"",data:g,effects:[]},c,!a),!0},setPaused(a){y=a,!a&&ae&&(ae=!1,le())},setParams(a){f={...a}},dispose(){b=!0,typeof h=="function"&&h();for(const a of X)a();for(const a of A.values())window.clearTimeout(a);A.clear();for(const a of N.values())window.clearInterval(a);N.clear()}}}const Me="openstation-app-runtime",Yt=200,D=new Map,Le=new Set;function W(){return window.wp?.os}function V(e,n="main"){return D.get(e)?.get(n)}function Ie(e){const n=W();return{fetch:(t,o,s)=>n?n.fetch(t,o,s):Promise.reject(new Error("[openstation] wp.os is not available.")),confirm:t=>n?.confirm?n.confirm({title:t.title,message:t.message,confirmLabel:t.confirmLabel,danger:t.danger}):Promise.resolve(!1),toast:t=>{n?.showToast(t.duration?{message:t.message,duration:t.duration}:{message:t.message})},setTitle:(t,o)=>{n?.windowManager.getById(t)?.setTitle(o)},closeWindow:t=>{n?.windowManager.getById(t)?.close()},openWindow:t=>{n?.openWindow(t)},openUrl:(t,o,s)=>{if(!n)return;const i=n.deriveWindowId(t);n.windowManager.open({id:i,baseId:i,url:t,title:o||t,icon:s||"dashicons-admin-generic"})},setBadge:(t,o)=>{n?.icons.setBadge(t,o),n?.dock?.setBadge(t,o)},setIcon:(t,o)=>{const s=n;s?.dock?.setArt?.(t,o),s?.taskbar?.setArt?.(t,o),s?.icons?.setArt?.(t,o)},announce:(t,o,s)=>{n?.announceContentChange(t,o,s,Te(e))},menu:(t,o,s)=>{Je(t,{scope:"os-app",actions:o.map(i=>({id:i.id,label:i.label,icon:i.icon||void 0,danger:i.danger,disabled:i.disabled,onClick:()=>s(i)}))})},refreshMenu:()=>{try{n?.refreshMenu?.()}catch{}},onBroadcast:(t,o)=>n?.subscribe(t,(s,i)=>o(i.topic,s))??(()=>{}),loadComponents:t=>n?.loadComponents(t)??Promise.resolve(),applyAppearance:(t,o)=>Qt(t,o)}}function Qt(e,n){const t=W();if(t&&(n.theme&&Object.keys(n.theme).length>0&&t.applyWindowTheme(e,n.theme),n.controls&&Object.keys(n.controls).length>0&&t.applyWindowControls(e,n.controls),n.slots))for(const[o,s]of Object.entries(n.slots))t.applyWindowSlot(e,o,s)}function _e(){let e=!0;return{focus:()=>e?!1:(e=!0,!0),blur:()=>e?(e=!1,!0):!1}}function en(e,n){const t=e.closest('[id^="wp-window-"]');return t?t.id.slice(10):n}function Oe(e,n){return e.id===n||e.config.baseId===n}function Pe(e,n){V(e.id)?.dispatch(n.action,n.args,{confirm:n.confirm})}function tn(e){const n=W();if(n){for(const t of e.titleBarButtons??[])n.registerTitleBarButton({id:`os-app/${e.id}/${t.id}`,label:t.label,icon:t.icon,placement:t.placement??"right",order:t.order,match:o=>Oe(o,e.id),onClick:o=>Pe(o,t),owner:Me});for(const t of e.windowActions??[])n.registerWindowAction({id:`os-app/${e.id}/${t.id}`,label:t.label,icon:t.icon,order:t.order,isVisible:o=>Oe(o,e.id),onSelect:o=>Pe(o,t),owner:Me})}}function nn(e){return async(n,t)=>{const o=en(n,e.id),s=Ie(o),i=new Set(e.lifecycle??[]),r=[];s.applyAppearance?.(o,e.appearance??{});const d=Array.from(n.querySelectorAll(`[data-os-app="${e.id}"]`));d.length===0&&d.push(n);const f=e.client?Tt(e.id):void 0,c=new Map;for(const m of d){const w=m.getAttribute("data-os-view")||"main",v=Jt({root:m,config:e,windowId:o,host:s,view:w,params:t?.params??{},signal:t?.signal,client:w==="main"?f:void 0});c.set(w,v)}D.set(o,c);const l=m=>{c.forEach(m)};if(t){if(r.push(t.onHide(()=>{l(m=>m.setPaused(!0)),i.has("hide")&&l(m=>void m.dispatch("hide"))})),r.push(t.onShow(()=>{l(m=>m.setPaused(!1)),i.has("show")&&l(m=>void m.dispatch("show"))})),i.has("resize")){let m=null;r.push(t.onResize((w,v)=>{m!==null&&window.clearTimeout(m),m=window.setTimeout(()=>{m=null,l(A=>void A.dispatch("resize",{width:w,height:v}))},Yt)}))}for(const[m,w]of Object.entries(e.channels??{}))r.push(t.window.on(m,v=>{l(A=>void A.dispatch(w,{payload:v}))}));s.send=(m,w)=>t.window.send(m,w)}const u=m=>{const w=m.detail;if(!w||w.windowId!==o)return;const v=w.params??{};l(A=>A.setParams(v)),i.has("reopen")&&l(A=>void A.dispatch("reopen",{params:v}))};document.addEventListener("os-window-reopened",u),r.push(()=>document.removeEventListener("os-window-reopened",u));const h=W();if(h&&(i.has("focus")||i.has("blur"))){const m=_e();r.push(h.onWindow(o,{focused:()=>{m.focus()&&i.has("focus")&&l(w=>void w.dispatch("focus"))},blurred:()=>{m.blur()&&i.has("blur")&&l(w=>void w.dispatch("blur"))}}))}const b=Array.from(c.values(),m=>m.dispatch("mount"));return Object.keys(t?.params??{}).length===0&&c.get("main")?.paintEagerly()===!0||await Promise.all(b),()=>{for(const m of r)m();l(m=>m.dispose()),D.get(o)===c&&D.delete(o)}}}function U(){const e=window,n=e.openStationWindowConfig??{},t=e.openStationNativeWindows??(e.openStationNativeWindows={}),o=[];for(const[s,i]of Object.entries(n)){const r=i;!r||r.osApp!==!0||Le.has(s)||(Le.add(s),t[s]=nn(r),tn(r),o.push(s))}return o}const De={defineApp:St,html:M,__:pe,_n:tt,_x:et,sprintf:me,formatBytes:mt,formatDate:ht,createPagedList:gt,applySelection:yt,createMarquee:wt,copyText:bt,statusControl:kt,pager:Et,mountMenuCheckboxes:xt,createListTableSync:$t};function We(){const e=window,n=o=>{try{o(De)}catch(s){console.error("[openstation] a queued client view threw.",s)}},t=e.openStationAppsPending;Array.isArray(t)&&t.forEach(n),e.openStationAppsPending={push:n}}return We(),U(),document.addEventListener("os-registry-changed",()=>{U()}),W()?.registerNamespace("apps",{...De,debug:(e="*",n=!0)=>Zt(e,n),dispatch:(e,n,t={},o="main")=>V(e,o)?.dispatch(n,t)??Promise.resolve(!1),local:(e,n,t={})=>V(e)?.local(n,t),session:(e,n="main")=>V(e,n),refresh:()=>U(),prewarm:e=>{const n=window.openStationWindowConfig?.[e];return!n||n.osApp!==!0||D.has(e)?!1:Ct(n,Ie(e).fetch)}}),O.createFocusGate=_e,O.publishClientApi=We,O.registerApps=U,Object.defineProperty(O,Symbol.toStringTag,{value:"Module"}),O}({});
46 + </footer>`}function Pt(e,n){const o=e.closest(".os-window")?.querySelector(".os-window__menu-panel")??null;if(!o||n.items.length===0)return null;const s=`${n.prefix}:`,i="data-os-app-menu-section";o.querySelectorAll(`[${i}="${n.prefix}"]`).forEach(f=>f.remove());const r=document.createElement("div");r.className="os-app__menu-section",r.setAttribute("role","presentation"),r.setAttribute(i,n.prefix),r.textContent=n.section,o.appendChild(r);const l=new Map;for(const f of n.items){const d=document.createElement("os-menu-item");d.setAttribute("role","menuitemcheckbox"),d.setAttribute("value",s+f.key),d.setAttribute(i,n.prefix),d.classList.add("os-window__menu-item","os-app__menu-item"),d.textContent=f.label||f.key,o.appendChild(d),l.set(f.key,d)}const u=()=>{for(const[f,d]of l)n.isChecked(f)?d.setAttribute("checked",""):d.removeAttribute("checked")};u();const c=f=>{const d=f.detail?.value;if(typeof d!="string"||!d.startsWith(s))return;const h=d.slice(s.length);l.has(h)&&(n.onToggle(h),u())};return o.addEventListener("os-menu-item-click",c),{refresh:u,dispose:()=>{o.removeEventListener("os-menu-item-click",c),r.remove();for(const f of l.values())f.remove();l.clear()}}}function Rt(e,n=null){const t=n??(typeof document<"u"?document.documentElement:null);if(!!t&&Ee(t)){e.hasAttribute("stacked")||e.setAttribute("stacked","");const i=e.getAttribute("sticky-columns");return i!==null&&(e.setAttribute("data-os-sticky-columns",i),e.removeAttribute("sticky-columns")),!0}e.hasAttribute("stacked")&&e.removeAttribute("stacked");const s=e.getAttribute("data-os-sticky-columns");return s!==null&&(e.setAttribute("sticky-columns",s),e.removeAttribute("data-os-sticky-columns")),!1}function xe(e){return Array.from(e.selection??[],String)}function Dt(){let e=null,n=!1,t=null,o=null;return{invalidateColumns(){e=null},invalidateData(){o=null},sync(s){const i={phone:!1,columnsChanged:!1,dataChanged:!1,selectionChanged:!1},r=s.table;if(!r)return i;const l=s.rowId??(c=>c.id),u=Rt(r);if(i.phone=u,u!==e&&(e=u,r.columns=s.columns(u),i.columnsChanged=!0),n||(n=!0,s.wire?.(r)),s.listKey!==t&&(t=s.listKey,xe(r).length>0&&(r.clearSelection(),i.selectionChanged=!0,s.onSelection?.([]))),s.fingerprint!==o){o=s.fingerprint,r.data=s.rows,i.dataChanged=!0;const c=new Set(s.rows.map(h=>String(l(h)))),f=xe(r),d=f.filter(h=>c.has(h));d.length!==f.length&&(r.selection=d,i.selectionChanged=!0,s.onSelection?.(d))}return i}}}function Bt(e,n){const t=n.local??{},o={id:e,hasLocal:r=>Object.prototype.hasOwnProperty.call(t,r),runLocal:(r,l,u,c)=>{const f=t[r];if(!f)return l;const d={...l},h=f(d,u,c);return h===void 0?d:h},render:r=>{vt(n.view(r),r.root),n.updated?.(r)},mounted:r=>n.mounted?.(r)},{placeholder:s}=n;s&&(o.placeholder=r=>s(r));const i=window;return(i.openStationApps??(i.openStationApps={}))[e]=o,o}function Wt(e){return window.openStationApps?.[e]}const Se=3e4,U=new Map;function jt(e,n){const t=U.get(e.id);if(t&&Date.now()-t.at<Se)return!1;const o={Accept:"application/json","Content-Type":"application/json"};e.restNonce&&(o["X-WP-Nonce"]=e.restNonce);const s=n(e.endpoint,{method:"POST",headers:o,body:JSON.stringify({action:"mount",view:"main",state:{...e.state},args:{},params:{},client:{width:0,height:0}})},{source:`openstation/app/${e.id}/prewarm`,silent:!0}).then(async i=>{if(!i.ok)return null;const r=await i.json();return r&&r.ok===!0?r:null}).catch(()=>null);return U.set(e.id,{promise:s,at:Date.now()}),!0}function Ft(e){const n=U.get(e);if(n)return U.delete(e),Date.now()-n.at<Se?n.promise:void 0}class oe extends Error{constructor(n,t){super(n||t.serverMessage||`HTTP ${t.status}`),this.name="RestError",this.status=t.status,this.code=t.code,this.data=t.data,this.serverMessage=t.serverMessage??""}}function $e(e){return e instanceof oe}function Ht(e){const n=typeof e=="object"&&e!==null?e:void 0;return{code:typeof n?.code=="string"?n.code:void 0,data:n?.data,serverMessage:typeof n?.message=="string"?n.message:""}}function Kt(e,n,t=""){return new oe(t,{status:e,...Ht(n)})}async function qt(e,n=""){let t=null;try{t=await e.json()}catch{t=null}return Kt(e.status,t,n)}const Ut="rest_cookie_invalid_nonce",Ne=()=>T("Could not reach the site. Check your connection and try again.","desktop-mode");function Te(e){return typeof navigator<"u"&&navigator.onLine===!1?!0:e instanceof TypeError}function Vt(e){return $e(e)?e.code===Ut||e.status===401?"session":e.status>=200&&e.status<300?"unreadable":e.status===404?"gone":e.status>=500?"server":e.status>=400?"refused":"unknown":Te(e)?"offline":"unknown"}function Xt(e){return $e(e)?e.serverMessage:Te(e)?Ne():e instanceof Error?e.message:""}function zt(e,n){const{fallback:t,lead:o}=n,s=Vt(e),i=s==="offline"||s==="unreadable"?"warning":"error";let r="",l=!0;switch(s){case"offline":r=Ne();break;case"session":r=T("Your session has expired. Reload the page and try again.","desktop-mode");break;case"unreadable":r=T("The site sent an unreadable reply. Reload the page to check whether the change went through.","desktop-mode");break;case"gone":case"refused":case"server":{const c=e;c.serverMessage?r=c.serverMessage:s==="gone"?(r=T("It no longer exists. Reload the page to catch up.","desktop-mode"),l=!1):s==="server"?(r=ne(T("The server answered with error %d.","desktop-mode"),c.status),l=!1):(r=ne(T("The server refused the request (HTTP %d).","desktop-mode"),c.status),l=!1);break}case"unknown":default:r=Xt(e);break}let u;return o?u=r?`${o}: ${r}`:t:r?l?u=r:u=`${t} ${r}`:u=t,{message:u,reason:r,kind:s,type:i}}function Gt(e,n,t){if(!e)return;const{duration:o,...s}=t,i=zt(n,s),r={message:i.message,type:i.type};o&&(r.duration=o),e(r)}const Yt=["os-avatar-click","os-button-activate","os-cancel","os-card-click","os-categories-change","os-categories-close","os-categories-create","os-categories-delete","os-categories-open","os-chain-remove","os-chain-segment-click","os-chain-segment-dragstart","os-checkbox-change","os-chip-dismiss","os-color-change","os-confirm","os-context-menu-pick","os-copy","os-disclosure-toggle","os-flyout-dismiss","os-form-input","os-form-reset","os-form-submit","os-split-change","os-input-change","os-input-commit","os-log-append","os-menu-item-click","os-modal-cancel","os-multiselect-close","os-multiselect-load-more","os-multiselect-open","os-notice-dismiss","os-pick","os-range-change","os-repeater-add","os-repeater-move","os-repeater-remove","os-role-toggle","os-save-status-change","os-segment-pick","os-series-toggle","os-step-click","os-submit","os-switch-change","os-tab-change","os-tab-pick","os-table-expand-change","os-table-filter-change","os-table-row-click","os-table-selection-change","os-table-sort-change","os-tag-add","os-tag-close","os-tag-open","os-tag-remove","os-tag-suggest","os-toast-action","os-toast-dismiss","os-toast-hold","os-token-field-input","os-token-insert","os-user-pick"],Zt=["click","dblclick","change","input","submit","keydown","contextmenu","toggle"],Ce={"os-button":"click",button:"click",a:"click","os-avatar":"os-avatar-click","os-card":"os-card-click","os-tile":"click","os-select":"os-pick","os-segmented":"os-pick","os-swatch-grid":"os-pick","os-multiselect":"os-pick","os-tabs":"os-tab-change","os-text-field":"os-input-change","os-textarea":"os-input-change","os-number-field":"os-input-change","os-token-field":"os-token-field-input","os-color-field":"os-color-change","os-range-field":"os-range-change","os-split":"os-split-change","os-switch":"os-switch-change","os-checkbox":"os-checkbox-change","os-disclosure":"os-disclosure-toggle","os-histogram":"os-series-toggle","os-chip":"os-chip-dismiss","os-tag-input":"os-tag-add","os-menu":"os-menu-item-click","os-context-menu":"os-context-menu-pick","os-table":"os-table-row-click","os-category-picker":"os-categories-change","os-role-picker":"os-role-toggle","os-user-search":"os-user-pick","os-repeater":"os-repeater-add","os-crumb-chain":"os-chain-segment-click","os-notice":"os-notice-dismiss","os-flyout":"os-flyout-dismiss","os-modal":"os-modal-cancel","os-confirm-dialog":"os-confirm","os-steps":"os-step-click","os-window-button":"os-button-activate","os-form":"os-form-submit","os-code":"os-copy",details:"toggle",form:"submit",select:"change",input:"change",textarea:"change"},Jt=new Set(["os-input-change","os-form-input","os-token-field-input","os-range-change","input"]),Qt=250,en=Array.from(new Set([...Yt,...Zt,...Object.values(Ce)])),tn=new Set(["toggle"]);function Me(e){const n=e.getAttribute("os-on");return n||(Ce[e.tagName.toLowerCase()]??"click")}function nn(e){return e.hasAttribute("os-action")||e.hasAttribute("os-bind")}function on(e,n,t){let o=e;for(;o&&o!==t;){if(nn(o)&&Me(o)===n)return o;o=o.parentElement}return null}function sn(e){const n={};for(const[t,o]of Object.entries(e))t==="originalEvent"||o instanceof Event||o instanceof Node||typeof o!="function"&&(n[t]=o);return n}function rn(e,n){if(e instanceof CustomEvent){const o=e.detail;if(o&&typeof o=="object"&&!Array.isArray(o))return sn(o);if(o!=null&&typeof o!="object")return{value:o}}if(e instanceof KeyboardEvent)return{key:e.key,code:e.code,alt:e.altKey,ctrl:e.ctrlKey,meta:e.metaKey,shift:e.shiftKey};const t=n.tagName.toLowerCase();if(t==="form"){const o={};return new FormData(n).forEach((s,i)=>{if(typeof s=="string")if(i in o){const r=o[i];o[i]=Array.isArray(r)?[...r,s]:[r,s]}else o[i]=s}),{values:o}}if(t==="details")return{open:n.open};if(t==="input"){const o=n;return o.type==="checkbox"||o.type==="radio"?{checked:o.checked,value:o.value}:{value:o.value}}return t==="select"||t==="textarea"?{value:n.value}:{}}function _e(e){const n={};for(const t of Array.from(e.attributes))t.name.startsWith("os-arg-")&&(n[t.name.slice(7)]=t.value);return n}function an(e){if("checked"in e)return e.checked;if("value"in e)return e.value;if("open"in e)return e.open}function cn(e){const n=e.getAttribute("os-confirm");return n?{message:n,title:e.getAttribute("os-confirm-title")??void 0,label:e.getAttribute("os-confirm-label")??void 0,danger:e.hasAttribute("os-confirm-danger")}:null}function ln(e,n){const t=e.getAttribute("os-bind"),o=e.getAttribute("os-action")??"set",s=n?n.type:Me(e),i=e.getAttribute("os-debounce");let r=0;return i!==null?r=Math.max(0,parseInt(i,10)||0):Jt.has(s)&&(r=Qt),{action:o,args:{..._e(e),...n?rn(n,e):{}},bind:t&&t!==""?t:null,debounce:r,confirm:cn(e)}}function un(e){const n=new Map;for(const t of Array.from(e.querySelectorAll("[os-poll]"))){const o=parseInt(t.getAttribute("os-poll")??"",10),s=t.getAttribute("os-action");if(!s||!Number.isFinite(o)||o<250)continue;const i=_e(t),r=`${s}|${o}|${JSON.stringify(i)}`;n.has(r)||n.set(r,{key:r,action:s,args:i,intervalMs:o})}return Array.from(n.values())}function dn(e){return e.slice(8).replace(/-([a-z])/g,(n,t)=>t.toUpperCase())}function Le(e,n){let t=0;for(const o of Array.from(e.querySelectorAll("*"))){let s=n.get(o);for(const i of Array.from(o.attributes)){if(!i.name.startsWith("os-prop-")||s&&s[i.name]===i.value)continue;let r=i.value;try{r=JSON.parse(i.value)}catch{}o[dn(i.name)]=r,s||(s={},n.set(o,s)),s[i.name]=i.value,t++}}return t}function fn(e,n){const t=document.createElement("template");t.innerHTML=n,Oe(e,Array.from(t.content.childNodes))}function se(e){if(e.nodeType!==Node.ELEMENT_NODE)return null;const n=e,t=n.getAttribute("os-key");return t!==null&&t!==""?t:n.id!==""?`#${n.id}`:null}function Ie(e,n){return e.nodeType!==n.nodeType?!1:e.nodeType===Node.ELEMENT_NODE?e.tagName===n.tagName:!0}function Oe(e,n){const t=e.ownerDocument.activeElement,o=new Map;for(const i of Array.from(e.childNodes)){const r=se(i);r!==null&&!o.has(r)&&o.set(r,i)}let s=0;for(const i of n){const r=e.childNodes[s]??null,l=se(i);let u=null;if(l!==null){const c=o.get(l);c&&Ie(c,i)&&(u=c,o.delete(l),c!==r&&e.insertBefore(c,r))}else r&&se(r)===null&&Ie(r,i)&&(u=r);if(!u){e.insertBefore(document.importNode(i,!0),r),s++;continue}pn(u,i,t),s++}for(;e.childNodes.length>s;)e.removeChild(e.childNodes[s])}function pn(e,n,t){if(e.nodeType!==Node.ELEMENT_NODE){e.nodeValue!==n.nodeValue&&(e.nodeValue=n.nodeValue);return}const o=e,s=n;if(o.hasAttribute("os-preserve"))return;const i=!!t&&(o===t||o.contains(t));mn(o,s,i),Oe(o,Array.from(s.childNodes)),hn(o,s,i)}function mn(e,n,t){for(const o of Array.from(n.attributes))t&&o.name==="value"||e.getAttribute(o.name)!==o.value&&e.setAttribute(o.name,o.value);for(const o of Array.from(e.attributes))n.hasAttribute(o.name)||t&&o.name==="value"||e.removeAttribute(o.name)}function hn(e,n,t){t||(e instanceof HTMLInputElement&&n instanceof HTMLInputElement?e.type==="checkbox"||e.type==="radio"?e.checked=n.checked:e.value!==n.value&&(e.value=n.value):(e instanceof HTMLTextAreaElement&&n instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement&&n instanceof HTMLSelectElement)&&e.value!==n.value&&(e.value=n.value))}function Pe(e){return`openstation-app-runtime:${e}`}const V=new Set;function gn(e,n=!0){n?V.add(e):V.delete(e)}const Re=new Set;function re(e,n){Re.has(e)||(Re.add(e),console.warn(n))}function yn(e){const{root:n,config:t,windowId:o,host:s,signal:i,client:r}=e,l=e.view??"main";let u=e.params??{},c={...t.state},f,d=!1,h,b=!1,y=!1,m=0,w=Promise.resolve(),v={x:0,y:0};const k=new Map,S=new Map,W=new WeakMap,G=[],qe=new Set(Object.keys(t.state??{})),En=new Set(["mount","set","refresh",...t.actions??[],...t.lifecycle??[]]),ae=()=>V.has("*")||V.has(o),xn=()=>{if(!(!t.actions||t.actions.length===0))for(const a of Array.from(n.querySelectorAll("[os-action]"))){const p=a.getAttribute("os-action")??"";p===""||En.has(p)||(r?.hasLocal(p)??!1)||re(`${t.id}:action:${p}`,`[openstation] app "${t.id}": os-action="${p}" names no server action, no local reducer and no built-in — dispatching it will fail. Declare ->action( '${p}' ) in the .os.php, or a local reducer in the .os.ts.`)}},Sn=a=>{for(const p of Object.keys(c))qe.has(p)||re(`${t.id}:key:${p}`,`[openstation] app "${t.id}": ${a} wrote state.${p}, which App::state() does not declare — the next server response silently drops it. Declare it in ->state(), or keep client-only values in ctx.ui().`)},$n=async(a,p,g)=>{if(b)return!1;const E=Date.now();m++,n.setAttribute("aria-busy","true"),g&&g.tagName.toLowerCase()==="os-button"&&g.setAttribute("busy","");const A=c;try{if(a==="mount"&&l==="main"&&Object.keys(u).length===0){const $=await Ft(t.id);if(b)return!1;if($)return ce($,A),!0}const N={Accept:"application/json","Content-Type":"application/json"};t.restNonce&&(N["X-WP-Nonce"]=t.restNonce);const L=await s.fetch(t.endpoint,{method:"POST",headers:N,body:JSON.stringify({action:a,view:l,state:A,args:p,params:u,client:{width:n.clientWidth,height:n.clientHeight}}),signal:i},{windowId:o,source:`openstation/app/${t.id}`});if(!L.ok)throw await qt(L);const j=await L.json();if(b)return!1;if(!j||j.ok!==!0){const $=j??{},M=typeof $.message=="string"?$.message:"";let me=L.status;throw typeof $.status=="number"?me=$.status:M&&(me=500),new oe("",{status:me,code:typeof $.error=="string"?$.error:void 0,serverMessage:M})}if(ce(j,A),ae()){const $=Object.keys(c).filter(M=>c[M]!==A[M]);console.groupCollapsed(`[openstation:${t.id}] ${a} · ${Date.now()-E}ms`),console.log("args",p),console.log("state Δ",$,$.length>0?Object.fromEntries($.map(M=>[M,c[M]])):""),console.log("effects",j.effects??[]),console.groupEnd()}return!0}catch(N){return b||i?.aborted||(ae()&&console.warn(`[openstation:${t.id}] ${a} FAILED after ${Date.now()-E}ms:`,N),Gt(s.toast,N,{lead:T("The window could not update"),fallback:T("The window could not update.")})),!1}finally{m--,m===0&&n.removeAttribute("aria-busy"),g&&g.isConnected&&g.removeAttribute("busy")}},P=async(a,p={},g={})=>{if(b||g.confirm&&(!s.confirm||!await s.confirm({title:g.confirm.title,message:g.confirm.message,confirmLabel:g.confirm.label,danger:!!g.confirm.danger})||b))return!1;const E=w.then(()=>$n(a,p,g.trigger??null));return w=E.catch(()=>{}),E},Y=()=>{Le(n,W),Mn(),Ln(),xn()},ce=(a,p,g=!1)=>{const E={...a.state};for(const A of Object.keys(c))c[A]!==p[A]&&(E[A]=c[A]);if(c=E,r){f=a.data,d=g;const A=h===void 0;if(r.render(Z()),Y(),A){const N=r.mounted(Z());h=typeof N=="function"?N:null}}else fn(n,a.html),Y();for(const A of a.effects??[])_n(A)};let le;const Nn=a=>(le===void 0&&(le=a()),le),Tn=()=>{!r||b||(r.render(Z()),Y())},Cn=(a,p={},g={})=>{const E=/^https?:\/\//i.test(a)?a:String(t.restRoot??"")+a.replace(/^\//,""),A=new Headers(p.headers);return A.has("Accept")||A.set("Accept","application/json"),t.restNonce&&!A.has("X-WP-Nonce")&&A.set("X-WP-Nonce",t.restNonce),s.fetch(E,{credentials:"same-origin",signal:i,...p,headers:A},{windowId:o,source:`openstation/app/${t.id}`,...g})},Z=()=>({get state(){return c},get data(){return f},get loading(){return d},root:n,windowId:o,dispatch:(a,p={},g={})=>P(a,p,{confirm:g.confirm??null}),local:(a,p={})=>ue(a,p),ui:Nn,repaint:Tn,fetch:Cn,host:s,extra:t.extra??{}}),ue=(a,p)=>{!r||b||(r.hasLocal(a)&&(c=r.runLocal(a,c,p,f),Sn(`local action "${a}"`),ae()&&console.debug(`[openstation:${t.id}] local ${a}`,p)),r.render(Z()),Y())},Ue=new Set,Mn=async()=>{if(!s.loadComponents)return;const a=new Set;for(const p of Array.from(n.querySelectorAll("*"))){const g=p.tagName.toLowerCase();!g.startsWith("os-")||customElements.get(g)||p.closest("[os-preserve]")||Ue.has(g)||(a.add(g),Ue.add(g))}a.size>0&&(await s.loadComponents(Array.from(a)),Le(n,new WeakMap))},_n=a=>{switch(a.type){case"toast":{const{message:p,toastType:g}=a;s.toast?.(typeof g=="string"&&g?{message:String(p),type:g}:{message:String(p)});return}case"title":s.setTitle?.(o,String(a.title));return;case"close":s.closeWindow?.(o);return;case"open":s.openWindow?.(String(a.window));return;case"open_url":s.openUrl?.(String(a.url),String(a.title??""),String(a.icon??""));return;case"badge":s.setBadge?.(t.id,Number(a.count)||0);return;case"icon":s.setIcon?.(t.id,String(a.icon));return;case"announce":{const p=a;s.announce?.(p.contentType,p.action,p.ids);return}case"menu":{const p=a.items??[];s.menu?.(v,p,g=>{P(g.action,g.args)});return}case"send":{const p=a;s.send?.(p.channel,p.payload);return}case"refresh_menu":s.refreshMenu?.();return;default:n.dispatchEvent(new CustomEvent("os-app-effect",{bubbles:!0,composed:!0,detail:{appId:t.id,windowId:o,view:l,effect:a}}))}},Ln=()=>{const a=new Map(un(n).map(p=>[p.key,p]));for(const[p,g]of S)a.has(p)||(window.clearInterval(g),S.delete(p));for(const[p,g]of a)S.has(p)||S.set(p,window.setInterval(()=>{y||document.hidden||m>0||b||P(g.action,g.args)},g.intervalMs))},In=(a,p)=>{if(a.bind){qe.has(a.bind)||re(`${t.id}:bind:${a.bind}`,`[openstation] app "${t.id}": os-bind="${a.bind}" writes a key App::state() does not declare — the server drops it on the next round trip. Declare it in ->state(), or keep client-only values in ctx.ui().`);const L=an(a.args);L!==void 0&&(c={...c,[a.bind]:L})}const g=!!r&&(r.hasLocal(a.action)||a.action==="set"&&a.bind!==null),E=()=>{if(g){ue(a.action,a.args);return}P(a.action,a.args,{confirm:a.confirm,trigger:p})};if(a.debounce<=0){E();return}const A=a.bind??a.action,N=k.get(A);N!==void 0&&window.clearTimeout(N),k.set(A,window.setTimeout(()=>{k.delete(A),E()},a.debounce))},Ve=a=>{if(b)return;a instanceof MouseEvent&&(v={x:a.clientX,y:a.clientY});const p=a.target instanceof Element?a.target:null,g=on(p,a.type,n);if(g&&!((a.type==="click"||a.type==="dblclick")&&g.hasAttribute("disabled"))){if((a.type==="submit"||a.type==="contextmenu")&&a.preventDefault(),a.type==="keydown"){const E=g.getAttribute("os-keys");if(E&&!E.split(/\s+/).includes(a.key))return;a.preventDefault()}In(ln(g,a),g)}};for(const a of en){const p=tn.has(a);n.addEventListener(a,Ve,p),G.push(()=>n.removeEventListener(a,Ve,p))}let de=!1,fe=!1;const pe=()=>{if(!(b||fe)){if(y){de=!0;return}fe=!0,P("set").finally(()=>{fe=!1})}},On=Pe(o),Xe=a=>!!a&&typeof a=="object"&&a.source===On;if(s.onBroadcast)for(const a of t.watch??[]){if(a==="*"){G.push(s.onBroadcast("*",(p,g)=>{/^os\..+\.changed$/.test(p)&&!Xe(g)&&pe()}));continue}G.push(s.onBroadcast(`os.${a}.changed`,(p,g)=>{Xe(g)||pe()}))}return{appId:t.id,windowId:o,view:l,get state(){return c},get data(){return f},dispatch:P,local:(a,p={})=>ue(a,p),paintEagerly(){if(!r||b||h!==void 0)return!1;const a=t.data!==void 0;if(!a&&!r.placeholder)return!1;const p={...t.state},g=a?t.data:r.placeholder?.(p);return ce({state:p,html:"",data:g,effects:[]},c,!a),!0},setPaused(a){y=a,!a&&de&&(de=!1,pe())},setParams(a){u={...a}},dispose(){b=!0,typeof h=="function"&&h();for(const a of G)a();for(const a of k.values())window.clearTimeout(a);k.clear();for(const a of S.values())window.clearInterval(a);S.clear()}}}const De="openstation-app-runtime",wn=200,D=new Map,Be=new Set;function B(){return window.wp?.os}function X(e,n="main"){return D.get(e)?.get(n)}function ie(e){const n=B();return{fetch:(t,o,s)=>n?n.fetch(t,o,s):Promise.reject(new Error("[openstation] wp.os is not available.")),confirm:t=>n?.confirm?n.confirm({title:t.title,message:t.message,confirmLabel:t.confirmLabel,danger:t.danger}):Promise.resolve(!1),toast:t=>{const o={message:t.message};t.duration&&(o.duration=t.duration),t.type&&(o.type=t.type),n?.showToast(o)},setTitle:(t,o)=>{n?.windowManager.getById(t)?.setTitle(o)},closeWindow:t=>{n?.windowManager.getById(t)?.close()},openWindow:t=>{n?.openWindow(t)},openUrl:(t,o,s)=>{if(!n||Je(t))return;const i=n.deriveWindowId(t);n.windowManager.open({id:i,baseId:i,url:t,title:o||t,icon:s||"dashicons-admin-generic"})},setBadge:(t,o)=>{n?.icons.setBadge(t,o),n?.dock?.setBadge(t,o)},setIcon:(t,o)=>{const s=n;s?.dock?.setArt?.(t,o),s?.taskbar?.setArt?.(t,o),s?.icons?.setArt?.(t,o)},announce:(t,o,s)=>{n?.announceContentChange(t,o,s,Pe(e))},menu:(t,o,s)=>{ct(t,{scope:"os-app",actions:o.map(i=>({id:i.id,label:i.label,icon:i.icon||void 0,danger:i.danger,disabled:i.disabled,onClick:()=>s(i)}))})},refreshMenu:()=>{try{n?.refreshMenu?.()}catch{}},onBroadcast:(t,o)=>n?.subscribe(t,(s,i)=>o(i.topic,s))??(()=>{}),loadComponents:t=>n?.loadComponents(t)??Promise.resolve(),applyAppearance:(t,o)=>bn(t,o)}}function bn(e,n){const t=B();if(t&&(n.theme&&Object.keys(n.theme).length>0&&t.applyWindowTheme(e,n.theme),n.controls&&Object.keys(n.controls).length>0&&t.applyWindowControls(e,n.controls),n.slots))for(const[o,s]of Object.entries(n.slots))t.applyWindowSlot(e,o,s)}function We(){let e=!0;return{focus:()=>e?!1:(e=!0,!0),blur:()=>e?(e=!1,!0):!1}}function vn(e,n){const t=e.closest('[id^="wp-window-"]');return t?t.id.slice(10):n}function je(e,n){return e.id===n||e.config.baseId===n}function Fe(e,n){X(e.id)?.dispatch(n.action,n.args,{confirm:n.confirm})}function kn(e){const n=B();if(n){for(const t of e.titleBarButtons??[])n.registerTitleBarButton({id:`os-app/${e.id}/${t.id}`,label:t.label,icon:t.icon,placement:t.placement??"right",order:t.order,match:o=>je(o,e.id),onClick:o=>Fe(o,t),owner:De});for(const t of e.windowActions??[])n.registerWindowAction({id:`os-app/${e.id}/${t.id}`,label:t.label,icon:t.icon,order:t.order,isVisible:o=>je(o,e.id),onSelect:o=>Fe(o,t),owner:De})}}function An(e){return async(n,t)=>{const o=vn(n,e.id),s=ie(o),i=new Set(e.lifecycle??[]),r=[];s.applyAppearance?.(o,e.appearance??{});const l=Array.from(n.querySelectorAll(`[data-os-app="${e.id}"]`));l.length===0&&l.push(n);const u=e.client?Wt(e.id):void 0,c=new Map;for(const m of l){const w=m.getAttribute("data-os-view")||"main",v=yn({root:m,config:e,windowId:o,host:s,view:w,params:t?.params??{},signal:t?.signal,client:w==="main"?u:void 0});c.set(w,v)}D.set(o,c);const f=m=>{c.forEach(m)};if(t){if(r.push(t.onHide(()=>{f(m=>m.setPaused(!0)),i.has("hide")&&f(m=>void m.dispatch("hide"))})),r.push(t.onShow(()=>{f(m=>m.setPaused(!1)),i.has("show")&&f(m=>void m.dispatch("show"))})),i.has("resize")){let m=null;r.push(t.onResize((w,v)=>{m!==null&&window.clearTimeout(m),m=window.setTimeout(()=>{m=null,f(k=>void k.dispatch("resize",{width:w,height:v}))},wn)}))}for(const[m,w]of Object.entries(e.channels??{}))r.push(t.window.on(m,v=>{f(k=>void k.dispatch(w,{payload:v}))}));s.send=(m,w)=>t.window.send(m,w)}const d=m=>{const w=m.detail;if(!w||w.windowId!==o)return;const v=w.params??{};f(k=>k.setParams(v)),i.has("reopen")&&f(k=>void k.dispatch("reopen",{params:v}))};document.addEventListener("os-window-reopened",d),r.push(()=>document.removeEventListener("os-window-reopened",d));const h=B();if(h&&(i.has("focus")||i.has("blur"))){const m=We();r.push(h.onWindow(o,{focused:()=>{m.focus()&&i.has("focus")&&f(w=>void w.dispatch("focus"))},blurred:()=>{m.blur()&&i.has("blur")&&f(w=>void w.dispatch("blur"))}}))}const b=Array.from(c.values(),m=>m.dispatch("mount"));return Object.keys(t?.params??{}).length===0&&c.get("main")?.paintEagerly()===!0||await Promise.all(b),()=>{for(const m of r)m();f(m=>m.dispose()),D.get(o)===c&&D.delete(o)}}}function z(){const e=window,n=e.openStationWindowConfig??{},t=e.openStationNativeWindows??(e.openStationNativeWindows={}),o=[];for(const[s,i]of Object.entries(n)){const r=i;!r||r.osApp!==!0||Be.has(s)||(Be.add(s),t[s]=An(r),kn(r),o.push(s))}return o}const He={defineApp:Bt,html:_,__:T,_n:ft,_x:dt,sprintf:ne,formatBytes:St,formatDate:$t,createPagedList:Nt,applySelection:Tt,createMarquee:Ct,copyText:Mt,statusControl:It,pager:Ot,mountMenuCheckboxes:Pt,createListTableSync:Dt};function Ke(){const e=window,n=o=>{try{o(He)}catch(s){console.error("[openstation] a queued client view threw.",s)}},t=e.openStationAppsPending;Array.isArray(t)&&t.forEach(n),e.openStationAppsPending={push:n}}return Ke(),z(),document.addEventListener("os-registry-changed",()=>{z()}),B()?.registerNamespace("apps",{...He,debug:(e="*",n=!0)=>gn(e,n),dispatch:(e,n,t={},o="main")=>X(e,o)?.dispatch(n,t)??Promise.resolve(!1),local:(e,n,t={})=>X(e)?.local(n,t),session:(e,n="main")=>X(e,n),refresh:()=>z(),prewarm:e=>{const n=window.openStationWindowConfig?.[e];return!n||n.osApp!==!0||D.has(e)?!1:jt(n,ie(e).fetch)}}),I.buildHost=ie,I.createFocusGate=We,I.publishClientApi=Ke,I.registerApps=z,Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),I}({});