@adia-ai/web-modules 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- :where(admin-shell){--page-bg:var(--a-canvas-1);--page-border:1px solid var(--a-border-subtle);--page-main-border:var(--page-border);--page-header-height:var(--a-chrome-app-header-height);--page-header-px:var(--a-space-3);--page-header-gap:var(--a-space-3);--page-header-font:var(--a-ui-size);--page-header-fg-muted:var(--a-fg-muted);--page-sidebar-px:var(--a-space-1);--page-sidebar-gap:var(--a-space-1);--page-sidebar-font:var(--a-ui-size);--page-sidebar-min-width:48px;--page-sidebar-max-width:480px;--page-sidebar-resize-accent:var(--a-accent);--page-sidebar-divider-bg:var(--a-border-subtle);--page-sidebar-width-leading:clamp(var(--page-sidebar-min-width), 200px, 240px);--page-sidebar-width-trailing:clamp(var(--page-sidebar-min-width), 200px, 240px);--page-content-bg:var(--a-canvas-0);--page-content-header-bg:var(--a-canvas-0);--page-content-radius:var(--a-radius-lg);--page-content-inset:var(--a-space-10);--page-content-max-width:1540px;--page-content-border:1px solid var(--a-border-subtle);--page-content-shadow:var(--a-shadow-sm);--page-content-bp-sm:480px;--page-content-bp-md:720px;--page-content-bp-lg:1024px;--page-section-gap:var(--a-space-6);--page-block-gap:var(--a-space-4);--page-deck-gap:var(--a-space-1);--page-section-size:var(--a-kicker-size);--page-section-weight:var(--a-kicker-weight);--page-section-leading:var(--a-kicker-leading);--page-section-tracking:var(--a-kicker-tracking);--page-section-case:var(--a-kicker-case);--page-section-color:var(--a-kicker-color);--page-section-mb:var(--a-space-3);--page-section-pb:var(--a-space-2);--page-subsection-size:var(--a-subsection-size);--page-subsection-weight:var(--a-subsection-weight);--page-subsection-color:var(--a-subsection-color);--page-sidebar-collapsed-icon:1.0625rem;--page-sidebar-collapsed-avatar:1.5rem;--page-actions-gap:var(--a-space-2);--page-grid-gap:var(--a-space-3);--page-duration:var(--a-duration);--page-duration-fast:var(--a-duration-fast);--page-easing:var(--a-easing);--page-font-family:var(--a-font-family);--page-body-size:var(--a-body-size);--nav-duration:var(--a-duration);--nav-duration-fast:var(--a-duration-fast);--nav-easing:var(--a-easing);--nav-label-px:var(--a-space-2);--nav-label-py:var(--a-space-1);--nav-label-font-size:var(--a-kicker-sm);--nav-label-weight:var(--a-weight-medium);--nav-label-fg:var(--a-fg-muted);--nav-divider-bg:var(--a-border-subtle);--nav-divider-my:var(--a-space-1);--nav-group-indent-rail-bg:var(--a-border-subtle);--nav-group-icon-font-size:var(--a-ui-size);--nav-group-text-weight:var(--a-weight-medium);--nav-group-badge-bg:var(--a-bg-muted);--nav-group-badge-px:var(--a-space-1);--nav-group-badge-radius:var(--a-radius-full);--nav-item-icon-font-size:var(--a-ui-size);--nav-item-selected-weight:var(--a-weight-medium);--nav-item-badge-fg:var(--a-fg-muted);--nav-item-badge-bg:var(--a-bg-muted);--nav-item-badge-px:var(--a-space-1);--nav-item-badge-radius:var(--a-radius-full);--nav-item-trailing-font:var(--a-ui-sm);--nav-item-trailing-fg:var(--a-fg-muted);--nav-item-trailing-border:var(--a-border-subtle);--nav-item-trailing-radius:var(--a-radius-sm);--nav-item-trailing-px:var(--a-space-0-5);--a-icon-size:18px}admin-shell[mode~=borderless]{--page-main-border:none;--page-border:none}admin-shell{background:var(--page-bg);overscroll-behavior:none;height:100dvh;font-family:var(--page-font-family);font-size:var(--page-body-size);display:flex;position:fixed;inset:0;overflow:hidden}admin-shell:not(:has(>:is(asideadmin-sidebar[slot=trailing],admin-sidebar[slot=trailing]):not([hidden])))>admin-content>admin-scroll{margin-inline-end:var(--a-space-2)}admin-shell:not(:has(>:is(header,header-ui,admin-topbar):not([hidden]),>admin-content>admin-topbar:not([hidden])))>admin-content>admin-scroll{margin-block-start:var(--a-space-2)}admin-shell:not(:has(>:is(footer,footer-ui,admin-statusbar):not([hidden]),>admin-content>admin-statusbar:not([hidden])))>admin-content>admin-scroll{margin-block-end:var(--a-space-2)}admin-shell>admin-content>admin-scroll::-webkit-scrollbar{display:none}admin-shell>admin-content>admin-scroll:has(>[data-subnav]:not([hidden])){grid-template-columns:var(--subnav-width,14rem) 1fr;grid-template-rows:minmax(0,1fr);gap:0;display:grid}admin-shell>admin-content>admin-scroll>[data-subnav]{overscroll-behavior:contain;border-inline-end:1px solid var(--a-border-subtle);min-height:0;padding-block:var(--a-space-2);padding-inline:var(--a-space-2);overflow-y:auto}@container (width<=40rem){admin-shell>admin-content>admin-scroll:has(>[data-subnav]:not([hidden])){grid-template-columns:1fr}admin-shell>admin-content>admin-scroll>[data-subnav]{border-inline-end:none;border-block-end:1px solid var(--a-border-subtle)}}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing]){min-width:var(--page-sidebar-min-width);max-width:var(--page-sidebar-max-width);min-height:0;font-size:var(--page-sidebar-font);transition:width var(--page-duration) var(--page-easing);flex-direction:column;flex-shrink:0;display:flex;position:relative;container:sidebar/inline-size}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>[data-resize]{cursor:col-resize;width:6px;transition:background var(--page-duration-fast) var(--page-easing);z-index:2;background:0 0;position:absolute;top:0;bottom:0}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>[data-resize]:hover,:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])[data-resizing]>[data-resize]{background:var(--page-sidebar-resize-accent)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])[data-resizing]{-webkit-user-select:none;user-select:none;transition:none}admin-sidebar[slot=leading]{width:var(--page-sidebar-width-leading)}admin-sidebar[slot=trailing]{width:var(--page-sidebar-width-trailing)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui),:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui){align-items:center;gap:var(--page-sidebar-gap);padding:var(--page-sidebar-px);flex-shrink:0;min-width:0;display:flex;overflow:hidden}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui){min-height:var(--page-header-height);border-bottom:var(--page-border)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui){min-height:var(--page-header-height);border-top:var(--page-border);margin-top:auto}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=icon],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=icon]{color:var(--page-header-fg-muted);flex-shrink:0;align-items:center;display:flex}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=heading],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=heading]{font-weight:var(--a-weight-medium);color:var(--a-fg)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=description],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=description]{color:var(--page-header-fg-muted);font-size:var(--a-ui-sm)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=action],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=action]{align-items:center;gap:var(--page-actions-gap);flex-shrink:0;margin-inline-start:auto;display:flex}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=action]~[slot=action],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=action]~[slot=action]{margin-inline-start:0}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=action-leading],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=action-leading]{align-items:center;gap:var(--page-actions-gap);flex-shrink:0;margin-inline-end:auto;display:flex}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(section,section-ui){padding:var(--page-sidebar-px);scrollbar-width:none;flex:1;min-height:0;overflow-y:auto}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(section,section-ui)::-webkit-scrollbar{display:none}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing]) span[slot=pad]{padding:var(--page-sidebar-px);display:block}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing]) nav-ui{border:none;padding:0}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(section,section-ui)>hr[data-nav-divider]{background:var(--page-sidebar-divider-bg);height:1px;margin:var(--page-sidebar-gap) var(--page-sidebar-px);border:none}@container sidebar (width<=96px){:is(admin-topbar,admin-statusbar){padding:var(--page-sidebar-px);justify-content:center}:is(section,section-ui){flex-direction:column;align-items:center;display:flex}select-ui [slot=display],select-ui [slot=caret]{display:none}select-ui [slot=trigger]{min-height:var(--page-header-height);justify-content:center;padding:0}select-ui [slot=leading]{--a-icon-size:var(--page-sidebar-collapsed-icon);font-size:var(--page-sidebar-collapsed-icon)}select-ui img[slot=leading]{width:var(--page-sidebar-collapsed-avatar);height:var(--page-sidebar-collapsed-avatar)}nav-ui [slot=text],nav-ui [slot=badge],nav-ui [slot=caret],nav-ui [slot=trailing],nav-ui [data-nav-label],nav-ui [data-nav-divider]{display:none!important}nav-group-ui [slot=header]{min-height:var(--nav-group-row-height);min-width:var(--nav-group-row-height);justify-content:center;padding:0}nav-item-ui{min-height:var(--nav-item-row-height);min-width:var(--nav-item-row-height);justify-content:center;width:100%;padding:0}nav-ui{width:100%}button-ui{--button-px:0;justify-content:center;width:auto!important}button-ui [slot=trailing]{display:none}:scope,:is(admin-topbar,admin-statusbar),:is(section,section-ui,nav){overflow:hidden}:is(span,p,div,h1,h2,h3,h4,h5,h6)[slot=heading],[slot=heading]:not(:has(>[slot])){display:none}button.nav-item,a.nav-item,[data-nav]{text-indent:-9999px;white-space:nowrap;justify-content:center;overflow:hidden}button.nav-item>icon-ui,a.nav-item>icon-ui,[data-nav]>icon-ui,button.nav-item>:has(>icon-ui),a.nav-item>:has(>icon-ui),[data-nav]>:has(>icon-ui){text-indent:0}}admin-page-header>:is(header,header-ui),admin-page-body>:is(section,section-ui){max-width:var(--page-content-max-width);box-sizing:border-box;width:100%;margin-inline:auto}admin-page-header>:is(header,header-ui){padding-inline:var(--page-content-inset)}admin-page-header[data-content-full]>:is(header,header-ui),admin-page-body[data-content-full]>:is(section,section-ui),admin-page-header>:is(header,header-ui)[data-content-full],admin-page-body>:is(section,section-ui)[data-content-full]{max-width:100%}admin-page-header>:is(header,header-ui){gap:var(--page-header-gap);padding-block:var(--page-content-inset) var(--page-header-gap);flex-direction:column;display:flex}admin-page-header>:is(header,header-ui):has(tabs-ui){padding-bottom:0}admin-page-header:has(>:is(header,header-ui)[data-flush]){background:0 0;border-bottom:none;position:static}admin-page-header>:is(header,header-ui)[data-compact]{padding-block:var(--page-header-px)}admin-page-header>:is(header,header-ui)>div:first-of-type{justify-content:space-between;align-items:center;gap:var(--page-header-gap);display:flex}admin-page-header h1,admin-page-header>:is(header,header-ui)>p{margin:0}admin-page-body>:is(section,section-ui){padding:var(--page-content-inset);gap:var(--page-section-gap,var(--a-space-8));flex-direction:column;display:flex}admin-page-body>iframe{border:0;flex:1;block-size:100%;inline-size:100%;display:block}[data-tab-content]>section{margin-bottom:var(--page-section-gap)}[data-tab-content]>section>h2{font-size:var(--page-section-size);font-weight:var(--page-section-weight);line-height:var(--page-section-leading);letter-spacing:var(--page-section-tracking);text-transform:var(--page-section-case);color:var(--page-section-color);margin:0 0 var(--page-section-mb);padding-bottom:var(--page-section-pb);border-bottom:var(--page-content-border)}[data-tab-content]>section>[data-section]{gap:var(--page-section-gap) var(--page-header-gap);grid-template-columns:1fr 2fr;display:grid}[data-tab-content]>section>[data-section]>aside>h3{font-size:var(--page-subsection-size);font-weight:var(--page-subsection-weight);color:var(--page-subsection-color);margin:0 0 var(--page-section-pb)}[data-tab-content]>section>[data-section]>aside>p{margin:0}@container page-content (width<=720px){[data-tab-content]>section>[data-section]{gap:var(--page-block-gap) 0;grid-template-columns:minmax(0,1fr)}}@container page-content (width<=768px){admin-page-header>:is(header,header-ui),admin-page-body>:is(section,section-ui){padding-inline:var(--a-space-8)}admin-page-body>:is(section,section-ui){padding-block:var(--a-space-8)}}@container page-content (width<=480px){admin-page-header>:is(header,header-ui),admin-page-body>:is(section,section-ui){padding-inline:var(--a-space-6)}admin-page-body>:is(section,section-ui){padding-block:var(--a-space-6)}}admin-shell [data-spacer]{flex:1}admin-shell [data-actions]{align-items:center;gap:var(--page-actions-gap);display:flex}admin-shell [data-grid]{gap:var(--page-grid-gap);grid-template-columns:1fr 1fr;display:grid}admin-shell [data-grid="3"]{grid-template-columns:1fr 1fr 1fr}admin-shell [data-col]{gap:var(--page-grid-gap);flex-direction:column;display:flex}admin-shell [data-row]{align-items:center;gap:var(--page-grid-gap);display:flex}admin-shell>admin-content{border-inline:var(--page-main-border);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}admin-content>admin-topbar,admin-shell>admin-topbar,admin-sidebar>admin-topbar{align-items:center;gap:var(--page-header-gap);padding:0 var(--a-space-3);height:var(--page-header-height);font-size:var(--page-header-font);border-bottom:var(--page-border);flex-shrink:0;display:flex}admin-content>admin-statusbar,admin-shell>admin-statusbar,admin-sidebar>admin-statusbar{align-items:center;gap:var(--page-header-gap);padding:0 var(--a-space-3);height:var(--page-header-height);font-size:var(--page-header-font);color:var(--page-header-fg-muted);border-top:var(--page-border);flex-shrink:0;display:flex}admin-sidebar>:is(admin-topbar,admin-statusbar){padding-inline:var(--page-sidebar-px)}admin-content>admin-scroll{overscroll-behavior:contain;scrollbar-width:none;background:var(--page-content-bg);border-inline:var(--page-content-border);min-height:0;box-shadow:var(--page-content-shadow);flex:1;overflow-y:auto}admin-shell[mode~=rounded]>admin-content>admin-scroll{border-radius:var(--page-content-radius)}:is(admin-scroll,admin-content) admin-page{flex-direction:column;min-height:100%;display:flex;container:page-content/inline-size}admin-page>admin-page-header{z-index:1;background:var(--page-content-header-bg);border-bottom:var(--page-content-border);box-shadow:var(--a-shadow-sm);flex-shrink:0;position:sticky;top:0}admin-page>admin-page-body{box-sizing:border-box;flex-direction:column;flex:1;width:100%;min-height:0;display:flex}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing]){min-width:var(--page-sidebar-min-width);max-width:var(--page-sidebar-max-width);min-height:0;font-size:var(--page-sidebar-font);transition:width var(--page-duration) var(--page-easing);background:var(--page-bg);flex-direction:column;flex-shrink:0;display:flex;position:relative;container:sidebar/inline-size}admin-sidebar[slot=leading]{width:var(--page-sidebar-width-leading);border-right:var(--page-border)}admin-sidebar[slot=trailing]{width:var(--page-sidebar-width-trailing);border-left:var(--page-border)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>[data-resize]{cursor:col-resize;z-index:1;-webkit-user-select:none;user-select:none;width:6px;position:absolute;top:0;bottom:0}admin-sidebar[slot=leading]>[data-resize]{right:-3px}admin-sidebar[slot=trailing]>[data-resize]{left:-3px}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>[data-resize]:hover{background:var(--page-sidebar-resize-accent);opacity:.5}admin-sidebar[resizing]{transition:none}admin-sidebar[resizing]>[data-resize]{background:var(--page-sidebar-resize-accent);opacity:.8}:is(admin-topbar,admin-statusbar)>[slot=action]:first-of-type{margin-inline-start:auto}:is(admin-topbar,admin-statusbar)>[slot=action-leading]{margin-inline-end:var(--page-actions-gap)}:is(admin-topbar,admin-statusbar)>[slot=icon]{color:var(--page-header-fg-muted);flex-shrink:0}:is(admin-topbar,admin-statusbar)>[slot=heading]{font-weight:var(--a-weight-medium,500);color:var(--a-fg)}:is(admin-topbar,admin-statusbar)>[slot=description]{color:var(--page-header-fg-muted);font-size:var(--a-ui-sm)}:is(admin-topbar,admin-statusbar)>[slot=action],:is(admin-topbar,admin-statusbar)>[slot=action-leading]{align-items:center;gap:var(--page-actions-gap);flex-shrink:0;display:flex}:is(admin-topbar,admin-statusbar)>[slot=action]~[slot=action]{margin-inline-start:0}:is(admin-topbar,admin-statusbar)>[slot=icon]{align-items:center;display:flex}admin-entity-item{--entity-item-gap:var(--a-space-1);--entity-item-px:var(--a-ui-px);--entity-item-icon-size:calc(var(--a-size) - var(--a-space-2));--entity-item-icon-color:var(--a-fg-muted);--entity-item-avatar-size:1.5rem;align-items:center;gap:var(--entity-item-gap);padding:0 var(--entity-item-px);min-width:0;display:inline-flex;overflow:hidden}admin-entity-item>[slot=icon]{color:var(--entity-item-icon-color);--a-icon-size:var(--entity-item-icon-size);flex-shrink:0;align-items:center;line-height:1;display:inline-flex}admin-entity-item>img[slot=icon]{width:var(--entity-item-avatar-size);height:var(--entity-item-avatar-size);border-radius:var(--a-radius-full);object-fit:cover}admin-entity-item>[slot=label]{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--a-ui-sm);font-weight:var(--a-weight-medium,500);color:var(--a-fg);flex:1;overflow:hidden}admin-entity-item>[slot=badge]{flex-shrink:0}@container sidebar (width<=96px){admin-entity-item>[slot=label],admin-entity-item>[slot=badge]{display:none}}
1
+ :where(admin-shell){--page-bg:var(--a-canvas-1);--page-border:1px solid var(--a-border-subtle);--page-main-border:var(--page-border);--page-header-height:var(--a-chrome-app-header-height);--page-header-px:var(--a-space-3);--page-header-gap:var(--a-space-3);--page-header-font:var(--a-ui-size);--page-header-fg-muted:var(--a-fg-muted);--page-sidebar-px:var(--a-space-1);--page-sidebar-gap:var(--a-space-1);--page-sidebar-font:var(--a-ui-size);--page-sidebar-min-width:48px;--page-sidebar-max-width:480px;--page-sidebar-resize-accent:var(--a-accent);--page-sidebar-divider-bg:var(--a-border-subtle);--page-sidebar-width-leading:clamp(var(--page-sidebar-min-width), 200px, 240px);--page-sidebar-width-trailing:clamp(var(--page-sidebar-min-width), 200px, 240px);--page-content-bg:var(--a-canvas-0);--page-content-header-bg:var(--a-canvas-0);--page-content-radius:var(--a-radius-lg);--page-content-inset:var(--a-space-10);--page-content-max-width:1540px;--page-content-border:1px solid var(--a-border-subtle);--page-content-shadow:var(--a-shadow-sm);--page-content-bp-sm:480px;--page-content-bp-md:720px;--page-content-bp-lg:1024px;--page-section-gap:var(--a-space-6);--page-block-gap:var(--a-space-4);--page-deck-gap:var(--a-space-1);--page-section-size:var(--a-kicker-size);--page-section-weight:var(--a-kicker-weight);--page-section-leading:var(--a-kicker-leading);--page-section-tracking:var(--a-kicker-tracking);--page-section-case:var(--a-kicker-case);--page-section-color:var(--a-kicker-color);--page-section-mb:var(--a-space-3);--page-section-pb:var(--a-space-2);--page-subsection-size:var(--a-subsection-size);--page-subsection-weight:var(--a-subsection-weight);--page-subsection-color:var(--a-subsection-color);--page-sidebar-collapsed-icon:1.0625rem;--page-sidebar-collapsed-avatar:1.5rem;--page-actions-gap:var(--a-space-2);--page-grid-gap:var(--a-space-3);--page-duration:var(--a-duration);--page-duration-fast:var(--a-duration-fast);--page-easing:var(--a-easing);--page-font-family:var(--a-font-family);--page-body-size:var(--a-body-size);--nav-duration:var(--a-duration);--nav-duration-fast:var(--a-duration-fast);--nav-easing:var(--a-easing);--nav-label-px:var(--a-space-2);--nav-label-py:var(--a-space-1);--nav-label-font-size:var(--a-kicker-sm);--nav-label-weight:var(--a-weight-medium);--nav-label-fg:var(--a-fg-muted);--nav-divider-bg:var(--a-border-subtle);--nav-divider-my:var(--a-space-1);--nav-group-indent-rail-bg:var(--a-border-subtle);--nav-group-icon-font-size:var(--a-ui-size);--nav-group-text-weight:var(--a-weight-medium);--nav-group-badge-bg:var(--a-bg-muted);--nav-group-badge-px:var(--a-space-1);--nav-group-badge-radius:var(--a-radius-full);--nav-item-icon-font-size:var(--a-ui-size);--nav-item-selected-weight:var(--a-weight-medium);--nav-item-badge-fg:var(--a-fg-muted);--nav-item-badge-bg:var(--a-bg-muted);--nav-item-badge-px:var(--a-space-1);--nav-item-badge-radius:var(--a-radius-full);--nav-item-trailing-font:var(--a-ui-sm);--nav-item-trailing-fg:var(--a-fg-muted);--nav-item-trailing-border:var(--a-border-subtle);--nav-item-trailing-radius:var(--a-radius-sm);--nav-item-trailing-px:var(--a-space-0-5);--a-icon-size:18px}admin-shell[mode~=borderless]{--page-main-border:none;--page-border:none}admin-shell{background:var(--page-bg);overscroll-behavior:none;height:100dvh;font-family:var(--page-font-family);font-size:var(--page-body-size);display:flex;position:fixed;inset:0;overflow:hidden}admin-shell:not(:has(>:is(asideadmin-sidebar[slot=trailing],admin-sidebar[slot=trailing]):not([hidden])))>admin-content>admin-scroll{margin-inline-end:var(--a-space-2)}admin-shell:not(:has(>:is(header,header-ui,admin-topbar):not([hidden]),>admin-content>admin-topbar:not([hidden])))>admin-content>admin-scroll{margin-block-start:var(--a-space-2)}admin-shell:not(:has(>:is(footer,footer-ui,admin-statusbar):not([hidden]),>admin-content>admin-statusbar:not([hidden])))>admin-content>admin-scroll{margin-block-end:var(--a-space-2)}admin-shell>admin-content>admin-scroll::-webkit-scrollbar{display:none}admin-shell>admin-content>admin-scroll:has(>[data-subnav]:not([hidden])){grid-template-columns:var(--subnav-width,14rem) 1fr;grid-template-rows:minmax(0,1fr);gap:0;display:grid}admin-shell>admin-content>admin-scroll>[data-subnav]{overscroll-behavior:contain;border-inline-end:1px solid var(--a-border-subtle);min-height:0;padding-block:var(--a-space-2);padding-inline:var(--a-space-2);overflow-y:auto}@container (width<=40rem){admin-shell>admin-content>admin-scroll:has(>[data-subnav]:not([hidden])){grid-template-columns:1fr}admin-shell>admin-content>admin-scroll>[data-subnav]{border-inline-end:none;border-block-end:1px solid var(--a-border-subtle)}}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing]){min-width:var(--page-sidebar-min-width);max-width:var(--page-sidebar-max-width);min-height:0;font-size:var(--page-sidebar-font);transition:width var(--page-duration) var(--page-easing);flex-direction:column;flex-shrink:0;display:flex;position:relative;container:sidebar/inline-size}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>[data-resize]{cursor:col-resize;width:6px;transition:background var(--page-duration-fast) var(--page-easing);z-index:2;background:0 0;position:absolute;top:0;bottom:0}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>[data-resize]:hover,:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])[data-resizing]>[data-resize]{background:var(--page-sidebar-resize-accent)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])[data-resizing]{-webkit-user-select:none;user-select:none;transition:none}admin-sidebar[slot=leading]{width:var(--page-sidebar-width-leading)}admin-sidebar[slot=trailing]{width:var(--page-sidebar-width-trailing)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui),:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui){align-items:center;gap:var(--page-sidebar-gap);padding:var(--page-sidebar-px);flex-shrink:0;min-width:0;display:flex;overflow:hidden}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui){min-height:var(--page-header-height);border-bottom:var(--page-border)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui){min-height:var(--page-header-height);border-top:var(--page-border);margin-top:auto}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=icon],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=icon]{color:var(--page-header-fg-muted);flex-shrink:0;align-items:center;display:flex}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=heading],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=heading]{font-weight:var(--a-weight-medium);color:var(--a-fg)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=description],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=description]{color:var(--page-header-fg-muted);font-size:var(--a-ui-sm)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=action],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=action]{align-items:center;gap:var(--page-actions-gap);flex-shrink:0;margin-inline-start:auto;display:flex}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=action]~[slot=action],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=action]~[slot=action]{margin-inline-start:0}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(header,header-ui)>[slot=action-leading],:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(footer,footer-ui)>[slot=action-leading]{align-items:center;gap:var(--page-actions-gap);flex-shrink:0;margin-inline-end:auto;display:flex}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(section,section-ui){padding:var(--page-sidebar-px);scrollbar-width:none;flex:1;min-height:0;overflow-y:auto}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(section,section-ui)::-webkit-scrollbar{display:none}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing]) span[slot=pad]{padding:var(--page-sidebar-px);display:block}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing]) nav-ui{border:none;padding:0}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>:is(section,section-ui)>hr[data-nav-divider]{background:var(--page-sidebar-divider-bg);height:1px;margin:var(--page-sidebar-gap) var(--page-sidebar-px);border:none}@container sidebar (width<=96px){:is(admin-topbar,admin-statusbar){padding:var(--page-sidebar-px);justify-content:center}:is(section,section-ui){flex-direction:column;align-items:center;display:flex}select-ui [slot=display],select-ui [slot=caret]{display:none}select-ui [slot=trigger]{min-height:var(--page-header-height);justify-content:center;padding:0}select-ui [slot=leading]{--a-icon-size:var(--page-sidebar-collapsed-icon);font-size:var(--page-sidebar-collapsed-icon)}select-ui img[slot=leading]{width:var(--page-sidebar-collapsed-avatar);height:var(--page-sidebar-collapsed-avatar)}nav-ui [slot=text],nav-ui [slot=badge],nav-ui [slot=caret],nav-ui [slot=trailing],nav-ui [data-nav-label],nav-ui [data-nav-divider]{display:none!important}nav-group-ui [slot=header]{min-height:var(--nav-group-row-height);min-width:var(--nav-group-row-height);justify-content:center;padding:0}nav-item-ui{min-height:var(--nav-item-row-height);min-width:var(--nav-item-row-height);justify-content:center;width:100%;padding:0}nav-ui{width:100%}button-ui{--button-px:0;justify-content:center;width:auto!important}button-ui [slot=trailing]{display:none}:scope,:is(admin-topbar,admin-statusbar),:is(section,section-ui,nav){overflow:hidden}:is(span,p,div,h1,h2,h3,h4,h5,h6)[slot=heading],[slot=heading]:not(:has(>[slot])){display:none}button.nav-item,a.nav-item,[data-nav]{text-indent:-9999px;white-space:nowrap;justify-content:center;overflow:hidden}button.nav-item>icon-ui,a.nav-item>icon-ui,[data-nav]>icon-ui,button.nav-item>:has(>icon-ui),a.nav-item>:has(>icon-ui),[data-nav]>:has(>icon-ui){text-indent:0}}admin-page-header>:is(header,header-ui),admin-page-body>:is(section,section-ui),admin-page-footer>:is(footer,footer-ui){max-width:var(--page-content-max-width);box-sizing:border-box;width:100%;margin-inline:auto}admin-page-header>:is(header,header-ui){padding-inline:var(--page-content-inset)}admin-page-header[data-content-full]>:is(header,header-ui),admin-page-body[data-content-full]>:is(section,section-ui),admin-page-footer[data-content-full]>:is(footer,footer-ui),admin-page-header>:is(header,header-ui)[data-content-full],admin-page-body>:is(section,section-ui)[data-content-full],admin-page-footer>:is(footer,footer-ui)[data-content-full]{max-width:100%}admin-page-header>:is(header,header-ui){gap:var(--page-header-gap);padding-block:var(--page-content-inset) var(--page-header-gap);flex-direction:column;display:flex}admin-page-header>:is(header,header-ui):has(tabs-ui){padding-bottom:0}admin-page-header:has(>:is(header,header-ui)[data-flush]){background:0 0;border-bottom:none;position:static}admin-page-header>:is(header,header-ui)[data-compact]{padding-block:var(--page-header-px)}admin-page-header>:is(header,header-ui)>div:first-of-type{justify-content:space-between;align-items:center;gap:var(--page-header-gap);display:flex}admin-page-header h1,admin-page-header>:is(header,header-ui)>p{margin:0}admin-page-body>:is(section,section-ui){padding:var(--page-content-inset);gap:var(--page-section-gap,var(--a-space-8));flex-direction:column;display:flex}admin-page-footer>:is(footer,footer-ui){justify-content:flex-end;align-items:center;gap:var(--page-header-gap);padding-inline:var(--page-content-inset);padding-block:var(--page-header-gap);display:flex}admin-page-body>iframe{border:0;flex:1;block-size:100%;inline-size:100%;display:block}[data-tab-content]>section{margin-bottom:var(--page-section-gap)}[data-tab-content]>section>h2{font-size:var(--page-section-size);font-weight:var(--page-section-weight);line-height:var(--page-section-leading);letter-spacing:var(--page-section-tracking);text-transform:var(--page-section-case);color:var(--page-section-color);margin:0 0 var(--page-section-mb);padding-bottom:var(--page-section-pb);border-bottom:var(--page-content-border)}[data-tab-content]>section>[data-section]{gap:var(--page-section-gap) var(--page-header-gap);grid-template-columns:1fr 2fr;display:grid}[data-tab-content]>section>[data-section]>aside>h3{font-size:var(--page-subsection-size);font-weight:var(--page-subsection-weight);color:var(--page-subsection-color);margin:0 0 var(--page-section-pb)}[data-tab-content]>section>[data-section]>aside>p{margin:0}@container page-content (width<=720px){[data-tab-content]>section>[data-section]{gap:var(--page-block-gap) 0;grid-template-columns:minmax(0,1fr)}}@container page-content (width<=768px){admin-page-header>:is(header,header-ui),admin-page-body>:is(section,section-ui){padding-inline:var(--a-space-8)}admin-page-body>:is(section,section-ui){padding-block:var(--a-space-8)}}@container page-content (width<=480px){admin-page-header>:is(header,header-ui),admin-page-body>:is(section,section-ui){padding-inline:var(--a-space-6)}admin-page-body>:is(section,section-ui){padding-block:var(--a-space-6)}}admin-shell [data-spacer]{flex:1}admin-shell [data-actions]{align-items:center;gap:var(--page-actions-gap);display:flex}admin-shell [data-grid]{gap:var(--page-grid-gap);grid-template-columns:1fr 1fr;display:grid}admin-shell [data-grid="3"]{grid-template-columns:1fr 1fr 1fr}admin-shell [data-col]{gap:var(--page-grid-gap);flex-direction:column;display:flex}admin-shell [data-row]{align-items:center;gap:var(--page-grid-gap);display:flex}admin-shell>admin-content{border-inline:var(--page-main-border);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}admin-content>admin-topbar,admin-shell>admin-topbar,admin-sidebar>admin-topbar{align-items:center;gap:var(--page-header-gap);padding:0 var(--a-space-3);height:var(--page-header-height);font-size:var(--page-header-font);border-bottom:var(--page-border);flex-shrink:0;display:flex}admin-content>admin-statusbar,admin-shell>admin-statusbar,admin-sidebar>admin-statusbar{align-items:center;gap:var(--page-header-gap);padding:0 var(--a-space-3);height:var(--page-header-height);font-size:var(--page-header-font);color:var(--page-header-fg-muted);border-top:var(--page-border);flex-shrink:0;display:flex}admin-sidebar>:is(admin-topbar,admin-statusbar){padding-inline:var(--page-sidebar-px)}admin-content>admin-scroll{overscroll-behavior:contain;scrollbar-width:none;background:var(--page-content-bg);border-inline:var(--page-content-border);min-height:0;box-shadow:var(--page-content-shadow);flex:1;overflow-y:auto}admin-shell[mode~=rounded]>admin-content>admin-scroll{border-radius:var(--page-content-radius)}:is(admin-scroll,admin-content) admin-page{flex-direction:column;min-height:100%;display:flex;container:page-content/inline-size}admin-page>admin-page-header{z-index:1;background:var(--page-content-header-bg);border-bottom:var(--page-content-border);box-shadow:var(--a-shadow-sm);flex-shrink:0;position:sticky;top:0}admin-page>admin-page-body{box-sizing:border-box;flex-direction:column;flex:1;width:100%;min-height:0;display:flex}admin-page>admin-page-footer{z-index:1;background:var(--page-content-header-bg);border-top:var(--page-content-border);flex-shrink:0;position:sticky;bottom:0}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing]){min-width:var(--page-sidebar-min-width);max-width:var(--page-sidebar-max-width);min-height:0;font-size:var(--page-sidebar-font);transition:width var(--page-duration) var(--page-easing);background:var(--page-bg);flex-direction:column;flex-shrink:0;display:flex;position:relative;container:sidebar/inline-size}admin-sidebar[slot=leading]{width:var(--page-sidebar-width-leading);border-right:var(--page-border)}admin-sidebar[slot=trailing]{width:var(--page-sidebar-width-trailing);border-left:var(--page-border)}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>[data-resize]{cursor:col-resize;z-index:1;-webkit-user-select:none;user-select:none;width:6px;position:absolute;top:0;bottom:0}admin-sidebar[slot=leading]>[data-resize]{right:-3px}admin-sidebar[slot=trailing]>[data-resize]{left:-3px}:is(admin-sidebar[slot=leading],admin-sidebar[slot=trailing])>[data-resize]:hover{background:var(--page-sidebar-resize-accent);opacity:.5}admin-sidebar[resizing]{transition:none}admin-sidebar[resizing]>[data-resize]{background:var(--page-sidebar-resize-accent);opacity:.8}:is(admin-topbar,admin-statusbar)>[slot=action]:first-of-type{margin-inline-start:auto}:is(admin-topbar,admin-statusbar)>[slot=action-leading]{margin-inline-end:var(--page-actions-gap)}:is(admin-topbar,admin-statusbar)>[slot=icon]{color:var(--page-header-fg-muted);flex-shrink:0}:is(admin-topbar,admin-statusbar)>[slot=heading]{font-weight:var(--a-weight-medium,500);color:var(--a-fg)}:is(admin-topbar,admin-statusbar)>[slot=description]{color:var(--page-header-fg-muted);font-size:var(--a-ui-sm)}:is(admin-topbar,admin-statusbar)>[slot=action],:is(admin-topbar,admin-statusbar)>[slot=action-leading]{align-items:center;gap:var(--page-actions-gap);flex-shrink:0;display:flex}:is(admin-topbar,admin-statusbar)>[slot=action]~[slot=action]{margin-inline-start:0}:is(admin-topbar,admin-statusbar)>[slot=icon]{align-items:center;display:flex}admin-entity-item{--entity-item-gap:var(--a-space-1);--entity-item-px:var(--a-ui-px);--entity-item-icon-size:calc(var(--a-size) - var(--a-space-2));--entity-item-icon-color:var(--a-fg-muted);--entity-item-avatar-size:1.5rem;align-items:center;gap:var(--entity-item-gap);padding:0 var(--entity-item-px);min-width:0;display:inline-flex;overflow:hidden}admin-entity-item>[slot=icon]{color:var(--entity-item-icon-color);--a-icon-size:var(--entity-item-icon-size);flex-shrink:0;align-items:center;line-height:1;display:inline-flex}admin-entity-item>img[slot=icon]{width:var(--entity-item-avatar-size);height:var(--entity-item-avatar-size);border-radius:var(--a-radius-full);object-fit:cover}admin-entity-item>[slot=label]{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--a-ui-sm);font-weight:var(--a-weight-medium,500);color:var(--a-fg);flex:1;overflow:hidden}admin-entity-item>[slot=badge]{flex-shrink:0}@container sidebar (width<=96px){admin-entity-item>[slot=label],admin-entity-item>[slot=badge]{display:none}}
@@ -1,4 +1,4 @@
1
- var S=Symbol("signal"),f=null,h=null,_=!1;function P(t){for(let e of t){if(e.disposed){t.delete(e);continue}e.dirty=!0,h||(h=new Set,_||queueMicrotask(q)),h.add(e)}}function q(){let t,e=0;for(;t=h;){if(++e>100){h=null,console.error("signals: drain loop exceeded 100 iterations");break}h=null;for(let n of t)if(!n.disposed&&n.dirty){n.dirty=!1;try{n.run()}catch(r){n.onError?n.onError(r):(n.disposed=!0,queueMicrotask(()=>{throw r}))}}}}function K(t){if(_){t();return}_=!0;try{t()}finally{_=!1,h&&q()}}function T(t){let e=f;f=null;try{return t()}finally{f=e}}function p(t){let e=new Set;return{[S]:!0,get value(){return f&&e.add(f),t},set value(n){Object.is(t,n)||(t=n,P(e))},peek(){return t}}}function k(t){let e=new Set,n,r=!0,i={dirty:!1,disposed:!1,run(){r=!0,P(e)}};return{[S]:!0,get value(){if(f&&e.add(f),r){let s=f;f=i;try{n=t(),r=!1}finally{f=s}}return n},peek(){return n}}}function m(t,e){let n={dirty:!1,disposed:!1,host:e?.host??null,onError:e?.onError??null,run(){let r=f;f=n;try{t()}finally{f=r}}};return n.run(),()=>{n.disposed=!0}}function O(t){return t!=null&&typeof t=="object"&&t[S]===!0}var[v,b]=[Symbol(),Symbol()];function V(t,...e){return{strings:t,values:e}}function X(t,...e){let n="";for(let i=0;i<t.length;i++)n+=t[i],i<e.length&&(n+=e[i]);let r=new CSSStyleSheet;return r.replaceSync(n),r}var I=new WeakMap;function Y(t){let e=0,n=0,r=0;for(;r<t.length;){if(e===0&&t.charCodeAt(r)===60&&t.charCodeAt(r+1)===33&&t.charCodeAt(r+2)===45&&t.charCodeAt(r+3)===45){let s=t.indexOf("-->",r+4);if(s===-1){n=0;break}r=s+3,n=0;continue}let i=t.charCodeAt(r);e?i===(e===1?39:34)&&(e=0):i===39?e=1:i===34?e=2:i===60?n=1:i===62&&(n=0),r++}return n===1}function J(t){let e=I.get(t);if(e)return e;let n="";for(let r=0;r<t.length;r++)n+=t[r],r<t.length-1&&(n+=Y(n)?`{{p:${r}}}`:`<!--p:${r}-->`);return e=document.createElement("template"),e.innerHTML=n,I.set(t,e),e}var R={classname:"className",innertext:"innerText",innerhtml:"innerHTML",outerhtml:"outerHTML",textcontent:"textContent",tabindex:"tabIndex",arialabel:"ariaLabel",ariadescribedby:"ariaDescribedBy",arialabelledby:"ariaLabelledBy",ariarole:"role",contenteditable:"contentEditable",readonly:"readOnly",maxlength:"maxLength",minlength:"minLength",colspan:"colSpan",rowspan:"rowSpan",cellpadding:"cellPadding",cellspacing:"cellSpacing",usemap:"useMap",ismap:"isMap",accesskey:"accessKey",defaultchecked:"defaultChecked",defaultvalue:"defaultValue",defaultselected:"defaultSelected"};function B(t,e){if(R[e])return R[e];let n=Object.getOwnPropertyNames(t);for(let i=0;i<n.length;i++){let s=n[i];if(s!==e&&s.toLowerCase()===e)return s}let r=Object.getPrototypeOf(t);for(;r&&r!==Object.prototype;){let i=Object.getOwnPropertyNames(r);for(let s=0;s<i.length;s++){let a=i[s];if(a!==e&&a.toLowerCase()===e)return a}r=Object.getPrototypeOf(r)}return e}function g(t,e){let n=e._i;(!n||n.s!==t.strings)&&(n&&A(n.p),n=Q(t,e),e._i=n),ne(n.p,t.values)}function Q(t,e){let{strings:n}=t,i=J(n).content.cloneNode(!0),s=Z(e);s&&(i=ee(i,s));let a=te(i,t.values.length);return e.replaceChildren(i),{s:n,p:a}}var C="http://www.w3.org/2000/svg",y="http://www.w3.org/1998/Math/MathML",D="http://www.w3.org/1999/xhtml";function Z(t){if(!t||t.nodeType!==1)return null;if(t.namespaceURI===C)return C;if(t.namespaceURI===y)return y;if(typeof t.closest!="function")return null;let e=t.closest("svg, math, foreignObject, annotation-xml");if(!e)return null;let n=e.localName;if(n==="foreignobject"||n==="foreignObject")return null;if(n==="annotation-xml"){let r=(e.getAttribute("encoding")||"").toLowerCase();return r==="text/html"||r==="application/xhtml+xml"?null:y}return n==="svg"?C:n==="math"?y:null}function ee(t,e){let n=document.createDocumentFragment();return H(t,n,e),n}function H(t,e,n){for(let r of[...t.childNodes])if(r.nodeType===1){let s=document.createElementNS(n,r.localName);for(let o of r.attributes)o.namespaceURI?s.setAttributeNS(o.namespaceURI,o.name,o.value):s.setAttribute(o.name,o.value);e.appendChild(s);let a=r.localName,c=n;if(n===C&&(a==="foreignObject"||a==="foreignobject"))c=D;else if(n===y&&a==="annotation-xml"){let o=(r.getAttribute("encoding")||"").toLowerCase();(o==="text/html"||o==="application/xhtml+xml")&&(c=D)}H(r,s,c)}else e.appendChild(r.cloneNode(!0))}function te(t,e){let n=new Array(e),r=document.createTreeWalker(t,129),i;for(;i=r.nextNode();)if(i.nodeType===8){let s=i.data.match(/^p:(\d+)$/);if(s){let a=document.createTextNode("");i.replaceWith(a),r.currentNode=a,n[+s[1]]={t:"n",n:a,c:void 0,_fx:null}}}else if(i.nodeType===1)for(let s of[...i.attributes]){let a=s.value.match(/^\{\{p:(\d+)\}\}$/);if(!a){if(s.value.includes("{{p:")){let l=s.name,u=l==="class"?' class="${expression}" \u2190 full replacement (whole class string is the expression)\n .className=${expression} \u2190 writes to the className property (resolved camelCase since FB-55 fix)\n':l==="style"?' style="${expression}" \u2190 full replacement of the style string\n .style.cssText=${expression} \u2190 write CSS text via the style.cssText accessor\n':` ${l}="\${expression}" \u2190 full replacement (whole attr is the placeholder)
1
+ var S=Symbol("signal"),f=null,h=null,_=!1;function P(t){for(let e of t){if(e.disposed){t.delete(e);continue}e.dirty=!0,h||(h=new Set,_||queueMicrotask(q)),h.add(e)}}function q(){let t,e=0;for(;t=h;){if(++e>100){h=null,console.error("signals: drain loop exceeded 100 iterations");break}h=null;for(let n of t)if(!n.disposed&&n.dirty){n.dirty=!1;try{n.run()}catch(r){n.onError?n.onError(r):(n.disposed=!0,queueMicrotask(()=>{throw r}))}}}}function K(t){if(_){t();return}_=!0;try{t()}finally{_=!1,h&&q()}}function T(t){let e=f;f=null;try{return t()}finally{f=e}}function p(t){let e=new Set;return{[S]:!0,get value(){return f&&e.add(f),t},set value(n){Object.is(t,n)||(t=n,P(e))},peek(){return t}}}function k(t){let e=new Set,n,r=!0,i={dirty:!1,disposed:!1,run(){r=!0,P(e)}};return{[S]:!0,get value(){if(f&&e.add(f),r){let s=f;f=i;try{n=t(),r=!1}finally{f=s}}return n},peek(){return n}}}function m(t,e){let n={dirty:!1,disposed:!1,host:e?.host??null,onError:e?.onError??null,run(){let r=f;f=n;try{t()}finally{f=r}}};return n.run(),()=>{n.disposed=!0}}function O(t){return t!=null&&typeof t=="object"&&t[S]===!0}var[v,b]=[Symbol(),Symbol()];function V(t,...e){return{strings:t,values:e}}function X(t,...e){let n="";for(let i=0;i<t.length;i++)n+=t[i],i<e.length&&(n+=e[i]);let r=new CSSStyleSheet;return r.replaceSync(n),r}var I=new WeakMap;function Y(t){let e=0,n=0,r=0;for(;r<t.length;){if(e===0&&t.charCodeAt(r)===60&&t.charCodeAt(r+1)===33&&t.charCodeAt(r+2)===45&&t.charCodeAt(r+3)===45){let s=t.indexOf("-->",r+4);if(s===-1){n=0;break}r=s+3,n=0;continue}let i=t.charCodeAt(r);e?i===(e===1?39:34)&&(e=0):i===39?e=1:i===34?e=2:i===60?n=1:i===62&&(n=0),r++}return n===1}function J(t){let e=I.get(t);if(e)return e;let n="";for(let r=0;r<t.length;r++)n+=t[r],r<t.length-1&&(n+=Y(n)?`{{p:${r}}}`:`<!--p:${r}-->`);return e=document.createElement("template"),e.innerHTML=n,I.set(t,e),e}var R={classname:"className",innertext:"innerText",innerhtml:"innerHTML",outerhtml:"outerHTML",textcontent:"textContent",tabindex:"tabIndex",arialabel:"ariaLabel",ariadescribedby:"ariaDescribedBy",arialabelledby:"ariaLabelledBy",ariarole:"role",contenteditable:"contentEditable",readonly:"readOnly",maxlength:"maxLength",minlength:"minLength",colspan:"colSpan",rowspan:"rowSpan",cellpadding:"cellPadding",cellspacing:"cellSpacing",usemap:"useMap",ismap:"isMap",accesskey:"accessKey",defaultchecked:"defaultChecked",defaultvalue:"defaultValue",defaultselected:"defaultSelected"};function B(t,e){if(R[e])return R[e];let n=Object.getOwnPropertyNames(t);for(let i=0;i<n.length;i++){let s=n[i];if(s!==e&&s.toLowerCase()===e)return s}let r=Object.getPrototypeOf(t);for(;r&&r!==Object.prototype;){let i=Object.getOwnPropertyNames(r);for(let s=0;s<i.length;s++){let a=i[s];if(a!==e&&a.toLowerCase()===e)return a}r=Object.getPrototypeOf(r)}return e}function g(t,e){let n=e._i;(!n||n.s!==t.strings)&&(n&&C(n.p),n=Q(t,e),e._i=n),ne(n.p,t.values)}function Q(t,e){let{strings:n}=t,i=J(n).content.cloneNode(!0),s=Z(e);s&&(i=ee(i,s));let a=te(i,t.values.length);return e.replaceChildren(i),{s:n,p:a}}var A="http://www.w3.org/2000/svg",y="http://www.w3.org/1998/Math/MathML",D="http://www.w3.org/1999/xhtml";function Z(t){if(!t||t.nodeType!==1)return null;if(t.namespaceURI===A)return A;if(t.namespaceURI===y)return y;if(typeof t.closest!="function")return null;let e=t.closest("svg, math, foreignObject, annotation-xml");if(!e)return null;let n=e.localName;if(n==="foreignobject"||n==="foreignObject")return null;if(n==="annotation-xml"){let r=(e.getAttribute("encoding")||"").toLowerCase();return r==="text/html"||r==="application/xhtml+xml"?null:y}return n==="svg"?A:n==="math"?y:null}function ee(t,e){let n=document.createDocumentFragment();return H(t,n,e),n}function H(t,e,n){for(let r of[...t.childNodes])if(r.nodeType===1){let s=document.createElementNS(n,r.localName);for(let o of r.attributes)o.namespaceURI?s.setAttributeNS(o.namespaceURI,o.name,o.value):s.setAttribute(o.name,o.value);e.appendChild(s);let a=r.localName,c=n;if(n===A&&(a==="foreignObject"||a==="foreignobject"))c=D;else if(n===y&&a==="annotation-xml"){let o=(r.getAttribute("encoding")||"").toLowerCase();(o==="text/html"||o==="application/xhtml+xml")&&(c=D)}H(r,s,c)}else e.appendChild(r.cloneNode(!0))}function te(t,e){let n=new Array(e),r=document.createTreeWalker(t,129),i;for(;i=r.nextNode();)if(i.nodeType===8){let s=i.data.match(/^p:(\d+)$/);if(s){let a=document.createTextNode("");i.replaceWith(a),r.currentNode=a,n[+s[1]]={t:"n",n:a,c:void 0,_fx:null}}}else if(i.nodeType===1)for(let s of[...i.attributes]){let a=s.value.match(/^\{\{p:(\d+)\}\}$/);if(!a){if(s.value.includes("{{p:")){let l=s.name,u=l==="class"?' class="${expression}" \u2190 full replacement (whole class string is the expression)\n .className=${expression} \u2190 writes to the className property (resolved camelCase since FB-55 fix)\n':l==="style"?' style="${expression}" \u2190 full replacement of the style string\n .style.cssText=${expression} \u2190 write CSS text via the style.cssText accessor\n':` ${l}="\${expression}" \u2190 full replacement (whole attr is the placeholder)
2
2
  .${l}=\${expression} \u2190 property assignment (preferred for objects/functions)
3
3
  `;console.warn(`[template] Partial attribute interpolation is not supported.
4
4
  Element: <${i.tagName.toLowerCase()}>
@@ -7,4 +7,4 @@ var S=Symbol("signal"),f=null,h=null,_=!1;function P(t){for(let e of t){if(e.dis
7
7
  `+u+" Compute the full attr value as a single expression and interpolate the whole.")}continue}let c=+a[1],o=s.name;o[0]==="@"?(i.removeAttribute(o),n[c]={t:"e",n:i,name:o.slice(1),c:void 0,_fx:null}):o[0]==="."?(i.removeAttribute(o),n[c]={t:"p",n:i,name:B(i,o.slice(1)),c:void 0,_fx:null,_resolved:!1}):o[0]==="?"?(i.removeAttribute(o),console.warn(`[template] Lit-style boolean attribute "${o}=" is not supported.
8
8
  Element: <${i.tagName.toLowerCase()}>
9
9
  Use .${o.slice(1)}=\${value} (property binding) instead \u2014 the primitive reflects the property to the DOM attribute for you.
10
- See USAGE.md \xA7 Template parser \u2014 invariants + unsupported syntaxes.`),n[c]={t:"n",n:document.createTextNode(""),c:void 0,_fx:null}):n[c]={t:"a",n:i,name:o,c:void 0,_fx:null}}return n}function A(t){for(let e of t)e&&e._fx&&(e._fx(),e._fx=null)}function M(t){if(t.n.nodeType===1&&t.n[v])return t.n;let e=document.createElement("span");return e.style.display="contents",e[v]=!0,t.n.replaceWith(e),t.n=e,e}var U=t=>t!=null&&typeof t=="object"&&t.strings,W=t=>typeof t=="function"||t!=null&&typeof t.handleEvent=="function";function j(t,e){if(e!==t.c){if(t.t==="n")if(e!=null&&e._directive)e._commit(M(t));else if(U(e))g(e,M(t));else if(Array.isArray(e)){let n=M(t);n.replaceChildren();for(let r of e)if(U(r)){let i=document.createElement("span");i.style.display="contents",n.appendChild(i),g(r,i)}else n.appendChild(document.createTextNode(r??""))}else if(e instanceof Node)t.n.replaceWith(e),t.n=e;else if(t.n[v]){let n=document.createTextNode(e??"");t.n.replaceWith(n),t.n=n}else t.n.textContent=e??"";else if(t.t==="a")e==null||e===!1?t.n.removeAttribute(t.name):t.n.setAttribute(t.name,e===!0?"":e);else if(t.t==="p"){if(!t._resolved){let n=B(t.n,t.name);n!==t.name&&(t.name=n),t._resolved=!0}t.n[t.name]=e}else t.t==="e"&&(W(t.c)&&t.n.removeEventListener(t.name,t.c),W(e)&&t.n.addEventListener(t.name,e));t.c=e}}function ne(t,e){for(let n=0;n<t.length;n++){let r=t[n];if(!r)continue;let i=e[n],s=r.t!=="e"&&typeof i=="function",a=!s&&r.t!=="e"&&O(i);if(r._fx&&!s&&!a&&(r._fx(),r._fx=null),s){r._fx||(r._fx=m(()=>j(r,i())));continue}if(a){r._fx||(r._fx=m(()=>j(r,i.value)));continue}j(r,i)}}function re(t,e,n){return{_directive:!0,_commit(r){let i=r[b]||new Map,s=new Map,a=[];for(let o=0;o<t.length;o++){let l=e(t[o],o);if(s.has(l))continue;a.push(l);let u=n(t[o],o);if(i.has(l)){let d=i.get(l);g(u,d),s.set(l,d)}else{let d=document.createElement("span");d.style.display="contents",g(u,d),s.set(l,d)}}for(let[o,l]of i)s.has(o)||(l._i&&A(l._i.p),l.remove());let c=null;for(let o=a.length-1;o>=0;o--){let l=s.get(a[o]);(l.nextSibling!==c||l.parentNode!==r)&&r.insertBefore(l,c),c=l}r[b]=s}}}var $=new Map,F=new Set(["input-interaction","keyboard-navigation","forms-data","layout-measurement","motion-positioning","animation-feedback","visual-dynamics","interaction-delight","audio-haptics-sensory"]);function de(t){if(!t.name)throw new Error("Trait requires a name");if(!t.setup)throw new Error(`Trait "${t.name}" requires a setup function`);if(!t.category)throw new Error(`Trait "${t.name}" requires a category`);if(!F.has(t.category))throw new Error(`Trait "${t.name}" has unknown category "${t.category}". Known: ${[...F].join(", ")}`);if(!t.description)throw new Error(`Trait "${t.name}" requires a description`);let e=Object.freeze({name:t.name,category:t.category,description:t.description,attributes:Object.freeze(t.attributes||[]),events:Object.freeze(t.events||[]),config:Object.freeze(t.config||[])});function n(){let r=null;return{schema:e,connect(i,s){r=t.setup({host:i,...s||{}})},disconnect(i){r&&(r(),r=null);for(let s of e.attributes)i.hasAttribute(s)&&(console.warn(`Trait "${e.name}": attribute "${s}" still present after disconnect`),i.removeAttribute(s))}}}return n.schema=e,$.set(t.name,n),n}function z(t){return $.get(t)||null}function he(t){return $.get(t)?.schema||null}function me(){return[...$.keys()]}var L=Symbol(),w=Symbol();function ie(t,e){t[w]=new Map,t[L]=new Map;for(let[n,r]of Object.entries(e)){let i=r.attribute??n.toLowerCase(),s=r.type??String,a=p(r.default??void 0);t[L].set(n,a),Object.defineProperty(t,n,{get(){return a.value},set(c){let o=a.peek();Object.is(o,c)||(t[w].set(n,o),a.value=c,r.reflect&&se(t,i,c,s))},configurable:!0})}}function se(t,e,n,r){r===Boolean?n?t.setAttribute(e,""):t.removeAttribute(e):n==null?t.removeAttribute(e):t.setAttribute(e,String(n))}var oe=(t,e)=>e===Boolean?t!==null:e===Number?t===null?null:+t:t;function ae(t){if(Object.hasOwn(t,"_sa"))return;t._sa=!0;let e=t.styles;if(!e)return;let n=Array.isArray(e)?e:[e];document.adoptedStyleSheets=[...document.adoptedStyleSheets,...n.filter(r=>!document.adoptedStyleSheets.includes(r))]}function G(t){if(Object.hasOwn(t,"_pp"))return;t._pp={};let e=t.parts;if(e)for(let[n,r]of Object.entries(e)){let i=document.createElement("template");i.innerHTML=r,t._pp[n]=i.content.firstElementChild}}var E=class extends HTMLElement{static get properties(){return{}}static get traits(){return[]}static get observedAttributes(){let e=Object.entries(this.properties).map(([n,r])=>r.attribute??n.toLowerCase());return e.includes("traits")?e:[...e,"traits"]}#i=[];#n=[];#s=[];#t=null;#r=null;#e=null;#a=p(0);constructor(){super(),this.internals=this.attachInternals(),ie(this,this.constructor.properties)}connectedCallback(){let e=this.constructor;e._tag||(e._tag=this.localName),ae(e),G(e),T(()=>this.connected()),this.#i.push(m(()=>{for(let r of this[L].values())r.value;this.#a.value;let n=e.template(this);if(n&&g(n,this),this.render(),this[w].size){let r=new Map(this[w]);this[w].clear(),this.updated(r)}},{host:this.localName,onError:this.onError?n=>this.onError(n):null})),this.#e||(this.#e=new Set);for(let n of e.traits)this.#o(n);this.#c(),this.#t&&this.#l()}disconnectedCallback(){this._i&&A(this._i.p);for(let e of this.#i)e();this.#i.length=0;for(let e of this.#s)e.value=void 0;this.#s.length=0;for(let e of this.#n)e.disconnect(this);this.#n.length=0,this.#e?.clear(),this.#r?.(),this.#r=null,this.#t?.disconnect?.(this),this.disconnected()}#l(){let e=this.#t;e.connect?.(this),this.#r=e.subscribe?.(()=>{this.#a.value++})}get controller(){return this.#t}set controller(e){this.#r?.(),this.#r=null,this.#t?.disconnect?.(this),this.#t=e,e&&this.isConnected&&this.#l()}#o(e,{declarative:n=!1}={}){this.#e.add(e);let r=e();r.connect(this,{host:this,signal:p,computed:k,effect:m}),n&&(r._declarative=!0),this.#n.push(r)}addTrait(e){return this.#e||(this.#e=new Set),this.#e.has(e)?this:(this.#o(e),this)}#c(){let e=this.getAttribute("traits");if(e)for(let n of e.split(/\s+/).filter(Boolean)){let r=z(n);if(!r){console.warn(`<${this.localName}> traits="${n}" \u2014 trait not found. Did you forget to import it?`);continue}this.#e.has(r)||this.#o(r,{declarative:!0})}}#f(){if(!this.#e)return;let e=[];for(let n of this.#n)if(n._declarative){n.disconnect(this);for(let r of this.#e)if(r.schema?.name&&n.schema?.name===r.schema.name){this.#e.delete(r);break}}else e.push(n);this.#n.length=0,this.#n.push(...e),this.#c()}attributeChangedCallback(e,n,r){if(e==="traits"){this.isConnected&&this.#f();return}for(let[i,s]of Object.entries(this.constructor.properties))if((s.attribute??i.toLowerCase())===e){this[i]=oe(r,s.type??String);break}}static template=()=>null;static create(e={}){let n=this._tag??customElements.getName?.(this);if(!n)throw new Error("Component not registered");let r=document.createElement(n);for(let[i,s]of Object.entries(e))r[i]=s;return r}signal(e){let n=p(e);return this.#s.push(n),n}ensure(e){for(let s of this.children)if(s.getAttribute("slot")===e)return s;let n=this.#u(e);if(n)return n;G(this.constructor);let r=this.constructor._pp?.[e];if(!r)return null;let i=r.cloneNode(!0);return i._uiPart=!0,this.appendChild(i),i}drop(e){for(let r of this.children)if(r.getAttribute("slot")===e){r.remove();return}let n=this.#u(e);n&&n.remove()}#u(e){for(let n of this.querySelectorAll(`[slot="${e}"]`)){let r=n.parentElement,i=!0;for(;r&&r!==this;){if(r.localName.includes("-")){i=!1;break}r=r.parentElement}if(i&&r===this)return n}return null}reconcile(e,n,r,i){let s=e[b]||new Map,a=new Map,c=[];for(let l=0;l<n.length;l++){let u=n[l],d=r(u,l);if(a.has(d))continue;let x=s.get(d);x?i(u,l,x):x=i(u,l,null),a.set(d,x),c.push(d)}for(let[l,u]of s)a.has(l)||u.remove();let o=null;for(let l=c.length-1;l>=0;l--){let u=a.get(c[l]);(u.nextSibling!==o||u.parentNode!==e)&&e.insertBefore(u,o),o=u}e[b]=a}connected(){}render(){}disconnected(){}updated(e){}};var le="rounded borderless",N=class t extends E{static properties={mode:{type:String,default:"",reflect:!0}};static template=()=>null;connected(){this.hasAttribute("mode")||(this.mode=le),this.addEventListener("click",this.#n),this.#s()}#i(e){return this.querySelector(`admin-sidebar[slot="${e}"], admin-sidebar[name="${e}"]`)}#n=e=>{let n=e.target.closest("[data-sidebar-toggle]");if(n&&this.contains(n)){let i=n.getAttribute("data-sidebar-toggle"),s=this.#i(i);s&&typeof s.toggle!="function"&&this.#r("admin-sidebar",`slot="${i}"`,"Sidebar toggle"),s?.toggle?.();return}let r=e.target.closest("[data-command-trigger]");if(r&&this.contains(r)){e.stopPropagation();let i=this.querySelector("admin-command");if(!i)return;if(typeof i.show!="function"){this.#r("admin-command","","Command palette");return}i.show()}};#s(){let e=this.querySelector("admin-command"),n=this.querySelector("nav-ui");!e||!n||e.addEventListener("command-select",r=>{let i=n.querySelector(`nav-item-ui[value="${r.detail.value}"]`);i&&n.select(i)})}static#t=new WeakSet;#r(e,n,r){let i=n?this.querySelector(`${e}[${n}], ${e}[${n.replace("slot=","name=")}]`):this.querySelector(e);if(!i||t.#t.has(i))return;t.#t.add(i);let s=e==="admin-sidebar"?"shell/admin-sidebar":"shell/admin-command";console.warn(`[admin-shell] <${e}${n?" "+n:""}> is in the DOM but ${e==="admin-sidebar"?"AdminSidebar":"AdminCommand"} is NOT registered \u2014 ${r} will not work. Import the cluster barrel \`@adia-ai/web-modules/shell\` (which registers all shell elements), OR add \`@adia-ai/web-modules/${s}\` alongside \`@adia-ai/web-modules/shell/admin-shell\` on the per-component path. Closes FB-55 silent-failure trap.`)}};customElements.define("admin-shell",N);export{N as AdminShell};
10
+ See USAGE.md \xA7 Template parser \u2014 invariants + unsupported syntaxes.`),n[c]={t:"n",n:document.createTextNode(""),c:void 0,_fx:null}):n[c]={t:"a",n:i,name:o,c:void 0,_fx:null}}return n}function C(t){for(let e of t)e&&e._fx&&(e._fx(),e._fx=null)}function M(t){if(t.n.nodeType===1&&t.n[v])return t.n;let e=document.createElement("span");return e.style.display="contents",e.setAttribute("role","presentation"),e[v]=!0,t.n.replaceWith(e),t.n=e,e}var U=t=>t!=null&&typeof t=="object"&&t.strings,W=t=>typeof t=="function"||t!=null&&typeof t.handleEvent=="function";function j(t,e){if(e!==t.c){if(t.t==="n")if(e!=null&&e._directive)e._commit(M(t));else if(U(e))g(e,M(t));else if(Array.isArray(e)){let n=M(t);n.replaceChildren();for(let r of e)if(U(r)){let i=document.createElement("span");i.style.display="contents",i.setAttribute("role","presentation"),n.appendChild(i),g(r,i)}else n.appendChild(document.createTextNode(r??""))}else if(e instanceof Node)t.n.replaceWith(e),t.n=e;else if(t.n[v]){let n=document.createTextNode(e??"");t.n.replaceWith(n),t.n=n}else t.n.textContent=e??"";else if(t.t==="a")e==null||e===!1?t.n.removeAttribute(t.name):t.n.setAttribute(t.name,e===!0?"":e);else if(t.t==="p"){if(!t._resolved){let n=B(t.n,t.name);n!==t.name&&(t.name=n),t._resolved=!0}t.n[t.name]=e}else t.t==="e"&&(W(t.c)&&t.n.removeEventListener(t.name,t.c),W(e)&&t.n.addEventListener(t.name,e));t.c=e}}function ne(t,e){for(let n=0;n<t.length;n++){let r=t[n];if(!r)continue;let i=e[n],s=r.t!=="e"&&typeof i=="function",a=!s&&r.t!=="e"&&O(i);if(r._fx&&!s&&!a&&(r._fx(),r._fx=null),s){r._fx||(r._fx=m(()=>j(r,i())));continue}if(a){r._fx||(r._fx=m(()=>j(r,i.value)));continue}j(r,i)}}function re(t,e,n){return{_directive:!0,_commit(r){let i=r[b]||new Map,s=new Map,a=[];for(let o=0;o<t.length;o++){let l=e(t[o],o);if(s.has(l))continue;a.push(l);let u=n(t[o],o);if(i.has(l)){let d=i.get(l);g(u,d),s.set(l,d)}else{let d=document.createElement("span");d.style.display="contents",d.setAttribute("role","presentation"),g(u,d),s.set(l,d)}}for(let[o,l]of i)s.has(o)||(l._i&&C(l._i.p),l.remove());let c=null;for(let o=a.length-1;o>=0;o--){let l=s.get(a[o]);(l.nextSibling!==c||l.parentNode!==r)&&r.insertBefore(l,c),c=l}r[b]=s}}}var $=new Map,F=new Set(["input-interaction","keyboard-navigation","forms-data","layout-measurement","motion-positioning","animation-feedback","visual-dynamics","interaction-delight","audio-haptics-sensory"]);function de(t){if(!t.name)throw new Error("Trait requires a name");if(!t.setup)throw new Error(`Trait "${t.name}" requires a setup function`);if(!t.category)throw new Error(`Trait "${t.name}" requires a category`);if(!F.has(t.category))throw new Error(`Trait "${t.name}" has unknown category "${t.category}". Known: ${[...F].join(", ")}`);if(!t.description)throw new Error(`Trait "${t.name}" requires a description`);let e=Object.freeze({name:t.name,category:t.category,description:t.description,attributes:Object.freeze(t.attributes||[]),events:Object.freeze(t.events||[]),config:Object.freeze(t.config||[])});function n(){let r=null;return{schema:e,connect(i,s){r=t.setup({host:i,...s||{}})},disconnect(i){r&&(r(),r=null);for(let s of e.attributes)i.hasAttribute(s)&&(console.warn(`Trait "${e.name}": attribute "${s}" still present after disconnect`),i.removeAttribute(s))}}}return n.schema=e,$.set(t.name,n),n}function z(t){return $.get(t)||null}function he(t){return $.get(t)?.schema||null}function me(){return[...$.keys()]}var L=Symbol(),w=Symbol();function ie(t,e){t[w]=new Map,t[L]=new Map;for(let[n,r]of Object.entries(e)){let i=r.attribute??n.toLowerCase(),s=r.type??String,a=p(r.default??void 0);t[L].set(n,a),Object.defineProperty(t,n,{get(){return a.value},set(c){let o=a.peek();Object.is(o,c)||(t[w].set(n,o),a.value=c,r.reflect&&se(t,i,c,s))},configurable:!0})}}function se(t,e,n,r){r===Boolean?n?t.setAttribute(e,""):t.removeAttribute(e):n==null?t.removeAttribute(e):t.setAttribute(e,String(n))}var oe=(t,e)=>e===Boolean?t!==null:e===Number?t===null?null:+t:t;function ae(t){if(Object.hasOwn(t,"_sa"))return;t._sa=!0;let e=t.styles;if(!e)return;let n=Array.isArray(e)?e:[e];document.adoptedStyleSheets=[...document.adoptedStyleSheets,...n.filter(r=>!document.adoptedStyleSheets.includes(r))]}function G(t){if(Object.hasOwn(t,"_pp"))return;t._pp={};let e=t.parts;if(e)for(let[n,r]of Object.entries(e)){let i=document.createElement("template");i.innerHTML=r,t._pp[n]=i.content.firstElementChild}}var E=class extends HTMLElement{static get properties(){return{}}static get traits(){return[]}static get observedAttributes(){let e=Object.entries(this.properties).map(([n,r])=>r.attribute??n.toLowerCase());return e.includes("traits")?e:[...e,"traits"]}#i=[];#n=[];#s=[];#t=null;#r=null;#e=null;#a=p(0);constructor(){super(),this.internals=this.attachInternals(),ie(this,this.constructor.properties)}connectedCallback(){let e=this.constructor;e._tag||(e._tag=this.localName),ae(e),G(e),T(()=>this.connected()),this.#i.push(m(()=>{for(let r of this[L].values())r.value;this.#a.value;let n=e.template(this);if(n&&g(n,this),this.render(),this[w].size){let r=new Map(this[w]);this[w].clear(),this.updated(r)}},{host:this.localName,onError:this.onError?n=>this.onError(n):null})),this.#e||(this.#e=new Set);for(let n of e.traits)this.#o(n);this.#c(),this.#t&&this.#l()}disconnectedCallback(){this._i&&C(this._i.p);for(let e of this.#i)e();this.#i.length=0;for(let e of this.#s)e.value=void 0;this.#s.length=0;for(let e of this.#n)e.disconnect(this);this.#n.length=0,this.#e?.clear(),this.#r?.(),this.#r=null,this.#t?.disconnect?.(this),this.disconnected()}#l(){let e=this.#t;e.connect?.(this),this.#r=e.subscribe?.(()=>{this.#a.value++})}get controller(){return this.#t}set controller(e){this.#r?.(),this.#r=null,this.#t?.disconnect?.(this),this.#t=e,e&&this.isConnected&&this.#l()}#o(e,{declarative:n=!1}={}){this.#e.add(e);let r=e();r.connect(this,{host:this,signal:p,computed:k,effect:m}),n&&(r._declarative=!0),this.#n.push(r)}addTrait(e){return this.#e||(this.#e=new Set),this.#e.has(e)?this:(this.#o(e),this)}#c(){let e=this.getAttribute("traits");if(e)for(let n of e.split(/\s+/).filter(Boolean)){let r=z(n);if(!r){console.warn(`<${this.localName}> traits="${n}" \u2014 trait not found. Did you forget to import it?`);continue}this.#e.has(r)||this.#o(r,{declarative:!0})}}#f(){if(!this.#e)return;let e=[];for(let n of this.#n)if(n._declarative){n.disconnect(this);for(let r of this.#e)if(r.schema?.name&&n.schema?.name===r.schema.name){this.#e.delete(r);break}}else e.push(n);this.#n.length=0,this.#n.push(...e),this.#c()}attributeChangedCallback(e,n,r){if(e==="traits"){this.isConnected&&this.#f();return}for(let[i,s]of Object.entries(this.constructor.properties))if((s.attribute??i.toLowerCase())===e){this[i]=oe(r,s.type??String);break}}static template=()=>null;static create(e={}){let n=this._tag??customElements.getName?.(this);if(!n)throw new Error("Component not registered");let r=document.createElement(n);for(let[i,s]of Object.entries(e))r[i]=s;return r}signal(e){let n=p(e);return this.#s.push(n),n}ensure(e){for(let s of this.children)if(s.getAttribute("slot")===e)return s;let n=this.#u(e);if(n)return n;G(this.constructor);let r=this.constructor._pp?.[e];if(!r)return null;let i=r.cloneNode(!0);return i._uiPart=!0,this.appendChild(i),i}drop(e){for(let r of this.children)if(r.getAttribute("slot")===e){r.remove();return}let n=this.#u(e);n&&n.remove()}#u(e){for(let n of this.querySelectorAll(`[slot="${e}"]`)){let r=n.parentElement,i=!0;for(;r&&r!==this;){if(r.localName.includes("-")){i=!1;break}r=r.parentElement}if(i&&r===this)return n}return null}reconcile(e,n,r,i){let s=e[b]||new Map,a=new Map,c=[];for(let l=0;l<n.length;l++){let u=n[l],d=r(u,l);if(a.has(d))continue;let x=s.get(d);x?i(u,l,x):x=i(u,l,null),a.set(d,x),c.push(d)}for(let[l,u]of s)a.has(l)||u.remove();let o=null;for(let l=c.length-1;l>=0;l--){let u=a.get(c[l]);(u.nextSibling!==o||u.parentNode!==e)&&e.insertBefore(u,o),o=u}e[b]=a}connected(){}render(){}disconnected(){}updated(e){}};var le="rounded borderless",N=class t extends E{static properties={mode:{type:String,default:"",reflect:!0}};static template=()=>null;connected(){this.hasAttribute("mode")||(this.mode=le),this.addEventListener("click",this.#n),this.#s()}#i(e){return this.querySelector(`admin-sidebar[slot="${e}"], admin-sidebar[name="${e}"]`)}#n=e=>{let n=e.target.closest("[data-sidebar-toggle]");if(n&&this.contains(n)){let i=n.getAttribute("data-sidebar-toggle"),s=this.#i(i);s&&typeof s.toggle!="function"&&this.#r("admin-sidebar",`slot="${i}"`,"Sidebar toggle"),s?.toggle?.();return}let r=e.target.closest("[data-command-trigger]");if(r&&this.contains(r)){e.stopPropagation();let i=this.querySelector("admin-command");if(!i)return;if(typeof i.show!="function"){this.#r("admin-command","","Command palette");return}i.show()}};#s(){let e=this.querySelector("admin-command"),n=this.querySelector("nav-ui");!e||!n||e.addEventListener("command-select",r=>{let i=n.querySelector(`nav-item-ui[value="${r.detail.value}"]`);i&&n.select(i)})}static#t=new WeakSet;#r(e,n,r){let i=n?this.querySelector(`${e}[${n}], ${e}[${n.replace("slot=","name=")}]`):this.querySelector(e);if(!i||t.#t.has(i))return;t.#t.add(i);let s=e==="admin-sidebar"?"shell/admin-sidebar":"shell/admin-command";console.warn(`[admin-shell] <${e}${n?" "+n:""}> is in the DOM but ${e==="admin-sidebar"?"AdminSidebar":"AdminCommand"} is NOT registered \u2014 ${r} will not work. Import the cluster barrel \`@adia-ai/web-modules/shell\` (which registers all shell elements), OR add \`@adia-ai/web-modules/${s}\` alongside \`@adia-ai/web-modules/shell/admin-shell\` on the per-component path. Closes FB-55 silent-failure trap.`)}};customElements.define("admin-shell",N);export{N as AdminShell};
@@ -1,4 +1,4 @@
1
- var S=Symbol("signal"),f=null,h=null,_=!1;function P(t){for(let e of t){if(e.disposed){t.delete(e);continue}e.dirty=!0,h||(h=new Set,_||queueMicrotask(B)),h.add(e)}}function B(){let t,e=0;for(;t=h;){if(++e>100){h=null,console.error("signals: drain loop exceeded 100 iterations");break}h=null;for(let n of t)if(!n.disposed&&n.dirty){n.dirty=!1;try{n.run()}catch(r){n.onError?n.onError(r):(n.disposed=!0,queueMicrotask(()=>{throw r}))}}}}function F(t){if(_){t();return}_=!0;try{t()}finally{_=!1,h&&B()}}function k(t){let e=f;f=null;try{return t()}finally{f=e}}function m(t){let e=new Set;return{[S]:!0,get value(){return f&&e.add(f),t},set value(n){Object.is(t,n)||(t=n,P(e))},peek(){return t}}}function O(t){let e=new Set,n,r=!0,i={dirty:!1,disposed:!1,run(){r=!0,P(e)}};return{[S]:!0,get value(){if(f&&e.add(f),r){let o=f;f=i;try{n=t(),r=!1}finally{f=o}}return n},peek(){return n}}}function p(t,e){let n={dirty:!1,disposed:!1,host:e?.host??null,onError:e?.onError??null,run(){let r=f;f=n;try{t()}finally{f=r}}};return n.run(),()=>{n.disposed=!0}}function $(t){return t!=null&&typeof t=="object"&&t[S]===!0}var[M,y]=[Symbol(),Symbol()];function V(t,...e){return{strings:t,values:e}}function X(t,...e){let n="";for(let i=0;i<t.length;i++)n+=t[i],i<e.length&&(n+=e[i]);let r=new CSSStyleSheet;return r.replaceSync(n),r}var I=new WeakMap;function Y(t){let e=0,n=0,r=0;for(;r<t.length;){if(e===0&&t.charCodeAt(r)===60&&t.charCodeAt(r+1)===33&&t.charCodeAt(r+2)===45&&t.charCodeAt(r+3)===45){let o=t.indexOf("-->",r+4);if(o===-1){n=0;break}r=o+3,n=0;continue}let i=t.charCodeAt(r);e?i===(e===1?39:34)&&(e=0):i===39?e=1:i===34?e=2:i===60?n=1:i===62&&(n=0),r++}return n===1}function J(t){let e=I.get(t);if(e)return e;let n="";for(let r=0;r<t.length;r++)n+=t[r],r<t.length-1&&(n+=Y(n)?`{{p:${r}}}`:`<!--p:${r}-->`);return e=document.createElement("template"),e.innerHTML=n,I.set(t,e),e}var q={classname:"className",innertext:"innerText",innerhtml:"innerHTML",outerhtml:"outerHTML",textcontent:"textContent",tabindex:"tabIndex",arialabel:"ariaLabel",ariadescribedby:"ariaDescribedBy",arialabelledby:"ariaLabelledBy",ariarole:"role",contenteditable:"contentEditable",readonly:"readOnly",maxlength:"maxLength",minlength:"minLength",colspan:"colSpan",rowspan:"rowSpan",cellpadding:"cellPadding",cellspacing:"cellSpacing",usemap:"useMap",ismap:"isMap",accesskey:"accessKey",defaultchecked:"defaultChecked",defaultvalue:"defaultValue",defaultselected:"defaultSelected"};function H(t,e){if(q[e])return q[e];let n=Object.getOwnPropertyNames(t);for(let i=0;i<n.length;i++){let o=n[i];if(o!==e&&o.toLowerCase()===e)return o}let r=Object.getPrototypeOf(t);for(;r&&r!==Object.prototype;){let i=Object.getOwnPropertyNames(r);for(let o=0;o<i.length;o++){let l=i[o];if(l!==e&&l.toLowerCase()===e)return l}r=Object.getPrototypeOf(r)}return e}function g(t,e){let n=e._i;(!n||n.s!==t.strings)&&(n&&A(n.p),n=Q(t,e),e._i=n),ne(n.p,t.values)}function Q(t,e){let{strings:n}=t,i=J(n).content.cloneNode(!0),o=Z(e);o&&(i=ee(i,o));let l=te(i,t.values.length);return e.replaceChildren(i),{s:n,p:l}}var C="http://www.w3.org/2000/svg",b="http://www.w3.org/1998/Math/MathML",R="http://www.w3.org/1999/xhtml";function Z(t){if(!t||t.nodeType!==1)return null;if(t.namespaceURI===C)return C;if(t.namespaceURI===b)return b;if(typeof t.closest!="function")return null;let e=t.closest("svg, math, foreignObject, annotation-xml");if(!e)return null;let n=e.localName;if(n==="foreignobject"||n==="foreignObject")return null;if(n==="annotation-xml"){let r=(e.getAttribute("encoding")||"").toLowerCase();return r==="text/html"||r==="application/xhtml+xml"?null:b}return n==="svg"?C:n==="math"?b:null}function ee(t,e){let n=document.createDocumentFragment();return U(t,n,e),n}function U(t,e,n){for(let r of[...t.childNodes])if(r.nodeType===1){let o=document.createElementNS(n,r.localName);for(let s of r.attributes)s.namespaceURI?o.setAttributeNS(s.namespaceURI,s.name,s.value):o.setAttribute(s.name,s.value);e.appendChild(o);let l=r.localName,c=n;if(n===C&&(l==="foreignObject"||l==="foreignobject"))c=R;else if(n===b&&l==="annotation-xml"){let s=(r.getAttribute("encoding")||"").toLowerCase();(s==="text/html"||s==="application/xhtml+xml")&&(c=R)}U(r,o,c)}else e.appendChild(r.cloneNode(!0))}function te(t,e){let n=new Array(e),r=document.createTreeWalker(t,129),i;for(;i=r.nextNode();)if(i.nodeType===8){let o=i.data.match(/^p:(\d+)$/);if(o){let l=document.createTextNode("");i.replaceWith(l),r.currentNode=l,n[+o[1]]={t:"n",n:l,c:void 0,_fx:null}}}else if(i.nodeType===1)for(let o of[...i.attributes]){let l=o.value.match(/^\{\{p:(\d+)\}\}$/);if(!l){if(o.value.includes("{{p:")){let a=o.name,u=a==="class"?' class="${expression}" \u2190 full replacement (whole class string is the expression)\n .className=${expression} \u2190 writes to the className property (resolved camelCase since FB-55 fix)\n':a==="style"?' style="${expression}" \u2190 full replacement of the style string\n .style.cssText=${expression} \u2190 write CSS text via the style.cssText accessor\n':` ${a}="\${expression}" \u2190 full replacement (whole attr is the placeholder)
1
+ var S=Symbol("signal"),f=null,h=null,_=!1;function P(t){for(let e of t){if(e.disposed){t.delete(e);continue}e.dirty=!0,h||(h=new Set,_||queueMicrotask(B)),h.add(e)}}function B(){let t,e=0;for(;t=h;){if(++e>100){h=null,console.error("signals: drain loop exceeded 100 iterations");break}h=null;for(let n of t)if(!n.disposed&&n.dirty){n.dirty=!1;try{n.run()}catch(r){n.onError?n.onError(r):(n.disposed=!0,queueMicrotask(()=>{throw r}))}}}}function F(t){if(_){t();return}_=!0;try{t()}finally{_=!1,h&&B()}}function k(t){let e=f;f=null;try{return t()}finally{f=e}}function m(t){let e=new Set;return{[S]:!0,get value(){return f&&e.add(f),t},set value(n){Object.is(t,n)||(t=n,P(e))},peek(){return t}}}function O(t){let e=new Set,n,r=!0,i={dirty:!1,disposed:!1,run(){r=!0,P(e)}};return{[S]:!0,get value(){if(f&&e.add(f),r){let o=f;f=i;try{n=t(),r=!1}finally{f=o}}return n},peek(){return n}}}function p(t,e){let n={dirty:!1,disposed:!1,host:e?.host??null,onError:e?.onError??null,run(){let r=f;f=n;try{t()}finally{f=r}}};return n.run(),()=>{n.disposed=!0}}function $(t){return t!=null&&typeof t=="object"&&t[S]===!0}var[M,y]=[Symbol(),Symbol()];function V(t,...e){return{strings:t,values:e}}function X(t,...e){let n="";for(let i=0;i<t.length;i++)n+=t[i],i<e.length&&(n+=e[i]);let r=new CSSStyleSheet;return r.replaceSync(n),r}var I=new WeakMap;function Y(t){let e=0,n=0,r=0;for(;r<t.length;){if(e===0&&t.charCodeAt(r)===60&&t.charCodeAt(r+1)===33&&t.charCodeAt(r+2)===45&&t.charCodeAt(r+3)===45){let o=t.indexOf("-->",r+4);if(o===-1){n=0;break}r=o+3,n=0;continue}let i=t.charCodeAt(r);e?i===(e===1?39:34)&&(e=0):i===39?e=1:i===34?e=2:i===60?n=1:i===62&&(n=0),r++}return n===1}function J(t){let e=I.get(t);if(e)return e;let n="";for(let r=0;r<t.length;r++)n+=t[r],r<t.length-1&&(n+=Y(n)?`{{p:${r}}}`:`<!--p:${r}-->`);return e=document.createElement("template"),e.innerHTML=n,I.set(t,e),e}var q={classname:"className",innertext:"innerText",innerhtml:"innerHTML",outerhtml:"outerHTML",textcontent:"textContent",tabindex:"tabIndex",arialabel:"ariaLabel",ariadescribedby:"ariaDescribedBy",arialabelledby:"ariaLabelledBy",ariarole:"role",contenteditable:"contentEditable",readonly:"readOnly",maxlength:"maxLength",minlength:"minLength",colspan:"colSpan",rowspan:"rowSpan",cellpadding:"cellPadding",cellspacing:"cellSpacing",usemap:"useMap",ismap:"isMap",accesskey:"accessKey",defaultchecked:"defaultChecked",defaultvalue:"defaultValue",defaultselected:"defaultSelected"};function H(t,e){if(q[e])return q[e];let n=Object.getOwnPropertyNames(t);for(let i=0;i<n.length;i++){let o=n[i];if(o!==e&&o.toLowerCase()===e)return o}let r=Object.getPrototypeOf(t);for(;r&&r!==Object.prototype;){let i=Object.getOwnPropertyNames(r);for(let o=0;o<i.length;o++){let l=i[o];if(l!==e&&l.toLowerCase()===e)return l}r=Object.getPrototypeOf(r)}return e}function g(t,e){let n=e._i;(!n||n.s!==t.strings)&&(n&&C(n.p),n=Q(t,e),e._i=n),ne(n.p,t.values)}function Q(t,e){let{strings:n}=t,i=J(n).content.cloneNode(!0),o=Z(e);o&&(i=ee(i,o));let l=te(i,t.values.length);return e.replaceChildren(i),{s:n,p:l}}var A="http://www.w3.org/2000/svg",b="http://www.w3.org/1998/Math/MathML",R="http://www.w3.org/1999/xhtml";function Z(t){if(!t||t.nodeType!==1)return null;if(t.namespaceURI===A)return A;if(t.namespaceURI===b)return b;if(typeof t.closest!="function")return null;let e=t.closest("svg, math, foreignObject, annotation-xml");if(!e)return null;let n=e.localName;if(n==="foreignobject"||n==="foreignObject")return null;if(n==="annotation-xml"){let r=(e.getAttribute("encoding")||"").toLowerCase();return r==="text/html"||r==="application/xhtml+xml"?null:b}return n==="svg"?A:n==="math"?b:null}function ee(t,e){let n=document.createDocumentFragment();return U(t,n,e),n}function U(t,e,n){for(let r of[...t.childNodes])if(r.nodeType===1){let o=document.createElementNS(n,r.localName);for(let s of r.attributes)s.namespaceURI?o.setAttributeNS(s.namespaceURI,s.name,s.value):o.setAttribute(s.name,s.value);e.appendChild(o);let l=r.localName,c=n;if(n===A&&(l==="foreignObject"||l==="foreignobject"))c=R;else if(n===b&&l==="annotation-xml"){let s=(r.getAttribute("encoding")||"").toLowerCase();(s==="text/html"||s==="application/xhtml+xml")&&(c=R)}U(r,o,c)}else e.appendChild(r.cloneNode(!0))}function te(t,e){let n=new Array(e),r=document.createTreeWalker(t,129),i;for(;i=r.nextNode();)if(i.nodeType===8){let o=i.data.match(/^p:(\d+)$/);if(o){let l=document.createTextNode("");i.replaceWith(l),r.currentNode=l,n[+o[1]]={t:"n",n:l,c:void 0,_fx:null}}}else if(i.nodeType===1)for(let o of[...i.attributes]){let l=o.value.match(/^\{\{p:(\d+)\}\}$/);if(!l){if(o.value.includes("{{p:")){let a=o.name,u=a==="class"?' class="${expression}" \u2190 full replacement (whole class string is the expression)\n .className=${expression} \u2190 writes to the className property (resolved camelCase since FB-55 fix)\n':a==="style"?' style="${expression}" \u2190 full replacement of the style string\n .style.cssText=${expression} \u2190 write CSS text via the style.cssText accessor\n':` ${a}="\${expression}" \u2190 full replacement (whole attr is the placeholder)
2
2
  .${a}=\${expression} \u2190 property assignment (preferred for objects/functions)
3
3
  `;console.warn(`[template] Partial attribute interpolation is not supported.
4
4
  Element: <${i.tagName.toLowerCase()}>
@@ -7,4 +7,4 @@ var S=Symbol("signal"),f=null,h=null,_=!1;function P(t){for(let e of t){if(e.dis
7
7
  `+u+" Compute the full attr value as a single expression and interpolate the whole.")}continue}let c=+l[1],s=o.name;s[0]==="@"?(i.removeAttribute(s),n[c]={t:"e",n:i,name:s.slice(1),c:void 0,_fx:null}):s[0]==="."?(i.removeAttribute(s),n[c]={t:"p",n:i,name:H(i,s.slice(1)),c:void 0,_fx:null,_resolved:!1}):s[0]==="?"?(i.removeAttribute(s),console.warn(`[template] Lit-style boolean attribute "${s}=" is not supported.
8
8
  Element: <${i.tagName.toLowerCase()}>
9
9
  Use .${s.slice(1)}=\${value} (property binding) instead \u2014 the primitive reflects the property to the DOM attribute for you.
10
- See USAGE.md \xA7 Template parser \u2014 invariants + unsupported syntaxes.`),n[c]={t:"n",n:document.createTextNode(""),c:void 0,_fx:null}):n[c]={t:"a",n:i,name:s,c:void 0,_fx:null}}return n}function A(t){for(let e of t)e&&e._fx&&(e._fx(),e._fx=null)}function j(t){if(t.n.nodeType===1&&t.n[M])return t.n;let e=document.createElement("span");return e.style.display="contents",e[M]=!0,t.n.replaceWith(e),t.n=e,e}var W=t=>t!=null&&typeof t=="object"&&t.strings,D=t=>typeof t=="function"||t!=null&&typeof t.handleEvent=="function";function v(t,e){if(e!==t.c){if(t.t==="n")if(e!=null&&e._directive)e._commit(j(t));else if(W(e))g(e,j(t));else if(Array.isArray(e)){let n=j(t);n.replaceChildren();for(let r of e)if(W(r)){let i=document.createElement("span");i.style.display="contents",n.appendChild(i),g(r,i)}else n.appendChild(document.createTextNode(r??""))}else if(e instanceof Node)t.n.replaceWith(e),t.n=e;else if(t.n[M]){let n=document.createTextNode(e??"");t.n.replaceWith(n),t.n=n}else t.n.textContent=e??"";else if(t.t==="a")e==null||e===!1?t.n.removeAttribute(t.name):t.n.setAttribute(t.name,e===!0?"":e);else if(t.t==="p"){if(!t._resolved){let n=H(t.n,t.name);n!==t.name&&(t.name=n),t._resolved=!0}t.n[t.name]=e}else t.t==="e"&&(D(t.c)&&t.n.removeEventListener(t.name,t.c),D(e)&&t.n.addEventListener(t.name,e));t.c=e}}function ne(t,e){for(let n=0;n<t.length;n++){let r=t[n];if(!r)continue;let i=e[n],o=r.t!=="e"&&typeof i=="function",l=!o&&r.t!=="e"&&$(i);if(r._fx&&!o&&!l&&(r._fx(),r._fx=null),o){r._fx||(r._fx=p(()=>v(r,i())));continue}if(l){r._fx||(r._fx=p(()=>v(r,i.value)));continue}v(r,i)}}function re(t,e,n){return{_directive:!0,_commit(r){let i=r[y]||new Map,o=new Map,l=[];for(let s=0;s<t.length;s++){let a=e(t[s],s);if(o.has(a))continue;l.push(a);let u=n(t[s],s);if(i.has(a)){let d=i.get(a);g(u,d),o.set(a,d)}else{let d=document.createElement("span");d.style.display="contents",g(u,d),o.set(a,d)}}for(let[s,a]of i)o.has(s)||(a._i&&A(a._i.p),a.remove());let c=null;for(let s=l.length-1;s>=0;s--){let a=o.get(l[s]);(a.nextSibling!==c||a.parentNode!==r)&&r.insertBefore(a,c),c=a}r[y]=o}}}var N=new Map,z=new Set(["input-interaction","keyboard-navigation","forms-data","layout-measurement","motion-positioning","animation-feedback","visual-dynamics","interaction-delight","audio-haptics-sensory"]);function fe(t){if(!t.name)throw new Error("Trait requires a name");if(!t.setup)throw new Error(`Trait "${t.name}" requires a setup function`);if(!t.category)throw new Error(`Trait "${t.name}" requires a category`);if(!z.has(t.category))throw new Error(`Trait "${t.name}" has unknown category "${t.category}". Known: ${[...z].join(", ")}`);if(!t.description)throw new Error(`Trait "${t.name}" requires a description`);let e=Object.freeze({name:t.name,category:t.category,description:t.description,attributes:Object.freeze(t.attributes||[]),events:Object.freeze(t.events||[]),config:Object.freeze(t.config||[])});function n(){let r=null;return{schema:e,connect(i,o){r=t.setup({host:i,...o||{}})},disconnect(i){r&&(r(),r=null);for(let o of e.attributes)i.hasAttribute(o)&&(console.warn(`Trait "${e.name}": attribute "${o}" still present after disconnect`),i.removeAttribute(o))}}}return n.schema=e,N.set(t.name,n),n}function G(t){return N.get(t)||null}function de(t){return N.get(t)?.schema||null}function he(){return[...N.keys()]}var L=Symbol(),x=Symbol();function ie(t,e){t[x]=new Map,t[L]=new Map;for(let[n,r]of Object.entries(e)){let i=r.attribute??n.toLowerCase(),o=r.type??String,l=m(r.default??void 0);t[L].set(n,l),Object.defineProperty(t,n,{get(){return l.value},set(c){let s=l.peek();Object.is(s,c)||(t[x].set(n,s),l.value=c,r.reflect&&oe(t,i,c,o))},configurable:!0})}}function oe(t,e,n,r){r===Boolean?n?t.setAttribute(e,""):t.removeAttribute(e):n==null?t.removeAttribute(e):t.setAttribute(e,String(n))}var se=(t,e)=>e===Boolean?t!==null:e===Number?t===null?null:+t:t;function le(t){if(Object.hasOwn(t,"_sa"))return;t._sa=!0;let e=t.styles;if(!e)return;let n=Array.isArray(e)?e:[e];document.adoptedStyleSheets=[...document.adoptedStyleSheets,...n.filter(r=>!document.adoptedStyleSheets.includes(r))]}function K(t){if(Object.hasOwn(t,"_pp"))return;t._pp={};let e=t.parts;if(e)for(let[n,r]of Object.entries(e)){let i=document.createElement("template");i.innerHTML=r,t._pp[n]=i.content.firstElementChild}}var T=class extends HTMLElement{static get properties(){return{}}static get traits(){return[]}static get observedAttributes(){let e=Object.entries(this.properties).map(([n,r])=>r.attribute??n.toLowerCase());return e.includes("traits")?e:[...e,"traits"]}#i=[];#t=[];#o=[];#n=null;#r=null;#e=null;#l=m(0);constructor(){super(),this.internals=this.attachInternals(),ie(this,this.constructor.properties)}connectedCallback(){let e=this.constructor;e._tag||(e._tag=this.localName),le(e),K(e),k(()=>this.connected()),this.#i.push(p(()=>{for(let r of this[L].values())r.value;this.#l.value;let n=e.template(this);if(n&&g(n,this),this.render(),this[x].size){let r=new Map(this[x]);this[x].clear(),this.updated(r)}},{host:this.localName,onError:this.onError?n=>this.onError(n):null})),this.#e||(this.#e=new Set);for(let n of e.traits)this.#s(n);this.#c(),this.#n&&this.#a()}disconnectedCallback(){this._i&&A(this._i.p);for(let e of this.#i)e();this.#i.length=0;for(let e of this.#o)e.value=void 0;this.#o.length=0;for(let e of this.#t)e.disconnect(this);this.#t.length=0,this.#e?.clear(),this.#r?.(),this.#r=null,this.#n?.disconnect?.(this),this.disconnected()}#a(){let e=this.#n;e.connect?.(this),this.#r=e.subscribe?.(()=>{this.#l.value++})}get controller(){return this.#n}set controller(e){this.#r?.(),this.#r=null,this.#n?.disconnect?.(this),this.#n=e,e&&this.isConnected&&this.#a()}#s(e,{declarative:n=!1}={}){this.#e.add(e);let r=e();r.connect(this,{host:this,signal:m,computed:O,effect:p}),n&&(r._declarative=!0),this.#t.push(r)}addTrait(e){return this.#e||(this.#e=new Set),this.#e.has(e)?this:(this.#s(e),this)}#c(){let e=this.getAttribute("traits");if(e)for(let n of e.split(/\s+/).filter(Boolean)){let r=G(n);if(!r){console.warn(`<${this.localName}> traits="${n}" \u2014 trait not found. Did you forget to import it?`);continue}this.#e.has(r)||this.#s(r,{declarative:!0})}}#f(){if(!this.#e)return;let e=[];for(let n of this.#t)if(n._declarative){n.disconnect(this);for(let r of this.#e)if(r.schema?.name&&n.schema?.name===r.schema.name){this.#e.delete(r);break}}else e.push(n);this.#t.length=0,this.#t.push(...e),this.#c()}attributeChangedCallback(e,n,r){if(e==="traits"){this.isConnected&&this.#f();return}for(let[i,o]of Object.entries(this.constructor.properties))if((o.attribute??i.toLowerCase())===e){this[i]=se(r,o.type??String);break}}static template=()=>null;static create(e={}){let n=this._tag??customElements.getName?.(this);if(!n)throw new Error("Component not registered");let r=document.createElement(n);for(let[i,o]of Object.entries(e))r[i]=o;return r}signal(e){let n=m(e);return this.#o.push(n),n}ensure(e){for(let o of this.children)if(o.getAttribute("slot")===e)return o;let n=this.#u(e);if(n)return n;K(this.constructor);let r=this.constructor._pp?.[e];if(!r)return null;let i=r.cloneNode(!0);return i._uiPart=!0,this.appendChild(i),i}drop(e){for(let r of this.children)if(r.getAttribute("slot")===e){r.remove();return}let n=this.#u(e);n&&n.remove()}#u(e){for(let n of this.querySelectorAll(`[slot="${e}"]`)){let r=n.parentElement,i=!0;for(;r&&r!==this;){if(r.localName.includes("-")){i=!1;break}r=r.parentElement}if(i&&r===this)return n}return null}reconcile(e,n,r,i){let o=e[y]||new Map,l=new Map,c=[];for(let a=0;a<n.length;a++){let u=n[a],d=r(u,a);if(l.has(d))continue;let w=o.get(d);w?i(u,a,w):w=i(u,a,null),l.set(d,w),c.push(d)}for(let[a,u]of o)l.has(a)||u.remove();let s=null;for(let a=c.length-1;a>=0;a--){let u=l.get(c[a]);(u.nextSibling!==s||u.parentNode!==e)&&e.insertBefore(u,s),s=u}e[y]=l}connected(){}render(){}disconnected(){}updated(e){}};var E=class extends T{static properties={centered:{type:Boolean,default:!1,reflect:!0},"full-bleed":{type:Boolean,default:!1,reflect:!0}};static template=()=>null};customElements.get("simple-shell")||customElements.define("simple-shell",E);export{E as SimpleShell};
10
+ See USAGE.md \xA7 Template parser \u2014 invariants + unsupported syntaxes.`),n[c]={t:"n",n:document.createTextNode(""),c:void 0,_fx:null}):n[c]={t:"a",n:i,name:s,c:void 0,_fx:null}}return n}function C(t){for(let e of t)e&&e._fx&&(e._fx(),e._fx=null)}function j(t){if(t.n.nodeType===1&&t.n[M])return t.n;let e=document.createElement("span");return e.style.display="contents",e.setAttribute("role","presentation"),e[M]=!0,t.n.replaceWith(e),t.n=e,e}var W=t=>t!=null&&typeof t=="object"&&t.strings,D=t=>typeof t=="function"||t!=null&&typeof t.handleEvent=="function";function v(t,e){if(e!==t.c){if(t.t==="n")if(e!=null&&e._directive)e._commit(j(t));else if(W(e))g(e,j(t));else if(Array.isArray(e)){let n=j(t);n.replaceChildren();for(let r of e)if(W(r)){let i=document.createElement("span");i.style.display="contents",i.setAttribute("role","presentation"),n.appendChild(i),g(r,i)}else n.appendChild(document.createTextNode(r??""))}else if(e instanceof Node)t.n.replaceWith(e),t.n=e;else if(t.n[M]){let n=document.createTextNode(e??"");t.n.replaceWith(n),t.n=n}else t.n.textContent=e??"";else if(t.t==="a")e==null||e===!1?t.n.removeAttribute(t.name):t.n.setAttribute(t.name,e===!0?"":e);else if(t.t==="p"){if(!t._resolved){let n=H(t.n,t.name);n!==t.name&&(t.name=n),t._resolved=!0}t.n[t.name]=e}else t.t==="e"&&(D(t.c)&&t.n.removeEventListener(t.name,t.c),D(e)&&t.n.addEventListener(t.name,e));t.c=e}}function ne(t,e){for(let n=0;n<t.length;n++){let r=t[n];if(!r)continue;let i=e[n],o=r.t!=="e"&&typeof i=="function",l=!o&&r.t!=="e"&&$(i);if(r._fx&&!o&&!l&&(r._fx(),r._fx=null),o){r._fx||(r._fx=p(()=>v(r,i())));continue}if(l){r._fx||(r._fx=p(()=>v(r,i.value)));continue}v(r,i)}}function re(t,e,n){return{_directive:!0,_commit(r){let i=r[y]||new Map,o=new Map,l=[];for(let s=0;s<t.length;s++){let a=e(t[s],s);if(o.has(a))continue;l.push(a);let u=n(t[s],s);if(i.has(a)){let d=i.get(a);g(u,d),o.set(a,d)}else{let d=document.createElement("span");d.style.display="contents",d.setAttribute("role","presentation"),g(u,d),o.set(a,d)}}for(let[s,a]of i)o.has(s)||(a._i&&C(a._i.p),a.remove());let c=null;for(let s=l.length-1;s>=0;s--){let a=o.get(l[s]);(a.nextSibling!==c||a.parentNode!==r)&&r.insertBefore(a,c),c=a}r[y]=o}}}var N=new Map,z=new Set(["input-interaction","keyboard-navigation","forms-data","layout-measurement","motion-positioning","animation-feedback","visual-dynamics","interaction-delight","audio-haptics-sensory"]);function fe(t){if(!t.name)throw new Error("Trait requires a name");if(!t.setup)throw new Error(`Trait "${t.name}" requires a setup function`);if(!t.category)throw new Error(`Trait "${t.name}" requires a category`);if(!z.has(t.category))throw new Error(`Trait "${t.name}" has unknown category "${t.category}". Known: ${[...z].join(", ")}`);if(!t.description)throw new Error(`Trait "${t.name}" requires a description`);let e=Object.freeze({name:t.name,category:t.category,description:t.description,attributes:Object.freeze(t.attributes||[]),events:Object.freeze(t.events||[]),config:Object.freeze(t.config||[])});function n(){let r=null;return{schema:e,connect(i,o){r=t.setup({host:i,...o||{}})},disconnect(i){r&&(r(),r=null);for(let o of e.attributes)i.hasAttribute(o)&&(console.warn(`Trait "${e.name}": attribute "${o}" still present after disconnect`),i.removeAttribute(o))}}}return n.schema=e,N.set(t.name,n),n}function G(t){return N.get(t)||null}function de(t){return N.get(t)?.schema||null}function he(){return[...N.keys()]}var L=Symbol(),x=Symbol();function ie(t,e){t[x]=new Map,t[L]=new Map;for(let[n,r]of Object.entries(e)){let i=r.attribute??n.toLowerCase(),o=r.type??String,l=m(r.default??void 0);t[L].set(n,l),Object.defineProperty(t,n,{get(){return l.value},set(c){let s=l.peek();Object.is(s,c)||(t[x].set(n,s),l.value=c,r.reflect&&oe(t,i,c,o))},configurable:!0})}}function oe(t,e,n,r){r===Boolean?n?t.setAttribute(e,""):t.removeAttribute(e):n==null?t.removeAttribute(e):t.setAttribute(e,String(n))}var se=(t,e)=>e===Boolean?t!==null:e===Number?t===null?null:+t:t;function le(t){if(Object.hasOwn(t,"_sa"))return;t._sa=!0;let e=t.styles;if(!e)return;let n=Array.isArray(e)?e:[e];document.adoptedStyleSheets=[...document.adoptedStyleSheets,...n.filter(r=>!document.adoptedStyleSheets.includes(r))]}function K(t){if(Object.hasOwn(t,"_pp"))return;t._pp={};let e=t.parts;if(e)for(let[n,r]of Object.entries(e)){let i=document.createElement("template");i.innerHTML=r,t._pp[n]=i.content.firstElementChild}}var T=class extends HTMLElement{static get properties(){return{}}static get traits(){return[]}static get observedAttributes(){let e=Object.entries(this.properties).map(([n,r])=>r.attribute??n.toLowerCase());return e.includes("traits")?e:[...e,"traits"]}#i=[];#t=[];#o=[];#n=null;#r=null;#e=null;#l=m(0);constructor(){super(),this.internals=this.attachInternals(),ie(this,this.constructor.properties)}connectedCallback(){let e=this.constructor;e._tag||(e._tag=this.localName),le(e),K(e),k(()=>this.connected()),this.#i.push(p(()=>{for(let r of this[L].values())r.value;this.#l.value;let n=e.template(this);if(n&&g(n,this),this.render(),this[x].size){let r=new Map(this[x]);this[x].clear(),this.updated(r)}},{host:this.localName,onError:this.onError?n=>this.onError(n):null})),this.#e||(this.#e=new Set);for(let n of e.traits)this.#s(n);this.#c(),this.#n&&this.#a()}disconnectedCallback(){this._i&&C(this._i.p);for(let e of this.#i)e();this.#i.length=0;for(let e of this.#o)e.value=void 0;this.#o.length=0;for(let e of this.#t)e.disconnect(this);this.#t.length=0,this.#e?.clear(),this.#r?.(),this.#r=null,this.#n?.disconnect?.(this),this.disconnected()}#a(){let e=this.#n;e.connect?.(this),this.#r=e.subscribe?.(()=>{this.#l.value++})}get controller(){return this.#n}set controller(e){this.#r?.(),this.#r=null,this.#n?.disconnect?.(this),this.#n=e,e&&this.isConnected&&this.#a()}#s(e,{declarative:n=!1}={}){this.#e.add(e);let r=e();r.connect(this,{host:this,signal:m,computed:O,effect:p}),n&&(r._declarative=!0),this.#t.push(r)}addTrait(e){return this.#e||(this.#e=new Set),this.#e.has(e)?this:(this.#s(e),this)}#c(){let e=this.getAttribute("traits");if(e)for(let n of e.split(/\s+/).filter(Boolean)){let r=G(n);if(!r){console.warn(`<${this.localName}> traits="${n}" \u2014 trait not found. Did you forget to import it?`);continue}this.#e.has(r)||this.#s(r,{declarative:!0})}}#f(){if(!this.#e)return;let e=[];for(let n of this.#t)if(n._declarative){n.disconnect(this);for(let r of this.#e)if(r.schema?.name&&n.schema?.name===r.schema.name){this.#e.delete(r);break}}else e.push(n);this.#t.length=0,this.#t.push(...e),this.#c()}attributeChangedCallback(e,n,r){if(e==="traits"){this.isConnected&&this.#f();return}for(let[i,o]of Object.entries(this.constructor.properties))if((o.attribute??i.toLowerCase())===e){this[i]=se(r,o.type??String);break}}static template=()=>null;static create(e={}){let n=this._tag??customElements.getName?.(this);if(!n)throw new Error("Component not registered");let r=document.createElement(n);for(let[i,o]of Object.entries(e))r[i]=o;return r}signal(e){let n=m(e);return this.#o.push(n),n}ensure(e){for(let o of this.children)if(o.getAttribute("slot")===e)return o;let n=this.#u(e);if(n)return n;K(this.constructor);let r=this.constructor._pp?.[e];if(!r)return null;let i=r.cloneNode(!0);return i._uiPart=!0,this.appendChild(i),i}drop(e){for(let r of this.children)if(r.getAttribute("slot")===e){r.remove();return}let n=this.#u(e);n&&n.remove()}#u(e){for(let n of this.querySelectorAll(`[slot="${e}"]`)){let r=n.parentElement,i=!0;for(;r&&r!==this;){if(r.localName.includes("-")){i=!1;break}r=r.parentElement}if(i&&r===this)return n}return null}reconcile(e,n,r,i){let o=e[y]||new Map,l=new Map,c=[];for(let a=0;a<n.length;a++){let u=n[a],d=r(u,a);if(l.has(d))continue;let w=o.get(d);w?i(u,a,w):w=i(u,a,null),l.set(d,w),c.push(d)}for(let[a,u]of o)l.has(a)||u.remove();let s=null;for(let a=c.length-1;a>=0;a--){let u=l.get(c[a]);(u.nextSibling!==s||u.parentNode!==e)&&e.insertBefore(u,s),s=u}e[y]=l}connected(){}render(){}disconnected(){}updated(e){}};var E=class extends T{static properties={centered:{type:Boolean,default:!1,reflect:!0},"full-bleed":{type:Boolean,default:!1,reflect:!0}};static template=()=>null};customElements.get("simple-shell")||customElements.define("simple-shell",E);export{E as SimpleShell};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adia-ai/web-modules",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "AdiaUI composite custom elements \u2014 shell, chat, editor, runtime clusters built from @adia-ai/web-components primitives. Subpath exports per cluster.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://adiaui.dev/a2ui/v0_9/components/AdminPageFooter.json",
4
+ "title": "AdminPageFooter",
5
+ "description": "Module-tier page-footer band. CSS-only — no behavior, no JS.\nSticky BOTTOM band inside <admin-page> — the bottom-anchored\ncounterpart of <admin-page-header>. Owns full-width concerns\n(sticky position, border-top, background); wraps an inner\n<footer-ui> for the centered reading column (max-width, gutter,\nrhythm). Use for persistent page-level chrome — a save / action\nbar, pagination, or legal strip. For shell-tier status chrome\nspanning the whole shell, use <admin-statusbar> instead.\n",
6
+ "type": "object",
7
+ "allOf": [
8
+ {
9
+ "$ref": "common_types.json#/$defs/ComponentCommon"
10
+ },
11
+ {
12
+ "$ref": "common_types.json#/$defs/CatalogComponentCommon"
13
+ }
14
+ ],
15
+ "properties": {
16
+ "component": {
17
+ "const": "AdminPageFooter"
18
+ }
19
+ },
20
+ "required": [
21
+ "component"
22
+ ],
23
+ "unevaluatedProperties": false,
24
+ "x-adiaui": {
25
+ "anti_patterns": [],
26
+ "category": "layout",
27
+ "composes": [],
28
+ "events": {},
29
+ "examples": [],
30
+ "keywords": [
31
+ "admin-page-footer",
32
+ "page-footer",
33
+ "sticky-footer",
34
+ "save-bar",
35
+ "action-bar"
36
+ ],
37
+ "name": "AdminPageFooter",
38
+ "related": [
39
+ "AdminPage",
40
+ "AdminPageHeader",
41
+ "AdminPageBody",
42
+ "AdminStatusbar",
43
+ "Footer"
44
+ ],
45
+ "slots": {
46
+ "default": {
47
+ "description": "Default — <footer-ui> with footer content (actions, meta, pagination, legal). Raw <footer> works for the CSS rhythm but drops named slots (no <footer-ui> shadow-DOM slot routing)."
48
+ }
49
+ },
50
+ "states": [
51
+ {
52
+ "description": "Default, the only state.",
53
+ "name": "idle"
54
+ }
55
+ ],
56
+ "status": "stable",
57
+ "synonyms": {
58
+ "page-footer": [
59
+ "content-footer",
60
+ "document-footer",
61
+ "action-bar",
62
+ "save-bar"
63
+ ]
64
+ },
65
+ "tag": "admin-page-footer",
66
+ "tokens": {},
67
+ "traits": [],
68
+ "version": 1
69
+ }
70
+ }
@@ -0,0 +1,64 @@
1
+ # Edit this file; run `npm run build:components` to regenerate a2ui.json.
2
+ $schema: ../../../../scripts/schemas/component.yaml.schema.json
3
+ name: AdminPageFooter
4
+ tag: admin-page-footer
5
+ status: stable
6
+ component: AdminPageFooter
7
+ category: layout
8
+ version: 1
9
+ description: |
10
+ Module-tier page-footer band. CSS-only — no behavior, no JS.
11
+ Sticky BOTTOM band inside <admin-page> — the bottom-anchored
12
+ counterpart of <admin-page-header>. Owns full-width concerns
13
+ (sticky position, border-top, background); wraps an inner
14
+ <footer-ui> for the centered reading column (max-width, gutter,
15
+ rhythm). Use for persistent page-level chrome — a save / action
16
+ bar, pagination, or legal strip. For shell-tier status chrome
17
+ spanning the whole shell, use <admin-statusbar> instead.
18
+
19
+ props: {}
20
+
21
+ events: {}
22
+
23
+ slots:
24
+ default:
25
+ description: >-
26
+ Default — <footer-ui> with footer content (actions, meta,
27
+ pagination, legal). Raw <footer> works for the CSS rhythm but
28
+ drops named slots (no <footer-ui> shadow-DOM slot routing).
29
+
30
+ states:
31
+ - name: idle
32
+ description: Default, the only state.
33
+
34
+ traits: []
35
+
36
+ a2ui:
37
+ rules:
38
+ - >-
39
+ admin-page-footer is the sticky bottom band of <admin-page>,
40
+ the bottom-anchored counterpart of <admin-page-header>. Wraps
41
+ an inner <footer-ui> for centered reading-column rhythm.
42
+ - rule: 'Wraps an inner <footer-ui> for centered reading-column rhythm; admin-page-footer owns sticky positioning + border-top, footer-ui owns the content layout.'
43
+ reason: 'Sticky chrome vs content layout separation — mirrors admin-page-header.'
44
+ - rule: 'Always inside <admin-page slot="footer">; for shell-tier status chrome spanning the whole shell use <admin-statusbar> instead.'
45
+ reason: 'Page-tier vs shell-tier distinction.'
46
+ - rule: 'Optional — most pages need only <admin-page-header> + <admin-page-body>. Add a footer only for persistent page-level actions (save bar, pagination, legal); never stamp an empty one.'
47
+ reason: 'The footer is optional in the header/body/footer triad.'
48
+
49
+ keywords:
50
+ - admin-page-footer
51
+ - page-footer
52
+ - sticky-footer
53
+ - save-bar
54
+ - action-bar
55
+
56
+ synonyms:
57
+ page-footer: [content-footer, document-footer, action-bar, save-bar]
58
+
59
+ related:
60
+ - AdminPage
61
+ - AdminPageHeader
62
+ - AdminPageBody
63
+ - AdminStatusbar
64
+ - Footer
@@ -125,6 +125,23 @@ admin-page > admin-page-body {
125
125
  flex-direction: column;
126
126
  }
127
127
 
128
+ /* ── admin-page-footer ≡ sticky bottom band ──
129
+ Bottom-anchored counterpart of admin-page-header: same raised background
130
+ so the band separates from content scrolling above it, but border-TOP
131
+ (not -bottom) and pinned to the bottom edge. No drop shadow — the header's
132
+ shadow reinforces "chrome floating above content you scroll DOWN past"; a
133
+ bottom-pinned band reads correctly from the border-top + canvas step alone.
134
+ The inner <footer-ui> centered-column geometry lives in templates.css
135
+ alongside the header/body rules. */
136
+ admin-page > admin-page-footer {
137
+ position: sticky;
138
+ bottom: 0;
139
+ z-index: 1;
140
+ background: var(--page-content-header-bg);
141
+ border-top: var(--page-content-border);
142
+ flex-shrink: 0;
143
+ }
144
+
128
145
  /* ── admin-sidebar — geometry + resize handle + container queries ──
129
146
  Canonical styling for <admin-sidebar> per ADR-0023. Pre-v0.4.0 this
130
147
  bridged to legacy <aside-ui slot> / <aside data-sidebar> selectors;
@@ -37,7 +37,8 @@
37
37
  — own margin/padding via their own CSS; never inherit this.
38
38
  ─────────────────────────────────────────────────────────────── */
39
39
  admin-page-header > :is(header, header-ui),
40
- admin-page-body > :is(section, section-ui) {
40
+ admin-page-body > :is(section, section-ui),
41
+ admin-page-footer > :is(footer, footer-ui) {
41
42
  max-width: var(--page-content-max-width);
42
43
  margin-inline: auto;
43
44
  width: 100%;
@@ -53,8 +54,10 @@ admin-page-header > :is(header, header-ui) {
53
54
  semantic element. */
54
55
  admin-page-header[data-content-full] > :is(header, header-ui),
55
56
  admin-page-body[data-content-full] > :is(section, section-ui),
57
+ admin-page-footer[data-content-full] > :is(footer, footer-ui),
56
58
  admin-page-header > :is(header, header-ui)[data-content-full],
57
- admin-page-body > :is(section, section-ui)[data-content-full] {
59
+ admin-page-body > :is(section, section-ui)[data-content-full],
60
+ admin-page-footer > :is(footer, footer-ui)[data-content-full] {
58
61
  max-width: 100%;
59
62
  }
60
63
 
@@ -118,6 +121,20 @@ admin-page-body > :is(section, section-ui) {
118
121
  gap: var(--page-section-gap, var(--a-space-8));
119
122
  }
120
123
 
124
+ /* ── Content footer inner layout ──
125
+ Centered column like the header, but a horizontal action row anchored to
126
+ the trailing edge by default (Cancel / Save bar). Authors who want a
127
+ spread layout (meta left, actions right) set their own justify-content on
128
+ the inner <footer-ui>. */
129
+ admin-page-footer > :is(footer, footer-ui) {
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: flex-end;
133
+ gap: var(--page-header-gap);
134
+ padding-inline: var(--page-content-inset);
135
+ padding-block: var(--page-header-gap);
136
+ }
137
+
121
138
  /* iframe-as-page-content: fill the body.
122
139
  display: block kills the 4-5px inline-descender gap. */
123
140
  admin-page-body > iframe {