/* m-shell.css — D03: the app frame. ONE source for header, navigation (desktop rail / phone tab bar / More sheet) and the shared page patterns.
   Replaces the shell rules that used to live in m-home.css, m-app-skin.css and m-compact.css. Tokens only (token-guard). Loaded last. */
:root{--shell-h:0px;--nav-h:0px;--rail-w:76px}
html:root{--bx-header-h:0px}
.skip{position:fixed;inset-block-start:var(--sp-2);inset-inline-start:var(--sp-2);z-index:200;padding:var(--sp-3) var(--sp-4);border-radius:var(--rd-md);background:var(--c-sand);color:var(--c-starlight-dark);font-weight:var(--fw-bold);text-decoration:none;transform:translateY(-200%)}
.skip:focus{transform:none;outline:3px solid var(--c-white);outline-offset:2px}
#main:focus{outline:0}
.nv-l{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
header.top .live{color:var(--c-x-4cd37b)}

/* ---- glyphs (CSS masks keyed off data-v / data-act: the markup stays text-only) ---- */
header.top nav button::before,.mo-nav button::before,.mo-act button::before,header.top .me button::before,.hd-search::before{content:"";width:20px;height:20px;flex:none;background:currentColor;-webkit-mask:var(--g) center/contain no-repeat;mask:var(--g) center/contain no-repeat}
.nv-more{--g:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23000'%3E%3Ccircle cx='5' cy='12' r='1.8'/%3E%3Ccircle cx='12' cy='12' r='1.8'/%3E%3Ccircle cx='19' cy='12' r='1.8'/%3E%3C/svg%3E")}
.hd-search{--g:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='m20 20-3.5-3.5'/%3E%3C/svg%3E")}
[data-act=logout]{--g:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9'/%3E%3C/svg%3E")}
.me [data-act=help],.mo-act [data-act=help]{--g:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9.5 9a2.5 2.5 0 1 1 3.5 2.3c-.7.4-1 1-1 1.7M12 17h.01'/%3E%3C/svg%3E")}
[data-act=install]{--g:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3v12M7 10l5 5 5-5M5 21h14'/%3E%3C/svg%3E")}
.rail-t{--g:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m15 6-6 6 6 6'/%3E%3C/svg%3E")}
.hide{display:none!important}

/* ---- More sheet (phones/tablets) ---- */
.mow{position:fixed;inset:0;z-index:60}
.mo-bd{position:absolute;inset:0;background:rgba(var(--c-starlight-dark-rgb),.55);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);animation:shell-fade var(--dur-md) var(--ease)}
.mo{position:absolute;inset-inline:0;bottom:0;margin-inline:auto;max-width:560px;max-height:88vh;overflow:auto;padding:var(--sp-4) var(--sp-4) calc(var(--sp-4) + env(safe-area-inset-bottom));background:var(--c-white);border-radius:var(--rd-lg) var(--rd-lg) 0 0;box-shadow:var(--sh-3);animation:shell-up var(--dur-slow) var(--ease)}
.mo-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--sp-3)}.mo-h b{font:var(--fw-bold) var(--fs-lg)/1.2 var(--font-head);color:var(--c-starlight)}
.mo-x{width:44px;height:44px;border:0;border-radius:50%;background:var(--c-n50);color:var(--c-starlight);font-size:var(--fs-lg);cursor:pointer}
.mo-nav{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-2)}
.mo-nav button{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-1);min-height:72px;padding:var(--sp-2);border:1px solid var(--c-n100);border-radius:var(--rd-md);background:var(--c-white);color:var(--c-starlight);font:var(--fw-bold) var(--fs-sm)/1.2 var(--font-body);cursor:pointer}
.mo-nav button.on{background:var(--c-blue-soft);border-color:var(--c-blue)}
.mo-nav button:active,.mo-act button:active{transform:scale(.97)}
.mo-me{display:flex;align-items:center;gap:var(--sp-3);margin:var(--sp-4) 0 var(--sp-2);padding-top:var(--sp-4);border-top:1px solid var(--c-n100)}
.mo-av{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,var(--c-sand),var(--c-sand-dark))}
.mo-act{display:grid;gap:var(--sp-1)}
.mo-act button{display:flex;align-items:center;gap:var(--sp-3);min-height:48px;padding:0 var(--sp-3);border:0;border-radius:var(--rd-md);background:none;color:var(--c-starlight);font:var(--fw-med) var(--fs-md) var(--font-body);cursor:pointer;text-align:start}
.mo-act button:hover{background:var(--c-n50)}
@keyframes shell-fade{from{opacity:0}}
@keyframes shell-up{from{transform:translateY(100%)}}

/* ---- PHONES & TABLETS (<900): slim header (<=56px) + bottom tab bar (4 destinations + More) ---- */
@media(max-width:899px){
  :root{--shell-h:56px;--nav-h:62px}
  html:root{--bx-header-h:var(--shell-h)}
  html:root:has(header.top.sk-hide){--bx-header-h:0px}
  html body header.top{position:sticky;top:0;inset-inline:0;z-index:40;width:auto;height:calc(var(--shell-h) + env(safe-area-inset-top));min-height:0;display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:var(--sp-2);padding:env(safe-area-inset-top) var(--sp-3) 0;overflow:visible;background:linear-gradient(135deg,var(--c-starlight-dark),var(--c-starlight));box-shadow:var(--sh-2);transition:top var(--dur-md) var(--ease)}
  html body header.top.sk-hide{top:calc(-1 * (var(--shell-h) + env(safe-area-inset-top)))}
  html body header.top .brand{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:var(--sp-2);padding:0;margin:0;border:0}
  html body header.top img.lg-h{display:none}
  html body header.top img.lg-s{display:block;height:34px;width:auto;flex:none}
  html body header.top .hd{min-width:0;padding:0;border:0;margin:0;line-height:1.15;font:var(--fw-bold) var(--fs-lg)/1.15 var(--font-head);text-transform:none;letter-spacing:0;color:var(--c-white);opacity:1;overflow:hidden}
  html body header.top .hd-app{display:none}
  html body header.top .hd-pg{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  html body header.top .hd small{display:block;margin:0;color:var(--c-n300);font:var(--fw-med) var(--fs-xs)/1.2 var(--font-body);letter-spacing:0;white-space:nowrap}
  html body header.top .empchip{order:2;flex:0 1 auto;min-width:0;max-width:46vw;min-height:40px}
  html body header.top .hd-search{order:3;flex:none;width:40px;height:40px;padding:0;display:grid;place-items:center;border:1px solid rgba(var(--c-white-rgb),.22);border-radius:50%;background:rgba(var(--c-white-rgb),.08);color:var(--c-white);cursor:pointer}
  html body header.top .hd-search .nv-l,html body header.top .hd-search kbd{display:none}
  html body header.top .notif-bell{order:4;flex:none}
  html body header.top .me{display:none}
  html body header.top nav{position:fixed;inset:auto 0 0 0;z-index:35;display:flex;justify-content:center;gap:0;width:100%;margin:0;padding:var(--sp-1) var(--sp-2) calc(var(--sp-1) + env(safe-area-inset-bottom));min-height:calc(var(--nav-h) + env(safe-area-inset-bottom));overflow:visible;background:rgba(var(--c-white-rgb),.96);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);border-top:1px solid var(--c-n100);box-shadow:0 -8px 28px rgba(var(--c-starlight-rgb),.10);transition:transform var(--dur-md) var(--ease)}
  html body header.top.sk-hide nav{transform:translateY(100%)}
  html body header.top nav .nv-g{display:contents}
  html body header.top nav .nv-gl{display:none}
  html body header.top nav button{flex:1 1 0;max-width:132px;min-width:0;min-height:52px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:var(--sp-1) 2px;border:0;border-radius:var(--rd-md);background:none;color:var(--c-n500);font:var(--fw-bold) var(--fs-xs)/1.15 var(--font-body);transform:none;box-shadow:none}
  html body header.top nav button::before{width:22px;height:22px}
  html body header.top nav button.on{background:var(--c-blue-soft);color:var(--c-starlight);box-shadow:none}
  html body header.top nav button.on::before{transform:none}
  html body header.top nav button.on::after{content:none}
  html body header.top nav button.nv-sec{display:none}
  html body header.top nav button .nv-l{max-width:100%}
  html body main{margin:0;max-width:none;padding:var(--sp-3) var(--sp-3) calc(var(--nav-h) + var(--sp-6) + env(safe-area-inset-bottom))}
  html body .hx-dial{inset-block-end:calc(var(--nav-h) + var(--sp-4) + env(safe-area-inset-bottom))}
  html body .toast{inset-block-end:calc(var(--nav-h) + var(--sp-4) + env(safe-area-inset-bottom))}
  html body .bulk-tools{bottom:calc(var(--nav-h) + env(safe-area-inset-bottom))}
}

/* ---- DESKTOP (>=900): left rail with groups, clear active state, collapsible ---- */
@media(min-width:900px){
  html{--hx-w:252px}
  html.rail-c{--hx-w:var(--rail-w)}
  .mow{display:none}
  html body header.top{position:fixed;inset:0 auto 0 0;z-index:30;width:var(--hx-w);height:100vh;display:flex;flex-direction:column;flex-wrap:nowrap;align-items:stretch;gap:var(--sp-1);padding:var(--sp-5) var(--sp-3) var(--sp-4);overflow-x:hidden;overflow-y:auto;background:linear-gradient(180deg,var(--c-starlight-dark),var(--c-x-09121e) 80%);border-inline-end:1px solid rgba(var(--c-white-rgb),.05);transition:width var(--dur-md) var(--ease)}
  html body main{margin-inline-start:var(--hx-w);max-width:none;transition:margin-inline-start var(--dur-md) var(--ease)}
  html body header.top .brand{order:0;flex-direction:column;align-items:flex-start;gap:var(--sp-2);padding:0 var(--sp-2) var(--sp-3);margin-bottom:var(--sp-2);border-bottom:1px solid rgba(var(--c-white-rgb),.08)}
  html body header.top img.lg-s{display:none}
  html body header.top img.lg-h{display:block;height:34px;width:auto}
  html body header.top .hd{padding:0;border:0;font:var(--fw-med) var(--fs-sm)/1.3 var(--font-body);color:var(--c-white);letter-spacing:.04em}
  html body header.top .hd-pg{display:none}
  html body header.top .hd small{display:block;margin-top:2px;color:var(--c-sand);letter-spacing:0;font-size:var(--fs-xs)}
  html body header.top .empchip{order:1;align-self:stretch;width:100%;max-width:none}
  html body header.top .hd-search{order:2;display:flex;align-items:center;gap:var(--sp-3);width:100%;min-height:42px;margin:var(--sp-1) 0 var(--sp-2);padding:0 var(--sp-3);border:1px solid rgba(var(--c-white-rgb),.14);border-radius:var(--rd-md);background:rgba(var(--c-white-rgb),.05);color:var(--c-n300);font:var(--fw-med) var(--fs-md) var(--font-body);cursor:pointer;text-align:start}
  html body header.top .hd-search:hover{background:rgba(var(--c-white-rgb),.1);color:var(--c-white)}
  html body header.top .hd-search kbd{margin-inline-start:auto;padding:1px 7px;border-radius:6px;border:1px solid rgba(var(--c-white-rgb),.2);background:none;color:var(--c-n300);font:var(--fw-med) var(--fs-xs) var(--font-body)}
  html body header.top nav{order:3;display:flex;flex-direction:column;gap:var(--sp-1);flex:1 1 auto;width:100%;margin:0;padding:0;overflow:visible}
  html body header.top nav .nv-g{display:flex;flex-direction:column;gap:2px}
  html body header.top nav .nv-gl{padding:var(--sp-2) var(--sp-3) var(--sp-1);color:rgba(var(--c-white-rgb),.5);font:var(--fw-med) var(--fs-xs) var(--font-body)}
  html body header.top nav button{display:flex;align-items:center;gap:var(--sp-3);width:100%;min-height:40px;padding:0 var(--sp-3);border:0;border-radius:var(--rd-md);background:none;color:var(--c-n300);font:var(--fw-med) var(--fs-md) var(--font-body);text-align:start;position:relative;transform:none;box-shadow:none;transition:background var(--dur-fast),color var(--dur-fast)}
  html body header.top nav button:hover{background:rgba(var(--c-white-rgb),.07);color:var(--c-white);transform:none}
  html body header.top nav button.on{background:rgba(var(--c-white-rgb),.13);color:var(--c-white);font-weight:var(--fw-bold);box-shadow:none}
  html body header.top nav button.on::before{background:var(--c-sand)}
  html body header.top nav button.on::after{content:"";position:absolute;inset-inline-start:calc(-1 * var(--sp-3));top:50%;width:4px;height:22px;margin-top:-11px;border-radius:0 4px 4px 0;background:var(--c-sand)}
  html body header.top nav .nv-more{display:none}
  html body header.top .notif-bell{order:4;width:100%;height:42px;border:0;border-radius:var(--rd-md);display:flex;align-items:center;justify-content:flex-start;gap:var(--sp-3);padding:0 var(--sp-3);font-size:var(--fs-xl);color:var(--c-n300);background:none}
  html body header.top .notif-bell::after{content:"Notifications";font:var(--fw-med) var(--fs-md) var(--font-body)}
  html body header.top .notif-bell:hover{background:rgba(var(--c-white-rgb),.07);color:var(--c-white);transform:none}
  html body header.top .notif-count{position:static;margin-inline-start:auto;order:3;inset:auto}
  html body header.top .me{order:5;display:grid;grid-template-columns:minmax(0,1fr) repeat(3,36px);align-items:center;gap:2px;margin:var(--sp-2) 0 0;padding:var(--sp-2);border-radius:var(--rd-lg);background:rgba(var(--c-white-rgb),.06);color:var(--c-white)}
  html body header.top .me>span{display:flex;align-items:center;gap:var(--sp-2);min-width:0;font-weight:var(--fw-bold);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
  html body header.top .me>span::before{content:"";width:30px;height:30px;border-radius:50%;flex:none;background:linear-gradient(135deg,var(--c-sand),var(--c-sand-dark));box-shadow:0 0 0 2px rgba(var(--c-white-rgb),.18)}
  html body header.top .me button{position:relative;display:grid;place-items:center;width:36px;height:36px;padding:0;border:0;border-radius:var(--rd-sm);background:none;color:var(--c-n300);cursor:pointer}
  html body header.top .me button:hover{background:rgba(var(--c-white-rgb),.1);color:var(--c-white)}
  html body header.top .me .nv-l{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  html body .toast{inset-inline-start:calc(50% + var(--hx-w)/2)}
  /* collapsed rail: icons only (labels stay in the DOM for screen readers) */
  html.rail-c body header.top{padding-inline:var(--sp-2)}
  html.rail-c body header.top img.lg-h,html.rail-c body header.top .hd,html.rail-c body header.top nav .nv-gl,html.rail-c body header.top .me>span,html.rail-c body header.top .hd-search kbd,html.rail-c body header.top .notif-bell::after,html.rail-c body header.top .notif-count{display:none}
  html.rail-c body header.top img.lg-s{display:block;height:34px;width:auto;margin-inline:auto}
  html.rail-c body header.top .brand{align-items:center;padding-inline:0}
  html.rail-c body header.top .nv-l{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  html.rail-c body header.top nav button,html.rail-c body header.top .hd-search,html.rail-c body header.top .notif-bell{justify-content:center;padding-inline:0}
  html.rail-c body header.top .me{grid-template-columns:1fr;justify-items:center}
  html.rail-c body header.top .me .hk{display:none}
  html.rail-c body header.top .empchip .en,html.rail-c body header.top .empchip .sw{display:none}
  html.rail-c body header.top .empchip{justify-content:center;padding:var(--sp-1)}
  html.rail-c body header.top nav button.on::after{inset-inline-start:calc(-1 * var(--sp-2))}
  html.rail-c body header.top .rail-t::before{transform:scaleX(-1)}
}
@media(min-width:900px) and (prefers-reduced-motion:reduce){html body header.top,html body main{transition:none}}
@media(prefers-reduced-motion:reduce){.mo,.mo-bd{animation:none}html body header.top,html body header.top nav{transition:none}}

/* ---- shared page patterns (D03): Page Header · Toolbar · Filter bar · Sticky actions. Existing `.tdh` headers share the Page Header look. ---- */
.ph,.tdh{display:flex;align-items:flex-end;justify-content:space-between;flex-wrap:wrap;gap:var(--sp-2) var(--sp-4);margin:0 0 var(--sp-4)}
.ph-t,.tdh>:first-child{min-width:0}
.ph h2,.tdh h2{margin:0;font:var(--fw-bold) var(--fs-2xl)/var(--lh-tight) var(--font-head);color:var(--c-starlight)}
.ph p,.tdh small{margin:var(--sp-1) 0 0;color:var(--c-n600);font:var(--fw-reg) var(--fs-md)/var(--lh-body) var(--font-body)}
.ph-a{display:flex;gap:var(--sp-2);align-items:center}
.tbar{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2);margin:0 0 var(--sp-3)}
.tbar>.grow{flex:1 1 220px;min-width:0}
.fbar{display:flex;gap:var(--sp-2);overflow-x:auto;scrollbar-width:none;padding-bottom:2px;margin:0 0 var(--sp-3)}
.fbar::-webkit-scrollbar{display:none}.fbar>*{flex:none}
.sact{position:sticky;bottom:calc(var(--nav-h) + env(safe-area-inset-bottom));z-index:20;display:flex;gap:var(--sp-2);padding:var(--sp-3);margin-top:var(--sp-4);border-top:1px solid var(--c-n100);background:rgba(var(--c-white-rgb),.96);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}
.sact>*{flex:1}
@media(max-width:899px){.ph h2,.tdh h2{font-size:var(--fs-xl)}}
