  :root {
    /* v1.4.10.403: the two brand faces (css/fonts.css serves them and names them
       again — this copy keeps app.css whole on its own). Every font-family in
       this sheet reads one of the three role tokens below them, never a face. */
    --font-brand:'Inter','Helvetica Neue',Arial,system-ui,sans-serif;   /* v1.4.10.543: Inter (was Poppins) */
    --font-logo:'Poppins','Helvetica Neue',Arial,system-ui,sans-serif;   /* v1.4.10.543: the AVDesk wordmark set as text, nothing else */
    --font-code:'Inter','Helvetica Neue',Arial,system-ui,sans-serif;   /* v1.4.10.546: codes in Inter too (tabular figures) */
    --font-source:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;   /* v1.4.10.546: source code only (<pre>, wiki code, a sheet's Mono) */
    --font:var(--font-body);
    /* ── TYPE SYSTEM (v1.4.10.443) — every size in this sheet, the js/ inline styles and the public pages is a step of
       10 11 12 13 14 15 16 18 20 24 30 36 44 px (no half pixels, no em/rem: dev/checks/fonts.py fails on anything else),
       every weight is 400 500 600 700, and an UPPERCASE label tracks in em. One look per role, everywhere:
         KPI / stat value 30/700 (-.03em; secondary 24/700, small 20/600)  ·  page title 20/600 (phone 18)
         section, modal, drawer title 16/600  ·  panel / card title 15/600  ·  sub-heading 13/600
         body 13/400  ·  reading text (wiki, messages, descriptions) 14/400  ·  meta 12/400  ·  caption 11/400
         uppercase label, table header, KPI label 11/600 .06em  ·  badge (uppercase only) 10/700 .04em
         status pill 11/600  ·  filter chip 12/500  ·  .btn 13/500 (.sm 12, .xs 11; primary 600)  ·  tab 13/600
         segmented control 12/600  ·  nav 13/500 (active 600)  ·  field 13/400 (16px on a phone: iOS zoom)
         field label 12/500  ·  tooltip 12  ·  toast 13/500  ·  bold (b, strong) 700
       10px is for uppercase badges only. The wall boards' clamp() type scales with the screen and is left out.
       v1.4.10.473 (the full pass after v471/v472 drifted) settled the cases above left open:
         KPI value on a phone 24/700  ·  a detail window's hero title (ticket, asset, site, device, client) is the page
         title look, an editor's hero (.site-ed-htext, .ue-htext, the asset editor) the modal title look  ·  a count chip
         (digits) is the badge, 10/700  ·  avatar initials on the 10px step take the badge look (userAv)  ·  .fld > span is
         the field label like .field label  ·  a hint inside a label ("(optional)") is a caption, 11/400  ·  an empty
         state says its message 13/400 (title 15/600, .empty-sub 12/400)  ·  codes carry .mono (Inter, tabular figures, since v1.4.10.546; JetBrains Mono before)  ·  a
         font-family reads --font-body / --font-display / --font-mono, never --font-brand / --font-code.
       Controls in one row share one height (.btn.primary carries a transparent border like its neighbours); on a touch
       screen every control has one 40px floor. dev/tools/format-crawl/pane-crawl.js measures all of it in a browser. ── */
    /* AVDesk brand — blue→purple gradient identity */
    --brand-blue: var(--bc-blue-v1);
    --brand-purple: var(--bc-purple-v1);
    --grad: linear-gradient(120deg, var(--bc-blue-v1) 0%, var(--bc-purple-v1) 100%);
    --accent: var(--bc-blue-v1);
    --accent-2: var(--bc-blue-v1-2);
    --accent-deep: var(--bc-blue-v1-deep);
    --accent-glow: rgba(var(--bc-accent-rgb),0.10);
    /* Light surfaces */
    --bg: #F6F8FC;            /* app canvas */
    --bg-2: #FFFFFF;          /* nav / elevated bars */
    --surface: #FFFFFF;       /* cards/panels */
    --surface-2: #F2F5FA;     /* subtle fills, hovers */
    --surface-3: #E9EEF6;     /* stronger fills */
    --line: #E2E8F2;          /* hairlines */
    --line-2: #CDD7E6;        /* stronger borders */
    /* Text on light */
    --text: #0F172A;
    --text-mute: #5A6B85;
    --text-dim: #93A0B4;
    /* Status */
    --ok: #16A34A;
    --warn: #D97706;
    --on-warn: #1b1300;   /* v1.4.10.428: text sitting ON a --warn fill */
    --err: #DC2626;
    --info: var(--bc-purple-v1);
    --p1: #DC2626;
    --p2: #D97706;
    --p3: var(--bc-blue-v1);
    --p4: #93A0B4;
    /* legacy aliases remapped to the light theme so existing rules keep working */
    --electric: var(--bc-blue-v1);
    --electric-2: var(--bc-blue-v1-2);
    --navy: #F6F8FC;
    --navy-2: #F2F5FA;
    --navy-3: #E9EEF6;
    --cyan: var(--bc-purple-v1);
    /* aliases for tokens referenced around the app but never declared — without
       these, `var(--card)` resolved to nothing (transparent panels on the
       Reliability / Utilisation / Wallboard / Launch-checks / Workspaces /
       Self-check pages) and `var(--border)` fell back to off-palette hexes. */
    --card: #FFFFFF;          /* = --surface */
    --border: #E2E8F2;        /* = --line   */
    --bg2: #FFFFFF;           /* = --bg-2   */
    --brand: var(--bc-blue-v1);         /* = --brand-blue */
    --mono:var(--font-code);  /* = --font-mono */
    --radius: 14px;
    --shadow-sm: 0 1px 2px rgba(15,23,42,0.04), 0 1px 3px rgba(15,23,42,0.06);
    --shadow-md: 0 4px 16px rgba(15,23,42,0.08);
    --shadow-lg: 0 20px 50px rgba(15,23,42,0.16);
    --font-display:var(--font-brand);
    --font-body:var(--font-brand);
    --font-mono:var(--font-code);
  }
  *,*::before,*::after{box-sizing:border-box;}
  html,body{margin:0;height:100%;background:var(--bg);color:var(--text);font-family:var(--font-body);font-size:14px;font-feature-settings:normal;-webkit-font-smoothing:antialiased;letter-spacing:-0.006em;}
  a{color:var(--accent-2);text-decoration:none;}
  /* v1.4.10.443: a control with no size of its own takes the size of the text around it — the browser's own
     13.333px was showing through on every unsized button and field. Fields with no class are body size (13px). */
  button,input,select,textarea,optgroup{font-family:inherit;font-size:inherit;}
  input,select,textarea{font-size:13px;}
  /* bold is 700, whatever it sits in: the browser's "bolder" turned a <strong> inside 600 text into 900 */
  b,strong{font-weight:700;}
  ::selection{background:rgba(var(--bc-accent-rgb),0.18);color:var(--text);}
  h1,h2,h3,h4{font-family:var(--font-display);font-weight:600;letter-spacing:-.012em;}
  
  /* Scrollbars */
  ::-webkit-scrollbar{width:10px;height:10px;}
  ::-webkit-scrollbar-track{background:transparent;}
  ::-webkit-scrollbar-thumb{background:var(--line);border-radius:5px;border:2px solid var(--navy);}
  ::-webkit-scrollbar-thumb:hover{background:var(--line-2);}

  /* ============ SHARED FORM PRIMITIVES (were in the old LOGIN block; used app-wide) ============ */
  .live-dot{width:8px;height:8px;border-radius:50%;background:var(--ok);position:relative;flex-shrink:0;}
  .live-dot::after{content:'';position:absolute;inset:0;border-radius:50%;background:var(--ok);animation:liveRing 2s ease-out infinite;}
  @keyframes liveRing{0%{transform:scale(1);opacity:0.6;}70%{transform:scale(2.8);opacity:0;}100%{opacity:0;}}
  /* Input adornments: leading icon + optional reveal toggle */
  .input-wrap{position:relative;display:flex;align-items:center;}
  .input-wrap .input-ico{position:absolute;left:13px;display:flex;align-items:center;justify-content:center;color:var(--text-dim);pointer-events:none;transition:color 0.15s;z-index:1;}
  .input-wrap .input-ico svg{width:17px;height:17px;}
  .input-wrap:focus-within .input-ico{color:var(--brand-blue);}
  .input-wrap .pass-toggle{position:absolute;right:8px;display:flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;background:transparent;border:0;border-radius:6px;color:var(--text-dim);cursor:pointer;transition:color 0.15s,background 0.15s;z-index:1;}
  .input-wrap .pass-toggle:hover{color:var(--brand-blue);background:var(--surface-2);}
  .input-wrap .pass-toggle svg{width:17px;height:17px;}
  .field{margin-bottom:16px;}
  .field label{display:block;font-size:12px;color:var(--text-mute);margin-bottom:7px;font-weight:500;}
  /* v1.4.10.473: a hint inside a field label ("(optional)", "(seconds)", "(read/write)") is a caption, 11/400 — it took the
     label's 500. Inside an uppercase form label (.fu-lb, .tk-item-lb) it is not shouted in capitals either, as .cust-modal-sec's */
  .field label .device-meta,.fld > span .device-meta{font-weight:400;}
  .fu-lb .device-meta,.tk-item-lb .device-meta{font-weight:400;text-transform:none;letter-spacing:0;}
  /* v1.4.10.473: a file picker drawn as <label class="btn"> (Choose photo, Choose image) is a button, not a field label:
     the rule above made it a block with a 7px margin, so it stood 33px beside 40px buttons it stretched (room and
     catalogue photo pickers) and read in the label's 12px grey */
  .field label.btn{display:inline-flex;margin-bottom:0;font-size:13px;color:var(--text);}
  .field label.btn.sm{font-size:12px;}
  .field label.btn.xs{font-size:11px;}
  .field input,.field select,.field textarea{width:100%;padding:11px 14px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;transition:border-color 0.15s,box-shadow 0.15s;}
  .field input:focus,.field select:focus,.field textarea:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .field textarea{min-height:96px;resize:vertical;}
  /* v1.4.10.473: a placeholder longer than its field ends in an ellipsis instead of being sliced mid-word — at a phone's
     16px "Only to change your own email or password" and "e.g. Quarterly projector lamp & filter service" ran out of box */
  .field input,.inp{text-overflow:ellipsis;}
  /* v1.4.10.473: one field height in a form: 44 on a desktop and 49 on a phone (the field's 11px 14px around its 13px /
     16px text), for an input, a select and the searchable picker (.field .avsel-btn) alike. A date or time box is as
     tall as the text box beside it: Chrome pads the date's field wrapper 1px top and bottom, so every date stood 2px
     taller (46 vs 44, 51 vs 49 on a phone: Site statistics' Add note, the maintenance editor's When / Until). */
  input::-webkit-datetime-edit-fields-wrapper{padding-top:0;padding-bottom:0;}
  /* v1.4.10.473: and a native select at 13px stood 1px taller than the input beside it (Chrome sizes its text box from the
     font, 21px to the input's 20: 45 vs 44 in the user, asset and maintenance editors); 10px on top brings it level. A
     touch screen's 16px select already measures the input's 49, so it keeps 11px there. */
  .field select:not([multiple]):not([size]){padding-top:10px;}
  @media (hover:none) and (pointer:coarse){ .field select:not([multiple]):not([size]){padding-top:11px;} }
  /* v1.4.10.473: a control that carries the wrapper's class itself (<input class="field">: the type-DELETE boxes of the
     site, client, Ody and invoice deletes, the move pickers, the Xero contact search) drew as a bare browser box (1px 2px
     padding, a 2px inset border) with the wrapper's 16px bottom margin. It takes the field look, and a button in its row
     takes its height (Delete everything at this site stood 38 / 40 beside it). */
  input.field,select.field,textarea.field{margin:0;padding:11px 14px;background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r-ctl);color:var(--text);font-size:13px;font-family:inherit;}
  input.field:focus,select.field:focus,textarea.field:focus{outline:none;border-color:var(--bc-grad-a);box-shadow:0 0 0 3px rgba(var(--bc-grad-a-rgb),.14);}
  :has(> input.field) > .btn{align-self:stretch;}
  @media (max-width:760px){ input.field,select.field,textarea.field{font-size:16px;} }
  .inp{padding:10px 12px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;transition:border-color 0.15s,box-shadow 0.15s;}
  .inp:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .inp:disabled{opacity:0.55;cursor:not-allowed;}
  .field-row{display:flex;justify-content:space-between;align-items:center;margin:-4px 0 18px;}
  .check{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--text-mute);cursor:pointer;}
  /* v1.4.10.473: a checkbox's label is the option's text, 13/400 wherever it sits — inside a .field the field-label rule
     (12/500) won, so the same tick-box read 13/400 on one form and 12/500 on the next. And the box itself is a box:
     .field input gave every tick-box in a form width:100% and 11px padding, so "Active supplier" sat on a line of its
     own under a 374px-wide checkbox (the generic editors' Active toggles). */
  .field label.check{display:flex;font-size:13px;font-weight:400;}
  .field input:where([type=checkbox],[type=radio]){width:auto;padding:0;}   /* same weight as .field input, so the switches' own hidden inputs (.ue-toggle input, .au-sw input…) still win */
  .check input{accent-color:var(--brand-blue);}
  .field-row a{font-size:12px;}
  /* Grouped multi-select sections in the user editor (orgs / sites / permissions) */
  .field.ef-block{margin-top:4px;padding-top:16px;border-top:1px solid var(--line);}
  .field.ef-block > label{font-size:13px;font-weight:600;color:var(--text);}

  /* ============ SIGN-IN (v1.4.10.326) ============
     Rebuilt on the avdesk.com.au brand (marketing site v1.7.x): the navy
     "arrive" stage with the building render, Poppins, the --brand-grad
     button, the eyebrow rule and the mono status line with its live LED.
     Everything is scoped under #login so the app-wide .field / .check /
     .input-wrap rules above keep their app look. html is 14px in this app,
     so the sheet sizes in px, never rem. #login MUST stay display:flex —
     init() and logout() write style.display='flex'. */
  #login{
    --lg-navy:var(--bc-navy); --lg-navy-2:#122237; --lg-line:#25384F;
    --lg-on-navy:#C3D0DE; --lg-on-navy-2:#9FB6D6; --lg-on-navy-3:#8FA6C4;
    --lg-ink:#0C1B2A; --lg-ink-2:#46596B; --lg-ink-3:#75899B;
    --lg-rule:#DEE5EC; --lg-rule-2:#C3CEDA; --lg-field:#FBFCFE;
    --lg-accent:var(--bc-grad-a); --lg-link:var(--bc-accent); --lg-led:#3ED27C; --lg-err:#B7362C;
    --lg-grad:linear-gradient(112deg,var(--bc-grad-a) 0%,var(--bc-grad-b) 52%,var(--bc-purple) 100%);
    --lg-ease:cubic-bezier(.22,.61,.36,1);
    --lg-font:var(--font-body);   /* v1.4.10.473: the role tokens, not the face tokens they resolve to */
    --lg-mono:var(--font-mono);
    min-height:100vh;min-height:100dvh;display:flex;align-items:stretch;position:relative;overflow-x:hidden;
    background:var(--lg-navy);color:var(--lg-ink);
    font-family:var(--font-body);font-feature-settings:normal;letter-spacing:-.006em;-webkit-font-smoothing:antialiased;
  }

  /* ── The stage: navy, the building, the promise ── */
  #login .lg-stage{position:relative;flex:1 1 auto;min-width:0;display:flex;flex-direction:column;
    padding:44px clamp(28px,4.4vw,68px) 40px;color:#fff;overflow:hidden;isolation:isolate;background:var(--lg-navy);}
  #login .lg-stage::before{content:'';position:absolute;top:-30%;right:-12%;width:80%;height:130%;z-index:-3;pointer-events:none;
    background:radial-gradient(closest-side,rgba(var(--bc-accent-rgb),.26),transparent 72%);}
  #login .lg-media{position:absolute;top:0;bottom:0;right:0;width:min(100%,74vh);z-index:-2;pointer-events:none;
    background:var(--bc-navy) url(../img/login-estate.svg) 50% 42%/cover no-repeat;   /* v1.4.10.433: AVDesk's own drawing of the estate */
    -webkit-mask-image:linear-gradient(90deg,transparent 0,rgba(0,0,0,.6) 20%,#000 42%);
            mask-image:linear-gradient(90deg,transparent 0,rgba(0,0,0,.6) 20%,#000 42%);}
  /* Scrim: the copy side is read against navy, the building stays lit on the
     right, and the base fades so the status line sits on a quiet ground. */
  #login .lg-stage::after{content:'';position:absolute;inset:0;z-index:-1;pointer-events:none;background:
    linear-gradient(90deg,rgba(var(--bc-navy-rgb),.95) 0,rgba(var(--bc-navy-rgb),.86) 420px,rgba(var(--bc-navy-rgb),.55) 610px,rgba(var(--bc-navy-rgb),.12) 820px,rgba(var(--bc-navy-rgb),0) 100%),
    linear-gradient(0deg,rgba(var(--bc-navy-rgb),.92) 0%,rgba(var(--bc-navy-rgb),0) 30%),
    linear-gradient(180deg,rgba(var(--bc-navy-rgb),.55) 0%,rgba(var(--bc-navy-rgb),0) 18%);}
  #login .lg-grid{position:absolute;inset:0;z-index:-1;pointer-events:none;
    background-image:linear-gradient(rgba(255,255,255,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.035) 1px,transparent 1px);
    background-size:44px 44px;
    -webkit-mask-image:radial-gradient(120% 90% at 0% 0%,#000 0,rgba(0,0,0,.4) 45%,transparent 75%);
            mask-image:radial-gradient(120% 90% at 0% 0%,#000 0,rgba(0,0,0,.4) 45%,transparent 75%);}

  #login .lg-top{display:flex;align-items:center;gap:14px;}
  #login .lg-logo{height:30px;width:auto;display:block;}
  #login .lg-product{display:flex;align-items:center;gap:14px;font-size:15px;font-weight:500;color:var(--lg-on-navy);letter-spacing:-.01em;}
  #login .lg-product::before{content:'';width:1px;height:22px;background:rgba(255,255,255,.24);}

  #login .lg-copy{margin:auto 0;padding:48px 0;max-width:560px;}
  #login .lg-eyebrow{display:inline-flex;align-items:center;gap:10px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--lg-on-navy-2);margin-bottom:20px;}   /* v1.4.10.473: the eyebrow look, 11/600 uppercase .06em (was 13/600) */
  #login .lg-eyebrow::before{content:'';width:22px;height:5px;border-radius:1px;background:var(--lg-grad);flex:none;transform:skewX(-38deg);}
  /* v1.4.10.473: the headline on the scale's display steps (44, 36 from 1180px, 30 on a phone, 24 on a short one) instead
     of a clamp() that ran 34-66px; the heading tracking and a line-height its three lines can breathe in (was 1.06) */
  #login .lg-stage h1{font-family:var(--font-body);font-weight:600;color:#fff;font-size:44px;line-height:1.2;
    letter-spacing:-.024em;margin:0 0 20px;max-width:14ch;text-wrap:balance;}
  #login .lg-sub{color:var(--lg-on-navy);font-size:16px;line-height:1.66;max-width:42ch;margin:0 0 34px;text-wrap:pretty;}
  #login .lg-facts{list-style:none;margin:0;padding:20px 0 0;max-width:520px;border-top:1px solid rgba(255,255,255,.16);
    display:grid;grid-template-columns:repeat(3,minmax(0,1fr));}
  #login .lg-facts li{display:flex;flex-direction:column;gap:0;padding:0 18px;border-right:1px solid rgba(255,255,255,.12);min-width:0;}
  #login .lg-facts li:first-child{padding-left:0;} #login .lg-facts li:last-child{border-right:0;padding-right:0;}
  #login .lg-facts .lg-fi{width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;margin-bottom:8px;
    color:#A9BEFF;background:rgba(var(--bc-grad-a-rgb),.14);border:1px solid rgba(120,150,255,.28);}
  #login .lg-facts .lg-fi svg{width:16px;height:16px;}
  #login .lg-facts li > div{display:flex;flex-direction:column;gap:2px;min-width:0;}
  #login .lg-facts b{color:#fff;font-size:13px;font-weight:600;letter-spacing:-.01em;}   /* v1.4.10.473: a sub-heading over its 12px line, 13/600 (was 14, between the looks) */
  #login .lg-facts li > div > span{color:var(--lg-on-navy-3);font-size:12px;line-height:1.5;}

  /* ── The side: a white column, like the marketing site's page under its hero ── */
  #login .lg-side{position:relative;z-index:1;flex:0 0 clamp(440px,36vw,560px);display:flex;flex-direction:column;
    background:#fff;padding:40px clamp(32px,3.6vw,60px) 22px;box-shadow:-30px 0 80px rgba(0,0,0,.34);}
  #login .lg-side::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(180deg,var(--bc-grad-a) 0%,var(--bc-grad-b) 52%,var(--bc-purple) 100%);}
  #login .login-form{width:100%;max-width:392px;margin:auto;padding:24px 0;}
  #login .lg-card-logo{display:none;height:28px;width:auto;margin:0 0 26px;}
  #login .lg-kicker{display:inline-flex;align-items:center;gap:10px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--lg-ink-2);margin-bottom:14px;}   /* v1.4.10.473: the eyebrow look (was 12/600) */
  #login .lg-kicker::before{content:'';width:18px;height:5px;border-radius:1px;background:var(--lg-grad);flex:none;transform:skewX(-38deg);}
  #login .login-form h2{font-family:var(--font-body);font-size:30px;font-weight:600;line-height:1.2;letter-spacing:-.024em;color:var(--lg-ink);margin:0 0 10px;}   /* v1.4.10.473: heading tracking -.024em (-.03em is a KPI's) and 1.2 for a title that wraps (was 1.1) */
  #login .login-form .sub{color:var(--lg-ink-2);font-size:14px;line-height:1.6;margin:0 0 30px;text-wrap:pretty;}

  #login .field{margin-bottom:18px;}
  #login .field label{display:block;font-family:var(--font-body);font-size:13px;font-weight:600;color:var(--lg-ink);margin-bottom:8px;letter-spacing:-.005em;}
  #login .input-wrap{position:relative;display:flex;align-items:center;}
  #login .input-wrap .input-ico{left:15px;color:var(--lg-ink-3);}
  #login .input-wrap .input-ico svg{width:18px;height:18px;}
  #login .input-wrap:focus-within .input-ico{color:var(--lg-accent);}
  #login .input-wrap input{width:100%;height:50px;padding:0 16px 0 46px;margin:0;font-family:var(--font-body);font-size:16px;font-weight:400;color:var(--lg-ink);   /* v1.4.10.473: 16/400 at every width, the size a phone already gets (was 15 on a desktop, off the field look) */
    background:var(--lg-field);border:1.5px solid var(--lg-rule-2);border-radius:4px;box-shadow:none;
    transition:border-color .2s var(--lg-ease),box-shadow .2s var(--lg-ease),background .2s var(--lg-ease);}
  #login .input-wrap input::placeholder{color:#9AA9B8;}
  #login .input-wrap input:hover{border-color:#A6B4C3;}
  #login .input-wrap input:focus{outline:none;background:#fff;border-color:var(--lg-accent);box-shadow:0 0 0 4px rgba(var(--bc-grad-a-rgb),.14);}
  #login .input-wrap input:-webkit-autofill{-webkit-text-fill-color:var(--lg-ink);caret-color:var(--lg-ink);box-shadow:inset 0 0 0 1000px #F2F6FF;transition:background-color 9999s;}
  #login .input-wrap input:-webkit-autofill:focus{box-shadow:inset 0 0 0 1000px #fff,0 0 0 4px rgba(var(--bc-grad-a-rgb),.14);}
  #login .input-wrap input[type=password],#login .input-wrap input[type=text]#login-pass{padding-right:52px;}
  #login .input-wrap .pass-toggle{right:6px;width:40px;height:40px;border-radius:4px;color:var(--lg-ink-3);}
  #login .input-wrap .pass-toggle:hover{color:var(--lg-accent);background:#EEF3FF;}
  #login .lg-caps{display:flex;align-items:center;gap:7px;margin-top:8px;font-size:12px;font-weight:500;color:#8A5A00;}
  #login .lg-caps::before{content:'';width:7px;height:7px;border-radius:50%;background:#F0A400;flex:none;}
  #login .lg-caps[hidden]{display:none;}

  #login .field-row{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px 14px;margin:4px 0 12px;}
  #login .field-row.lg-row2{margin:0 0 26px;}
  #login .check{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--lg-ink-2);cursor:pointer;}
  #login .check input{width:17px;height:17px;margin:0;accent-color:var(--lg-accent);cursor:pointer;}
  #login a{color:var(--lg-link);font-weight:600;text-decoration:none;}
  #login a:hover{text-decoration:underline;text-underline-offset:3px;}
  #login .field-row a{font-size:13px;}

  #login .login-btn{position:relative;width:100%;height:52px;padding:0 20px;border:0;border-radius:4px;cursor:pointer;overflow:hidden;
    display:flex;align-items:center;justify-content:center;gap:10px;color:#fff;background:var(--lg-grad);
    font-family:var(--font-body);font-size:15px;font-weight:600;letter-spacing:-.01em;
    box-shadow:0 12px 34px rgba(var(--bc-grad-a-rgb),.32);
    transition:transform .34s var(--lg-ease),box-shadow .34s var(--lg-ease),filter .34s var(--lg-ease);}
  #login .login-btn::before{content:'';position:absolute;top:0;left:-130%;width:60%;height:100%;
    background:linear-gradient(100deg,transparent,rgba(255,255,255,.28),transparent);transform:skewX(-18deg);transition:left .7s var(--lg-ease);}
  #login .login-btn:hover{filter:saturate(1.12) brightness(1.06);box-shadow:0 16px 44px rgba(var(--bc-grad-b-rgb),.42);transform:translateY(-1px);}
  #login .login-btn:hover::before{left:130%;}
  #login .login-btn:active{transform:translateY(0);}
  #login .login-btn:focus-visible{outline:3px solid rgba(var(--bc-grad-a-rgb),.45);outline-offset:3px;}
  #login .login-btn .btn-arrow{display:flex;align-items:center;transition:transform .34s var(--lg-ease);}
  #login .login-btn .btn-arrow svg{width:17px;height:17px;}
  #login .login-btn:hover .btn-arrow{transform:translateX(4px);}
  #login .login-btn:disabled{cursor:progress;filter:saturate(.85);transform:none;}
  #login .login-btn:disabled .btn-arrow{opacity:0;}
  #login .login-btn:disabled::after{content:'';position:absolute;right:18px;top:50%;width:16px;height:16px;margin-top:-8px;border-radius:50%;
    border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:lgSpin .8s linear infinite;}
  @keyframes lgSpin{to{transform:rotate(360deg);}}

  #login .login-foot{text-align:center;margin-top:22px;font-size:13px;color:var(--lg-ink-3);}
  #login .lg-secure{display:flex;align-items:center;justify-content:center;gap:8px;}
  #login .lg-lock{display:flex;color:var(--lg-ink-3);} #login .lg-lock svg{width:14px;height:14px;}
  #login .lg-stack{display:flex;flex-direction:column;align-items:center;gap:8px;}
  #login .lg-msg{font-size:13px;line-height:1.45;min-height:20px;margin:0 0 14px;color:var(--lg-err);}
  #login .lg-alert{display:flex;align-items:flex-start;gap:9px;margin:0 0 16px;padding:11px 13px;border-radius:4px;
    background:#FDF3F2;border:1px solid #F1CDC8;color:#9E2B22;font-size:13px;line-height:1.45;}
  #login .lg-alert::before{content:'!';flex:none;width:18px;height:18px;border-radius:50%;background:var(--lg-err);color:#fff;
    font-size:12px;font-weight:700;line-height:18px;text-align:center;}
  #login .lg-alert:empty{display:none;}

  #login .lg-legal{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:6px 20px;padding-top:18px;font-size:12px;color:var(--lg-ink-3);}
  #login .lg-legal a{color:var(--lg-ink-2);font-weight:500;}
  #login .lg-legal a:hover{color:var(--lg-ink);}
  #login a:focus-visible,#login .check input:focus-visible,#login .pass-toggle:focus-visible{outline:3px solid rgba(var(--bc-grad-a-rgb),.45);outline-offset:2px;border-radius:4px;}

  /* ── Arrival: one short rise, the render settles — nothing loops but the LED ── */
  @media (prefers-reduced-motion:no-preference){
    #login .lg-media{animation:lgSettle 2.4s var(--lg-ease) both;}
    #login .lg-copy > *,#login .lg-top,#login .lg-note{animation:lgRise .7s var(--lg-ease) both;}
    #login .lg-copy > :nth-child(2){animation-delay:.06s;} #login .lg-copy > :nth-child(3){animation-delay:.12s;}
    #login .lg-copy > :nth-child(4){animation-delay:.18s;} #login .lg-note{animation-delay:.24s;}
    #login .login-form{animation:lgRise .7s var(--lg-ease) .1s both;}
  }
  @keyframes lgRise{from{opacity:0;transform:translateY(14px);}to{opacity:1;transform:none;}}
  @keyframes lgSettle{from{opacity:0;transform:scale(1.05);}to{opacity:1;transform:none;}}
  @media (prefers-reduced-motion:reduce){
    #login *,#login *::before,#login *::after{animation:none !important;transition:none !important;}
  }

  /* ── Mid widths: the three facts stack rather than squeeze ── */
  @media (max-width:1180px){
    #login .lg-facts{grid-template-columns:1fr;gap:14px;padding-top:22px;}
    #login .lg-facts li{flex-direction:row;align-items:center;gap:14px;padding:0;border-right:0;}
    #login .lg-facts .lg-fi{margin:0;}
    #login .lg-stage h1{font-size:36px;}   /* v1.4.10.473 */
  }
  @media (max-width:1100px){ #login .lg-side{flex-basis:420px;padding-left:36px;padding-right:36px;} }
  /* 900–1180px: the copy spans most of the stage, so the scrim is even across
     it and the building reads as texture rather than a picture. */
  @media (min-width:901px) and (max-width:1180px){
    #login .lg-stage::after{background:
      linear-gradient(90deg,rgba(var(--bc-navy-rgb),.92) 0,rgba(var(--bc-navy-rgb),.74) 380px,rgba(var(--bc-navy-rgb),.40) 100%),
      linear-gradient(0deg,rgba(var(--bc-navy-rgb),.92) 0%,rgba(var(--bc-navy-rgb),0) 30%),
      linear-gradient(180deg,rgba(var(--bc-navy-rgb),.55) 0%,rgba(var(--bc-navy-rgb),0) 18%);}
  }

  /* ── Tablet / phone: the stage becomes a band, the form a sheet over it ── */
  @media (max-width:900px){
    #login{flex-direction:column;}
    #login .lg-stage{flex:0 0 auto;min-height:clamp(260px,38vh,420px);padding:22px 24px 60px;}
    #login .lg-media{width:100%;background-position:50% 36%;-webkit-mask-image:none;mask-image:none;}
    #login .lg-stage::after{background:linear-gradient(180deg,rgba(var(--bc-navy-rgb),.42) 0%,rgba(var(--bc-navy-rgb),.66) 45%,rgba(var(--bc-navy-rgb),.92) 100%);}
    #login .lg-copy{margin:auto 0 0;padding:34px 0 0;max-width:600px;}
    #login .lg-eyebrow{margin-bottom:12px;}   /* v1.4.10.473: stays 11px (was 12) */
    #login .lg-stage h1{font-size:36px;max-width:15ch;margin-bottom:10px;}   /* v1.4.10.473: was clamp(28px,6.2vw,40px) */
    #login .lg-sub{font-size:14px;line-height:1.6;margin:0;max-width:46ch;}
    #login .lg-facts,#login .lg-note{display:none;}
    #login .lg-side{flex:1 0 auto;margin-top:-28px;border-radius:20px 20px 0 0;padding:34px 24px 18px;box-shadow:0 -24px 60px rgba(0,0,0,.30);}
    #login .lg-side::before{left:50%;top:11px;bottom:auto;width:44px;height:4px;margin-left:-22px;border-radius:2px;background:var(--lg-grad);}
    #login .login-form{margin:0 auto;padding:10px 0 20px;}
    #login .lg-legal{margin-top:auto;}
    #login .login-form h2{font-size:30px;}
    #login .login-form .sub{margin-bottom:24px;}
  }
  @media (max-width:600px){ #login .lg-stage h1{font-size:30px;} }   /* v1.4.10.473: the headline's phone step */
  @media (max-width:420px){
    #login .lg-stage{min-height:0;padding:18px 20px 54px;}
    #login .lg-logo{height:26px;} #login .lg-product{font-size:14px;gap:12px;}
    #login .lg-copy{padding-top:26px;}
    #login .lg-sub{display:none;}
    #login .lg-side{padding:30px 20px 16px;}
    #login .login-form h2{font-size:24px;}
  }
  /* Phone tap floor (the v248 40px floor) for the card's text links and a
     44px reveal button, matching the app-wide ≤700px touch layer. */
  @media (max-width:700px){
    #login .lg-link,#login .login-foot a,#login .lg-legal a{display:inline-flex;align-items:center;min-height:40px;}
    #login .lg-stack{gap:0;}
    #login .input-wrap .pass-toggle{width:44px;height:44px;right:3px;}
    #login .lg-legal{padding-top:8px;gap:0 18px;}
  }
  /* Small, short phones (SE-class 375×667 and below): win back the band's
     height so the Sign in button is on the first screen. */
  @media (max-width:420px) and (max-height:700px){
    #login .lg-eyebrow{display:none;}
    #login .lg-copy{padding-top:18px;}
    #login .lg-stage h1{font-size:24px;}
    #login .lg-kicker{display:none;}
    #login .login-form .sub{margin-bottom:18px;}
    #login .field{margin-bottom:14px;}
  }
  /* Short landscape (a phone on its side, or any very short window): the stage
     would push the form below the fold — drop it and brand the form itself. */
  @media (max-height:560px) and (orientation:landscape){
    #login{flex-direction:column;}
    #login .lg-stage{display:none;}
    #login .lg-side{flex:1 0 auto;margin:0;border-radius:0;box-shadow:none;padding:22px 24px 14px;}
    #login .lg-side::before{left:0;right:0;top:0;bottom:auto;width:auto;height:3px;margin:0;border-radius:0;}
    #login .lg-card-logo{display:block;}
    #login .login-form{padding:4px 0 12px;}
  }


  /* ============ APP SHELL ============ */
  /* minmax(0,1fr): a 1fr track's implicit minimum is the content's min-content
     width, so one non-shrinking header row was silently forcing the whole app
     to ~670px on phones (everything then rendered pre-scrolled/cut). Zero the
     minimum and the shell can never exceed the viewport. */
  #app{display:none;height:100vh;height:100dvh;grid-template-rows:auto auto 1fr;grid-template-columns:minmax(0,1fr);overflow:hidden;}
  #app.active{display:grid;}

  /* ============ TOP BRAND BAR ============ */
  .topbrand{height:60px;background:var(--bg-2);border-bottom:1px solid var(--line);}
  .topbrand-inner{display:flex;align-items:center;gap:16px;height:100%;width:100%;padding:0 30px;min-width:0;}
  .topbrand .brand-area{display:flex;align-items:center;gap:10px;padding:0;flex-shrink:0;}
  .topbrand .logo-mark{display:flex;align-items:center;flex-shrink:0;}
  .topbrand .brand-text{display:flex;flex-direction:column;line-height:1;}
  .topbrand .brand-text strong{font-family:var(--font-display);font-size:18px;font-weight:700;letter-spacing:-0.03em;white-space:nowrap;}
  .topbrand .brand-text small{font-size:11px;color:var(--brand-purple);font-weight:600;letter-spacing:.06em;text-transform:uppercase;margin-top:3px;white-space:nowrap;}
  .tb-spacer{flex:1;min-width:8px;}
  .topbrand .search-box{flex-shrink:1;min-width:0;}
  .topbrand .site-picker{flex-shrink:0;min-width:168px;max-width:220px;text-overflow:ellipsis;}
  .topbrand .user-foot{flex-shrink:0;}
  .nav-toggle{display:none;}

  /* ============ HORIZONTAL NAV ============ */
  .topnav{display:flex;align-items:center;gap:2px;padding:7px 11px;background:var(--bg-2);border-bottom:1px solid var(--line);overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;-webkit-overflow-scrolling:touch;}
  .topnav::-webkit-scrollbar{height:0;}
  .nav-group{display:contents;}
  .nav-group-title{display:none;}
  .nav-item{display:inline-flex;align-items:center;gap:9px;padding:8px 13px;border-radius:6px;color:var(--text-mute);cursor:pointer;font-size:13px;font-weight:500;transition:all 0.14s;white-space:nowrap;position:relative;flex-shrink:0;}
  .nav-item:hover{background:var(--surface-2);color:var(--text);}
  .nav-item.active{color:var(--brand-blue);background:var(--accent-glow);font-weight:600;}
  .nav-item.active .ico{color:var(--brand-blue);}
  .nav-item .ico{width:17px;height:17px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-dim);flex-shrink:0;transition:color 0.14s;}
  .nav-item:hover .ico{color:var(--text-mute);}
  .nav-item .nav-badge{background:var(--err);color:#fff;font-size:10px;padding:1px 6px;border-radius:6px;font-weight:700;min-width:17px;text-align:center;margin-left:2px;}

  /* Grouped dropdown navigation — condenses the long flat bar into a few menus */
  .nav-dd{position:relative;display:inline-flex;flex-shrink:0;}
  .nav-dd-trigger{display:inline-flex;align-items:center;gap:7px;padding:8px 11px;border-radius:6px;border:none;background:transparent;color:var(--text-mute);cursor:pointer;font-size:13px;font-weight:500;font-family:inherit;white-space:nowrap;transition:all .14s;}
  .nav-dd-trigger:hover{background:var(--surface-2);color:var(--text);}
  .nav-dd.open .nav-dd-trigger,.nav-dd-trigger.has-active{background:var(--accent-glow);color:var(--brand-blue);font-weight:600;}
  .nav-dd-trigger .ico{width:17px;height:17px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-dim);transition:color .14s;}
  .nav-dd.open .nav-dd-trigger .ico,.nav-dd-trigger.has-active .ico{color:var(--brand-blue);}
  .nav-dd-caret{width:12px;height:12px;transition:transform .15s;opacity:.6;flex-shrink:0;}
  .nav-dd.open .nav-dd-caret{transform:rotate(180deg);}
  /* Fixed (not absolute): the nav bar is a horizontal scroll container, so an
     absolutely-positioned menu would be clipped to the bar's height and never
     show. Fixed coords are set from the trigger by positionNavMenu(). The
     viewport caps + internal scroll keep it fully on-screen on phones. */
  .nav-dd-menu{position:fixed;top:0;left:0;min-width:212px;max-width:calc(100vw - 16px);max-height:calc(100dvh - 84px);overflow-y:auto;background:var(--surface);border:1px solid var(--line-2);border-radius:7px;box-shadow:var(--shadow-lg);padding:6px;z-index:200;display:none;flex-direction:column;gap:1px;overscroll-behavior:contain;}
  .nav-dd.open .nav-dd-menu{display:flex;}
  /* Roomier tap targets for the nav + dropdown rows on phones. */
  @media(max-width:600px){
    .nav-dd-item{padding:11px 12px;}
    .nav-dd-trigger,.nav-item{padding:10px 12px;}
    .topnav{padding:7px 4px;}
  }
  .nav-dd-item{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:6px;color:var(--text-mute);cursor:pointer;font-size:13px;font-weight:500;white-space:nowrap;transition:all .12s;}
  .nav-dd-item:hover{background:var(--surface-2);color:var(--text);}
  .nav-dd-item.active{background:var(--accent-glow);color:var(--brand-blue);font-weight:600;}
  .nav-dd-item .ico{width:17px;height:17px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-dim);flex-shrink:0;transition:color .12s;}
  .nav-dd-item.active .ico,.nav-dd-item:hover .ico{color:inherit;}
  .nav-dd-item .nav-badge,.nav-dd-trigger .nav-badge{background:var(--err);color:#fff;font-size:10px;padding:1px 6px;border-radius:6px;font-weight:700;min-width:17px;text-align:center;}
  .nav-dd-item .nav-badge{margin-left:auto;}
  .nav-dd-trigger .nav-badge{margin-left:1px;}

  /* user chip + sign out live in the brand bar on the right */
  .user-foot{display:flex;align-items:center;gap:10px;}
  .avatar{width:34px;height:34px;border-radius:6px;background:var(--grad);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:13px;font-family:var(--font-display);}
  .user-info{display:flex;flex-direction:column;line-height:1.15;}
  .user-info .un{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;}
  .user-info .ur{font-size:11px;color:var(--text-mute);}
  .icon-btn{background:transparent;border:1px solid var(--line);color:var(--text-mute);width:36px;height:36px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all 0.15s;position:relative;}
  .icon-btn:hover{color:var(--brand-blue);border-color:var(--line-2);background:var(--surface-2);}
  /* Safari collapses an <svg> that has only a viewBox to 0×0 inside flex
     (v1.4.10.177 — the hamburger rendered as an empty white box on iPhone).
     Icons should carry width/height attributes; this is the safety net for
     any that don't. */
  .icon-btn svg:not([width]){width:20px;height:20px;}

  /* ============ MAIN ============ */
  .main{overflow-y:auto;background:var(--bg);}
  /* App footer — sits at the foot of the scrolling content area. */
  .app-footer{border-top:1px solid var(--line);background:var(--bg-2);margin-top:8px;}
  .af-inner{display:flex;align-items:center;flex-wrap:wrap;gap:10px;
    padding:16px 30px;font-size:12px;color:var(--text-mute);}
  .af-copy{font-weight:600;color:var(--text);}
  .af-sep{color:var(--text-dim);}
  .af-div{color:var(--text-dim);}
  .af-link{color:var(--brand-blue);text-decoration:none;font-weight:500;}
  .af-link:hover{text-decoration:underline;}
  .af-tag{margin-left:auto;color:var(--text-dim);}
  @media(max-width:560px){ .af-inner{padding:14px 16px;} .af-tag{margin-left:0;flex-basis:100%;} }
  .topbar{display:flex;align-items:center;gap:14px;padding:20px 30px 4px;}
  .page-title{font-family:var(--font-display);font-size:20px;font-weight:600;margin:0;letter-spacing:-.024em;}
  .page-sub{font-size:13px;color:var(--text-mute);margin-top:3px;}
  .topbar-spacer{flex:1;}
  .search-box{position:relative;}
  /* v1.4.10.473: the header's fields are 36px, the height of the icon buttons and the avatar beside them (were 40-41px
     from their padding: one row, three heights); a placeholder that does not fit ends in an ellipsis, not mid-word */
  /* v1.4.10.508: 12px on the right, not 52: the Ctrl K hint that space was kept for is gone */
  .search-box input{background:var(--surface);border:1px solid var(--line);color:var(--text);height:36px;padding:0 12px 0 36px;border-radius:6px;font-size:13px;width:300px;font-family:inherit;transition:border-color 0.15s,box-shadow 0.15s,width 0.2s;box-shadow:var(--shadow-sm);text-overflow:ellipsis;}
  .search-box input:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);width:340px;}
  .search-box .search-ico{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--text-mute);pointer-events:none;}
  .search-results{position:absolute;top:calc(100% + 8px);right:0;width:420px;max-width:calc(100vw - 24px);max-height:440px;overflow-y:auto;background:var(--surface);border:1px solid var(--line-2);border-radius:8px;box-shadow:var(--shadow-lg);z-index:50;display:none;padding:6px;}
  .search-results.open{display:block;}
  .sr-group{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;padding:10px 12px 6px;}
  .sr-item{display:flex;align-items:center;gap:11px;padding:9px 12px;border-radius:6px;cursor:pointer;}
  .sr-item:hover,.sr-item.active{background:var(--surface-2);}
  .sr-item .sr-ico{width:30px;height:30px;border-radius:6px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--brand-blue);}
  .sr-item .sr-main{flex:1;min-width:0;}
  .sr-item .sr-t{font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .sr-item .sr-d{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}   /* v1.4.10.473: a result's secondary line is meta, 12/400 (was 11) */
  .sr-empty{padding:28px 16px;text-align:center;color:var(--text-mute);font-size:13px;}
  .sr-scope{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--text-mute);padding:9px 12px 7px;border-bottom:1px solid var(--line);margin-bottom:4px;}
  .sr-scope svg{width:13px;height:13px;opacity:.7;}
  .sr-scope b{color:var(--brand-blue);font-weight:600;}
  .site-picker{background:var(--surface);border:1px solid var(--line);color:var(--text);height:36px;padding:0 12px;border-radius:6px;font-size:13px;font-weight:500;font-family:inherit;cursor:pointer;box-shadow:var(--shadow-sm);}   /* v1.4.10.473: 36px like the search and the icon buttons (was 41px) */
  .cust-picker{display:none;max-width:190px;font-weight:500;}
  .intg-picker{display:none;max-width:190px;font-weight:500;}
  .intg-picker.scoped{border-color:var(--accent,#6366F1);}
  .cust-picker.scoped{border-color:var(--accent,#6366F1);}
  .site-picker.scoped{border-color:var(--accent,#6366F1);}

  .content{padding:18px 30px 48px;}

  /* ============ KPI ============ */
  .kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(214px,100%),1fr));gap:14px;margin-bottom:26px;}
  .kpi{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:18px 20px;position:relative;overflow:hidden;transition:transform 0.18s ease,box-shadow 0.18s ease;box-shadow:var(--shadow-sm);}
  .kpi::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--accent);opacity:0.85;transition:opacity 0.18s;}
  .kpi.ok::before{background:var(--ok);} .kpi.warn::before{background:var(--warn);} .kpi.err::before{background:var(--err);} .kpi.blue::before{background:var(--grad);}
  .kpi:hover{transform:translateY(-2px);box-shadow:var(--shadow-md);}
  .kpi:hover::before{opacity:1;}
  .kpi .kpi-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;}
  .kpi .label{font-size:11px;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;font-weight:600;}
  .kpi .kpi-ico{width:30px;height:30px;border-radius:6px;display:flex;align-items:center;justify-content:center;}
  .kpi.ok .kpi-ico{background:rgba(22,163,74,0.12);color:var(--ok);}
  .kpi.warn .kpi-ico{background:rgba(217,119,6,0.12);color:var(--warn);}
  .kpi.err .kpi-ico{background:rgba(220,38,38,0.12);color:var(--err);}
  .kpi.blue .kpi-ico{background:var(--accent-glow);color:var(--brand-blue);}
  .kpi .value{font-family:var(--font-display);font-size:30px;font-weight:700;letter-spacing:-0.03em;line-height:1;margin-bottom:7px;font-variant-numeric:tabular-nums;}
  .kpi.ok .value{color:var(--ok);}
  .kpi.warn .value{color:var(--warn);}
  .kpi.err .value{color:var(--err);}
  .kpi .delta{font-size:12px;color:var(--text-mute);}

  /* ============ PANELS ============ */
  .panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);margin-bottom:18px;overflow:hidden;box-shadow:var(--shadow-sm);}
  .panel-head{display:flex;align-items:center;padding:16px 20px;border-bottom:1px solid var(--line);}
  .panel-head h3{margin:0;font-size:15px;font-weight:600;letter-spacing:-.01em;}   /* v1.4.10.473: a panel title tracks -.01em (was -.012em, the modal title's) */
  /* v1.4.10.473: .panel-sub is the meta line wherever it is used — outside a .panel-head (modal intros, card notes) it
     had no rule and took its parent's 13 or 14px */
  .panel-sub{font-size:12px;color:var(--text-mute);}
  .panel-head .panel-sub{font-size:12px;color:var(--text-mute);margin-top:3px;font-family:var(--font-body);}
  .panel-head .head-actions{margin-left:auto;display:flex;gap:8px;align-items:center;}
  /* v1.4.10.375: one height for a panel's action row — a picker stood 23px beside a 32px button
     (Settings → Email history, Asset statuses, Billing → Invoices) */
  .panel-head .head-actions > select,.panel-head .head-actions > .btn.sm{min-height:32px;}
  @media (max-width:760px){ .panel-head .head-actions > select,.panel-head .head-actions > .btn.sm{min-height:40px;} }
  .panel-body{padding:18px 20px;}
  .panel-body.flush{padding:0;}

  /* ============ TABLES ============ */
  .dt{width:100%;border-collapse:collapse;font-size:13px;}
  .dt thead th{text-align:left;font-weight:600;color:var(--text-dim);font-size:11px;text-transform:uppercase;letter-spacing:.06em;padding:11px 18px;border-bottom:1px solid var(--line);background:var(--bg-2);}
  .dt tbody td{padding:13px 18px;border-bottom:1px solid var(--line);vertical-align:middle;}
  .dt tbody tr:last-child td{border-bottom:0;}
  .dt tbody tr{cursor:pointer;transition:background 0.12s;}
  .dt tbody tr:hover{background:var(--surface-2);}

  /* ============ PILLS / BADGES ============ */
  .pill{display:inline-flex;align-items:center;gap:6px;font-size:11px;padding:4px 10px;border-radius:5px;font-weight:600;line-height:1;letter-spacing:0;}
  .pill.ok{background:rgba(22,163,74,0.12);color:var(--ok);}
  .pill.warn{background:rgba(217,119,6,0.13);color:var(--warn);}
  .pill.err{background:rgba(220,38,38,0.11);color:var(--err);}
  .pill.info{background:rgba(var(--bc-purple-rgb),0.12);color:var(--info);}
  .pill.blue{background:var(--accent-glow);color:var(--brand-blue);}
  .pill.muted{background:var(--surface-3);color:var(--text-mute);}
  .dot{width:7px;height:7px;border-radius:50%;display:inline-block;}
  .dot.ok{background:var(--ok);box-shadow:0 0 0 3px rgba(52,211,153,0.16);}
  .dot.warn{background:var(--warn);box-shadow:0 0 0 3px rgba(251,191,36,0.16);}
  .dot.err{background:var(--err);box-shadow:0 0 0 3px rgba(248,113,113,0.16);}
  .dot.muted{background:var(--text-mute);box-shadow:0 0 0 3px rgba(148,163,184,0.14);}

  /* ============ BUTTONS ============ */
  .btn{display:inline-flex;align-items:center;gap:6px;background:var(--surface);border:1px solid var(--line-2);color:var(--text);padding:8px 14px;border-radius:6px;font-size:13px;cursor:pointer;font-family:inherit;font-weight:500;transition:all 0.14s;box-shadow:var(--shadow-sm);}
  .btn:hover{background:var(--surface-2);border-color:var(--line-2);}
  .btn.ghost{background:transparent;box-shadow:none;border-color:var(--line);}
  .btn.ghost:hover{background:var(--surface-2);}
  .btn.primary{background:var(--grad);border:1px solid transparent;background-origin:border-box;color:#fff;font-weight:600;box-shadow:0 1px 2px rgba(var(--bc-accent-rgb),0.3);}   /* v1.4.10.473: a 1px transparent edge like every bordered .btn (was border:0, so a primary stood 2px shorter than the ghost beside it); the gradient is laid from the border box, so no seam shows */
  .btn.primary:hover{filter:brightness(1.06);}
  .btn.danger{background:transparent;border-color:rgba(220,38,38,0.35);color:var(--err);box-shadow:none;}
  .btn.danger:hover{background:rgba(220,38,38,0.08);}
  .btn.warn{background:transparent;border-color:rgba(217,119,6,0.4);color:var(--warn);box-shadow:none;}
  .btn.warn:hover{background:rgba(217,119,6,0.1);}
  .row-actions{display:inline-flex;gap:6px;}
  .ra-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:6px;background:var(--surface);border:1px solid var(--line);color:var(--text-mute);cursor:pointer;transition:all 0.15s;}
  .ra-btn:hover{color:var(--brand-blue);background:var(--surface-2);border-color:var(--line-2);}
  .ra-btn.danger:hover{color:#fff;background:var(--err);border-color:var(--err);}
  td.actions-cell{text-align:right;white-space:nowrap;}
  .btn.ghost{background:transparent;}
  .btn.ghost:hover{background:var(--navy-3);}
  .btn.danger{background:rgba(239,68,68,0.12);border-color:rgba(239,68,68,0.28);color:var(--err);}
  .btn.danger:hover{background:rgba(239,68,68,0.18);}
  .btn.sm{padding:6px 11px;font-size:12px;}

  /* ============ SITES ============ */
  .site-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));gap:16px;}
  .site-card{background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:18px 20px;cursor:pointer;transition:all 0.15s;}
  .site-card:hover{border-color:var(--electric);transform:translateY(-1px);}
  .site-card .site-head{display:flex;align-items:flex-start;gap:12px;margin-bottom:14px;}
  .site-card .site-mark{width:42px;height:42px;border-radius:6px;background:var(--accent-glow);border:1px solid rgba(var(--bc-accent-rgb),0.18);display:flex;align-items:center;justify-content:center;color:var(--brand-blue);flex-shrink:0;}
  .site-card .name{font-weight:600;font-size:15px;margin-bottom:3px;letter-spacing:-0.01em;}
  .site-card .addr{font-size:12px;color:var(--text-mute);line-height:1.4;}
  .site-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;padding-top:14px;border-top:1px solid var(--line);}
  .site-stat .v{font-size:20px;font-weight:600;line-height:1;letter-spacing:-0.02em;}
  .site-stat .l{font-size:11px;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;margin-top:4px;font-weight:600;}

  /* ============ DEVICES ============ */
  .device-name{display:flex;align-items:center;gap:12px;}
  .device-icon{width:34px;height:34px;border-radius:6px;background:var(--navy-3);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .device-meta{font-size:11px;color:var(--text-mute);margin-top:2px;}
  .ip-text{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;color:var(--text-mute);}

  /* ============ SLA BAR ============ */
  .sla-bar{width:80px;height:6px;background:var(--navy-3);border-radius:3px;overflow:hidden;display:inline-block;vertical-align:middle;margin-right:9px;}
  .sla-fill{height:100%;background:var(--ok);transition:width 0.3s;}
  .sla-fill.warn{background:var(--warn);}
  .sla-fill.err{background:var(--err);}

  /* ============ MODAL ============ */
  .modal-back{position:fixed;inset:0;background:rgba(15,23,42,0.45);backdrop-filter:blur(4px);display:none;align-items:flex-start;justify-content:center;z-index:50;padding:60px 20px 20px;overflow-y:auto;}
  .modal-back.active{display:flex;}
  .modal{background:var(--surface);border:1px solid var(--line);border-radius:8px;width:100%;max-width:820px;animation:modalIn 0.2s ease;box-shadow:var(--shadow-lg);}
  @keyframes modalIn{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:translateY(0);}}
  .modal-head{padding:18px 22px;border-bottom:1px solid var(--line);display:flex;align-items:center;}
  .modal-head h3{margin:0;font-size:16px;font-weight:600;letter-spacing:-.012em;display:flex;align-items:center;gap:10px;}
  .modal-head .close{margin-left:auto;background:transparent;border:0;color:var(--text-mute);cursor:pointer;width:32px;height:32px;border-radius:5px;display:flex;align-items:center;justify-content:center;}
  .modal-head .close:hover{background:var(--navy-3);color:var(--text);}
  .modal-body{padding:22px;}
  /* Generic record editor: cap the body height and scroll inside the modal so
     long forms (e.g. the user permission matrix) never run off-screen. The
     footer stays pinned and visible. */
  .modal-body.ef-modal-body{padding:0;}
  .ef-modal-body .ef-scroll{padding:22px;max-height:min(70vh,760px);overflow-y:auto;}
  .ef-modal-body .ef-foot{display:flex;gap:8px;justify-content:flex-end;padding:14px 22px;border-top:1px solid var(--line);background:var(--surface);border-radius:0 0 8px 8px;}
  /* Notifications */
  .notif-list{display:flex;flex-direction:column;gap:6px;}
  .notif{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:6px;background:var(--navy-2);border:1px solid var(--line);}
  .notif:hover{border-color:var(--line-2);}
  .notif-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
  .notif-dot.err{background:var(--err);} .notif-dot.warn{background:var(--warn);} .notif-dot.info{background:var(--electric-2);}
  .notif .notif-t{font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .notif .notif-d{font-size:11px;color:var(--text-mute);margin-top:2px;}
  .notif .pill{flex-shrink:0;}

  .grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px;}

  /* Telemetry */
  .tele-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(150px,100%),1fr));gap:12px;}
  .tele-cell{background:var(--navy-2);border:1px solid var(--line);border-radius:6px;padding:14px;}
  .tele-cell .lbl{font-size:11px;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;font-weight:600;}
  .tele-cell .val{font-size:20px;font-weight:600;margin-top:6px;letter-spacing:-0.02em;line-height:1.1;}
  .tele-cell .val.sm{font-size:14px;font-weight:500;}

  /* Log */
  .log{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:14px;max-height:240px;overflow-y:auto;line-height:1.85;}
  .log .ts{color:var(--text-dim);}
  .log .lv-ok{color:var(--ok);font-weight:500;}
  .log .lv-warn{color:var(--warn);font-weight:500;}
  .log .lv-err{color:var(--err);font-weight:500;}
  .log .lv-info{color:var(--electric-2);font-weight:500;}
  /* Structured event-stream rows (real data) */
  .log-row{display:flex;align-items:center;gap:10px;padding:5px 6px;border-radius:6px;transition:background 0.12s;white-space:nowrap;}
  .log-row:hover{background:rgba(15,23,42,0.04);}
  .log-row .ts{color:var(--text-dim);flex-shrink:0;min-width:62px;}
  .log-row .log-dev{color:var(--text);font-weight:500;flex:0 1 auto;min-width:0;max-width:45%;overflow:hidden;text-overflow:ellipsis;}   /* v1.4.10.473: a long "device · room" ends in an ellipsis at 45% of the row; it never shrank, so the alert beside it was squeezed to 0px */
  .log-row .log-msg{color:var(--text-mute);overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0;}
  .log-row .log-dev,.log-row .log-msg{font-family:var(--font-body);}   /* v1.4.10.473: the device and the alert are words, so Poppins; the time and the [LEVEL] tag keep the code face */
  .log-row .pill{font-family:var(--font-body);flex-shrink:0;}
  .log-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:36px 24px;color:var(--text-mute);}
  .log-empty-ico{width:46px;height:46px;border-radius:7px;background:var(--navy-3);display:inline-flex;align-items:center;justify-content:center;margin-bottom:14px;color:var(--text-dim);}
  .log-empty-t{font-family:var(--font-display);font-size:15px;font-weight:600;letter-spacing:-.012em;color:var(--text);margin-bottom:5px;}   /* v1.4.10.473: an empty state's title, 15/600 like .empty's (was 13/600) */
  .log-empty-d{font-size:12px;line-height:1.6;max-width:420px;color:var(--text-mute);}
  @media (max-width:700px){
    .log-row{flex-wrap:wrap;row-gap:0;}
    .log-row .log-dev,.log-row .log-msg{order:1;flex:1 0 100%;max-width:none;}
    .log-row .log-msg{white-space:normal;line-height:1.5;}   /* v1.4.10.473: on a phone the time, level and pill keep the first line and the device and the alert each take a line below (one line ran 761px inside a 324px log) */
  }
  /* Live "breathing" indicator dot */
  .live-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--ok);margin-left:7px;vertical-align:middle;position:relative;}
  .live-dot::after{content:'';position:absolute;inset:-3px;border-radius:50%;background:var(--ok);opacity:0.35;animation:livePulse 1.8s ease-out infinite;}
  @keyframes livePulse{0%{transform:scale(0.6);opacity:0.5;}70%{transform:scale(1.9);opacity:0;}100%{opacity:0;}}
  /* Segmented filter control */
  .seg{display:inline-flex;background:var(--navy-2);border:1px solid var(--line);border-radius:6px;padding:2px;gap:2px;}
  .seg-btn{background:transparent;border:0;color:var(--text-mute);padding:5px 11px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;font-family:inherit;transition:all 0.12s;}
  .seg-btn:hover{color:var(--text);}
  .seg-btn.active{background:var(--surface-3);color:var(--text);}

  /* ============ ASSET MANAGEMENT ============ */
  .mono-tag{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;color:var(--accent);background:var(--accent-glow);padding:3px 8px;border-radius:6px;}
  /* v1.4.10.473: .mono is the codes utility (refs, invoice / order numbers, serials, IPs, file names, room codes): JetBrains
     Mono wherever it sits. No base rule gave it a face, so only the containers that each re-declared it drew mono */
  .mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
  .forecast-chart{display:flex;align-items:flex-end;gap:14px;height:200px;padding:8px 4px 0;}
  .fc-col{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:8px;min-width:0;}
  .fc-amt{font-size:11px;color:var(--text-mute);font-variant-numeric:tabular-nums;white-space:nowrap;}
  .fc-bar{width:100%;max-width:54px;background:linear-gradient(180deg,var(--accent) 0%,var(--accent-deep) 100%);border-radius:6px 6px 0 0;transition:height 0.4s ease;}
  .fc-bar.now{background:linear-gradient(180deg,var(--warn) 0%,#B45309 100%);}
  .fc-bar.past{background:linear-gradient(180deg,var(--err) 0%,#991B1B 100%);opacity:0.85;}
  .fc-year{font-size:11px;color:var(--text-dim);font-weight:500;white-space:nowrap;}
  .asset-detail{display:grid;grid-template-columns:1fr 1fr;gap:16px;}   /* v1.4.10.473: Lifecycle ops' panel pairs (its one user) — the grid moved here from an inline style that beat the phone rule below, so on a phone the pairs stayed 2-across at 168px */
  .detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px 20px;}
  .dg-cell .lbl{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;margin-bottom:4px;}
  .dg-cell .val{font-size:13px;color:var(--text);}
  /* Asset "where it lives" strip — Site › Floor › Space code › Room › Note */
  .asd-place{display:flex;align-items:stretch;flex-wrap:wrap;gap:0;border:1px solid var(--line);border-radius:7px;background:var(--surface-2);overflow:hidden;margin:18px 0 24px;}
  /* v1.4.10.112 (item 5): the overview grid keeps its own top gap so the
     Lifecycle / At a glance headings never sit hard against whatever is above
     them (place strip, health facts, or an incomplete-record notice). */
  .asd-place:last-child{margin-bottom:0;}
  .adt-pane .asd-ovgrid{margin-top:20px;}
  .asd-place + .asd-ovgrid{margin-top:0;}
  .asd-place-seg{display:flex;flex-direction:column;gap:3px;padding:11px 16px;min-width:0;flex:1 1 auto;}
  .asd-place-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;}
  .asd-place-val{font-size:13px;color:var(--text);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .asd-place-div{width:1px;background:var(--line);align-self:stretch;flex:0 0 1px;}
  @media (max-width:680px){ .asd-place{flex-direction:column;} .asd-place-div{width:auto;height:1px;} }
  /* Compact placement breadcrumb in the asset hero (Client › Site › Level › Location · CODE) */
  .ah-breadcrumb{display:flex;align-items:center;flex-wrap:wrap;gap:7px;margin:8px 0 0;font-size:12px;font-weight:600;color:rgba(255,255,255,.92);}
  .ah-bc-sep{opacity:.55;font-weight:400;}
  .ah-bc-code{display:inline-flex;align-items:center;margin-left:2px;padding:1px 8px;border-radius:6px;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.22);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;letter-spacing:.04em;}
  /* Read-only space-code chip in the asset editor placement step */
  .ae-spacecode-box{display:flex;align-items:center;min-height:38px;padding:7px 11px;border:1px dashed var(--line);border-radius:6px;background:var(--surface-2);}
  /* Administration → Settings tab bar */
  .set-tabs{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 18px;padding:5px;border:1px solid var(--line);border-radius:7px;background:var(--surface-2);}
  .set-tab{display:inline-flex;align-items:center;gap:7px;padding:8px 14px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--text-mute);font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap;transition:background .12s,color .12s,border-color .12s;}
  .set-tab:hover{background:var(--surface);color:var(--text);}
  .set-tab.active{background:var(--surface);color:var(--accent,var(--bc-blue-v1));border-color:var(--line);box-shadow:0 1px 2px rgba(0,0,0,.04);}
  .set-tab svg{width:15px;height:15px;flex:none;}
  .set-pane{display:block;}
  @media (max-width:680px){ .set-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;} .set-tab{flex:none;} }
  .qr-box{display:inline-flex;align-items:center;justify-content:center;background:#fff;padding:10px;border-radius:7px;line-height:0;}
  .qr-box svg{display:block;width:auto;height:auto;max-width:100%;height:auto;border-radius:2px;}
  /* v1.4.10.155: .qr-label is a flex ROW and .qr-box defaulted to flex-shrink:1
     with no max-width on the QR variant, so on a narrow modal the box was
     squeezed and the code overflowed it. Pin it and let it wrap instead. */
  .qr-label .qr-box{flex:none;}
  .qr-label{display:flex;gap:22px;align-items:center;justify-content:center;background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:26px 30px;}
  /* Barcode labels stack tag details above the (wide) Code 128 strip. */
  .qr-label.is-barcode{flex-direction:column;gap:16px;text-align:center;}
  .qr-label.is-barcode .qr-label-side{align-items:center;}
  .qr-label.is-barcode .qr-box svg{max-width:100%;height:auto;}
  .qr-label-side{display:flex;flex-direction:column;gap:5px;}
  @media(max-width:700px){
    .qr-label{flex-direction:column;gap:16px;text-align:center;padding:20px 16px;}
    .qr-label .qr-label-side{align-items:center;}
  }
  .qr-brand{display:flex;align-items:center;gap:8px;font-family:var(--font-display);font-weight:600;font-size:15px;margin-bottom:8px;}
  .qr-tag{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:24px;font-weight:600;letter-spacing:1px;}
  .qr-model{font-size:14px;color:var(--text);}
  .qr-meta{font-size:12px;color:var(--text-mute);}
  .import-cols{font-size:12px;color:var(--text-mute);line-height:1.7;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:12px 14px;}
  .import-cols code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;color:var(--accent-2);}
  .import-preview-head{font-size:12px;color:var(--text-mute);margin:16px 0 8px;}
  .import-err{color:var(--err);font-size:13px;padding:12px;background:rgba(248,113,113,0.08);border-radius:6px;}
  @media (max-width:680px){ .asset-detail{grid-template-columns:1fr;} }
  /* Sectioned asset editor */
  .asset-editor{max-width:760px;}
  .form-section{border:1px solid var(--line);border-radius:7px;margin-bottom:14px;overflow:hidden;}
  .form-section .fs-head{padding:12px 16px;background:var(--bg-2);border-bottom:1px solid var(--line);}
  .form-section .fs-title{font-family:var(--font-display);font-size:15px;font-weight:600;letter-spacing:-.01em;}   /* v1.4.10.473: a card title, -.01em like .panel-head h3 (was -.012em) */
  .form-section .fs-sub{font-size:12px;color:var(--text-mute);margin-top:2px;}
  .form-section .fs-body{padding:16px;}
  /* v1.4.10.473: on a phone a section sits inside a padded modal or editor body, so its own sides are 12px (were 16): the
     fields gain 8px (the mail channel's Subject and Channel mailbox stood 292px on a 390px screen and cut their text);
     the head keeps the body's inset so its title still lines up with the fields */
  @media (max-width:700px){ .form-section .fs-head{padding-left:12px;padding-right:12px;} .form-section .fs-body{padding:12px;} }
  .fs-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 16px;}
  .fs-grid .field,.fs-body .field{margin-bottom:0;}
  .fs-full{grid-column:1/-1;}
  .fs-hint{font-size:12px;color:var(--text-dim);margin-top:12px;line-height:1.55;}
  .fs-hint a{cursor:pointer;}
  /* Asset alert-policy chooser (notify vs ticket) */
  /* v1.4.10.173: THREE policies now (ticket / notify / silent). auto-fit rather
     than a fixed 3-track grid so the cards keep a readable width inside the
     editor at any modal size and fold to two, then one, on their own. */
  .ae-alertpol{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px;}
  .ae-alertpol-opt{display:flex;align-items:flex-start;gap:9px;padding:11px 12px;border:1px solid var(--line);border-radius:6px;cursor:pointer;transition:border-color .14s,background .14s;}
  .ae-alertpol-opt:hover{border-color:var(--line-2);background:var(--surface-2);}
  .ae-alertpol-opt input{margin-top:2px;flex-shrink:0;}
  .ae-alertpol-opt:has(input:checked){border-color:var(--brand-blue);background:var(--accent-glow);}
  .ae-alertpol-opt span{display:flex;flex-direction:column;gap:2px;}
  .ae-alertpol-opt b{font-size:13px;font-weight:600;color:var(--text);}
  .ae-alertpol-opt small{font-size:12px;color:var(--text-mute);line-height:1.4;}
  @media (max-width:560px){ .ae-alertpol{grid-template-columns:1fr;} }
  /* Asset ⇄ SSO connector picker */
  .ae-sso-tabs{display:inline-flex;gap:4px;padding:3px;background:var(--surface-2,rgba(0,0,0,.04));border:1px solid var(--line);border-radius:6px;margin-bottom:10px;flex-wrap:wrap;}
  .ae-sso-seg{appearance:none;border:none;background:transparent;color:var(--text-mute);font:inherit;font-size:12px;font-weight:600;padding:6px 12px;border-radius:5px;cursor:pointer;transition:background .14s,color .14s;}
  .ae-sso-seg:hover{color:var(--text);}
  .ae-sso-seg.on{background:var(--surface);color:var(--brand-blue,var(--bc-blue-v1));box-shadow:var(--shadow-sm);}
  .ae-sso-body{padding-top:2px;}
  .ae-sso-chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:9px;}
  .ae-sso-chip{display:inline-flex;align-items:center;gap:7px;padding:6px 11px;border:1px solid var(--line);border-radius:999px;font-size:12px;font-weight:500;color:var(--text);cursor:pointer;background:var(--surface);transition:border-color .14s,background .14s,box-shadow .14s;}
  .ae-sso-chip:hover{border-color:var(--line-2);background:var(--surface-2);}
  .ae-sso-chip.on{border-color:var(--brand-blue,var(--bc-blue-v1));background:var(--accent-glow,rgba(var(--bc-accent-rgb),.08));box-shadow:0 0 0 1px var(--brand-blue,var(--bc-blue-v1)) inset;}
  .ae-sso-dot{width:7px;height:7px;border-radius:50%;background:var(--text-dim,#94A3B8);flex:none;}
  .ae-sso-dot.ok{background:var(--ok,#16A34A);}
  .ae-sso-dot.err{background:var(--err,#DC2626);}
  /* Binary monitoring method selector (Not monitored / Ody / SSO) */
  .ae-mon-methods{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;}
  @media (max-width:560px){ .ae-mon-methods{grid-template-columns:1fr;} }
  .ae-mon-seg{appearance:none;text-align:left;border:1px solid var(--line);background:var(--surface);border-radius:6px;padding:11px 13px;cursor:pointer;display:flex;flex-direction:column;gap:3px;transition:border-color .14s,background .14s,box-shadow .14s;color:var(--text);}
  .ae-mon-seg:hover{border-color:var(--line-2);background:var(--surface-2);}
  .ae-mon-seg.on{border-color:var(--brand-blue,var(--bc-blue-v1));background:var(--accent-glow,rgba(var(--bc-accent-rgb),.07));box-shadow:0 0 0 1px var(--brand-blue,var(--bc-blue-v1)) inset;}
  .ae-mon-seg-t{font-weight:600;font-size:13px;}
  .ae-mon-seg-s{font-size:12px;color:var(--text-mute);line-height:1.35;}
  .ae-mon-panel{border:1px solid var(--line);border-radius:6px;padding:13px;background:var(--surface-2,rgba(0,0,0,.02));}
  .ae-ody-note{margin-top:10px;font-size:12px;line-height:1.5;color:var(--text-mute);border-left:3px solid var(--warn,#D97706);padding:6px 0 6px 11px;background:var(--accent-glow,rgba(217,119,6,.06));border-radius:0 6px 6px 0;}
  /* "Monitoring adds this to the device estate" auto note (Ody + SSO panels) */
  .ae-estate-auto{display:flex;align-items:flex-start;gap:11px;margin-top:12px;padding:11px 13px;border:1px solid var(--line);border-radius:6px;background:var(--accent-glow,rgba(var(--bc-accent-rgb),.06));font-size:12px;line-height:1.5;color:var(--text-mute);}
  .ae-estate-auto b{color:var(--text);font-weight:700;}
  /* v1.4.10.658: a sealed credential — on the editor a masked input with Show / Remove, on the record a mask with Show */
  .ae-secret{display:flex;gap:6px;align-items:center;}
  .ae-secret input{flex:1;min-width:0;}
  .ae-secret .btn{flex:none;}
  .ad-sec-wrap{display:inline-flex;flex-wrap:wrap;gap:6px;align-items:center;max-width:100%;}
  .ad-sec-wrap .opi-cred{font-size:12px;padding:3px 8px;}
  .ad-sec-k{font-size:11px;font-weight:600;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;}
  .ae-estate-auto-ico{flex:none;width:30px;height:30px;border-radius:6px;display:flex;align-items:center;justify-content:center;background:var(--surface);color:var(--brand-blue,var(--bc-blue-v1));}
  .ae-estate-auto-ico svg{width:17px;height:17px;}
  /* SSO verify / delete / manual-add requirement fields */
  .ae-sso-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;}
  .ae-sso-actions .ae-sso-del{color:var(--err,#DC2626);}
  .ae-sso-status{font-size:12px;font-weight:600;color:var(--text-mute);}
  .ae-sso-status.ok{color:var(--ok,#16A34A);}
  .ae-sso-status.err{color:var(--err,#DC2626);}
  .ae-sso-req{margin-top:10px;}
  .ae-sso-req>label{display:block;font-size:12px;font-weight:500;color:var(--text-mute);margin-bottom:5px;}
  .ae-sso-copy{display:flex;gap:7px;}
  .ae-sso-copy input{flex:1;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:13px;padding:7px 9px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);}
  .ae-sso-setup{margin-top:9px;font-size:12px;line-height:1.5;color:var(--text-mute);background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:9px 11px;}
  .ae-sso-docs{display:inline-block;margin-top:8px;font-size:12px;font-weight:600;color:var(--brand-blue,var(--bc-blue-v1));text-decoration:none;}
  .ae-sso-docs:hover{text-decoration:underline;}
  /* Account & access — org/site chip picker */
  .acc-pick{margin-top:2px;}
  .acc-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:2px 0 9px;}
  .acc-search{flex:1;min-width:160px;max-width:300px;padding:7px 11px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font:inherit;font-size:13px;}
  .acc-search:focus{outline:none;border-color:var(--brand-blue,var(--bc-blue-v1));box-shadow:0 0 0 3px var(--accent-glow,rgba(var(--bc-accent-rgb),.12));}
  .acc-count{font-size:12px;color:var(--text-mute);font-weight:600;}
  .acc-bar-actions{margin-left:auto;display:inline-flex;align-items:center;gap:7px;}
  .acc-link{appearance:none;border:none;background:transparent;color:var(--brand-blue,var(--bc-blue-v1));font:inherit;font-size:11px;font-weight:500;cursor:pointer;padding:2px 2px;}
  .acc-link:hover{text-decoration:underline;}
  .acc-sep{color:var(--text-dim);font-size:11px;}
  .acc-grid{display:flex;flex-wrap:wrap;gap:8px;padding:2px 0;}
  .acc-chip{display:inline-flex;align-items:center;gap:7px;padding:7px 12px;border:1px solid var(--line);border-radius:6px;background:var(--surface);cursor:pointer;font-size:12px;color:var(--text);transition:border-color .14s,background .14s,box-shadow .14s;user-select:none;}
  .acc-chip:hover{border-color:var(--line-2);background:var(--surface-2);}
  .acc-chip input{position:absolute;opacity:0;width:0;height:0;pointer-events:none;}
  .acc-chip-name{font-weight:500;}
  .acc-tag{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim);background:var(--surface-2,rgba(0,0,0,.05));padding:1px 6px;border-radius:5px;}
  .acc-check{display:inline-flex;width:15px;height:15px;align-items:center;justify-content:center;border:1.5px solid var(--line-2,#CBD5E1);border-radius:5px;color:#fff;}
  .acc-check svg{width:11px;height:11px;opacity:0;transition:opacity .12s;}
  .acc-chip.on{border-color:var(--brand-blue,var(--bc-blue-v1));background:var(--accent-glow,rgba(var(--bc-accent-rgb),.08));box-shadow:0 0 0 1px var(--brand-blue,var(--bc-blue-v1)) inset;color:var(--text);}
  .acc-chip.on .acc-check{background:var(--brand-blue,var(--bc-blue-v1));border-color:var(--brand-blue,var(--bc-blue-v1));}
  .acc-chip.on .acc-check svg{opacity:1;}
  .acc-chip.on .acc-tag{color:var(--brand-blue,var(--bc-blue-v1));}
  .acc-groups{display:flex;flex-direction:column;gap:12px;}
  .acc-group{border:1px solid var(--line);border-radius:6px;padding:10px 12px;background:var(--surface);}
  .acc-group-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;}
  .acc-group-name{font-size:11px;font-weight:600;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;}
  .acc-group-n{display:inline-block;margin-left:6px;font-size:10px;font-weight:700;color:var(--text-dim);background:var(--surface-2,rgba(0,0,0,.05));border-radius:999px;padding:1px 7px;letter-spacing:.04em;}   /* v1.4.10.473: a badge tracks .04em (was 0 inside an uppercase label) */
  .acc-empty{color:var(--text-dim);font-size:12px;padding:8px 0;}
  .asd-h{font-family:var(--font-display);font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:22px 0 12px;font-weight:600;}
  .asd-h:first-child{margin-top:0;}
  /* Activity log */
  .alog{display:flex;flex-direction:column;gap:14px;}
  .alog-row{display:flex;gap:10px;}
  .alog-dot{width:8px;height:8px;border-radius:50%;background:var(--accent);margin-top:5px;flex-shrink:0;box-shadow:0 0 0 3px var(--accent-glow);}
  .alog-action{font-size:13px;}   /* v1.4.10.473: a row's title is body text 13, above its 12px meta line (was 12, the same size as the meta) */
  /* v1.4.10.554: as written (was text-transform:capitalize): every row it heads is somebody's own words, a call-out title, a
     ticket subject, a stock movement's note, and each word of them was capitalised ("Lamp Change, Pyrmont Theatre", "1 Each") */
  .alog-meta{font-size:12px;color:var(--text-dim);margin-top:2px;}   /* v1.4.10.473: meta line 12/400 (was 11) */
  @media (max-width:560px){ .fs-grid{grid-template-columns:1fr;} }
  .empty .empty-sub{font-size:12px;color:var(--text-dim);margin-top:6px;line-height:1.6;max-width:380px;margin-left:auto;margin-right:auto;}

  /* Tabs */
  .tab-row{display:flex;gap:2px;border-bottom:1px solid var(--line);margin-bottom:16px;}
  .tab{padding:10px 16px;background:transparent;border:0;border-bottom:2px solid transparent;color:var(--text-mute);cursor:pointer;font-size:13px;font-family:inherit;font-weight:600;}
  .tab.active{color:var(--brand-blue);border-bottom-color:var(--brand-blue);}

  /* ============ DEV TEAM ============ */
  .dv-board{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:14px;flex:1;min-width:0;}
  .dv-col{background:var(--bg-2);border:1px solid var(--line);border-radius:7px;padding:10px;min-height:120px;display:flex;flex-direction:column;}
  .dv-col.drop{outline:2px dashed var(--brand-blue);outline-offset:-4px;}
  .dv-col-head{display:flex;align-items:center;gap:8px;padding:4px 6px 10px;font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--text-mute);text-transform:uppercase;}
  .dv-col-head .dv-dot{width:8px;height:8px;border-radius:50%;}
  .dv-col-head .dv-cnt{margin-left:auto;font-size:10px;background:var(--surface-3);color:var(--text-mute);border-radius:6px;padding:1px 8px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: a count is the badge look, 10/700 uppercase .04em (it took the heading's .06em) */
  .dv-card{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:11px 12px;margin-bottom:9px;box-shadow:var(--shadow-sm);cursor:grab;transition:border-color .14s,transform .05s;}
  .dv-card:hover{border-color:var(--line-2);}
  .dv-card:active{cursor:grabbing;}
  .dv-card.dragging{opacity:.45;}
  .dv-card .dv-top{display:flex;align-items:center;gap:6px;margin-bottom:7px;}
  .dv-card .dv-id{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;color:var(--text-dim);}
  .dv-card .dv-title{font-size:13px;font-weight:600;line-height:1.35;margin-bottom:9px;color:var(--text);}
  .dv-card .dv-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  .dv-kind{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:700;padding:2px 7px;border-radius:6px;text-transform:uppercase;letter-spacing:.04em;}
  .dv-kind.bug{background:rgba(220,38,38,0.11);color:var(--err);}
  .dv-kind.design{background:rgba(var(--bc-purple-rgb),0.12);color:var(--info);}
  .dv-kind.feature{background:var(--accent-glow);color:var(--brand-blue);}
  .dv-kind.chore{background:var(--surface-3);color:var(--text-mute);}
  .dv-prio{font-size:11px;font-weight:600;padding:2px 7px;border-radius:6px;}
  .dv-prio.p1{background:rgba(220,38,38,0.11);color:var(--err);}
  .dv-prio.p2{background:rgba(217,119,6,0.13);color:var(--warn);}
  .dv-prio.p3{background:var(--surface-3);color:var(--text-mute);}
  .dv-assignee{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--text-mute);min-width:0;max-width:100%;}   /* v1.4.10.473: never wider than the card's meta row, so the select inside can be held to it */
  .dv-av{width:20px;height:20px;border-radius:50%;background:var(--grad);color:#fff;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}   /* v1.4.10.473: 10px initials take the badge look, 10/700 uppercase .04em (were 10/600) */
  .dv-move{display:flex;gap:4px;margin-top:9px;}
  .dv-move button{flex:1;border:1px solid var(--line);background:var(--surface-2);color:var(--text-mute);border-radius:6px;font-size:11px;font-weight:500;padding:4px;cursor:pointer;font-family:inherit;}
  .dv-move button:hover:not(:disabled){background:var(--surface-3);color:var(--text);}
  .dv-move button:disabled{opacity:.3;cursor:default;}
  .dv-link{font-size:11px;color:var(--brand-blue);text-decoration:none;}
  /* Roadmap / forecast */
  .dv-fc-grid{display:grid;grid-template-columns:1.3fr 1fr;gap:18px;}
  .dv-road{display:flex;flex-direction:column;gap:10px;}
  .dv-rel{border:1px solid var(--line);border-radius:6px;overflow:hidden;}
  .dv-rel-head{display:flex;align-items:center;gap:10px;padding:11px 14px;background:var(--bg-2);border-bottom:1px solid var(--line);}
  .dv-rel-q{font-family:var(--font-display);font-weight:700;font-size:13px;}
  .dv-rel-theme{font-size:12px;color:var(--text-mute);}
  .dv-rel-pts{margin-left:auto;font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;}
  .dv-rel-body{padding:8px 14px 12px;}
  .dv-item{display:flex;align-items:center;gap:9px;padding:7px 0;border-bottom:1px dashed var(--line);font-size:12px;}
  .dv-item:last-child{border-bottom:0;}
  .dv-item .dv-i-name{color:var(--text);}
  .dv-item .dv-i-tag{margin-left:auto;}
  .dv-prog{height:6px;border-radius:4px;background:var(--surface-3);overflow:hidden;flex:1;max-width:90px;}
  .dv-prog > i{display:block;height:100%;background:var(--grad);border-radius:4px;}
  /* Recommendations */
  .dv-rec{display:flex;gap:12px;padding:13px 0;border-bottom:1px solid var(--line);}
  .dv-rec:last-child{border-bottom:0;}
  .dv-rec-ico{width:34px;height:34px;border-radius:6px;background:var(--accent-glow);color:var(--brand-blue);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}
  .dv-rec-body{flex:1;min-width:0;}
  .dv-rec-title{font-size:13px;font-weight:600;margin-bottom:3px;}
  .dv-rec-desc{font-size:12px;color:var(--text-mute);line-height:1.5;}
  .dv-rec-tags{display:flex;gap:7px;margin-top:8px;flex-wrap:wrap;}
  .dv-mini{font-size:11px;font-weight:600;padding:2px 8px;border-radius:6px;background:var(--surface-3);color:var(--text-mute);}
  .dv-mini.imp-high{background:rgba(22,163,74,0.12);color:var(--ok);}
  .dv-mini.eff-low{background:var(--accent-glow);color:var(--brand-blue);}
  .dv-rec-act{display:flex;align-items:flex-start;}
  .dv-readonly{font-size:12px;color:var(--text-dim);display:inline-flex;align-items:center;gap:6px;}
  @media (max-width:1400px){ .dv-board{grid-template-columns:repeat(3,minmax(0,1fr));} }
  @media (max-width:1180px){ .dv-board-wrap{flex-direction:column;} .dv-side{width:100%;} }
  @media (max-width:900px){ .dv-board{grid-template-columns:1fr 1fr;} .dv-fc-grid{grid-template-columns:1fr;} }
  @media (max-width:560px){ .dv-board{grid-template-columns:1fr;} }
  /* Dev Team — expanded workspace */
  .dv-tabline{display:flex;gap:2px;border-bottom:1px solid var(--line);margin-bottom:20px;overflow-x:auto;scrollbar-width:thin;-webkit-overflow-scrolling:touch;}
  .dv-tab{padding:10px 15px;background:transparent;border:0;border-bottom:2px solid transparent;color:var(--text-mute);cursor:pointer;font-size:13px;font-family:inherit;font-weight:600;white-space:nowrap;display:inline-flex;align-items:center;gap:7px;}
  .dv-tab .ico{width:15px;height:15px;display:inline-flex;}
  .dv-tab:hover{color:var(--text);}
  .dv-tab.on{color:var(--brand-blue);border-bottom-color:var(--brand-blue);font-weight:600;}
  .dv-tab .dv-tabn{font-size:10px;background:var(--surface-3);color:var(--text-mute);border-radius:6px;padding:0 7px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: badge look */
  .dv-section-title{font-family:var(--font-display);font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin:0 0 12px;}
  .dv-ov-grid{display:grid;grid-template-columns:1.45fr 1fr;gap:18px;align-items:start;}
  .dv-toolbar{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap;}
  .dv-toolbar .grow{flex:1;min-width:60px;}
  .dv-toolbar select,.dv-toolbar input{height:32px;box-sizing:border-box;padding:0 11px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;}   /* v1.4.10.473: 32px like the .btn.sm and the view switch in the same row (was 38/39 beside 32/36) */
  @media (max-width:700px){ .dv-toolbar > input{flex:1 1 100%;min-width:0;} .dv-toolbar > select{flex:1 1 calc(50% - 5px);min-width:0;} }   /* v1.4.10.473: on a phone the search takes a row and the filters pair up in even halves (they wrapped ragged, one per row) */
  /* assignee select on cards */
  .dv-assignee select{font-family:inherit;font-size:13px;border:1px solid var(--line);background:var(--surface-2);border-radius:6px;color:var(--text-mute);padding:2px 4px;min-width:0;max-width:100%;cursor:pointer;}   /* v1.4.10.473: a field is 13/400 (was 12); it may take the card's width (118px cut most names) but no more: without min-width:0 it grew to the team's longest name and ran out of every card */
  /* files */
  .dv-dropzone{border:1.5px dashed var(--line-2);border-radius:8px;padding:28px 20px;text-align:center;color:var(--text-mute);background:var(--bg-2);cursor:pointer;transition:all .15s;margin-bottom:18px;}
  .dv-dropzone:hover,.dv-dropzone.drag{border-color:var(--brand-blue);background:var(--accent-glow);color:var(--brand-blue);}
  .dv-dropzone .dz-ico{width:40px;height:40px;border-radius:6px;background:var(--surface-3);display:inline-flex;align-items:center;justify-content:center;margin-bottom:10px;color:var(--brand-blue);}
  .dv-dropzone.drag .dz-ico{background:var(--surface);}
  .dv-dropzone .dz-t{font-size:13px;font-weight:600;color:var(--text);}
  .dv-dropzone .dz-s{font-size:12px;margin-top:4px;}
  .dv-files{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(248px,100%),1fr));gap:12px;}
  .dv-file{display:flex;gap:11px;padding:13px;border:1px solid var(--line);border-radius:7px;background:var(--surface);align-items:flex-start;box-shadow:var(--shadow-sm);}
  .dv-file-ico{width:42px;height:42px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;text-transform:uppercase;color:#fff;flex-shrink:0;letter-spacing:.06em;}   /* v1.4.10.473: the file type is an uppercase label, 11/600 .06em (was 11/700 .04em) */
  .dv-file-main{flex:1;min-width:0;}
  .dv-file-name{font-size:13px;font-weight:600;word-break:break-word;line-height:1.35;}   /* v1.4.10.473: a card's title line is 13/600, as the board cards' (was 12) */
  .dv-file-meta{font-size:11px;color:var(--text-dim);margin-top:4px;line-height:1.5;}
  .dv-file-cat{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;background:var(--surface-3);color:var(--text-mute);margin-top:6px;text-transform:uppercase;letter-spacing:.04em;}
  .dv-file-acts{display:flex;gap:6px;margin-top:9px;}
  .dv-file-acts button{border:1px solid var(--line);background:var(--surface-2);color:var(--text-mute);border-radius:6px;font-size:11px;font-weight:500;padding:3px 9px;cursor:pointer;font-family:inherit;display:inline-flex;align-items:center;gap:4px;}
  .dv-file-acts button:hover{background:var(--surface-3);color:var(--text);}
  /* reference */
  .dv-ref-wrap{display:grid;grid-template-columns:268px 1fr;gap:18px;align-items:start;}
  .dv-ref-list{display:flex;flex-direction:column;gap:7px;}
  .dv-ref-item{padding:11px 13px;border:1px solid var(--line);border-radius:6px;cursor:pointer;background:var(--surface);transition:all .12s;}
  .dv-ref-item:hover{background:var(--surface-2);}
  .dv-ref-item.on{border-color:var(--brand-blue);background:var(--accent-glow);}
  .dv-ref-item .ri-t{font-size:13px;font-weight:600;display:flex;align-items:center;gap:8px;color:var(--text);}
  .dv-ref-item .ri-t .ico{color:var(--text-mute);width:15px;height:15px;display:inline-flex;flex-shrink:0;}
  .dv-ref-item.on .ri-t .ico{color:var(--brand-blue);}
  .dv-ref-item .ri-m{font-size:11px;color:var(--text-dim);margin-top:4px;}
  .dv-ref-read{border:1px solid var(--line);border-radius:7px;padding:24px 26px;background:var(--surface);min-height:320px;}
  .dv-doc h3.dh{font-family:var(--font-display);font-size:16px;font-weight:600;margin:0 0 4px;letter-spacing:-.012em;}
  .dv-doc .dsub{font-size:12px;color:var(--text-mute);margin-bottom:18px;padding-bottom:14px;border-bottom:1px solid var(--line);}
  .dv-doc h4{font-size:15px;font-weight:600;margin:20px 0 8px;color:var(--text);}
  .dv-doc p{font-size:14px;line-height:1.65;color:var(--text-mute);margin:0 0 10px;}
  .dv-doc ul{margin:0 0 12px;padding-left:20px;}
  .dv-doc li{font-size:14px;line-height:1.6;color:var(--text-mute);margin-bottom:5px;}
  .dv-doc code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;background:var(--bg);border:1px solid var(--line);border-radius:5px;padding:1px 6px;color:var(--accent-2);}
  .dv-doc table.dvk{width:100%;border-collapse:collapse;margin:4px 0 14px;font-size:13px;}
  .dv-doc table.dvk td{padding:7px 10px;border-bottom:1px solid var(--line);color:var(--text-mute);}
  .dv-doc table.dvk td:first-child{font-weight:600;color:var(--text);width:38%;white-space:nowrap;}
  /* team */
  .dv-team{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(290px,100%),1fr));gap:14px;}
  .dv-member{border:1px solid var(--line);border-radius:7px;padding:16px;background:var(--surface);box-shadow:var(--shadow-sm);}
  .dv-member-head{display:flex;align-items:center;gap:12px;margin-bottom:13px;}
  .dv-av.lg{width:44px;height:44px;font-size:16px;text-transform:none;letter-spacing:0;}
  .dv-member-name{font-size:15px;font-weight:600;letter-spacing:-.012em;}
  .dv-member-role{font-size:12px;color:var(--text-mute);margin-top:1px;}
  .dv-load-row{display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--text-mute);margin-bottom:5px;}
  .dv-load{height:7px;border-radius:4px;background:var(--surface-3);overflow:hidden;margin-bottom:13px;}
  .dv-load > i{display:block;height:100%;background:var(--grad);border-radius:4px;transition:width .4s ease;}
  .dv-jobs{display:flex;flex-direction:column;gap:7px;}
  .dv-job{font-size:12px;display:flex;gap:8px;align-items:center;}
  .dv-job .jt{color:var(--text);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .dv-job-empty{font-size:12px;color:var(--text-dim);font-style:italic;}
  /* notes */
  .dv-note{border:1px solid var(--line);border-radius:6px;padding:13px 15px;margin-bottom:10px;background:var(--surface);}
  .dv-note.pin{border-color:rgba(var(--bc-accent-rgb),.32);background:var(--accent-glow);}
  .dv-note-head{display:flex;align-items:center;gap:8px;font-size:12px;margin-bottom:6px;}
  .dv-note-who{font-weight:600;color:var(--text);}
  .dv-note-date{color:var(--text-dim);margin-left:auto;font-size:12px;}
  .dv-note-text{font-size:14px;line-height:1.55;color:var(--text-mute);white-space:pre-wrap;}
  /* activity */
  .dv-act{display:flex;gap:10px;padding:9px 0;border-bottom:1px solid var(--line);font-size:12px;}
  .dv-act:last-child{border-bottom:0;}
  .dv-act-dot{width:7px;height:7px;border-radius:50%;background:var(--accent);margin-top:5px;flex-shrink:0;box-shadow:0 0 0 3px var(--accent-glow);}
  .dv-act-txt{color:var(--text-mute);line-height:1.5;}
  .dv-act-txt b{color:var(--text);font-weight:600;}
  .dv-act-time{font-size:11px;color:var(--text-dim);margin-top:2px;}
  @media (max-width:900px){ .dv-ov-grid,.dv-ref-wrap{grid-template-columns:1fr;} }
  /* labels */
  .dv-labels{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:8px;}
  .dv-label{font-size:11px;font-weight:600;padding:2px 8px;border-radius:5px;letter-spacing:0;display:inline-flex;align-items:center;gap:5px;}
  .dv-label .lx{cursor:pointer;opacity:.6;font-weight:700;}
  .dv-label .lx:hover{opacity:1;}
  .dv-card.clk{cursor:pointer;}
  .dv-card.clk:hover{border-color:var(--brand-blue);}
  /* fix detail modal */
  .dv-fix{display:grid;grid-template-columns:1fr 250px;gap:24px;}
  .dv-fix-main{min-width:0;}
  .dv-subh{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin:22px 0 10px;}
  .dv-subh:first-child{margin-top:0;}
  .dv-desc-box{font-size:14px;line-height:1.65;color:var(--text-mute);white-space:pre-wrap;background:var(--bg-2);border:1px solid var(--line);border-radius:6px;padding:13px 15px;min-height:48px;}
  .dv-check{display:flex;flex-direction:column;gap:8px;margin:4px 0;}
  .dv-check-item{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--text);}
  .dv-check-item input{width:16px;height:16px;accent-color:var(--brand-blue);cursor:pointer;flex-shrink:0;}
  .dv-check-item.done .ct{text-decoration:line-through;color:var(--text-dim);}
  .dv-check-item .cx{margin-left:auto;color:var(--text-dim);cursor:pointer;opacity:0;font-size:15px;}
  .dv-check-item:hover .cx{opacity:.7;}
  .dv-check-item .cx:hover{opacity:1;color:var(--err);}
  .dv-addrow{display:flex;gap:8px;margin-top:10px;}
  .dv-addrow input{flex:1;padding:8px 11px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;}
  .dv-cmt{display:flex;gap:10px;margin-bottom:13px;}
  .dv-cmt-body{flex:1;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:10px 13px;}
  .dv-cmt-head{display:flex;gap:8px;font-size:12px;margin-bottom:4px;align-items:center;}
  .dv-cmt-who{font-weight:600;color:var(--text);}
  .dv-cmt-when{color:var(--text-dim);margin-left:auto;font-size:12px;}
  .dv-cmt-text{font-size:14px;line-height:1.55;color:var(--text-mute);white-space:pre-wrap;}
  .dv-fix-side .dg-cell{margin-bottom:15px;}
  .dv-fix-side .dg-cell .lbl{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;margin-bottom:6px;}
  .dv-fix-side select,.dv-fix-side input{width:100%;padding:8px 10px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;}
  .dv-attach{display:flex;align-items:center;gap:9px;font-size:12px;padding:7px 0;border-bottom:1px dashed var(--line);}
  .dv-attach:last-child{border-bottom:0;}
  .dv-attach .ax{margin-left:auto;color:var(--text-dim);cursor:pointer;}
  .dv-hist{display:flex;gap:9px;padding:6px 0;font-size:12px;color:var(--text-dim);}
  .dv-hist .hd{width:6px;height:6px;border-radius:50%;background:var(--line-2);margin-top:5px;flex-shrink:0;}
  /* overview mini bars */
  .dv-bars{display:flex;flex-direction:column;gap:11px;}
  .dv-bar-row{display:flex;align-items:center;gap:11px;font-size:12px;}
  .dv-bar-row .bl{width:90px;color:var(--text-mute);flex-shrink:0;}
  .dv-bar-track{flex:1;height:9px;background:var(--surface-3);border-radius:5px;overflow:hidden;}
  .dv-bar-track>i{display:block;height:100%;border-radius:5px;}
  .dv-bar-row .bn{width:22px;text-align:right;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;}
  .dv-rel-add{display:flex;gap:7px;margin-top:8px;}
  .dv-i-tag.clk{cursor:pointer;}
  @media (max-width:680px){ .dv-fix{grid-template-columns:1fr;} }
  /* hero headers */
  .dv-hero{display:flex;align-items:center;gap:18px;padding:20px 22px;border-radius:8px;margin-bottom:20px;background:linear-gradient(120deg,rgba(var(--bc-accent-rgb),.10),rgba(var(--bc-purple-rgb),.07));border:1px solid var(--line);}
  .dv-hero-ico{width:50px;height:50px;border-radius:8px;background:var(--grad);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 6px 18px rgba(var(--bc-accent-rgb),.28);}
  .dv-hero-ico svg{width:25px;height:25px;}
  .dv-hero-main{flex:1;min-width:0;}
  .dv-hero-title{font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.024em;margin:0;display:flex;align-items:center;flex-wrap:wrap;}
  .dv-hero-sub{font-size:13px;color:var(--text-mute);margin:4px 0 0;line-height:1.5;}
  .dv-hero-actions{flex-shrink:0;display:flex;gap:8px;}
  .dv-live{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:var(--ok);background:rgba(22,163,74,.13);padding:2px 9px;border-radius:10px;margin-left:10px;}
  .dv-live-dot{width:7px;height:7px;border-radius:50%;background:var(--ok);animation:dvpulse 1.6s infinite;}
  @keyframes dvpulse{0%{box-shadow:0 0 0 0 rgba(22,163,74,.5)}70%{box-shadow:0 0 0 6px rgba(22,163,74,0)}100%{box-shadow:0 0 0 0 rgba(22,163,74,0)}}
  @media (max-width:640px){ .dv-hero{flex-wrap:wrap;} .dv-hero-actions{width:100%;} .dv-hero-actions .btn{flex:1;justify-content:center;} }

  /* ── User-profile detail: hero + tidy permission cards ── */
  .dv-hero-user{flex-direction:column;align-items:stretch;gap:0;margin-bottom:18px;}
  .dv-hero-top{display:flex;align-items:center;gap:18px;}
  .dv-hero-top .dv-hero-actions{margin-left:auto;}
  .dv-hero-top .dv-hero-ico.ua-av{width:50px;height:50px;}   /* v1.4.10.473: the hero avatar keeps the 50px hero size (.ua-av's 34px row size won, and the 20px initials ran out of the circle) */
  @media (max-width:640px){ .dv-hero-top{flex-wrap:wrap;gap:14px;} }   /* v1.4.10.473: on a phone the Edit / Disable / Delete row drops under the name (it squeezed the name to 0px and ran 90-160px out of the card) */
  .dv-hero-title-job{font-weight:400;color:var(--text-mute);margin-left:8px;font-size:13px;}   /* v1.4.10.473: 13/400 like the rest of the sub line (was 500) */
  .dv-hero-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(190px,100%),1fr));gap:10px 22px;margin-top:18px;padding-top:16px;border-top:1px solid var(--line);}
  .dv-fact{display:flex;align-items:center;gap:11px;min-width:0;}
  .dv-fact-ic{width:32px;height:32px;border-radius:6px;background:var(--surface);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;color:var(--text-mute);flex-shrink:0;}
  .dv-fact-ic svg{width:15px;height:15px;}
  .dv-fact-t{display:flex;flex-direction:column;min-width:0;line-height:1.3;}
  .dv-fact-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
  .dv-fact-v{font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  a.dv-fact-v{color:var(--brand-blue);text-decoration:none;}
  a.dv-fact-v:hover{text-decoration:underline;}

  .up-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;margin-bottom:6px;}   /* v1.4.10.473: an even split: a long access list widened its block and squeezed Account to ~100px */
  @media (max-width:620px){ .up-cols{grid-template-columns:minmax(0,1fr);} }   /* v1.4.10.473: minmax, so a long access line cannot widen the column (the profile scrolled sideways, 589px in 358) */
  .up-block{border:1px solid var(--line);border-radius:7px;padding:14px 15px;background:var(--surface);}
  .up-h{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--text);margin:0 0 10px;}
  .up-h svg{width:15px;height:15px;color:var(--text-mute);}
  .up-h-perm{margin:20px 0 11px;}
  .up-sum{font-size:12px;font-weight:500;color:var(--text-mute);}
  .up-scope{display:flex;flex-direction:column;gap:9px;}
  .up-scope-row{display:flex;gap:10px;align-items:baseline;}
  .up-scope-k{flex:0 0 96px;font-size:12px;font-weight:600;color:var(--text-dim);}
  .up-scope-v{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:5px;font-size:13px;}

  .up-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(232px,100%),1fr));gap:12px;}
  .up-card{border:1px solid var(--line);border-radius:7px;background:var(--surface);overflow:hidden;}
  .up-card-h{display:flex;align-items:center;justify-content:space-between;padding:9px 13px;background:var(--surface-2);border-bottom:1px solid var(--line);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
  .up-card-n{font-variant-numeric:tabular-nums;color:var(--text-mute);}
  .up-caps{padding:7px 8px;display:flex;flex-direction:column;gap:1px;}
  .up-cap{display:flex;align-items:center;gap:9px;padding:5px 6px;border-radius:5px;font-size:12px;}
  .up-cap .ic{width:18px;height:18px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .up-cap .ic svg{width:11px;height:11px;}
  .up-cap.on .ic{background:rgba(22,163,74,.14);color:var(--ok);}
  .up-cap.off .ic{background:var(--surface-3);color:var(--text-dim);}
  .up-cap.on .lbl{color:var(--text);}
  .up-cap.off .lbl{color:var(--text-dim);}
  .up-cap .lbl{flex:1;min-width:0;}
  .up-tag{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;padding:1px 6px;border-radius:5px;flex-shrink:0;}
  .up-tag.allow{color:var(--ok);background:rgba(22,163,74,.13);}
  .up-tag.deny{color:var(--err);background:rgba(220,38,38,.12);}
  /* v1.4.10.491: an area's meter, what is not included as one line, the areas with no access at all */
  .up-grid{align-items:start;}
  .up-meter{height:3px;background:var(--surface-3,rgba(120,130,150,.15));}
  .up-meter i{display:block;height:100%;background:var(--ok,#16A34A);}
  .up-off{padding:0 14px 10px;font-size:12px;line-height:1.55;color:var(--text-dim);}
  .up-off > span:first-child{color:var(--text-mute);font-weight:500;}
  .up-off .up-tag{margin-left:2px;}
  .up-none{grid-column:1/-1;display:flex;align-items:flex-start;gap:9px;padding:10px 13px;border:1px dashed var(--line);border-radius:7px;font-size:12px;line-height:1.55;color:var(--text-mute);}
  .up-none svg{width:12px;height:12px;margin-top:3px;flex-shrink:0;}
  .up-none b{color:var(--text);font-weight:600;}
  /* live chat */
  .dv-chat{display:grid;grid-template-columns:1fr 232px;gap:18px;align-items:start;}
  .dv-chat-panel{display:flex;flex-direction:column;height:560px;border:1px solid var(--line);border-radius:8px;background:var(--surface);overflow:hidden;box-shadow:var(--shadow-sm);}
  .dv-chat-scroll{flex:1;overflow-y:auto;padding:18px 18px 8px;display:flex;flex-direction:column;}
  .dv-msg{display:flex;gap:10px;margin-bottom:13px;align-items:flex-start;}
  .dv-msg.mine{flex-direction:row-reverse;}
  .dv-msg-bub{max-width:76%;min-width:0;}
  .dv-msg-head{display:flex;gap:8px;font-size:12px;margin-bottom:3px;color:var(--text-dim);align-items:center;}
  .dv-msg-who{font-weight:600;color:var(--text-mute);}
  .dv-msg-text{font-size:14px;line-height:1.5;padding:9px 13px;border-radius:7px;background:var(--surface-2);border:1px solid var(--line);color:var(--text);white-space:pre-wrap;word-wrap:break-word;overflow-wrap:anywhere;}
  .dv-msg.mine .dv-msg-text{background:var(--grad);border:0;color:#fff;}
  .dv-chat-compose{display:flex;gap:9px;padding:12px 14px;border-top:1px solid var(--line);background:var(--bg-2);align-items:flex-end;}
  .dv-chat-compose textarea{flex:1;resize:none;min-height:42px;max-height:120px;padding:10px 13px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-family:inherit;font-size:13px;line-height:1.4;}
  .dv-chat-compose textarea:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .dv-chat-compose .btn{height:42px;}
  /* @mention pill inside messages */
  .dv-mention{background:var(--accent-glow);color:var(--brand-blue);font-weight:600;border-radius:5px;padding:0 4px;}
  .dv-msg.mine .dv-mention{background:rgba(255,255,255,.22);color:#fff;}
  /* Composer field + mention autocomplete */
  .dv-compose-field{flex:1;min-width:0;position:relative;display:flex;}   /* v1.4.10.363: or Send is pushed out of the panel */
  .dv-compose-field textarea{flex:1;}
  .dv-mention-menu{display:none;position:absolute;left:0;bottom:calc(100% + 8px);width:280px;max-height:264px;overflow-y:auto;
    background:var(--surface);border:1px solid var(--line-2);border-radius:7px;box-shadow:var(--shadow-lg);z-index:60;padding:5px;}
  .dv-mention-menu.open{display:block;}
  .dv-mi{display:flex;align-items:center;gap:10px;padding:7px 9px;border-radius:6px;cursor:pointer;}
  .dv-mi.on,.dv-mi:hover{background:var(--surface-2);}
  .dv-mi-av{width:28px;height:28px;border-radius:6px;background:var(--accent-glow);color:var(--brand-blue);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;flex-shrink:0;}
  .dv-mi-main{display:flex;flex-direction:column;min-width:0;line-height:1.25;}
  .dv-mi-name{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .dv-mi-sub{font-size:11px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .dv-chat-side{border:1px solid var(--line);border-radius:8px;background:var(--surface);padding:15px 16px;box-shadow:var(--shadow-sm);}
  .dv-pres{display:flex;align-items:center;gap:9px;padding:6px 0;}
  .dv-pres .dot{width:8px;height:8px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px rgba(22,163,74,.15);flex-shrink:0;}
  /* member picker */
  .dvm-row{display:flex;align-items:center;gap:11px;padding:11px 14px;border-bottom:1px solid var(--line);cursor:pointer;}
  .dvm-row:last-child{border-bottom:0;}
  .dvm-row:hover{background:var(--surface-2);}
  .dvm-row input{width:16px;height:16px;accent-color:var(--brand-blue);cursor:pointer;flex-shrink:0;}
  .dvm-main{display:flex;flex-direction:column;min-width:0;}
  .dvm-name{font-size:13px;font-weight:600;color:var(--text);}
  .dvm-meta{font-size:12px;color:var(--text-mute);}
  @media (max-width:760px){ .dv-chat{grid-template-columns:1fr;} .dv-chat-panel{height:440px;} }

  /* Chat — drag/drop, attachments, reactions, reply, message actions */
  .dv-chat-panel{position:relative;}
  .dv-chat-panel.drag{outline:2px dashed var(--brand-blue);outline-offset:-6px;}
  .dv-chat-dzhint{display:none;position:absolute;inset:0;z-index:5;align-items:center;justify-content:center;gap:8px;background:color-mix(in srgb,var(--surface) 86%,transparent);font-size:13px;font-weight:600;color:var(--brand-blue);pointer-events:none;}
  .dv-chat-panel.drag .dv-chat-dzhint{display:flex;}
  .dv-msg-bub:hover .dv-msg-acts{opacity:1;}
  .dv-msg-acts{display:flex;gap:2px;margin-top:4px;opacity:0;transition:opacity .12s;}
  .dv-msg.mine .dv-msg-acts{justify-content:flex-end;}
  .dv-msg-acts button{border:1px solid var(--line);background:var(--surface);color:var(--text-mute);border-radius:5px;width:26px;height:24px;font-size:12px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;}
  .dv-msg-acts button:hover{background:var(--surface-2);color:var(--text);}
  .dv-msg-acts button svg{width:12px;height:12px;}
  .dv-msg-edited{font-size:11px;color:var(--text-dim);margin:2px 2px 0;display:inline-block;}
  .dv-msg.mine .dv-msg-edited{text-align:right;display:block;}
  .dv-msg-reply{font-size:12px;color:var(--text-dim);border-left:2px solid var(--line-2);padding:2px 8px;margin-bottom:4px;border-radius:0 6px 6px 0;background:var(--surface-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;}
  .dv-msg-reply svg{width:10px;height:10px;}
  .dv-msg-files{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;}
  .dv-msg.mine .dv-msg-files{justify-content:flex-end;}
  .dv-msg-img{display:block;border-radius:6px;overflow:hidden;border:1px solid var(--line);max-width:220px;}
  .dv-msg-img img{display:block;max-width:220px;max-height:200px;object-fit:cover;}
  .dv-msg-doc{display:inline-flex;align-items:center;gap:9px;padding:8px 11px;border:1px solid var(--line);border-radius:6px;background:var(--surface);text-decoration:none;color:var(--text);max-width:240px;}
  .dv-msg-doc:hover{background:var(--surface-2);}
  .dv-doc-ico{width:30px;height:30px;border-radius:5px;background:var(--brand-blue);color:#fff;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .dv-doc-meta{display:flex;flex-direction:column;min-width:0;}
  .dv-doc-meta .n{font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px;}
  .dv-doc-meta .s{font-size:11px;color:var(--text-dim);}
  .dv-msg-doc svg{width:14px;height:14px;color:var(--text-dim);}
  .dv-msg-reacts{display:flex;flex-wrap:wrap;gap:5px;margin-top:5px;}
  .dv-msg.mine .dv-msg-reacts{justify-content:flex-end;}
  .dv-react{font-size:12px;padding:2px 8px;border-radius:10px;border:1px solid var(--line);background:var(--surface);cursor:pointer;color:var(--text-mute);}
  .dv-react.on{background:var(--accent-glow);border-color:var(--brand-blue);color:var(--brand-blue);}
  .dv-react-menu{position:fixed;z-index:9999;display:flex;gap:3px;background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:5px;box-shadow:var(--shadow-md,0 8px 24px rgba(0,0,0,.15));}
  .dv-react-menu button{border:0;background:none;font-size:18px;cursor:pointer;padding:3px 5px;border-radius:5px;}
  .dv-react-menu button:hover{background:var(--surface-2);}
  .dv-reply-bar,.dv-stage{display:flex;flex-wrap:wrap;gap:7px;align-items:center;padding:8px 14px;border-top:1px solid var(--line);background:var(--bg-2);font-size:12px;color:var(--text-mute);}
  .dv-reply-bar .x,.dv-stage-chip .x{cursor:pointer;color:var(--text-dim);margin-left:auto;font-weight:700;}
  .dv-stage-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 9px;border:1px solid var(--line);border-radius:10px;background:var(--surface);font-size:12px;}
  .dv-stage-chip .x{margin-left:4px;}
  .dv-attach-btn{height:42px;padding:0 12px;}

  /* Roadmap — richer item rows + detail */
  .dv-item.clk{cursor:pointer;transition:background .12s;}
  .dv-item.clk:hover{background:var(--surface-2);}
  .dv-i-tasks{font-size:11px;color:var(--text-dim);margin-left:7px;font-variant-numeric:tabular-nums;}
  .dv-i-remain{font-size:11px;color:var(--text-dim);min-width:62px;text-align:right;font-variant-numeric:tabular-nums;}
  .dv-i-owner,.dv-i-due,.dv-i-upd{font-size:11px;color:var(--text-dim);white-space:nowrap;}
  .dv-i-due{font-variant-numeric:tabular-nums;}
  .dv-rel-tools{margin-left:8px;display:inline-flex;gap:4px;}
  .dv-rel-tools .ic{border:1px solid var(--line);background:var(--surface);color:var(--text-mute);border-radius:6px;width:24px;height:22px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;}
  .dv-rel-tools .ic:hover{background:var(--surface-2);color:var(--text);}
  .dv-rel-tools .ic svg{width:11px;height:11px;}
  .dv-histwrap{max-height:200px;overflow-y:auto;}
  input[type=range]{width:100%;accent-color:var(--brand-blue);}

  /* WikiBoard */
  .dv-wiki-sec{margin-bottom:22px;}
  .dv-wiki-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(230px,100%),1fr));gap:14px;margin-top:10px;}
  .dv-wiki-card{border:1px solid var(--line);border-radius:7px;background:var(--surface);padding:15px 16px;cursor:pointer;transition:transform .12s,box-shadow .12s,border-color .12s;display:flex;flex-direction:column;gap:7px;min-height:120px;}
  .dv-wiki-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-md,0 8px 22px rgba(0,0,0,.1));border-color:var(--line-2);}
  .ww-head{display:flex;align-items:center;justify-content:space-between;}
  .ww-ico{color:var(--brand-blue);}.ww-ico svg{width:18px;height:18px;}
  .ww-pin{font-size:13px;}
  .ww-title{font-family:var(--font-display);font-weight:600;font-size:15px;letter-spacing:-.012em;line-height:1.25;}
  .ww-snip{font-size:12px;color:var(--text-mute);line-height:1.45;flex:1;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;}
  .ww-meta{font-size:11px;color:var(--text-dim);}

  /* Login history table */
  .dv-loginhist{overflow-x:auto;}
  .dv-lh-table{width:100%;border-collapse:collapse;font-size:13px;}
  .dv-lh-table th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;padding:6px 10px;border-bottom:1px solid var(--line);}
  .dv-lh-table td{padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:middle;white-space:nowrap;}
  .dv-lh-table tbody tr:last-child td,.dv-lh-table tbody tr:last-child td{border-bottom:0;}
  .dv-lh-table code{background:var(--surface-2);padding:1px 5px;border-radius:5px;}

  /* Ticket */
  .ticket-detail{display:grid;grid-template-columns:1fr 290px;gap:22px;}
  .conv-msg{background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:14px;margin-bottom:10px;}
  .conv-msg.system{background:var(--accent-glow);border-color:rgba(var(--bc-accent-rgb),0.18);}
  .conv-msg .conv-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;}
  .conv-msg .who{font-size:12px;font-weight:600;display:flex;align-items:center;gap:7px;}
  .conv-msg .who .who-ico{color:var(--text-mute);}
  .conv-msg.system .who .who-ico{color:var(--electric-2);}
  .conv-msg .when{font-size:12px;color:var(--text-mute);}
  .conv-msg .text{font-size:14px;color:var(--text);line-height:1.55;}
  .meta-row{display:flex;justify-content:space-between;padding:9px 0;border-bottom:1px solid var(--line);font-size:12px;}
  .meta-row:last-child{border:0;}
  .meta-row .k{color:var(--text-mute);}
  .meta-row .v{font-weight:500;}

  /* ============ TICKET WORKSPACE (upgraded) ============ */
  /* v1.4.10.203 — the page-level `.tkx-header` and the five-card `.tkx-kpis`
     grid are GONE from the markup. renderPageHero() already draws the title,
     the scope and the count chips, so the header printed a second heading and a
     second (differently-worded) summary 20px below the first; and five KPI
     cards in a repeat(5,1fr) grid laid out 2+2+1 from 1100px down to 760px,
     leaving a lone full-width tile on row three.
     The rules stay defined because other surfaces reuse .tkx-health-* and a
     saved layout may still reference them — but nothing on Support emits them. */
  .tkx-header{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:18px;}
  .tkx-header-main{display:flex;align-items:center;gap:14px;min-width:0;}
  .tkx-header-ico{width:44px;height:44px;border-radius:7px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--accent-glow);color:var(--brand-blue);}
  .tkx-header-ico svg{width:22px;height:22px;}
  .tkx-header-title{font-size:20px;font-weight:600;letter-spacing:-.024em;margin:0;line-height:1.1;}
  .tkx-header-sub{font-size:13px;color:var(--text-mute);margin-top:3px;}
  .tkx-header-health{display:flex;align-items:center;gap:12px;background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:10px 16px 10px 12px;box-shadow:var(--shadow-sm);}
  .tkx-health-ring{position:relative;width:46px;height:46px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;
    background:conic-gradient(var(--ring-c) calc(var(--pct,100)*1%), var(--surface-3) 0);}
  .tkx-health-ring.ok{--ring-c:var(--ok);}
  .tkx-health-ring.warn{--ring-c:var(--warn);}
  .tkx-health-ring::before{content:"";position:absolute;inset:5px;border-radius:50%;background:var(--surface);}
  .tkx-health-ring span{position:relative;font-size:12px;font-weight:700;letter-spacing:-.02em;}
  .tkx-health-txt{display:flex;flex-direction:column;line-height:1.3;}
  .tkx-health-txt strong{font-size:12px;font-weight:700;}
  .tkx-health-txt span{font-size:12px;color:var(--text-mute);}
  @media(max-width:560px){ .tkx-header-health{flex:1;} }

  /* ── The Support stat rail (v1.4.10.203) ──────────────────────────────────
     Built on the v201 `.akpi` rail so the two big lists of the app look and
     behave the same. SIX figures, because six divides by 6, 3 and 2 and
     therefore fills every row exactly at every breakpoint — 6 across on a
     desktop, 3+3 at =1099px, one swipeable line on a phone. Proven at eight
     widths 768-1440 with no lone tile. **A SEVENTH FIGURE BREAKS THE DIVISION
     AND THESE COUNTS MUST BE RE-CHOSEN.** */
  /* `.akpi-rail` pins repeat(5) for the asset rail's NINE figures and is
     declared later in this sheet, so a bare `.tkx-rail` tied with it on
     specificity and LOST — six tiles laid out 5+1, the exact orphan this rail
     exists to avoid. Doubled up so it outranks (0-2-0 against 0-1-0) rather
     than relying on source order. Caught by t/v203.js, not by eye. */
  .akpi-rail.tkx-rail{grid-template-columns:repeat(6,minmax(0,1fr));}
  @media(max-width:1099px){ .akpi-rail.tkx-rail{grid-template-columns:repeat(3,minmax(0,1fr));} }
  /* Reliability's six-tile rail (v1.4.10.208) — same doubling, same reason. */
  .akpi-rail.rel-rail{grid-template-columns:repeat(6,minmax(0,1fr));}
  .rel-rail .akpi-txt{display:flex;flex-direction:column;}
  @media(max-width:1099px){ .akpi-rail.rel-rail{grid-template-columns:repeat(3,minmax(0,1fr));} }
  .tkx-tile{font-family:inherit;text-align:left;width:100%;color:inherit;}
  .tkx-tile .v.bad{color:var(--err);}
  .tkx-tile:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
  /* v1.4.10.203 — TWO GROUPS, NOT NINE SIBLINGS.
     The old bar was nine children of one wrapping flex with a `flex:1` spacer
     in the middle. The spacer ate the slack and pushed the LAST child onto a
     row of its own, so "New ticket" — the primary action of the page — was
     alone on line two at 1440px (bar height 77px against ~44 for one line) and
     at every width below. Splitting into a find group and an actions group lets
     the bar degrade group-by-group; `justify-content:space-between` does the
     job the spacer used to, without a phantom child that can take a line. */
  .tkx-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px 14px;flex-wrap:wrap;margin-bottom:14px;}
  .tkx-tb-find,.tkx-tb-acts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;}
  .tkx-filtline{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;}
  .tkx-tb-find{flex:1 1 420px;}
  .tkx-tb-acts{flex:0 1 auto;justify-content:flex-end;}
  /* The primary button is pinned to the end of its own group and never wraps
     away from the control before it. */
  .tkx-new{white-space:nowrap;}

  /* The line above the table: what is uniform across the whole set (said ONCE
     rather than repeated on every row), which columns were dropped for having
     nothing to say, and the toggle that brings them back. */
  .tkx-colnote{display:flex;align-items:center;gap:8px 12px;flex-wrap:wrap;margin:0 0 8px;font-size:12px;color:var(--text-mute);}
  .tkx-colnote .tkc-uniform{display:inline-flex;align-items:center;gap:6px;background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:3px 11px;}
  .tkx-colnote .tkc-uniform b{color:var(--text);font-weight:700;}
  .tkx-colnote .tkc-hidden{color:var(--text-dim);}
  .tkx-colnote .tkc-toggle{border:1px solid var(--line);background:var(--surface);color:var(--text-mute);font-family:inherit;font-size:12px;font-weight:500;
    padding:4px 10px;border-radius:6px;cursor:pointer;transition:all .14s;}
  .tkx-colnote .tkc-toggle:hover{color:var(--text);border-color:var(--line-2);}

  /* ── The toolbar on a small screen (v1.4.10.203) ──────────────────────────
     Measured before this release: 277px and SEVEN rows at 390px, because nine
     controls wrapped one per line. Three deliberate lines instead —
       1. search, full width;
       2. the filters, as ONE horizontally swipeable line (the rail's pattern);
       3. the actions, one swipeable line with the PRIMARY BUTTON PINNED FIRST
          via `order` so "New ticket" can never be the thing that scrolls off.
     Every control also grows to the 40px thumb target v1.4.10.128 set for
     =700px, which the 25px priority chips and 30px view toggle never met. */
  @media(max-width:900px){
    .tkx-tb-find{flex:1 1 100%;flex-wrap:nowrap;flex-direction:column;align-items:stretch;gap:8px;}
    .tkx-search{max-width:none;width:100%;}
    /* flex-wrap MUST be restated: the base .tkx-filtline rule sets wrap, and
       without overriding it the chips and the status select took a line each
       (measured on the phone shot) instead of one swipeable line. */
    .tkx-tb-find .tkx-filtline{display:flex;flex-wrap:nowrap;align-items:center;gap:8px;overflow-x:auto;
      -webkit-overflow-scrolling:touch;scrollbar-width:none;padding-bottom:2px;}
    .tkx-tb-find .tkx-filtline::-webkit-scrollbar{display:none;}
    .tkx-tb-find .tkx-chipset,.tkx-tb-find .tkx-select{flex:0 0 auto;}
    .tkx-tb-acts{flex:1 1 100%;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
      scrollbar-width:none;justify-content:flex-start;padding-bottom:2px;}
    .tkx-tb-acts::-webkit-scrollbar{display:none;}
    .tkx-tb-acts > *{flex:0 0 auto;}
    .tkx-tb-acts .tkx-new{order:-1;}
  }
  @media(max-width:700px){
    .tkx-toolbar .tkx-chip{min-height:40px;padding:0 12px;}
    .tkx-toolbar .tkx-toggle button{min-height:34px;padding:0 12px;}
    .tkx-toolbar .tkx-toggle{padding:0;border:0;outline:1px solid var(--line);outline-offset:-1px;}   /* v1.4.10.473: 40 beside the 40px Notifications / Export / New ticket buttons in its row (the 3px track and border around 40px buttons made it 48); the line is drawn inside the box, as .mt-viewseg does */
    .tkx-tb-acts .btn.sm{min-height:40px;}
    .tkx-select{min-height:40px;}
    .tkx-pg{min-height:40px;min-width:40px;}
    .tkx-colnote .tkc-toggle{min-height:40px;}
  }
  .tkx-search{position:relative;flex:1;min-width:200px;max-width:340px;}
  .tkx-search input{width:100%;background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:9px 12px 9px 34px;font-size:13px;color:var(--text);font-family:inherit;transition:border-color .15s, box-shadow .15s;}
  .tkx-search input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow);}
  .tkx-search .tks-ico{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--text-dim);display:flex;pointer-events:none;}
  .tkx-chipset{display:inline-flex;gap:4px;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:3px;}
  .tkx-chip{border:0;background:transparent;color:var(--text-mute);font-family:inherit;font-size:12px;font-weight:600;padding:5px 11px;border-radius:5px;cursor:pointer;transition:all .14s;white-space:nowrap;display:inline-flex;align-items:center;gap:5px;}
  .tkx-chip:hover{color:var(--text);}
  .tkx-chip.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);}
  .tkx-chip .cdot{width:7px;height:7px;border-radius:50%;}
  .tkx-chip .cn{font-size:10px;color:var(--text-dim);font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: a count badge, so the badge look: 10/700 uppercase .04em */
  .tkx-spacer{flex:1;}
  .tkx-toggle{display:inline-flex;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:3px;}
  .tkx-toggle button{border:0;background:transparent;color:var(--text-mute);padding:6px 10px;border-radius:5px;cursor:pointer;display:flex;align-items:center;gap:6px;font-size:12px;font-weight:600;font-family:inherit;transition:all .14s;}
  .tkx-toggle button.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);}
  .tkx-select{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:8px 12px;font-size:13px;color:var(--text);font-family:inherit;font-weight:400;cursor:pointer;}

  /* List rows — richer */
  .tkx-table tr{cursor:pointer;}
  .tkx-table tbody tr:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
  .tkx-th:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
  .tkx-pbar{display:inline-block;width:3px;height:30px;border-radius:3px;vertical-align:middle;margin-right:2px;}
  /* v213 polish: rows answer the pointer — accent wash + the subject warms to
     the brand blue. Backgrounds and colour only, so every v203/v212 geometry
     number (59px rows, 0 sideways scroll) holds to the pixel. */
  .tkx-table tbody tr{transition:background .12s ease;}
  .tkx-table tbody tr:hover{background:var(--accent-glow);}
  .tkx-table tbody tr:hover .tkx-subj{color:var(--brand-blue);}
  .tkx-subj{font-weight:600;letter-spacing:-.01em;}
  /* v1.4.10.203 — these were inline styles inside the row template. Moving them
     into the sheet is what lets the =760px card block and the 761-900px band
     below restyle the SAME markup without fighting a style attribute. */
  /* v1.4.10.203 — THE SUBJECT IS ONE LINE ON THE DESKTOP TABLE.
     Measured on the ICC dump before this release: rows were 59px at 1440 but
     105px at 1000, 135px at 900 and 197px at 820, because the Ticket cell is
     given whatever width the six fixed columns leave and real subjects
     ("133712 -C4.4 Projector lens appear to be incorrect") wrapped to three
     lines in it. A list is scanned, not read: the full subject is on the row's
     `title`, in the phone card (two lines) and at the top of the ticket itself.
     This is the same treatment the asset register's Equipment column got in
     v1.4.10.201, and it is what holds the row at 59px all the way down. */
  /* inline-block, not block: the priority bar sits beside it and a block would
     push the whole subject onto a second line (measured 89px rows). */
  .tkx-subjwrap{display:inline-block;vertical-align:middle;min-width:0;max-width:calc(100% - 12px);}
  .tkx-table td.tk-subj{max-width:0;width:40%;}
  .tkx-table .tkx-subj{display:inline-block;max-width:100%;vertical-align:bottom;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .tkx-refline{display:block;font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .tkx-sub2{display:block;}
  .tkx-slaflag{font-size:11px;padding:1px 5px;}
  .tkx-slapill{font-size:11px;padding:2px 7px;}
  .tkx-asg{display:inline-flex;align-items:center;gap:7px;min-width:0;}
  /* "Unassigned" is not a person and no longer gets a person's avatar — the old
     cell rendered an indigo identity chip with the initial "U" beside the word,
     so an empty field read as a user named U (v1.4.10.203). */
  .tkx-unasg{color:var(--text-dim);font-style:italic;}
  .tkx-unasg.sm{font-size:11px;}
  /* No SLA policy applies: ONE muted dash, not two pills reading "Rsp - Res -".
     Two badges assert two clocks were measured and came back empty. */
  .tkx-nosla{color:var(--text-dim);}
  /* The thin columns never wrap: at 820px "Waiting on Client" took two lines in
     the Status cell and pushed that row to 79px while every other row was 59
     (t/v203.js). The subject is the only cell allowed to take the slack, and it
     ellipsises rather than wrapping. */
  .tkx-table td.tk-status,.tkx-table td.tk-pri,.tkx-table td.tk-upd,.tkx-table td.tk-sla{white-space:nowrap;}
  .tkx-table td.tk-asg{white-space:nowrap;}
  /* v1.4.10.236: LOCATION WAS NEVER ADDED TO THAT LIST, and it is the one cell
     whose content is long enough to matter. "Show all columns" inserts
     Priority, which takes 58px off Location (measured 160px -> 102px), and an
     ICC room name — "ICCC00-B37_BCD DATA COMPLEX Beam..." — then wraps onto
     three lines and drags the whole row from 83px to 122px. Every other cell
     in that row sits at 122px holding a single 19px pill.
     Same treatment as tk-subj: max-width:0 so the auto table layout cannot let
     it expand, then ellipsise. The full text stays on the cell's title and on
     the ticket itself. */
  .tkx-table td.tk-loc{max-width:0;width:13%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .tkx-table td.tk-loc .tkx-sub2{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  /* v1.4.10.238 — the device tree's location rows.
     A collapsed location is a HEAD ONLY: no table element at all, so the
     saving is the whole 52px filler table and not just its row. The chevron
     and the "N not shown" count are what keep a collapse from reading as
     missing data. */
  .est-loc-head{cursor:pointer;}
  .est-loc-head:hover{background:var(--accent-glow);}
  .est-loc.is-closed .est-loc-head{opacity:.86;}
  .est-loc-more{color:var(--text-mute);font-size:11px;margin-left:8px;white-space:nowrap;}
  .est-locnote{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
    padding:8px 12px;margin:0 0 8px;border:1px dashed var(--line);
    border-radius:6px;color:var(--text-mute);font-size:12px;background:var(--surface);}
  /* The location head is a control now, so it needs the phone floor the rest
     of the product has carried since v128 (t/v233.js). */
  @media (max-width:700px){
    .est-loc-head{min-height:40px;}
  }
  .tkx-board-more{display:block;width:100%;margin-top:2px;border:1px dashed var(--line);background:var(--surface);color:var(--text-mute);
    font-family:inherit;font-size:13px;font-weight:500;padding:8px;border-radius:6px;cursor:pointer;transition:all .14s;}
  .tkx-board-more:hover{color:var(--text);border-color:var(--brand-blue);}
  .tkx-chips-inline{display:inline-flex;gap:5px;flex-wrap:wrap;margin-top:3px;}
  .tkx-mini{font-size:11px;font-weight:600;padding:1px 6px;border-radius:5px;display:inline-flex;align-items:center;gap:4px;border:1px solid var(--line);color:var(--text-mute);background:var(--surface-2);}
  .tkx-mini.dev{color:var(--brand-blue);border-color:rgba(var(--bc-accent-rgb),.25);background:var(--accent-glow);}
  .tkx-mini.ast{color:var(--brand-purple);border-color:rgba(var(--bc-purple-rgb),.22);background:rgba(var(--bc-purple-rgb),.08);}
  /* v213: the room chip on board cards — the location family's teal, capped so
     ICC's long room names ("X05-X09_E2-3-Meeting Room 3 NE of Lift 10") can't
     stretch a card; full text on the title. */
  .tkx-mini.loc{color:#0F766E;border-color:rgba(15,118,110,.25);background:rgba(15,118,110,.07);max-width:100%;}
  .tkx-mini.loc, .tkx-mini.dev, .tkx-mini.ast{min-width:0;}
  .tkx-mini span, .tkx-mini{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  /* v213: the detail SLA card's honest empty state — one sentence, not four
     dashes asserting clocks that were never started. */
  .tkd-nosla{font-size:12px;color:var(--text-mute);line-height:1.6;padding:2px 0;}
  .tkx-avatar{width:26px;height:26px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:#fff;flex-shrink:0;}

  /* Board / Kanban */
  /* v1.4.10.203 — a board is horizontal by nature, but it was scrolling
     sideways ACCIDENTALLY: six fixed 248px columns is ~1,530px, so it scrolled
     178px even at 1440 while two of the six were empty. Empty columns are no
     longer drawn (see tkxBoard), which fits five inside a desktop. Where it
     does still scroll it now SNAPS, so a swipe lands on a column instead of
     halfway between two — and on a phone one column fills the screen. */
  /* The max on the track is what stops ONE column stretching to the full 1,380px
     when a filter leaves a single status on the board — a kanban card 1,200px
     wide is not a card. Columns still share the space evenly when there are
     several of them. */
  .tkx-board{display:grid;grid-template-columns:repeat(var(--cols,5),minmax(248px,420px));gap:14px;overflow-x:auto;padding-bottom:6px;
    justify-content:start;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;}
  .tkx-col{scroll-snap-align:start;}
  /* One column ~fills a phone screen, but CAPPED: a bare 84vw measured 638px at
     760 and turned a 568px scroll into 2,504px — worse than the accidental
     scroll it replaced. min() keeps a column a column at every width below the
     desktop grid. */
  @media(max-width:760px){
    .tkx-board{grid-template-columns:repeat(var(--cols,5),minmax(min(84vw,300px),min(90vw,340px)));gap:10px;scroll-snap-type:x mandatory;}
  }
  .tkx-col{background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:12px;min-height:160px;display:flex;flex-direction:column;}
  .tkx-col-head{display:flex;align-items:center;gap:8px;margin:2px 4px 11px;}
  .tkx-col-head .ch-dot{width:9px;height:9px;border-radius:50%;}
  .tkx-col-head .ch-name{font-size:13px;font-weight:600;}
  /* v1.4.10.473: the column's count is a badge — 10/700 uppercase .04em */
  .tkx-col-head .ch-count{margin-left:auto;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-mute);background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:1px 8px;}
  .tkx-card{background:var(--surface);border:1px solid var(--line);border-left-width:3px;border-radius:6px;padding:12px;margin-bottom:10px;cursor:pointer;box-shadow:var(--shadow-sm);transition:transform .14s, box-shadow .14s, border-color .14s;}
  .tkx-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-md);}
  .tkx-card .tc-top{display:flex;align-items:center;gap:7px;margin-bottom:7px;}
  .tkx-card .tc-ref{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;color:var(--text-mute);}
  .tkx-card .tc-subj{font-size:13px;font-weight:600;line-height:1.35;letter-spacing:-.01em;margin-bottom:8px;}
  .tkx-card .tc-meta{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
  .tkx-card .tc-foot{display:flex;align-items:center;justify-content:space-between;margin-top:9px;padding-top:9px;border-top:1px solid var(--line);}
  .tkx-board-empty{font-size:12px;color:var(--text-dim);text-align:center;padding:18px 8px;border:1px dashed var(--line);border-radius:6px;}

  /* ============ TICKET DETAIL (upgraded) ============ */
  /* v1.4.10.203 — THE HEAD STAYS ON SCREEN.
     The modal used to grow to its content and let the page behind it scroll:
     1,410px at 1440x1000 and 2,700px (4.1 screens) at 390x664. Scroll into a
     thread and the reference, the status, the priority and the Reply button
     were all gone. This is the shape the asset detail already uses
     (`#modal-inner.modal-asset`, v201): the panel is capped to the viewport,
     the head is a flex-shrink:0 sibling OUTSIDE the scroll area — so it is
     pinned by construction rather than by `position:sticky`, which cannot work
     inside an `overflow:hidden` ancestor — and the body scrolls within. */
  #modal-inner.modal-tkt{max-width:1080px;width:100%;overflow:hidden;
    max-height:calc(100dvh - 96px);display:flex;flex-direction:column;}
  #modal-inner.modal-tkt > .tkd-head{flex-shrink:0;}
  #modal-inner.modal-tkt > .tkd-body{flex:1;min-height:0;}
  /* Two panes that scroll independently, so the triage card stays put while a
     long thread is read. Below 920px the body is one column and scrolls once. */
  .tkd-main{overflow-y:auto;}
  .tkd-side{overflow-y:auto;}
  .tkd-head{position:relative;padding:20px 22px 16px;background:var(--surface-2);border-bottom:1px solid var(--line);border-radius:8px 8px 0 0;}
  .tkd-head .tkd-pstripe{position:absolute;left:0;top:0;bottom:0;width:5px;border-radius:5px 0 0 0;}
  .tkd-head .tkd-row1{display:flex;align-items:flex-start;gap:14px;}
  .tkd-head .tkd-pchip{width:46px;height:46px;border-radius:6px;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:15px;color:#fff;flex-shrink:0;box-shadow:var(--shadow-sm);}
  .tkd-head .tkd-ref{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;color:var(--text-mute);letter-spacing:.02em;}
  /* v1.4.10.179: ref + state pills share one row — status/SLA/via-email used
     to be text spliced into the ref string and a pill lost in the sub line. */
  .tkd-head .tkd-refrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;}
  .tkd-statepill{font-size:11px;padding:2px 8px;font-weight:600;white-space:nowrap;}
  .tkd-head .tkd-opened{white-space:nowrap;}
  .tkd-head .tkd-opened b{color:var(--text);font-weight:600;}
  /* Labelled action-bar controls (Status / Priority). The label sits inside
     the control's border so the pair reads as one field, not a bare select. */
  .tkd-ctl{display:inline-flex;align-items:center;gap:0;border:1px solid var(--line);border-radius:6px;background:var(--surface);overflow:hidden;}
  .tkd-ctl > span{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);padding:0 8px 0 10px;border-right:1px solid var(--line);align-self:stretch;display:inline-flex;align-items:center;background:var(--surface-2);}
  .tkd-ctl > select{border:0;background:transparent;color:var(--text);font-family:inherit;font-size:13px;font-weight:400;padding:6px 8px;cursor:pointer;max-width:170px;}   /* v1.4.10.473: a field is 13/400 (was 500) */
  .tkd-ctl > select:focus{outline:none;}
  .tkd-head h3{font-size:20px;font-weight:600;letter-spacing:-.024em;margin:3px 0 0;line-height:1.25;}
  .tkd-head .tkd-sub{font-size:12px;color:var(--text-mute);margin-top:5px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;}
  .tkd-head .tkd-sub a{color:var(--brand-blue);cursor:pointer;}
  .tkd-head .tkd-loc{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;}
  .tkd-head .tkd-loc-sep{color:var(--text-dim);font-weight:700;margin:0 1px;}
  .tkd-actionbar{display:flex;gap:7px;flex-wrap:wrap;margin-top:14px;}
  .tkd-actionbar .tkd-del{margin-left:auto;}
  /* v1.4.10.203 — the phone header. Measured 262px of a 664px screen (39%)
     before a word of the ticket, with the action bar on two rows and the
     reference row on two. One scrollable action row (the v201 asset-hero
     treatment), a two-line subject clamp, and the breadcrumb allowed to
     ellipsise rather than wrap. */
  @media(max-width:760px){
    .tkd-head{padding:14px 14px 12px;}
    .tkd-head .tkd-pchip{width:38px;height:38px;border-radius:6px;font-size:13px;}
    .tkd-head h3{font-size:18px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
    .tkd-head .tkd-sub{margin-top:4px;font-size:12px;}
    /* v1.4.10.279 — MEASURED at 390×664: "nowrap + ellipsis" on this flex
       container never ellipsised (text-overflow only works on a text box, not
       on flex CHILDREN), so the room hard-clipped mid-word —
       "T00-P01_STAGE-T". A tech reads a ticket FOR the room, so the crumb
       wraps instead; the org level (redundant beside the site) is dropped to
       pay for the line, and its trailing separator goes with it. */
    .tkd-head .tkd-loc{flex-wrap:wrap;max-width:100%;}
    .tkd-head .tkd-cr-org{display:none;}
    .tkd-head .tkd-cr-org + .tkd-loc-sep{display:none;}
    /* The requester's address made the via-email pill wider than the screen
       and the refrow clipped it mid-word ("via em…"); the address lives in
       the pill's title and in the thread itself, so the phone shows the fact
       and not the string. */
    .tkd-statepill .tkd-viamail{display:none;}
    /* "Opened by …" truncates with a real ellipsis instead of clipping. */
    .tkd-head .tkd-opened{max-width:100%;overflow:hidden;text-overflow:ellipsis;}
    /* The sub line wraps onto two lines here, which left the middle-dot joiner
       stranded at the end of line one looking like a typo. Each part gets its
       own line and the separator goes. */
    .tkd-head .tkd-sub{flex-direction:column;align-items:flex-start;gap:2px;}
    .tkd-head .tkd-sub-sep{display:none;}
    .tkd-actionbar{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;
      margin-top:10px;padding-bottom:2px;}
    .tkd-actionbar::-webkit-scrollbar{display:none;}
    .tkd-actionbar > *{flex:0 0 auto;}
    /* Destructive action last under the thumb, never first. */
    .tkd-actionbar .tkd-del{margin-left:0;order:9;}
    .tkd-actionbar .btn.sm{min-height:40px;}
    .tkd-ctl > select{min-height:40px;}
    /* v213: the SIDEBAR's controls (Assignee / Vendor / Asset / Room — every
       .ex-sel and the asset picker button) never got the v128 floor; only the
       action bar's selects did in v203. Measured 34px on a 390px phone. */
    .ex-sel{min-height:40px;}
    .tkt-astbtn{min-height:40px;}
    /* v203 made this row a hidden-scrollbar strip because the via-email pill
       carried the requester's whole address and could not fit. v1.4.10.279
       moved the address into the pill's title, so the pills are short again —
       and a strip that clips a pill mid-word with no scrollbar reads as
       BROKEN, not scrollable (measured: "via em…" amputated under the close
       button). The row wraps now: one line in the normal case, a visible
       second line in the worst, nothing ever cut. */
    .tkd-head .tkd-refrow{flex-wrap:wrap;row-gap:4px;}
    /* The composer footer wrapped onto FOUR rows at 390px (Attach, Photo, the
       after-send select and Send each taking a line). One scrollable row with
       Send pinned first, same treatment as the action bar above. */
    .tkd-composer .cmp-foot{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;gap:6px;}
    .tkd-composer .cmp-foot::-webkit-scrollbar{display:none;}
    .tkd-composer .cmp-foot > *{flex:0 0 auto;}
    .tkd-composer .cmp-foot .cmp-spacer{display:none;}
    .tkd-composer .cmp-foot .btn.primary{order:-1;}
    .tkd-composer .cmp-foot .btn{min-height:40px;}
    /* v1.4.10.246 — THE REST OF THE TICKET DETAIL, MEASURED AT 390.
       v203 gave the action bar the v128 floor and v213 gave it to the sidebar
       selects, but the controls INSIDE the ticket were never measured. On a
       390px phone: the two main tabs 30px, the composer's Reply/Internal-note
       tabs 38px, the show/hide-changes toggle 24px, the "show email footer"
       fold 26px, the header pencil 22px and the modal close 27px. The tabs are
       the primary navigation of the screen and were the smallest thing on it. */
    .tkd-tabs .tkd-tab{min-height:40px;}
    .tkd-composer .cmp-tab{min-height:40px;}
    .cv-acttog{min-height:40px;padding-top:8px;padding-bottom:8px;}
    .conv-item .cv-fold{min-height:40px;}
    .tkd-subj-edit{min-width:40px;min-height:40px;justify-content:center;margin-top:0;}
    .tkd-head .close{min-width:40px;min-height:40px;justify-content:center;}
    .cmp-draft-x{min-height:40px;}
    .tkpdf-opt{min-height:44px;align-items:center;}
    /* The site crumb is a LINK (it opens the site) laid out inline in a
       sentence, so it measured 15px — the smallest tap target on the ticket.
       Padding plus an equal negative margin grows the hit box to the floor
       and leaves the line exactly where it was. */
    .tkd-head .tkd-loc a{display:inline-block;padding:13px 3px;margin:-13px 0;}
    /* v1.4.10.473: the same for the asset / device links in the Details sheet (measured 17px tall) */
    .tkd-details .ex-v a{display:inline-block;padding:12px 0;margin:-12px 0;}
  }

  /* ── Editable ticket header (v1.4.10.144) ── */
  .tkd-subjrow{display:flex;align-items:center;gap:8px;min-width:0;}
  .tkd-subjrow h3.editable{cursor:text;border-radius:5px;padding:0 4px;margin-left:-4px;}
  .tkd-subjrow h3.editable:hover{background:var(--bg-2);box-shadow:inset 0 0 0 1px var(--line);}
  .tkd-subj-edit{border:0;background:none;color:var(--text-dim);cursor:pointer;padding:4px;border-radius:5px;
                 display:inline-flex;align-items:center;flex-shrink:0;margin-top:3px;}
  .tkd-subj-edit:hover{color:var(--brand-blue);background:var(--accent-glow);}
  .tkd-subj-input{flex:1;min-width:0;font-size:20px;font-weight:600;letter-spacing:-.024em;
                  padding:6px 10px;border:1px solid var(--brand-blue);border-radius:6px;
                  background:var(--surface);color:var(--text);outline:none;}

  /* ── Support notifications panel (v1.4.10.144) ── */
  .tkn-lead{font-size:13px;color:var(--text-mute);line-height:1.6;margin:0 0 12px;}
  .tkn-note{display:flex;align-items:flex-start;gap:9px;font-size:12px;line-height:1.55;border-radius:6px;
            padding:11px 13px;margin:12px 0;}
  .tkn-note svg{flex-shrink:0;margin-top:1px;}
  .tkn-note.warn{background:color-mix(in srgb, var(--warn, #D97706) 9%, transparent);color:var(--text);
                 border:1px solid color-mix(in srgb, var(--warn, #D97706) 30%, transparent);}
  .tkn-note.ok{background:color-mix(in srgb, #16A34A 8%, transparent);color:var(--text);
               border:1px solid color-mix(in srgb, #16A34A 25%, transparent);}
  .tkn-list{border:1px solid var(--line);border-radius:7px;background:var(--surface);overflow:hidden;}
  .tkn-row{display:flex;align-items:center;gap:11px;padding:10px 13px;}
  .tkn-row + .tkn-row{border-top:1px solid var(--line);}
  .tkn-row:hover{background:var(--bg-2);}
  .tkn-main{flex:1;min-width:0;}
  .tkn-name{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:7px;flex-wrap:wrap;}
  .tkn-mail{font-size:12px;color:var(--text-dim);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .tkn-def{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim);
           border:1px solid var(--line);border-radius:6px;padding:1px 6px;}
  .tkn-foot{font-size:12px;color:var(--text-dim);line-height:1.55;margin-top:10px;}

  /* ── Match-rooms panel (v1.4.10.216) ── */
  .tkr-figs{display:flex;gap:10px;flex-wrap:wrap;margin:4px 0 14px;}
  .tkr-fig{flex:1 1 130px;display:flex;flex-direction:column;gap:2px;border:1px solid var(--line);
           border-radius:7px;background:var(--surface);padding:11px 13px;}
  .tkr-fig.on{border-color:color-mix(in srgb, var(--brand-blue) 42%, transparent);
              background:color-mix(in srgb, var(--brand-blue) 7%, var(--surface));}
  .tkr-fig-v{font-size:20px;font-weight:600;letter-spacing:-.02em;color:var(--text);
             font-variant-numeric:tabular-nums;line-height:1.15;}
  .tkr-fig.on .tkr-fig-v{color:var(--brand-blue);}
  .tkr-fig-l{font-size:11px;color:var(--text-dim);line-height:1.4;}
  .tkr-rooms{border:1px solid var(--line);border-radius:7px;background:var(--surface);
             overflow:hidden;margin-bottom:12px;}
  .tkr-rooms-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;
               color:var(--text-dim);padding:9px 13px;border-bottom:1px solid var(--line);background:var(--bg-2);}
  .tkr-room{display:flex;align-items:center;gap:10px;padding:7px 13px;font-size:12px;color:var(--text);}
  .tkr-room + .tkr-room{border-top:1px solid var(--line);}
  .tkr-room-n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .tkr-room-c{font-weight:700;font-variant-numeric:tabular-nums;color:var(--text-mute);}
  .tkr-samp{display:flex;align-items:center;gap:9px;padding:8px 13px;font-size:12px;flex-wrap:wrap;}
  .tkr-samp + .tkr-samp{border-top:1px solid var(--line);}
  .tkr-samp-r{font-weight:700;color:var(--brand-blue);font-size:12px;flex-shrink:0;}
  .tkr-samp-s{flex:1;min-width:120px;color:var(--text-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .tkr-bar{height:8px;border-radius:99px;background:var(--bg-2);border:1px solid var(--line);
           overflow:hidden;margin:2px 0 4px;}
  .tkr-bar span{display:block;height:100%;background:var(--brand-blue);transition:width .25s ease;}
  .tkr-acts{display:flex;gap:9px;justify-content:flex-end;flex-wrap:wrap;margin-top:14px;}
  /* The floor has to out-specify BOTH late blanket rules — `.btn.sm` is pinned
     to 36px at <=700 and 34px at <=600, further down the sheet, and a bare
     `.tkr-acts .btn` ties with them on specificity and LOSES to whichever is
     declared later (the v203 lesson; `.tkx-tb-acts .btn.sm` already does this).
     Measured at 390: 36px before, 40px after. */
  @media(max-width:700px){
    .tkr-acts{flex-direction:column-reverse;}
    .tkr-acts .btn.sm,.tkr-acts .btn{width:100%;justify-content:center;min-height:40px;}
    .tkr-fig{flex:1 1 100%;}
  }
  @media(max-width:600px){
    .tkr-acts .btn.sm,.tkr-acts .btn{min-height:40px;}
  }
  @media(max-width:700px){ .tkn-mail{max-width:52vw;} }
  .tkd-body{display:grid;grid-template-columns:1fr 360px;gap:0;}
  @media(max-width:920px){
    #modal-inner.modal-tkt{max-width:560px;}
    /* One column, one scroll — and the sidebar's two halves take their own
       places in it. `display:contents` promotes them into this flex container
       so the triage card can sit ABOVE the conversation (it was 1,899px down a
       2,700px modal, under every message and the reply box) while the
       reference cards stay below it. */
    .tkd-body{display:flex;flex-direction:column;grid-template-columns:1fr;overflow-y:auto;}
    .tkd-main{overflow-y:visible;order:2;}
    .tkd-side{display:contents;overflow-y:visible;}
    .tkd-side-top{order:1;padding:14px 16px 0;background:var(--surface-2);}
    .tkd-side-rest{order:3;padding:16px;background:var(--surface-2);border-top:1px solid var(--line);border-radius:0 0 8px 8px;}
    .tkd-side-top .sbx{margin-bottom:0;}
  }
  .tkd-main{padding:20px 22px;min-width:0;border-right:1px solid var(--line);}
  .tkd-side{padding:18px;background:var(--surface-2);border-radius:0 0 8px 0;}
  @media(max-width:920px){.tkd-side{border-radius:0 0 8px 8px;border-top:1px solid var(--line);}.tkd-main{border-right:0;}}

  /* Conversation timeline */
  .tkd-tabs{display:inline-flex;gap:2px;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:3px;margin-bottom:16px;}
  .tkd-tab{border:0;background:transparent;color:var(--text-mute);font-family:inherit;font-size:13px;font-weight:600;padding:6px 13px;border-radius:5px;cursor:pointer;transition:all .14s;display:flex;align-items:center;gap:6px;}
  .tkd-tab.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);}
  .tkd-tab .tb-n{font-size:10px;background:var(--surface-3);border-radius:6px;padding:0 6px;color:var(--text-mute);font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: a count badge — 10/700 uppercase .04em */
  .tkd-pane{display:none;}
  .tkd-pane.on{display:block;}
  .conv-thread{position:relative;}
  .conv-item{display:flex;gap:11px;margin-bottom:15px;}
  .conv-item .cv-av{width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;color:#fff;flex-shrink:0;}
  .conv-item .cv-body{flex:1;min-width:0;}
  .conv-item .cv-head{display:flex;align-items:baseline;gap:8px;margin-bottom:5px;flex-wrap:wrap;}
  .conv-item .cv-who{font-size:13px;font-weight:700;letter-spacing:-.01em;}
  .conv-item .cv-role{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:1px 6px;border-radius:5px;background:var(--surface-3);color:var(--text-mute);}
  .conv-item .cv-when{font-size:12px;color:var(--text-dim);margin-left:auto;}
  .conv-item .cv-bubble{background:var(--surface);border:1px solid var(--line);border-radius:4px 7px 7px 7px;padding:11px 13px;font-size:14px;line-height:1.55;color:var(--text);}
  .conv-item.system .cv-av{background:linear-gradient(135deg,var(--bc-blue-v1),var(--bc-purple-v1));}
  .conv-item.system .cv-bubble{background:var(--accent-glow);border-color:rgba(var(--bc-accent-rgb),.18);}
  .conv-item.note .cv-av{background:linear-gradient(135deg,#D97706,#B45309);}   /* v1.4.10.491: an internal note's author chip was white initials on nothing (no background), an empty circle in the thread */
  .conv-item.note .cv-bubble{background:rgba(217,119,6,.07);border-color:rgba(217,119,6,.25);}
  .conv-item.note .cv-role{background:rgba(217,119,6,.14);color:var(--warn);}
  .conv-item.control .cv-av{background:linear-gradient(135deg,#0F766E,#16A34A);}
  .conv-item.control .cv-bubble{background:rgba(22,163,74,.07);border-color:rgba(22,163,74,.24);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;}

  /* ── Thread restructure (v1.4.10.189) ──────────────────────────────────
     Quoted chains and legal footers fold behind one line; system change
     entries read as a timeline, not as somebody talking; a day separator
     gives the eye somewhere to rest in a long thread. */
  .conv-item .cv-fold{display:block;margin-top:9px;appearance:none;border:1px dashed var(--line);background:var(--surface-2);
    color:var(--text-mute);border-radius:6px;padding:5px 10px;font-size:12px;font-weight:500;font-family:inherit;
    cursor:pointer;transition:color .12s,border-color .12s;}
  .conv-item .cv-fold:hover{color:var(--brand-blue);border-color:var(--brand-blue);}
  .conv-item .cv-fold.on{color:var(--brand-blue);border-style:solid;}
  .cv-fold-dots{letter-spacing:2px;margin-right:7px;color:var(--text-dim);}
  .conv-item .cv-folded{margin-top:9px;padding-top:9px;border-top:1px solid var(--line);color:var(--text-mute);
    font-size:12px;line-height:1.6;overflow-wrap:anywhere;}
  .conv-day{display:flex;align-items:center;gap:10px;margin:4px 0 13px;}
  .conv-day::before,.conv-day::after{content:"";height:1px;background:var(--line);flex:1;}
  .conv-day span{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);white-space:nowrap;}
  .conv-actbar{display:flex;justify-content:flex-end;margin-bottom:10px;}
  .cv-acttog{appearance:none;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);
    background:var(--surface);color:var(--text-mute);border-radius:999px;padding:4px 11px;font-size:12px;
    font-weight:500;font-family:inherit;cursor:pointer;}
  .cv-acttog svg{width:12px;height:12px;}
  .cv-acttog:hover{color:var(--brand-blue);border-color:var(--brand-blue);}
  .cv-acttog.on{color:var(--brand-blue);background:var(--accent-glow);border-color:rgba(var(--bc-accent-rgb),.22);}
  .conv-act{display:flex;gap:11px;margin:0 0 13px;align-items:flex-start;}
  .conv-act .ca-dot{width:32px;height:32px;border-radius:6px;flex-shrink:0;display:flex;align-items:center;
    justify-content:center;background:var(--surface-2);color:var(--text-dim);}
  .conv-act .ca-dot svg{width:14px;height:14px;}
  .conv-act .ca-body{flex:1;min-width:0;padding-top:2px;}
  .conv-act .ca-lines{font-size:12px;line-height:1.65;color:var(--text-mute);}
  .conv-act .ca-lines div{overflow-wrap:anywhere;}
  .conv-act .ca-when{font-size:11px;color:var(--text-dim);margin-top:3px;}

  /* Details pane, grouped (v1.4.10.189). */
  .tkd-details{display:grid;gap:12px;}
  .tkd-dsec{border:1px solid var(--line);border-radius:7px;background:var(--surface);overflow:hidden;}
  .tkd-dsec-h{display:flex;align-items:center;gap:8px;padding:9px 13px;background:var(--surface-2);
    border-bottom:1px solid var(--line);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
  .tkd-dsec-ico{display:inline-flex;color:var(--brand-blue);}
  .tkd-dsec-ico svg{width:14px;height:14px;}
  .tkd-dsec-b{padding:4px 13px 8px;}

  /* Reply composer */
  .tkd-composer{margin-top:8px;border:1px solid var(--line);border-radius:7px;background:var(--surface);overflow:hidden;}
  .tkd-composer .cmp-tabs{display:flex;border-bottom:1px solid var(--line);}
  .tkd-composer .cmp-tab{flex:0 0 auto;border:0;background:transparent;color:var(--text-mute);padding:9px 15px;font-size:13px;font-weight:600;font-family:inherit;cursor:pointer;border-bottom:2px solid transparent;display:flex;align-items:center;gap:6px;}
  .tkd-composer .cmp-tab.on{color:var(--text);border-bottom-color:var(--accent);}
  .tkd-composer .cmp-tab.note.on{border-bottom-color:var(--warn);color:var(--warn);}
  .tkd-composer textarea{width:100%;border:0;background:transparent;padding:12px 14px;font-size:13px;color:var(--text);font-family:inherit;resize:vertical;min-height:84px;line-height:1.55;}
  .tkd-composer textarea:focus{outline:none;}
  .tkd-composer.note-mode{background:rgba(217,119,6,.04);}
  .cmp-foot{display:flex;align-items:center;gap:8px;padding:9px 12px;border-top:1px solid var(--line);flex-wrap:wrap;}
  /* v1.4.10.181: the canned quick-reply pills are gone (by request) — the
     spacer keeps Attach / Photo / the after-send select pushed right. */
  .cmp-spacer{flex:1;}

  /* v1.4.10.246 — THE DRAFT LINE. It exists so the holding is not a secret:
     text that survives an attachment, a status change and a browser restart
     has to SAY it is being held, or coming back to a half-written reply reads
     as the app having sent something. Present only while a draft exists. */
  .cmp-draft{display:none;align-items:center;gap:8px;padding:7px 14px;font-size:12px;
             color:var(--ok,#0f7b4f);background:rgba(16,150,90,.07);border-top:1px solid var(--line);line-height:1.4;}
  .cmp-draft.on{display:flex;}
  .cmp-draft svg{flex-shrink:0;}
  .cmp-draft-x{margin-left:auto;flex-shrink:0;appearance:none;border:1px solid var(--line);background:var(--surface);
               color:var(--text-mute);font-family:inherit;font-size:12px;font-weight:500;
               padding:5px 10px;border-radius:5px;cursor:pointer;}
  .cmp-draft-x:hover{color:var(--err);border-color:var(--err);}

  /* v1.4.10.246 — the one-ticket PDF options. */
  .tkpdf-opts{display:flex;flex-direction:column;gap:2px;}
  .tkpdf-opt{display:flex;align-items:flex-start;gap:10px;padding:9px 8px;border-radius:6px;cursor:pointer;}
  .tkpdf-opt:hover{background:var(--surface-2);}
  .tkpdf-opt input{margin-top:2px;width:16px;height:16px;flex-shrink:0;cursor:pointer;}
  .tkpdf-opt span{display:block;font-size:13px;line-height:1.45;}
  .tkpdf-opt b{display:block;font-weight:600;color:var(--text);}
  .tkpdf-opt i{display:block;font-style:normal;color:var(--text-mute);font-size:12px;margin-top:1px;}

  /* Sidebar cards */
  .sbx{background:var(--surface);border:1px solid var(--line);border-radius:7px;margin-bottom:14px;overflow:hidden;box-shadow:var(--shadow-sm);}
  .sbx-head{display:flex;align-items:center;gap:8px;padding:11px 14px;border-bottom:1px solid var(--line);}
  .sbx-head .sx-ico{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .sbx-head h5{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin:0;flex:1;}
  .sbx-head .sx-pill{font-size:11px;}
  .sbx-body{padding:13px 14px;}
  .sbx-body.tight{padding:8px 14px 12px;}

  /* Inline editable detail rows */
  .ex-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:1px solid var(--line);font-size:12px;}
  .ex-row:last-child{border-bottom:0;}
  .ex-row .ex-k{color:var(--text-mute);flex-shrink:0;}
  .ex-row .ex-v{font-weight:600;text-align:right;}
  .ex-sel{background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:5px 8px;font-size:13px;color:var(--text);font-family:inherit;font-weight:400;cursor:pointer;max-width:170px;}
  /* ── v1.4.10.270: 170px was cutting people's names in half ────────────────
     A `<select>` renders its SELECTED option, clipped, with no ellipsis and no
     tooltip — so "Jay Burridge — AV Manager" read as "Jay Burridge — AV Mana".
     The cap dates from when this row held short values; the assignee control
     has carried "Name — Title" since v152 and the Room button has carried ICC
     room names since v215, neither of which fits in 170px.

     Released rather than merely raised: .ex-row is already a flex row with a
     non-shrinking key, so `flex:1 1 auto; min-width:0` lets each control take
     exactly the rail it is given and no more. Scoped to `.ex-row .ex-sel`
     (0,2,0) so it beats the cap by specificity, and so the OTHER users of this
     class — .txp-row (width:100%) and .sd-loctools-row (max-width:100%) — are
     untouched. */
  /* flex-basis 0, not auto: a <select>'s auto basis is its widest OPTION, which
     left the control narrower than the rail it was sitting in. With basis 0 it
     takes every pixel the key does not want. */
  .ex-row{flex-wrap:wrap;}
  .ex-row .ex-sel{max-width:none;min-width:0;flex:1 1 0;}
  .ex-row .ex-k{flex:0 0 auto;}
  /* The picker BUTTONS carry a multi-word value, so they wrap rather than
     ellipsis — but they stay right-aligned with the selects above them. */
  .ex-row button.ex-sel{text-align:right;}
  .ex-sel:focus{outline:none;border-color:var(--accent);}
  /* v1.4.10.473: the 170px cap is a desktop toolbar's. A select whose markup asks for the whole width (style="width:100%":
     the sheet's Chart type and the wiki's Move pickers, capped at 170px in their dialogs) gets it, and on a phone the cap
     is its own cell (the crew search was 170px under width:100%). */
  .ex-sel[style*="width:100%"]{max-width:none;}
  @media (max-width:700px){ .ex-sel{max-width:100%;} }

  /* Linked asset card */
  .ast-card{border-radius:7px;overflow:hidden;border:1px solid rgba(var(--bc-purple-rgb),.22);margin-bottom:14px;box-shadow:var(--shadow-sm);}
  .ast-card .ac-banner{background:linear-gradient(125deg,#1E3A8A,var(--bc-blue-v1) 50%,var(--bc-purple-v1));padding:13px 15px;color:#fff;display:flex;align-items:center;gap:11px;}
  .ast-card .ac-thumb{width:40px;height:40px;border-radius:6px;background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0;}
  .ast-card .ac-thumb img{width:100%;height:100%;object-fit:contain;}
  .ast-card .ac-tag{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;background:rgba(255,255,255,.22);padding:1px 7px;border-radius:5px;display:inline-block;margin-bottom:3px;}
  .ast-card .ac-name{font-size:15px;font-weight:600;letter-spacing:-.012em;line-height:1.2;}
  .ast-card .ac-body{background:var(--surface);padding:12px 14px;}
  /* ── v1.4.10.270: the asset PICTURE band and the SUPPLIER row ─────────────
     The picture sits ABOVE the gradient banner so the tag and model name stay
     legible on their own background — laid over a photo they would be at the
     mercy of whatever the technician pointed a phone at. object-fit:contain,
     not cover: rack gear photographed at an angle gets cropped into
     abstraction by cover, and the point of the picture is recognition.
     The band collapses to zero if the lazy blob never arrives, so an asset
     whose has_photo flag outlives its file leaves no empty grey slab. */
  .ast-card .ac-pic{background:var(--surface-2);border-bottom:1px solid var(--line);
    display:flex;align-items:center;justify-content:center;overflow:hidden;}
  .ast-card .ac-pic:empty{display:none;}
  .ast-card .ac-pic img{width:100%;max-height:150px;object-fit:contain;display:block;}
  .ast-card .ac-sup{display:flex;align-items:center;gap:10px;padding:9px 10px;margin:0 0 11px;
    background:var(--surface-2);border:1px solid var(--line);border-radius:6px;}
  .ast-card .ac-sup-logo{width:34px;height:34px;flex:0 0 auto;border-radius:5px;background:var(--surface);
    border:1px solid var(--line);display:flex;align-items:center;justify-content:center;overflow:hidden;color:var(--text-mute);}
  .ast-card .ac-sup-logo img{width:100%;height:100%;object-fit:contain;}
  .ast-card .ac-sup-logo svg{width:15px;height:15px;}
  .ast-card .ac-sup-t{min-width:0;flex:1 1 auto;}
  .ast-card .ac-sup-k{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;}
  .ast-card .ac-sup-v{font-size:12px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;}
  .ast-grid{display:grid;grid-template-columns:1fr 1fr;gap:9px 14px;}
  .ast-grid .ag-c .ag-k{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;margin-bottom:1px;}
  .ast-grid .ag-c .ag-v{font-size:12px;font-weight:600;}
  .ast-warr{display:flex;align-items:center;gap:6px;margin-top:11px;padding-top:11px;border-top:1px solid var(--line);flex-wrap:wrap;}

  /* Device control panel */
  .ctl-tele{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:12px;}
  .ctl-tele .ct-cell{background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:8px 10px;}
  .ctl-tele .ct-l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;margin-bottom:2px;}
  .ctl-tele .ct-v{font-size:20px;font-weight:600;letter-spacing:-.02em;}
  .ctl-grid{display:grid;grid-template-columns:1fr 1fr;gap:7px;}
  .ctl-btn{display:flex;align-items:center;gap:8px;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:9px 11px;cursor:pointer;font-family:inherit;color:var(--text);text-align:left;transition:all .14s;}
  .ctl-btn:hover{border-color:var(--accent);background:var(--accent-glow);}
  .ctl-btn.danger:hover{border-color:var(--err);background:rgba(220,38,38,.06);}
  /* v1.4.10.534: an offline device's commands are drawn greyed (not hidden) on the ticket, with the reason in the title */
  .ctl-btn[disabled]{opacity:.5;cursor:not-allowed;}
  .ctl-btn[disabled]:hover{border-color:var(--line);background:var(--surface-2);}
  .ctl-btn[disabled]:hover .cb-ico{color:inherit;border-color:var(--line);}
  .ctl-offline-line{display:flex;gap:8px;align-items:flex-start;margin:0 0 10px;font-size:12px;line-height:1.5;color:var(--text-mute);}
  .ctl-offline-line svg{width:14px;height:14px;flex-shrink:0;margin-top:2px;color:var(--err);}
  .ctl-btn .cb-ico{width:26px;height:26px;border-radius:5px;background:var(--surface);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--text-mute);}
  .ctl-btn:hover .cb-ico{color:var(--brand-blue);border-color:rgba(var(--bc-accent-rgb),.3);}
  .ctl-btn.danger:hover .cb-ico{color:var(--err);border-color:rgba(220,38,38,.3);}
  /* v1.4.10.278: the title and its description are TWO LINES, not one string.
     Both spans were display:inline, so every button in this grid read
     "Open deviceFull record & controls". The wrapper stacks them and takes
     min-width:0 so a long description wraps inside the button instead of
     widening the grid track. */
  .ctl-btn>span:not(.cb-ico){display:flex;flex-direction:column;min-width:0;}
  .ctl-btn .cb-t{display:block;font-size:13px;font-weight:600;letter-spacing:-.01em;}
  .ctl-btn .cb-d{display:block;font-size:11px;color:var(--text-dim);}
  .ctl-span{grid-column:1/-1;}
  .ctl-cmdline{margin-top:11px;padding-top:11px;border-top:1px solid var(--line);font-size:11px;color:var(--text-dim);}
  .ctl-cmdline .cl-row{display:flex;align-items:center;gap:7px;padding:3px 0;font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
  .ctl-cmdline .cl-row .cl-st{width:6px;height:6px;border-radius:50%;flex-shrink:0;}

  /* Related tickets */
  .rel-row{display:flex;align-items:center;gap:9px;padding:8px 0;border-bottom:1px solid var(--line);cursor:pointer;font-size:12px;}
  .rel-row:last-child{border-bottom:0;}
  .rel-row:hover .rel-subj{color:var(--brand-blue);}
  .rel-row .rel-subj{flex:1;font-weight:600;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

  /* New-ticket modal */
  .nt-section{border:1px solid var(--line);border-radius:7px;padding:14px 14px 4px;margin-bottom:14px;background:var(--surface-2);}
  .nt-sec-label{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:11px;}
  .nt-sec-label svg{width:14px;height:14px;}
  .nt-path{display:flex;align-items:center;flex-wrap:wrap;gap:5px;min-height:20px;margin:2px 0 10px;font-size:12px;}
  .nt-path .ntp-seg{color:var(--text-mute);font-weight:600;}
  .nt-path .ntp-seg.last{color:var(--brand-blue);}
  .nt-path .ntp-sep{color:var(--text-dim);font-weight:700;}
  .nt-prio{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;}
  .nt-prio label{display:flex;flex-direction:column;gap:2px;border:1.5px solid var(--line);border-radius:6px;padding:9px 10px;cursor:pointer;transition:all .14s;position:relative;}
  .nt-prio label:hover{border-color:var(--line-2);}
  .nt-prio input{position:absolute;opacity:0;}
  .nt-prio input:checked + .ntp-t{color:var(--text);}
  .nt-prio label:has(input:checked){border-color:var(--accent);background:var(--accent-glow);box-shadow:0 0 0 2px var(--accent-glow);}
  .nt-prio .ntp-t{font-size:13px;font-weight:600;display:flex;align-items:center;gap:6px;}
  .nt-prio .ntp-d{font-size:12px;font-weight:400;color:var(--text-mute);}   /* v1.4.10.473: the line under P1-P4 is meta, 12/400 (was 11/500, the label's weight) */
  .nt-prio .ntp-dot{width:8px;height:8px;border-radius:50%;}
  .nt-preview{margin-top:4px;border:1px solid var(--line);border-radius:6px;overflow:hidden;animation:ntpop .2s ease;}
  @keyframes ntpop{from{opacity:0;transform:translateY(-4px);}to{opacity:1;transform:translateY(0);}}
  .nt-preview .npv-bar{background:linear-gradient(125deg,#1E3A8A,var(--bc-blue-v1) 55%,var(--bc-purple-v1));padding:10px 13px;color:#fff;display:flex;align-items:center;gap:10px;}
  .nt-preview .npv-ico{width:32px;height:32px;border-radius:6px;background:rgba(255,255,255,.16);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .nt-preview .npv-body{padding:11px 13px;display:grid;grid-template-columns:1fr 1fr;gap:8px 12px;background:var(--surface);}
  .nt-preview .npv-c .k{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;}
  .nt-preview .npv-c .v{font-size:12px;font-weight:600;}
  .nt-asset-list{position:absolute;left:0;right:0;top:100%;z-index:50;margin-top:4px;max-height:260px;overflow-y:auto;background:var(--surface);border:1px solid var(--line-2);border-radius:6px;box-shadow:0 12px 30px rgba(0,0,0,.18);}
  .nt-asset-opt{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;border-bottom:1px solid var(--line);}
  .nt-asset-opt:last-child{border-bottom:0;}
  .nt-asset-opt:hover{background:var(--accent-glow);}
  .nt-asset-opt .naq-ico{width:26px;height:26px;border-radius:5px;background:var(--surface-3);color:var(--text-mute);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .nt-asset-opt .naq-tag{display:block;font-weight:600;font-size:13px;}   /* v1.4.10.473: an option's title is a sub-heading, 13/600 (was 13/700) */
  .nt-asset-opt .naq-sub{display:block;font-size:11px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .nt-asset-empty{padding:12px;font-size:12px;color:var(--text-dim);text-align:center;}
  /* v1.4.10.215: group headings inside the new-ticket asset list (the chosen
     room's assets lead), and the room search box above the Room select. */
  .nt-asset-grp{position:sticky;top:0;background:var(--surface-2);color:var(--text-mute);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;padding:6px 12px;border-bottom:1px solid var(--line);}
  .nt-locq{margin-bottom:6px;}
  .nt-locn{font-size:11px;color:var(--text-mute);margin-top:4px;}

  /* Quick actions */
  .quick-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(170px,100%),1fr));gap:10px;}
  .qa{background:var(--navy-2);border:1px solid var(--line);border-radius:6px;padding:13px;cursor:pointer;text-align:left;color:var(--text);font-family:inherit;display:flex;gap:11px;align-items:flex-start;transition:all 0.15s;}
  .qa:hover{border-color:var(--electric);background:var(--navy-3);}
  .qa-ico{width:30px;height:30px;border-radius:5px;background:var(--accent-glow);color:var(--electric-2);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .qa .qa-t{font-size:13px;font-weight:600;margin-bottom:2px;letter-spacing:-0.01em;}
  .qa .qa-d{font-size:11px;color:var(--text-mute);line-height:1.4;}

  /* Remote cards */
  .remote-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(280px,100%),1fr));gap:14px;}
  .remote-card{position:relative;display:flex;flex-direction:column;background:var(--surface);
    border:1px solid var(--line);border-radius:8px;overflow:hidden;box-shadow:var(--shadow-sm);
    transition:border-color .15s,box-shadow .15s,transform .15s;}
  .remote-card:hover{border-color:var(--line-2);box-shadow:var(--shadow-md);transform:translateY(-2px);}
  /* Media strip — asset photo when present, else a typed icon tile. */
  .rc-media{position:relative;height:140px;background:var(--surface-2);
    display:flex;align-items:center;justify-content:center;overflow:hidden;border-bottom:1px solid var(--line);}
  .rc-media img{width:100%;height:100%;object-fit:cover;display:block;}
  .rc-media .rc-ph{display:flex;align-items:center;justify-content:center;width:62px;height:62px;border-radius:8px;
    background:rgba(var(--bc-accent-rgb),.08);}
  .rc-media .rc-ph svg{width:30px;height:30px;}
  .rc-media .rc-photo-tag{position:absolute;left:10px;bottom:10px;font-size:10px;font-weight:700;letter-spacing:.04em;
    text-transform:uppercase;background:rgba(15,23,42,.62);color:#fff;border-radius:6px;padding:3px 7px;backdrop-filter:blur(3px);}
  .rc-status{position:absolute;top:10px;right:10px;display:inline-flex;align-items:center;gap:6px;
    background:rgba(255,255,255,.92);border:1px solid var(--line);border-radius:10px;padding:4px 9px;
    font-size:11px;font-weight:600;color:var(--text);box-shadow:var(--shadow-sm);}
  .rc-type-chip{position:absolute;top:10px;left:10px;display:inline-flex;align-items:center;gap:5px;
    background:rgba(255,255,255,.92);border:1px solid var(--line);border-radius:6px;padding:4px 8px;
    font-size:11px;font-weight:600;box-shadow:var(--shadow-sm);}
  .rc-type-chip svg{width:13px;height:13px;}
  .rc-body{padding:13px 15px 15px;display:flex;flex-direction:column;gap:3px;}
  .remote-card .rc-name{font-weight:600;font-size:15px;letter-spacing:-.012em;line-height:1.25;}
  .remote-card .rc-meta{font-size:12px;color:var(--text-mute);}
  .remote-card .rc-addr{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;color:var(--text-dim);margin:6px 0 12px;
    display:inline-flex;align-items:center;gap:6px;}
  .remote-card .rc-addr svg{width:12px;height:12px;opacity:.7;}
  .remote-card .rc-actions{display:flex;gap:7px;flex-wrap:wrap;margin-top:auto;}
  .rc-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
  .rc-dot.ok{background:var(--ok);box-shadow:0 0 0 3px rgba(22,163,74,.15);}
  .rc-dot.warn{background:var(--warn);box-shadow:0 0 0 3px rgba(217,119,6,.15);}
  .rc-dot.err{background:var(--err);box-shadow:0 0 0 3px rgba(220,38,38,.15);}
  /* v1.4.10.450: a never-reported device reads grey (devStatusMeta), not a red Fault. */
  .rc-dot.muted{background:var(--text-mute);box-shadow:0 0 0 3px rgba(148,163,184,.14);}
  /* Remote-access summary strip at the top of the page. */
  .remote-summary{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:18px;}
  .rs-stat{display:flex;align-items:flex-start;gap:11px;background:var(--surface);border:1px solid var(--line);
    border-radius:7px;padding:12px 16px;min-width:130px;flex:1 1 130px;max-width:220px;}   /* v1.4.10.473: figures share one top across a row (centred, a label that wraps to two lines lifted its figure 8px above its neighbour's) */
  .rs-stat .ic{width:36px;height:36px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .rs-stat .ic svg{width:18px;height:18px;}
  .rs-stat.tot .ic{background:var(--accent-glow);color:var(--brand-blue);}
  .rs-stat.ok .ic{background:rgba(22,163,74,.12);color:var(--ok);}
  .rs-stat.warn .ic{background:rgba(217,119,6,.13);color:var(--warn);}
  .rs-stat.err .ic{background:rgba(220,38,38,.12);color:var(--err);}
  /* v1.4.10.450: the "Not reporting" chip, so the strip adds up to Reachable. */
  .rs-stat.muted .ic{background:var(--surface-3);color:var(--text-mute);}
  .rs-stat .v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;}
  .rs-stat .l{font-size:11px;color:var(--text-mute);margin-top:3px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;}   /* v1.4.10.473: KPI label 11/600 uppercase .06em, as every KPI tile (was 11/400) */
  /* Remote Access — in-page filter bar + channel segment */
  .ra-filterbar{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:18px;}
  .ra-filters{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;}
  .ra-fl{display:flex;flex-direction:column;gap:5px;min-width:150px;}
  .ra-fl>span{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;padding-left:2px;}
  .ra-fl select{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:0 12px;height:36px;box-sizing:border-box;font-size:13px;   /* v1.4.10.473: 36, the page's control height (was 41) */color:var(--text);font-family:inherit;transition:border-color .15s,box-shadow .15s;}
  .ra-fl select:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .ra-fl select:disabled{opacity:.5;cursor:not-allowed;}
  .ra-filters .btn.sm{align-self:flex-end;margin-bottom:1px;}
  .ra-seg{display:inline-flex;gap:4px;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:4px;align-self:flex-end;}
  .ra-seg-btn{border:0;background:transparent;color:var(--text-mute);font-family:inherit;font-size:12px;font-weight:600;padding:4px 13px;   /* v1.4.10.473: 4px (was 7) - the switch stands 36 beside the 36px search */border-radius:6px;cursor:pointer;transition:all .14s;white-space:nowrap;display:inline-flex;align-items:center;gap:7px;}
  .ra-seg-btn:hover{color:var(--text);}
  .ra-seg-btn.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);}
  /* v1.4.10.473: the count badge takes the badge look, 10/700 uppercase .04em (was 10/700 untracked) */
  .ra-seg-n{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-dim);background:var(--surface-3);border-radius:10px;padding:1px 7px;min-width:18px;text-align:center;}
  .ra-seg-btn.on .ra-seg-n{background:var(--accent-glow);color:var(--brand-blue);}
  .ra-band{margin-bottom:26px;}
  .ra-band-head{display:flex;align-items:center;gap:12px;margin:0 2px 14px;}
  .ra-band-ico{width:34px;height:34px;border-radius:6px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--accent-glow);color:var(--brand-blue);}
  .ra-band-ico svg{width:18px;height:18px;}
  /* v1.4.10.473: card title 15/600 like every other card head (was 700) */
  .ra-band-title{font-weight:600;font-size:15px;letter-spacing:-.01em;}
  .ra-band-sub{font-size:12px;color:var(--text-mute);margin-top:1px;}
  /* Locations — per-room card with a distinct heading band above its assets */
  .loc-card{background:var(--card);border:1px solid var(--line);border-radius:7px;overflow:hidden;box-shadow:var(--shadow-sm);}
  .loc-card-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
    padding:13px 16px;background:var(--surface-2);border-bottom:1px solid var(--line);}
  .loc-card-titlewrap{display:flex;align-items:center;gap:11px;min-width:0;}
  .loc-card-ico{width:30px;height:30px;border-radius:6px;flex-shrink:0;display:flex;align-items:center;justify-content:center;
    background:var(--accent-glow);color:var(--brand-blue);}
  .loc-card-ico svg{width:16px;height:16px;}
  .loc-card-title{font-weight:600;font-size:15px;letter-spacing:-.012em;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .loc-card-meta{font-size:12px;color:var(--text-mute);margin-top:1px;}
  .loc-card-code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--text-dim);}
  .loc-card-pills{display:flex;gap:5px;flex-wrap:wrap;}
  .loc-card-body{padding:2px 16px 12px;}
  .loc-card-body>div:first-child{border-top:0 !important;}
  @media(max-width:560px){ .remote-grid{grid-template-columns:1fr;} .ra-filterbar{align-items:stretch;} .ra-fl{min-width:0;flex:1 1 120px;} }

  /* Remote Access — toolbar (search + channel), scope row, location chips */
  .ra-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px;}
  .ra-search{flex:1 1 280px;min-width:200px;position:relative;display:flex;align-items:center;}
  .ra-search>svg{position:absolute;left:13px;width:16px;height:16px;color:var(--text-dim);pointer-events:none;}
  .ra-search input{width:100%;background:var(--surface);border:1px solid var(--line);border-radius:6px;
    padding:0 40px 0 38px;height:36px;box-sizing:border-box;font-size:13px;color:var(--text);font-family:inherit;box-shadow:var(--shadow-sm);   /* v1.4.10.473: 36 like the channel switch beside it (the two stood 44 and 42) */
    transition:border-color .15s,box-shadow .15s;}
  .ra-search input:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .ra-search input::placeholder{color:var(--text-dim);}
  .ra-search-x{position:absolute;right:8px;width:24px;height:24px;border:0;background:var(--surface-2);color:var(--text-mute);
    border-radius:5px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:15px;line-height:1;transition:all .14s;}
  .ra-search-x:hover{background:var(--surface-3);color:var(--text);}
  .ra-search-x svg{width:13px;height:13px;}
  .ra-toolbar .ra-seg{align-self:auto;margin-left:auto;}
  .ra-scope{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;margin-bottom:14px;}
  .ra-scope .ra-fl{min-width:170px;flex:0 1 220px;}
  .ra-scope .ra-fl select{width:100%;}
  .ra-clear{align-self:flex-end;margin-bottom:1px;display:inline-flex;align-items:center;gap:5px;}
  .ra-clear svg{width:12px;height:12px;}
  .ra-locrow{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 18px;}
  .ra-chip{display:inline-flex;align-items:center;gap:7px;background:var(--surface);border:1px solid var(--line);
    color:var(--text-mute);border-radius:999px;padding:7px 13px;font-size:12px;font-weight:500;font-family:inherit;
    cursor:pointer;transition:all .14s;box-shadow:var(--shadow-sm);}
  .ra-chip:hover{color:var(--text);border-color:var(--line-2);background:var(--surface-2);}
  .ra-chip.on{background:var(--grad);border-color:transparent;color:#fff;box-shadow:0 2px 8px rgba(var(--bc-accent-rgb),.28);}
  /* v1.4.10.473: badge look, 10/700 uppercase .04em (was untracked) */
  .ra-chip-n{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;background:var(--surface-3);color:var(--text-dim);border-radius:999px;
    padding:1px 7px;min-width:18px;text-align:center;}
  .ra-chip.on .ra-chip-n{background:rgba(255,255,255,.22);color:#fff;}
  /* Clickable summary stats */
  button.rs-stat{font-family:inherit;text-align:left;cursor:pointer;
    transition:transform .15s,box-shadow .15s,border-color .15s;}
  button.rs-stat:hover{transform:translateY(-1px);box-shadow:var(--shadow-md);border-color:var(--line-2);}
  button.rs-stat.on{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  @media(max-width:560px){
    .ra-toolbar .ra-seg{margin-left:0;width:100%;}
    .ra-toolbar .ra-seg-btn{flex:1;justify-content:center;}
    .ra-scope .ra-fl{flex:1 1 140px;min-width:0;}
    .rs-stat{max-width:none;flex:1 1 calc(50% - 6px);}   /* v1.4.10.473: two to a row, and an odd last tile takes the row (it stood 220px beside nothing) */
    .ra-locrow{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:4px;}
    .ra-chip{white-space:nowrap;}
  }

  /* Remote Access — location spaces (devices grouped by room) */
  .ra-space{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
    box-shadow:var(--shadow-sm);margin-bottom:18px;overflow:hidden;}
  .ra-space-head{display:flex;align-items:center;gap:12px;padding:14px 16px;
    background:var(--surface-2);border-bottom:1px solid var(--line);}
  .ra-space-ico{width:34px;height:34px;border-radius:6px;flex-shrink:0;display:flex;align-items:center;justify-content:center;
    background:var(--accent-glow);color:var(--brand-blue);}
  .ra-space-ico svg{width:17px;height:17px;}
  .ra-space-titlewrap{min-width:0;flex:1;}
  .ra-space-title{font-weight:600;font-size:15px;letter-spacing:-.012em;line-height:1.25;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .ra-space-code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;color:var(--text-dim);
    background:var(--surface-3);border-radius:6px;padding:1px 6px;margin-left:6px;vertical-align:middle;}
  .ra-space-meta{font-size:12px;color:var(--text-mute);margin-top:2px;}
  .ra-space-roll{display:flex;gap:6px;flex-wrap:wrap;flex-shrink:0;}
  .ra-space-roll .pill{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;}
  .ra-space-roll .dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;}
  .ra-space-roll .dot.ok{background:var(--ok);}
  .ra-space-roll .dot.warn{background:var(--warn);}
  .ra-space-roll .dot.err{background:var(--err);}
  .ra-space-body{padding:15px 16px;}
  /* v1.4.10.208: rooms collapse. The head is the toggle — a real focusable
     control with a caret that rotates open. A closed room has no body in the
     DOM at all, so the head must not sit on a phantom border. */
  .ra-space-head{cursor:pointer;user-select:none;}
  .ra-space-head:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;border-radius:var(--radius) var(--radius) 0 0;}
  .ra-space.closed .ra-space-head{border-bottom:none;padding:10px 16px;}
  .ra-space.closed{margin-bottom:9px;}
  .ra-caret{display:flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0;
    color:var(--text-mute);transition:transform .15s ease;}
  .ra-caret svg{width:15px;height:15px;}
  .ra-space.open .ra-caret{transform:rotate(90deg);}
  .ra-secbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
    margin:2px 0 12px;color:var(--text-mute);font-size:12px;}
  .ra-secbtns{display:flex;gap:6px;flex-shrink:0;}
  .ra-secbar .ra-trouble-all{margin-left:6px;vertical-align:middle;}   /* v1.4.10.438: past the self-open cap */
  .ra-more{display:flex;align-items:center;justify-content:center;min-height:88px;border:1px dashed var(--line-2);
    border-radius:8px;background:var(--surface-2);color:var(--text-dim);font-size:13px;font-weight:500;
    cursor:pointer;transition:border-color .15s,color .15s;}
  .ra-more:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
  @media(max-width:560px){
    .ra-space-head{flex-wrap:wrap;}
    .ra-space-roll{width:100%;}
  }
  /* Phone thumb floor (v128 rule, applied to this page's own controls — the
     card action buttons measured 30px against the 40px floor). */
  @media(max-width:700px){
    .remote-card .rc-actions .btn.sm{min-height:40px;}
    .ra-space-head{min-height:48px;}
    .ra-secbtns .btn.sm, .ra-secbar .ra-trouble-all{min-height:40px;}
  }

  /* ── Reliability: ONE estate table (v1.4.10.208) ──
     Rooms are group rows inside a single table with a single header — the
     previous shape drew a full table per room (67 repeated headers on ICC).
     ≤760px the device rows card themselves; the header row is hidden and each
     numeric cell carries its own label via data-l. */
  .rel-panel{padding:0;overflow:hidden;}
  .rl-dropnote{padding:10px 16px 0;color:var(--text-mute);font-size:12px;}
  .rel-tbl{width:100%;border-collapse:collapse;font-size:13px;}
  .rel-tbl thead th{padding:10px 12px;text-align:left;color:var(--text-mute);font-size:11px;font-weight:600;
    letter-spacing:.06em;text-transform:uppercase;border-bottom:1px solid var(--line);}
  .rel-tbl thead th.rl-num{text-align:center;}
  .rel-tbl thead th.rl-status{text-align:right;}
  .rel-tbl td{padding:8px 12px;border-top:1px solid var(--line);vertical-align:middle;}
  .rel-tbl td.rl-num{text-align:center;color:var(--text-dim);font-variant-numeric:tabular-nums;}
  .rel-tbl td.rl-num.bad{color:var(--err);font-weight:600;}
  .rel-tbl td.rl-status{text-align:right;}
  .rel-tbl .rl-nm{font-weight:600;}
  .rel-tbl .rl-sub{color:var(--text-mute);font-size:12px;margin-left:7px;}
  .rel-grp td{padding:0;border-top:1px solid var(--line);background:var(--surface-2);}
  .rel-grp:first-child td{border-top:none;}
  .rel-grp-in{display:flex;align-items:center;gap:10px;padding:8px 14px;min-width:0;cursor:pointer;user-select:none;}
  .rel-grp-in:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
  .rel-caret{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;
    color:var(--text-mute);transition:transform .15s ease;}
  .rel-caret svg{width:14px;height:14px;}
  .rel-grp.open .rel-caret{transform:rotate(90deg);}
  .rel-grp-ico{display:flex;width:26px;height:26px;align-items:center;justify-content:center;border-radius:5px;
    background:var(--surface);color:var(--accent);flex-shrink:0;border:1px solid var(--line);}
  .rel-grp-ico svg{width:14px;height:14px;}
  .rel-grp-t{flex:1;min-width:0;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;}
  .rel-grp-name{font-weight:600;font-size:13px;line-height:1.3;}
  .rel-grp-meta{color:var(--text-mute);font-size:12px;}
  .rel-grp-n{color:var(--text-mute);font-size:12px;white-space:nowrap;flex-shrink:0;}
  .rel-grp-score{display:flex;align-items:center;gap:8px;flex-shrink:0;}
  .rel-grp-sl{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
  @media(max-width:760px){
    .rel-tbl thead{display:none;}
    .rel-tbl, .rel-tbl tbody{display:block;}
    .rel-tbl tr.rel-grp{display:block;}
    .rel-tbl tr.rel-grp td{display:block;}
    .rel-grp-in{flex-wrap:wrap;gap:8px 11px;}
    .rel-grp-n{width:100%;order:5;margin-top:-4px;}
    .rel-tbl tr.rlt-row{display:grid;grid-template-columns:repeat(3,1fr);gap:4px 10px;
      padding:10px 14px;border-top:1px solid var(--line);}
    .rel-tbl tr.rlt-row td{display:block;padding:0;border-top:none;min-width:0;}
    .rel-tbl tr.rlt-row td.rl-name{grid-column:1/3;grid-row:1;}
    .rel-tbl tr.rlt-row td.rl-status{grid-column:3/4;grid-row:1;align-self:start;text-align:right;}
    .rel-tbl tr.rlt-row td.rl-score{grid-column:1/-1;grid-row:2;}
    .rel-tbl tr.rlt-row td.rl-num{grid-row:3;text-align:left;font-size:12px;}
    .rel-tbl tr.rlt-row td[data-l]::before{content:attr(data-l) ' ';color:var(--text-mute);
      font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;display:block;margin-bottom:1px;}
    .rel-tbl tr.rlt-row td.rl-score[data-l]::before{display:none;}
    .rel-tbl tr.rlt-row td.rl-status[data-l]::before{display:none;}
    .rel-tbl .rl-sub{display:block;margin-left:0;}
    .rel-grp-t{flex-direction:column;align-items:flex-start;gap:1px;}
    .rel-grp-in{min-height:48px;flex-wrap:wrap;row-gap:2px;padding:8px 12px;}
    .rel-grp-ico{display:none;}
    .rel-grp-sl{display:none;}
    .rel-grp-n{font-size:11px;}
    .ra-secbtns .btn.sm{min-height:40px;}
  }

  /* Bars */
  .stack-bar{display:flex;height:8px;border-radius:4px;overflow:hidden;background:var(--navy-3);}
  .stack-bar > div{height:100%;}

  /* Health bars per site */
  .health-row{display:grid;grid-template-columns:1fr auto;gap:14px;align-items:center;margin-bottom:14px;font-size:13px;}
  .health-row:last-child{margin-bottom:0;}
  .health-row .hr-name{font-weight:500;}
  .health-row .hr-stats{font-size:11px;color:var(--text-mute);text-align:right;margin-bottom:5px;}
  .health-row .hr-bar{grid-column:1/-1;}

  /* Toast */
  /* v1.4.10.422: pointer-events:none — the toast holds only text, and for its 2.8 s it sat over (and took
     the taps for) whatever lay under it on a phone: the follow-up scheduler's Schedule and Cancel. */
  /* v1.4.10.429: z-index above the camera sheet (1700) — at 100 the "Camera not ready yet" toast fired under the open sheet and was invisible. */
  .toast{position:fixed;bottom:24px;right:24px;background:var(--surface);border:1px solid var(--line-2);border-radius:6px;padding:14px 18px 14px 14px;font-size:13px;font-weight:500;z-index:1750;display:none;align-items:center;gap:10px;min-width:min(280px,calc(100vw - 48px));max-width:min(480px,calc(100vw - 48px));box-shadow:var(--shadow-lg);pointer-events:none;}   /* v1.4.10.473: a long message wraps inside 480px with the 24px inset on both sides — it ran 727px wide at 1440, and on a phone out to the screen's left edge (0px there, 24 on the right) */
  .toast.active{display:flex;animation:toastIn 0.25s ease;}
  @keyframes toastIn{from{opacity:0;transform:translateY(10px);}to{opacity:1;transform:translateY(0);}}
  .toast .toast-ico{width:30px;height:30px;border-radius:5px;background:var(--accent-glow);color:var(--electric-2);display:flex;align-items:center;justify-content:center;flex-shrink:0;}

  /* Empty / hint */
  .empty{padding:48px 20px;text-align:center;color:var(--text-mute);font-size:13px;}   /* v1.4.10.473: an empty state's message is body text, 13 everywhere (it took the size of whatever it sat in: 14 on a page, 13 in a table, 12 in a side panel); its title stays 15/600 and .empty-sub 12 */
  .empty .empty-ico{width:48px;height:48px;border-radius:7px;background:var(--navy-3);display:inline-flex;align-items:center;justify-content:center;margin-bottom:12px;color:var(--text-mute);}

  /* Dashboard split */
  .dash-split{display:grid;grid-template-columns:1.3fr 1fr;gap:18px;}
  /* ── Dashboard structure (v1.4.10.319) ──
     .dash-deck  — short status panels share a row instead of stacking.
     .dash-oklines — the one-line "all good" states sit together on ONE band.
     .dash-sec   — a light rule + heading between the dashboard's three
                   questions (your work / the estate / the analysis). */
  .dash-deck{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(380px,100%),1fr));gap:18px;margin-bottom:18px;}
  .dash-deck > .panel{margin-bottom:0;}
  .dash-oklines{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));gap:10px;margin-bottom:18px;}
  .dash-oklines > .dash-okline{margin-bottom:0;}
  .dash-sec{display:flex;align-items:center;gap:12px;margin:26px 0 14px;}
  .dash-sec > span{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
    color:var(--text-mute);white-space:nowrap;}
  .dash-sec::after{content:'';flex:1;height:1px;background:var(--line);}
  @media(max-width:700px){
    .dash-deck,.dash-oklines{grid-template-columns:1fr;gap:12px;}
    .dash-sec{margin:20px 0 11px;}
  }

  @media(max-width:1100px){.dash-split{grid-template-columns:1fr;}}
  /* ── Dashboard: asset portfolio widget ── */
  .dash-asset-figs{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:18px;}
  .dash-asset-figs .daf{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:12px 13px;}
  .dash-asset-figs .daf .v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;}
  .dash-asset-figs .daf .l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin-top:6px;}
  .dash-meter{margin-bottom:14px;}
  .dash-meter .dm-row{display:flex;justify-content:space-between;font-size:12px;color:var(--text-mute);margin-bottom:6px;}
  .dash-meter .dm-row span:last-child{color:var(--text);font-weight:700;}   /* v1.4.10.473: a meter row reads like the hero's factor rows, 12/400 with the figure in bold (was 500 / 600) */
  .dash-meter .stack-bar{height:9px;border-radius:5px;}
  .dash-warr{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px;}
  .dw-chip{flex:1;min-width:96px;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:9px 10px;font-size:11px;
    color:var(--text-mute);cursor:pointer;text-align:left;font-weight:500;transition:all .14s;display:flex;flex-direction:column;gap:2px;}
  .dw-chip b{font-size:20px;font-weight:600;letter-spacing:-.02em;color:var(--text);}
  .dw-chip:hover{border-color:var(--brand-blue);transform:translateY(-1px);}
  .dw-chip.ok b{color:var(--ok);} .dw-chip.warn b{color:var(--warn);} .dw-chip.err b{color:var(--err);}
  .dw-chip.ok{border-color:rgba(34,197,94,.3);} .dw-chip.warn{border-color:rgba(245,158,11,.3);} .dw-chip.err{border-color:rgba(239,68,68,.3);}
  @media(max-width:560px){.dash-asset-figs{grid-template-columns:repeat(2,1fr);}}
  /* ── Dashboard: upcoming maintenance list ── */
  .dash-maint{display:flex;flex-direction:column;gap:2px;}
  .dmt-row{display:flex;align-items:center;gap:13px;padding:11px 8px;border-radius:6px;cursor:pointer;transition:background .14s;}
  .dmt-row:hover{background:var(--bg);}
  .dmt-row + .dmt-row{border-top:1px solid var(--line);border-radius:0;}
  .dmt-date{flex-shrink:0;width:52px;text-align:center;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:6px 2px;}
  .dmt-date .d{font-size:12px;font-weight:700;letter-spacing:-.02em;line-height:1.1;}
  .dmt-date .t{font-size:11px;color:var(--text-mute);margin-top:1px;}
  .dmt-date.over{border-color:var(--err);background:rgba(239,68,68,.08);}
  .dmt-date.over .d{color:var(--err);}
  .dmt-main{flex:1;min-width:0;}
  .dmt-main .ttl{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .dmt-main .sub{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px;}

  /* ====================== DASHBOARD (command centre) ====================== */
  /* Hero band: greeting + quick chips + estate-health gauge */
  .dash-hero{display:grid;grid-template-columns:1fr auto;gap:26px;align-items:center;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:22px 26px;margin-bottom:18px;box-shadow:var(--shadow-sm);position:relative;overflow:hidden;}
  .dash-hero::before{content:'';position:absolute;inset:0;background:radial-gradient(130% 150% at 100% 0%,rgba(var(--bc-purple-rgb),.07),transparent 52%),radial-gradient(120% 140% at 0% 110%,rgba(var(--bc-accent-rgb),.06),transparent 48%);pointer-events:none;}
  .dash-hero::after{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--grad);}
  .dh-left{position:relative;z-index:1;min-width:0;}
  .dh-hi{font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.1;}
  .dh-sub{font-size:13px;color:var(--text-mute);margin-top:5px;}
  .dh-sub strong{color:var(--text);font-weight:600;}
  .dh-chips{display:flex;flex-wrap:wrap;gap:10px;margin-top:16px;}
  .dh-chip{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:8px 14px 9px;min-width:84px;}
  .dh-chip .v{font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;font-variant-numeric:tabular-nums;}
  .dh-chip .k{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin-top:5px;}
  .dh-chip.ok .v{color:var(--ok);} .dh-chip.warn .v{color:var(--warn);} .dh-chip.err .v{color:var(--err);} .dh-chip.blue .v{color:var(--brand-blue);}
  .dh-right{position:relative;z-index:1;flex-shrink:0;}
  .dh-health{display:flex;align-items:center;gap:22px;}
  .dh-gauge{flex-shrink:0;}
  .dh-facs{display:flex;flex-direction:column;gap:9px;min-width:150px;}
  .dh-fac .ff{display:flex;justify-content:space-between;font-size:12px;color:var(--text-mute);margin-bottom:4px;}
  .dh-fac .ff span:last-child{font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;}
  /* v1.4.10.426: "no data" is wider than a percentage — at phone width "Maintenance" ran into it. The value keeps a
     gap and, when the column is too narrow for both, drops to its own line at the right. */
  .dh-fac .ff{flex-wrap:wrap;column-gap:8px;}
  .dh-fac .ff span:last-child{margin-left:auto;white-space:nowrap;}
  .dh-fac-tr{height:6px;background:var(--bg);border-radius:4px;overflow:hidden;}
  .dh-fac-tr>div{height:100%;border-radius:4px;transition:width .5s cubic-bezier(.2,.7,.3,1);}

  /* KPI strip with sparklines.
     v1.4.10.204: the auto-fit minmax grid laid 7 tiles out 6+1 at 1440 — the
     rail orphan. renderDashboard now trims the count to {6,4,3,2,1} and stamps
     dkn-N, and these rules give each count explicit columns that divide at
     every width (6→6/3/2, 4→4/2/2, 3→3/3/1). auto-fit stays only as the
     fallback for a strip without a dkn class. */
  .dash-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(196px,100%),1fr));gap:14px;margin-bottom:18px;}
  .dash-kpis.dkn-6{grid-template-columns:repeat(6,1fr);}
  .dash-kpis.dkn-4{grid-template-columns:repeat(4,1fr);}
  .dash-kpis.dkn-3{grid-template-columns:repeat(3,1fr);}
  .dash-kpis.dkn-2{grid-template-columns:repeat(2,1fr);}
  .dash-kpis.dkn-1{grid-template-columns:1fr;}
  @media(max-width:1099px){
    .dash-kpis.dkn-6{grid-template-columns:repeat(3,1fr);}
    .dash-kpis.dkn-4{grid-template-columns:repeat(2,1fr);}
  }

  /* v1.4.10.204: the attention band — urgent counts as click-through chips, or
     one slim all-clear line. Sits between the KPI rail and the first panel. */
  /* v1.4.10.484: the attention band is a panel of tiles (a head, then one tile per thing: icon, count, label, the way in),
     urgent first. It was one line of coloured pills that wrapped into a jumble with six or more. */
  .dash-attn{display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:0;margin-bottom:18px;box-shadow:var(--shadow-sm);}
  .dash-attn .da-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin-right:2px;}
  .da-head{display:flex;align-items:center;gap:12px;padding:14px 18px 0;}
  .da-ttl{min-width:0;} .da-ttl h3{margin:0;font-size:15px;font-weight:600;line-height:1.3;} .da-sub{font-size:12px;color:var(--text-mute);margin-top:1px;line-height:1.4;}
  .da-pills{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end;}
  .da-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px;padding:12px 18px 16px;}
  .da-item{--da-c:var(--brand-blue);display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto auto;align-items:center;column-gap:10px;row-gap:1px;text-align:left;
    padding:10px 12px 10px 11px;border:1px solid var(--line);border-left:3px solid var(--da-c);border-radius:12px;background:var(--surface);color:var(--text);cursor:pointer;font:inherit;min-height:56px;
    transition:transform .12s,box-shadow .12s,border-color .12s;}
  .da-item.err{--da-c:var(--err);} .da-item.warn{--da-c:#D97706;} .da-item.blue{--da-c:var(--brand-blue);}
  .da-item:hover,.da-item:focus-visible{transform:translateY(-1px);box-shadow:var(--shadow-sm);border-color:color-mix(in srgb,var(--da-c) 40%,var(--line));border-left-color:var(--da-c);outline:none;}
  .da-item-i{grid-row:1/3;width:32px;height:32px;border-radius:9px;display:inline-grid;place-items:center;flex:none;background:color-mix(in srgb,var(--da-c) 12%,var(--surface));color:var(--da-c);}
  .da-item-i svg{width:16px;height:16px;}
  .da-item-v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.1;color:var(--da-c);font-variant-numeric:tabular-nums;}
  .da-item-l{grid-column:2;font-size:12px;color:var(--text-mute);line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .da-item-go{grid-row:1/3;grid-column:3;display:inline-flex;color:var(--text-dim);opacity:0;transform:translateX(-4px);transition:opacity .18s,transform .18s;}
  .da-item-go svg{width:14px;height:14px;}
  .da-item:hover .da-item-go,.da-item:focus-visible .da-item-go{opacity:1;transform:none;}
  .da-chip{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--line);border-radius:999px;padding:5px 12px;font-size:12px;font-weight:500;background:var(--bg-2);color:var(--text);cursor:pointer;transition:transform .12s,box-shadow .12s;}
  .da-chip b{font-weight:600;}   /* v1.4.10.473: the count in a 12/500 chip at 600, the chip's own emphasis (was 700) */
  .da-chip:hover{transform:translateY(-1px);box-shadow:var(--shadow-sm);}
  .da-chip.err{border-color:color-mix(in srgb,var(--err) 45%,var(--line));background:color-mix(in srgb,var(--err) 9%,var(--surface));color:var(--err);}
  .da-chip.warn{border-color:color-mix(in srgb,var(--warn) 45%,var(--line));background:color-mix(in srgb,var(--warn) 10%,var(--surface));color:#8a5a00;}
  .da-chip.blue{border-color:color-mix(in srgb,var(--brand-blue) 40%,var(--line));background:color-mix(in srgb,var(--brand-blue) 8%,var(--surface));color:var(--brand-blue);}
  .dash-attn.ok{color:var(--text-mute);font-size:13px;font-weight:600;}
  .da-dot{width:9px;height:9px;border-radius:50%;background:var(--ok);flex-shrink:0;box-shadow:0 0 0 3px color-mix(in srgb,var(--ok) 18%,transparent);}

  /* v1.4.10.204: one-line healthy state for the Ody block. */
  .dash-okline{display:flex;align-items:center;gap:10px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:11px 14px;margin-bottom:18px;box-shadow:var(--shadow-sm);font-size:13px;font-weight:600;color:var(--text);cursor:pointer;}
  .dash-okline:hover{box-shadow:var(--shadow-md);}
  .dash-okline .dol-go{margin-left:auto;display:inline-flex;color:var(--text-dim);}
  .dash-okline .dol-go svg{width:16px;height:16px;}
  .dk{position:relative;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:15px 17px;box-shadow:var(--shadow-sm);overflow:hidden;transition:transform .15s,box-shadow .15s;}
  .dk::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--brand-blue);opacity:.9;}
  .dk.ok::before{background:var(--ok);} .dk.warn::before{background:var(--warn);} .dk.err::before{background:var(--err);}
  .dk.purple::before{background:var(--brand-purple);} .dk.blue::before{background:var(--grad);} .dk.muted::before{background:var(--text-dim);}
  .dk.clickable{cursor:pointer;}
  .dk:hover{transform:translateY(-2px);box-shadow:var(--shadow-md);}
  .dk-head{display:flex;align-items:center;justify-content:space-between;gap:8px;}
  .dk-l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;}
  .dk-i{color:var(--text-dim);display:inline-flex;flex-shrink:0;}
  .dk-i svg{width:16px;height:16px;}
  .dk-v{font-family:var(--font-display);font-size:30px;font-weight:700;letter-spacing:-.03em;line-height:1.05;margin:9px 0 3px;display:flex;align-items:center;gap:8px;font-variant-numeric:tabular-nums;}
  .dk.ok .dk-v{color:var(--ok);} .dk.warn .dk-v{color:var(--warn);} .dk.err .dk-v{color:var(--err);} .dk.purple .dk-v{color:var(--brand-purple);}
  .dk-s{font-size:12px;color:var(--text-mute);}
  .dk-spark{margin-top:9px;height:30px;}
  .dk-spark .ins-spark{width:100%;display:block;}

  /* Site health ranking rows */
  .dsr-head,.dsr{display:grid;grid-template-columns:1.4fr 2.2fr auto auto;gap:14px;align-items:center;}
  .dsr-head{padding:0 8px 8px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;}
  .dsr-head span:nth-child(3),.dsr-head span:nth-child(4){text-align:right;}
  .dsr{padding:11px 8px;border-radius:6px;cursor:pointer;transition:background .14s;}
  .dsr+.dsr{border-top:1px solid var(--line);border-radius:0;}
  .dsr:hover{background:var(--bg);}
  .dsr-name{font-weight:600;font-size:13px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .dsr-name .dsr-meta{font-size:11px;color:var(--text-mute);font-weight:500;margin-top:2px;}
  .dsr-bar .stack-bar{height:10px;border-radius:5px;}
  .dsr-pct{font-size:13px;font-weight:700;text-align:right;font-variant-numeric:tabular-nums;min-width:42px;}
  .dsr-pct.ok{color:var(--ok);} .dsr-pct.warn{color:var(--warn);} .dsr-pct.err{color:var(--err);}
  .dsr-tix{text-align:right;min-width:34px;}

  @media(max-width:760px){
    .dash-hero{grid-template-columns:1fr;gap:14px;padding:16px;}
    .dh-right{width:100%;}
    .dh-health{justify-content:space-between;}
    .dh-hi{font-size:18px;}
    /* v1.4.10.204: every disciplined count reads as two columns on a phone
       (6→3 rows, 4→2, 2→1); a lone third tile in dkn-3 takes the full row. */
    .dash-kpis, .dash-kpis.dkn-6, .dash-kpis.dkn-4, .dash-kpis.dkn-3, .dash-kpis.dkn-2{grid-template-columns:1fr 1fr;gap:10px;}
    .dash-kpis.dkn-3 .dk:last-child{grid-column:1 / -1;}
    .dash-attn{padding:0;} .da-head{padding:12px 14px 0;} .da-grid{padding:10px 14px 14px;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:8px;}   /* v1.4.10.484 */
    .da-item-l{white-space:normal;overflow:visible;text-overflow:clip;}   /* v1.4.10.484: the label wraps on a phone ("tasks ove…") */
    /* The map earns its place on a phone at half height — 410px of tiles was a
       whole screen before the first issue row. */
    #dash-map{height:240px !important;}
    /* Trends: four history tiles read as 2×2 instead of four stacked rows
       (min-width:170 forced one per row at 366px — a 657px panel of sparklines). */
    .dtr-tile{min-width:0 !important;flex:1 1 calc(50% - 6px) !important;}
    .dsr-head,.dsr{grid-template-columns:1fr auto auto;}
    .dsr-bar{display:none;}
    .dsr-head span:nth-child(2){display:none;}
  }
  @media(max-width:430px){ .dash-kpis .dk{padding:12px 13px;} }

  /* ══ v1.4.10.269 — THE DASHBOARD HERO ON AN iPHONE ═════════════════════════
     MEASURED, at 375x667 (iPhone SE/8) and 390x844 (iPhone 14/15/16):
       .dash-hero  content box 317px   grid-template-columns resolved to 362px
                   scrollWidth 394  clientWidth 349   →  45px CLIPPED AWAY
     The chain: .dh-right had `min-width:auto` (the grid default), so its
     min-content set the track. Its min-content is .dh-health, a flex row of
     .dh-gauge — an SVG carrying hard width="220" height="128" attributes — plus
     a 22px gap plus .dh-facs pinned to min-width:120px. 220 + 22 + 120 = 362,
     a hard floor that no iPhone width can satisfy. At 430px (Pro Max) the box
     is 372px and it fits, which is exactly why this looked like "some iPhones".

     WHY NO BATTERY CAUGHT IT: .dash-hero is overflow:hidden. Content wider than
     the box is not scrolled and does not push the page sideways — it is
     silently cut off. t/v233.js asserts "nothing pushes the page sideways" and
     passes 25/25 on the broken build, because the clipping IS the containment.
     t/v269.js measures scrollWidth vs clientWidth on clipping boxes instead.

     The fix releases the floor at every link in the chain rather than shaving
     one number down until it happens to fit: the track may shrink, the gauge
     scales through its viewBox (the width/height attributes are presentational
     and CSS overrides them), and the factor bars keep a readable 96px. */
  .ins-gauge-svg{max-width:100%;height:auto;}

  /* ── v1.4.10.269, the same clipping fault elsewhere ────────────────────────
     A `<select>` is sized by its WIDEST OPTION, so a picker listing ICC's room
     names ("C02-C09_MEET C2.1-Meeting Room 1 Pyrmont …") renders 510px wide
     inside a 309px panel and is cut off — measured on the Devices page at
     375px. The `min-width:0` that prevents this already existed but was scoped
     to `.asset-toolbar .atb-sel`, so only the asset register was protected.
     The constraint belongs to the component, not to one page that happens to
     use it. Desktop is untouched: the rule only applies below 760px, where a
     500px control cannot fit by definition. */
  @media(max-width:760px){
    .atb-sel{min-width:0;max-width:100%;}
    .atb-sel select{min-width:0;max-width:100%;width:100%;text-overflow:ellipsis;}
  }
  /* Chart legend labels were cut mid-word with no ellipsis — a monitoring alert
     reading "[Monitor] #AST61029 PS-1600G — error sta" is worse than a truncated
     one, because nothing signals that there is more. */
  .ins-leg .lab{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

  /* ── The Devices estate headers on a phone (v1.4.10.269) ───────────────────
     Each tier's header is one non-wrapping flex row: an id block capped at
     34–36% of the width, then the rollup chips, then the chevron. At 375px that
     cap leaves 130px for a name AND its meta line, so "AV Integrator · 1 client
     · 1 site · 354 devices" rendered as "AV Integrator · 1 client · 1 s…", and
     the site tier — which has no ellipsis, being a container rather than a text
     run — was clipped outright by .est-site's overflow:hidden (116px of it,
     after the table scroller above took the other 368px).

     A percentage cap is a desktop idea: it exists to stop a long client name
     eating the row on a wide screen. On a phone there is no row to share, so
     the cap is released and the chips take a line of their own.

     SCOPED UNDER THE HEAD ON PURPOSE. `.est-site-id{max-width:36%}` is defined
     ~3,300 lines BELOW this block, and a media query adds NO specificity — a
     bare `.est-site-id` here loses on source order and the rule silently does
     nothing (it did, on the first cut: measured 116px still clipped). The
     descendant selector makes it 0,2,0 and order-independent. */
  @media(max-width:760px){
    .est-int-head,.est-cli-head,.est-site-head{flex-wrap:wrap;}
    .est-int-head .est-int-id,
    .est-cli-head .est-cli-id,
    .est-site-head .est-site-id{max-width:none;flex:1 1 auto;min-width:0;}
    .est-int-head .est-roll,
    .est-cli-head .est-roll,
    .est-site-head .est-roll{flex:1 1 100%;min-width:0;}
    .est-roll .rlchips{margin-top:2px;}
    /* The LOCATION row needs the same treatment, and for a reason worth stating:
       a COLLAPSED location has no table, so `.est-loc:has(table.dt)` above
       correctly does not match it and it never became a scroller. Its head row
       is still a nowrap flex of chevron + name + meta + rollup chips, measured
       343px inside 227px — which is the whole of the 116px that survived the
       table fix. Wrapping it costs nothing when it IS expanded. */
    .est-loc-head{flex-wrap:wrap;}
    .est-loc-head .est-loc-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
    .est-loc-head .rlchips{margin:2px 0 0 0;flex:1 1 100%;}
  }
  @media(max-width:760px){
    .dh-right{min-width:0;}
    .dh-health{gap:14px;align-items:center;}
    .dh-gauge{min-width:0;flex:1 1 132px;max-width:220px;}
    .dh-gauge .ins-gauge-svg{width:100%;}
    .dh-facs{min-width:0;flex:1 1 96px;}
  }
  /* Under ~340px (iPhone SE 1st gen, or a phone at large text sizes) even the
     shrunk pair is cramped — the gauge takes the full width and the factor bars
     sit beneath it rather than being squeezed to illegibility. */
  @media(max-width:340px){
    .dh-health{flex-wrap:wrap;}
    .dh-gauge{flex:1 1 100%;max-width:none;}
    .dh-facs{flex:1 1 100%;}
  }

  /* ── Maintenance: the page's stat rail (v1.4.10.221) ──
     Six figures, each one that maps to a status doubling as its filter. Pinned
     to repeat(6) so the tiles can never orphan one onto a row of its own — the
     .akpi-rail lesson from v203, stated at full specificity from the start. */
  .mt-railwrap{padding:0 20px 4px;}
  .mt-rail{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-bottom:4px;}
  .mt-stat{display:flex;flex-direction:column;align-items:flex-start;gap:1px;text-align:left;
    border:1px solid var(--line);border-radius:7px;background:var(--surface);padding:11px 13px;
    cursor:pointer;transition:border-color .14s,background .14s,box-shadow .14s;min-width:0;}
  .mt-stat[disabled]{cursor:default;}
  .mt-stat:not([disabled]):hover{border-color:var(--brand-blue);background:var(--bg);}
  .mt-stat.on{border-color:var(--brand-blue);box-shadow:inset 0 0 0 1px var(--brand-blue);background:var(--bg);}
  .mt-stat-v{font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.1;}
  .mt-stat-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);   /* v1.4.10.473: KPI label 11/600 uppercase .06em (was 12/600 sentence case) */white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
  .mt-stat-s{font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
  .mt-stat.err .mt-stat-v{color:var(--err);} .mt-stat.warn .mt-stat-v{color:var(--warn);}
  .mt-stat.ok .mt-stat-v{color:var(--ok);}   .mt-stat.muted .mt-stat-v{color:var(--text-dim);}
  .mt-table .mt-astcell{font-size:12px;font-weight:600;}
  .mt-table tr.mt-late td:first-child{box-shadow:inset 3px 0 0 var(--err);}

  /* The month strip: what this month holds, and where the work actually is
     when it holds nothing (v1.4.10.221 — ICC opens on an empty month with 463
     items filed under other ones). */
  .mt-msum{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:0 0 12px;padding:10px 14px;
    border:1px solid var(--line);border-radius:7px;background:var(--surface);}
  .mt-msum.quiet{background:var(--bg);border-style:dashed;}
  .mt-msum-t{font-size:12px;color:var(--text-mute);}
  .mt-msum-n{font-family:var(--font-display);font-weight:700;font-size:15px;color:var(--text);margin-right:3px;}
  .mt-msum-none{font-weight:600;color:var(--text-mute);}
  .mt-msum-j{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto;}
  .mt-jump{border:1px solid var(--line);background:var(--surface);border-radius:6px;padding:5px 10px;
    font-size:12px;font-weight:500;color:var(--text-mute);cursor:pointer;white-space:nowrap;}
  .mt-jump:hover{border-color:var(--brand-blue);color:var(--text);}
  .mt-jump b{color:var(--text);font-weight:700;}
  .mt-jump.err{border-color:color-mix(in srgb,var(--err) 40%,transparent);color:var(--err);}
  .mt-jump.err b{color:var(--err);}
  .mtcal-up-ast{font-size:11px;color:var(--text-dim);margin-top:2px;display:flex;align-items:center;gap:4px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mtcal-up-ast svg{width:11px;height:11px;flex-shrink:0;}
  .mtcal-chip.late{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--err) 45%,transparent);}
  .mtv-astlink{color:var(--brand-blue);cursor:pointer;font-weight:600;display:inline-flex;align-items:center;gap:5px;}
  .mtv-astlink:hover{text-decoration:underline;}
  .mtv-astlink svg{width:12px;height:12px;}

  /* The maintenance editor's asset picker (v1.4.10.221) */
  .me-astnone{border:1px dashed var(--line);border-radius:6px;padding:12px 14px;font-size:12px;
    color:var(--text-dim);display:flex;align-items:center;gap:8px;}
  .me-astpickbtn{width:100%;text-align:left;border:1px solid var(--line);border-radius:6px;background:var(--surface);
    padding:12px 14px;font-size:13px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:8px;color:var(--text);}
  .me-astpickbtn:hover{border-color:var(--brand-blue);background:var(--bg);}
  .me-astsel{display:flex;align-items:center;gap:11px;border:1px solid var(--line);border-radius:6px;
    background:var(--surface);padding:10px 12px;}
  .me-astico{flex-shrink:0;width:32px;height:32px;border-radius:6px;background:var(--bg);display:flex;
    align-items:center;justify-content:center;color:var(--brand-blue);}
  .me-astmain{flex:1;min-width:0;}
  .me-asttag{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .me-astpanel{margin-top:8px;}

  /* ── The picker's scope + asset-number search (v1.4.10.222) ── */
  .me-astscope{display:inline-flex;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:3px;gap:2px;margin-bottom:8px;}
  .me-astsbtn{display:inline-flex;align-items:center;gap:6px;border:none;background:transparent;color:var(--text-mute);
    font-size:12px;font-weight:600;padding:6px 11px;border-radius:6px;cursor:pointer;transition:all .14s;white-space:nowrap;}
  .me-astsbtn svg{width:13px;height:13px;}
  .me-astsbtn:hover{color:var(--text);}
  .me-astsbtn.on{background:var(--surface);color:var(--brand-blue);box-shadow:var(--shadow-sm);}
  .me-astroom{font-size:12px;color:var(--text-mute);font-weight:600;margin:0 0 8px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .me-astroom.quiet{font-weight:400;color:var(--text-dim);}
  .me-astq{width:100%;}
  .me-astfoot{display:flex;align-items:center;gap:8px;margin-top:6px;}
  .me-astmiss{padding:8px 2px;font-size:12px;color:var(--text-dim);display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
  .me-astwiden{flex-shrink:0;}

  /* ── The year at a glance (v1.4.10.222) ── */
  .mtyr{border:1px solid var(--line);border-radius:7px;background:var(--surface);padding:10px 14px 8px;margin:0 0 12px;}
  .mtyr-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px;}
  .mtyr-y{font-family:var(--font-display);font-size:14px;font-weight:700;letter-spacing:-.02em;min-width:44px;text-align:center;}
  .mtcal-navbtn.sm{width:26px;height:26px;border-radius:6px;}
  .mtcal-navbtn.sm svg{width:14px;height:14px;}
  .mtyr-t{font-size:12px;color:var(--text-mute);margin-left:6px;}
  .mtyr-t b{color:var(--text);font-family:var(--font-display);font-weight:700;}
  .mtyr-out{font-size:12px;color:var(--text-dim);margin-left:auto;}
  .mtyr-out b{color:var(--text-mute);font-weight:700;}
  .mtyr-bars{display:grid;grid-template-columns:repeat(12,1fr);gap:5px;align-items:end;}
  .mtyr-b{display:flex;flex-direction:column;align-items:center;gap:2px;border:none;background:transparent;
    cursor:pointer;padding:2px 0 3px;border-radius:6px;transition:background .13s;min-width:0;}
  .mtyr-b:hover{background:var(--bg);}
  .mtyr-col{width:100%;height:34px;display:flex;align-items:flex-end;justify-content:center;}
  .mtyr-fill{width:70%;max-width:26px;min-height:2px;border-radius:4px 4px 2px 2px;
    background:color-mix(in srgb,var(--brand-blue) 72%,transparent);display:flex;align-items:flex-end;overflow:hidden;}
  .mtyr-late{width:100%;background:var(--err);border-radius:0 0 2px 2px;}
  .mtyr-n{font-size:11px;font-weight:700;color:var(--text-mute);line-height:1;min-height:10px;}
  .mtyr-m{font-size:11px;color:var(--text-dim);font-weight:600;line-height:1;}
  .mtyr-b.on .mtyr-m{color:var(--brand-blue);}
  .mtyr-b.on{background:var(--bg);box-shadow:inset 0 0 0 1px var(--line);}
  .mtyr-b.zero .mtyr-col{opacity:.45;}
  .mtyr-b.zero .mtyr-fill{background:var(--line);min-height:2px;height:2px !important;}

  /* ── The overdue backlog in the calendar's side rail (v1.4.10.222) ── */
  .mtcal-od{border:1px solid color-mix(in srgb,var(--err) 32%,var(--line));border-radius:7px;
    background:color-mix(in srgb,var(--err) 4%,var(--surface));padding:10px 11px;margin-bottom:14px;}
  .mtcal-odh{display:flex;align-items:center;gap:6px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;
    font-weight:600;color:var(--err);margin:0 0 8px;}
  .mtcal-odh svg{width:13px;height:13px;}
  .mtcal-odn{font-family:var(--font-display);font-size:13px;letter-spacing:-.02em;text-transform:none;}   /* v1.4.10.473: the count is a figure, not part of the uppercase label it sits in */
  .mtcal-odrow{display:flex;align-items:center;gap:9px;width:100%;text-align:left;border:none;background:transparent;
    padding:6px 4px;border-radius:6px;cursor:pointer;min-width:0;}
  .mtcal-odrow:hover{background:var(--surface);}
  .mtcal-odage{flex-shrink:0;width:38px;text-align:center;font-family:var(--font-display);font-weight:700;
    font-size:14px;color:var(--err);line-height:1;}
  .mtcal-odage span{display:block;font-size:11px;font-weight:600;color:var(--text-dim);letter-spacing:.04em;}
  .mtcal-odmain{min-width:0;flex:1;display:flex;flex-direction:column;gap:1px;}
  .mtcal-odt{font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mtcal-odm{font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mtcal-odall{width:100%;margin-top:6px;border:1px solid color-mix(in srgb,var(--err) 35%,transparent);
    background:transparent;color:var(--err);border-radius:6px;padding:6px 8px;font-size:12px;font-weight:500;
    cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px;}
  .mtcal-odall:hover{background:color-mix(in srgb,var(--err) 8%,transparent);}
  .mtcal-odall svg{width:12px;height:12px;}
  .mtcal-chip-r{display:block;font-size:11px;opacity:.72;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}

  /* ── The job modal's hero, due state and quick actions (v1.4.10.222) ── */
  .mtv-hero{display:flex;align-items:center;gap:14px;flex-wrap:wrap;border:1px solid var(--line);border-radius:7px;
    background:var(--surface-2);padding:12px 14px;margin-bottom:14px;border-left:4px solid var(--c);}
  .mtv-hero-main{min-width:0;flex:1;}
  .mtv-hero-when{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700;letter-spacing:-.01em;}
  .mtv-hero-when svg{width:15px;height:15px;color:var(--text-mute);flex-shrink:0;}
  .mtv-hero-sub{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:7px;}
  .mtv-chip{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;border-radius:6px;
    padding:3px 8px;color:var(--c);background:color-mix(in srgb,var(--c) 12%,transparent);}
  .mtv-due{font-size:12px;font-weight:700;border-radius:6px;padding:3px 8px;
    background:var(--bg);border:1px solid var(--line);color:var(--text-mute);}
  .mtv-due.err{color:var(--err);border-color:color-mix(in srgb,var(--err) 40%,transparent);
    background:color-mix(in srgb,var(--err) 8%,transparent);}
  .mtv-due.warn{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 40%,transparent);
    background:color-mix(in srgb,var(--warn) 9%,transparent);}
  .mtv-due.muted{color:var(--text-dim);}
  .mtv-who{font-size:12px;color:var(--text-mute);}
  .mtv-who.none{color:var(--text-dim);font-style:italic;}
  .mtv-acts{display:flex;gap:8px;flex-wrap:wrap;flex-shrink:0;}
  .mtv-acts .btn svg{width:14px;height:14px;}
  .mtv-astcard{display:flex;align-items:center;gap:11px;width:100%;text-align:left;border:1px solid var(--line);
    border-radius:7px;background:var(--surface);padding:10px 12px;margin-bottom:14px;cursor:pointer;
    transition:border-color .14s,background .14s;}
  .mtv-astcard:hover{border-color:var(--brand-blue);background:var(--bg);}
  .mtv-astcard-m{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;}
  .mtv-astcard-t{font-weight:600;font-size:13px;   /* v1.4.10.473: sub-heading 13/600 (was 700) */white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mtv-astcard-go{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:700;color:var(--brand-blue);}
  .mtv-astcard-go svg{width:12px;height:12px;}

  /* Asset detail → Maintenance jobs */
  .ap-mj-h{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);
    font-weight:600;margin:0 0 7px;display:flex;align-items:center;gap:7px;}
  .ap-mj-row{cursor:pointer;}
  .ap-mj-row:hover{background:var(--bg);}

  @media(max-width:1100px){ .mt-rail{grid-template-columns:repeat(3,1fr);} }
  @media(max-width:640px){
    .mt-railwrap{padding:0 14px 4px;}
    .mt-rail{grid-template-columns:repeat(2,1fr);gap:8px;}
    .mt-stat{padding:9px 11px;min-height:44px;}
    .mt-stat-v{font-size:20px;}
    .mt-msum{gap:8px;padding:9px 12px;}
    .mt-msum-j{margin-left:0;width:100%;}
    .mt-jump{min-height:34px;display:inline-flex;align-items:center;}
    .me-astpickbtn,.me-astsel,.me-astnone{min-height:44px;}
    /* Tap-target floor for everything the picker and the job modal ADD, not
       just the controls that open them — the v215 lesson, fourth outing. */
    /* 40px, not 44 — the .ex-sel phone floor is declared later in this sheet
       and ties on specificity, so a 44 stated here LOSES and the rule would
       be describing something that does not happen. Measured 40px, reachable
       by hit-test, 16px type so iOS does not zoom the form (the v213 rule). */
    .me-astsbtn,.me-astq{min-height:40px;}
    .me-astwiden,.mtcal-odall,.mtv-acts .btn{min-height:40px;}
    .mtcal-odrow{min-height:44px;}
    .mtyr-bars{gap:3px;} .mtyr-col{height:28px;} .mtyr-b{min-height:44px;}
    .mtyr-out{margin-left:0;width:100%;}
    .mtv-hero{gap:10px;} .mtv-acts{width:100%;}
    .mtv-acts .btn{flex:1;justify-content:center;}
  }

  /* ── Maintenance: list/calendar view toggle ── */
  .mt-head-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
  .mt-viewseg{display:inline-flex;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:2px;gap:2px;}
  .mt-vbtn{display:inline-flex;align-items:center;gap:6px;border:none;background:transparent;color:var(--text-mute);font-size:12px;font-weight:600;padding:4px 12px;   /* v1.4.10.473: track 2px and segments 4px tall-padding, so the switch stands 32 beside the 32px Print / Schedule buttons (was 38) */border-radius:6px;cursor:pointer;transition:all .14s;white-space:nowrap;}
  .mt-vbtn svg{width:15px;height:15px;}
  .mt-vbtn:hover{color:var(--text);}
  .mt-vbtn.active{background:var(--surface);color:var(--brand-blue);box-shadow:var(--shadow-sm);}
  @media(max-width:640px){ .mt-viewseg{padding:0;border:0;outline:1px solid var(--line);outline-offset:-1px;} }   /* v1.4.10.473: 40 beside the 40px Print / Schedule buttons (the 3px track around 40px buttons made it 48, the border alone 42); the line is drawn inside the box */

  /* ── Maintenance month-grid calendar ── */
  .mtcal-toolbar{display:flex;align-items:center;gap:12px;margin-bottom:14px;flex-wrap:wrap;}
  .mtcal-nav{display:flex;gap:6px;}
  .mtcal-navbtn{width:34px;height:34px;border:1px solid var(--line);background:var(--surface);border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-mute);}
  .mtcal-navbtn:hover{background:var(--bg);color:var(--text);}
  .mtcal-month{font-family:var(--font-display);font-size:16px;font-weight:600;letter-spacing:-.012em;min-width:150px;}
  .mtcal-today{flex-shrink:0;}
  .mtcal-legend{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-left:auto;}
  .mtcal-leg{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--text-mute);font-weight:500;}
  .mtcal-leg i{width:10px;height:10px;border-radius:3px;display:inline-block;}
  .mtcal-wrap{display:grid;grid-template-columns:1fr 300px;gap:18px;align-items:start;}
  .mtcal-grid{border:1px solid var(--line);border-radius:8px;overflow:hidden;background:var(--surface);}
  .mtcal-dow{display:grid;grid-template-columns:repeat(7,1fr);background:var(--bg);border-bottom:1px solid var(--line);}
  .mtcal-dow span{padding:8px 10px;font-size:11px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;}
  /* v1.4.10.328: minmax(0,1fr), not 1fr — a plain 1fr track keeps its
     content's min-content width, so a chip carrying a long job title (nowrap
     ellipsis inside a flex chip is not a width floor) widened its column to
     495px and the seven-column month became 2,158px inside a 1,020px grid
     with overflow:hidden. Wednesday to Saturday were simply cut off on a real
     month of jobs (the v327 .fs-grid lesson, in the calendar). */
  .mtcal-body{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));grid-auto-rows:minmax(98px,1fr);}
  .mtcal-dow{grid-template-columns:repeat(7,minmax(0,1fr));}
  .mtcal-cell{min-width:0;overflow:hidden;}
  .mtcal-chip{min-width:0;} .mtcal-chip-t{min-width:0;flex:1 1 auto;}
  .mtcal-cell{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:6px 6px 4px;min-height:98px;position:relative;transition:background .12s;}
  .mtcal-cell[onclick]{cursor:pointer;}
  .mtcal-cell:nth-child(7n){border-right:none;}
  .mtcal-cell[onclick]:hover{background:var(--bg);}
  .mtcal-cell.dim{background:var(--bg);}
  .mtcal-cell.dim .mtcal-dnum{color:var(--text-dim);}
  .mtcal-cell.today .mtcal-dnum{background:var(--grad);color:#fff;border-radius:50%;}
  .mtcal-dnum{font-size:12px;font-weight:600;width:24px;height:24px;display:flex;align-items:center;justify-content:center;margin-bottom:3px;color:var(--text);}
  .mtcal-chips{display:flex;flex-direction:column;gap:3px;}
  .mtcal-chip{--c:var(--bc-blue-v1);display:flex;align-items:center;width:100%;text-align:left;border:none;background:color-mix(in srgb,var(--c) 13%,transparent);border-left:3px solid var(--c);border-radius:5px;padding:2px 6px;cursor:pointer;font-size:12px;line-height:1.35;color:var(--text);overflow:hidden;}
  .mtcal-chip:hover{background:color-mix(in srgb,var(--c) 24%,transparent);}
  .mtcal-chip.done{opacity:.55;text-decoration:line-through;}
  .mtcal-chip-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mtcal-chip-t b{font-weight:700;}
  .mtcal-more{border:none;background:none;color:var(--text-mute);font-size:11px;font-weight:500;cursor:pointer;padding:1px 6px;text-align:left;}
  .mtcal-more:hover{color:var(--text);}
  .mtcal-side{border:1px solid var(--line);border-radius:8px;background:var(--surface);overflow:hidden;}
  .mtcal-side > h4{margin:0;padding:13px 16px;font-size:15px;font-weight:600;border-bottom:1px solid var(--line);background:var(--bg);}
  .mtcal-up{display:flex;gap:11px;align-items:center;width:100%;text-align:left;border:none;border-bottom:1px solid var(--line);background:none;padding:11px 14px;cursor:pointer;}
  .mtcal-up:last-child{border-bottom:none;}
  .mtcal-up:hover{background:var(--bg);}
  .mtcal-up-date{--c:var(--bc-blue-v1);flex-shrink:0;width:46px;height:46px;border-radius:6px;background:color-mix(in srgb,var(--c) 12%,transparent);display:flex;flex-direction:column;align-items:center;justify-content:center;border:1px solid color-mix(in srgb,var(--c) 30%,transparent);}
  .mtcal-up-mon{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;   /* v1.4.10.473: a 10px badge is uppercase */color:color-mix(in srgb,var(--c) 80%,var(--text));}
  .mtcal-up-day{font-size:18px;font-weight:700;line-height:1;letter-spacing:-.02em;color:color-mix(in srgb,var(--c) 80%,var(--text));}
  .mtcal-up-main{flex:1;min-width:0;}
  .mtcal-up-title{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mtcal-up-meta{font-size:11px;color:var(--text-mute);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mtcal-overdue{color:var(--err);font-weight:700;}
  .mtcal-empty{padding:20px;text-align:center;color:var(--text-dim);font-size:13px;}
  @media(max-width:1000px){ .mtcal-wrap{grid-template-columns:1fr;} }
  @media(max-width:680px){
    .mtcal-legend{width:100%;margin-left:0;gap:10px;}
    .mtcal-month{font-size:16px;min-width:0;flex:1;}
    .mtcal-body{grid-auto-rows:minmax(74px,1fr);}
    .mtcal-cell{min-height:74px;padding:4px 3px 3px;}
    .mtcal-dow span{padding:7px 4px;font-size:11px;text-align:center;}
    .mtcal-dnum{font-size:12px;width:21px;height:21px;margin-bottom:2px;}
    /* On phones the chips become compact dots-with-text; hide the time to save room */
    .mtcal-chip{font-size:11px;padding:1px 4px;border-left-width:3px;}
    .mtcal-chip-t b{display:none;}
    .mtcal-more{font-size:11px;padding:0 4px;}
  }
  @media(max-width:430px){
    .mtcal-body{grid-auto-rows:minmax(58px,1fr);}
    .mtcal-cell{min-height:58px;}
    /* Collapse multi-chip days to a colour bar strip so cells never overflow */
    .mtcal-chip-t{font-size:0;}
    .mtcal-chip{height:7px;padding:0;border-radius:3px;border-left:none;}
    .mtcal-chips{gap:2px;}
  }

  /* Data tables: let wide tables scroll horizontally instead of crushing/clipping */
  .panel-body.flush{overflow-x:auto;-webkit-overflow-scrolling:touch;}
  .panel-body.flush .dt{min-width:680px;}
  /* v1.4.10.473: the 680px floor is a phone's (a full-width table there scrolls rather than crushing its columns). Past
     760px it is the panel's own width at most: a half-width panel narrower than 680 (crew People, 676 at 1440) scrolled
     sideways by a few px for a table that fitted. A table whose content is genuinely wider still scrolls. */
  @media (min-width:761px){ .panel-body.flush .dt{min-width:min(680px,100%);} }
  @media(max-width:920px){
    .ticket-detail{grid-template-columns:1fr;}
    .content{padding:16px;}
    .topbar{padding:16px 16px 4px;}
    .topbrand-inner{padding:0 16px;gap:12px;}
    /* Collapse the user chip to just the avatar on small screens */
    .topbrand .user-info{display:none;}
    .topbrand .brand-text small{display:none;}
    /* Keep search but let it shrink; site picker narrower */
    .topbrand .search-box input{width:160px;}
    .topbrand .search-box input:focus{width:180px;}
    .topbrand .site-picker{max-width:120px;min-width:0;flex-shrink:1;}
    .icon-btn{width:40px;height:40px;}
    /* v1.4.10.473: the header's fields grow with the icon buttons here (40, one row height); v1.4.10.508: the Ctrl K
       hint is gone everywhere, so the 12px right padding below is the rule at every width */
    .topbrand .site-picker,.topbrand .search-box input{height:40px;}
    .topbrand .search-box input{padding-right:12px;}
  }
  @media(max-width:600px){
    .topbrand .search-box{display:none;}   /* search via ⌘K / nav still works; saves room */
    .topbrand-inner{gap:10px;}
    .topbrand .site-picker{max-width:104px;min-width:0;flex-shrink:1;font-size:13px;}
    .kpi-grid{grid-template-columns:1fr 1fr;}
    .kpi .value{font-size:24px;}
  }
  @media(max-width:400px){
    .kpi-grid{grid-template-columns:1fr;}
  }
  /* ============ MOBILE: forms, modals, tables, headers ============ */
  @media(max-width:600px){
    /* Every two-column add/edit form collapses to a single column */
    .grid-2{grid-template-columns:1fr;gap:12px;}
    .detail-grid,.ast-grid,.ctl-grid,.ctl-tele,.remote-grid{grid-template-columns:1fr;}
    .nt-prio{grid-template-columns:repeat(2,1fr);}
    .site-stats{grid-template-columns:repeat(2,1fr);}
    /* Modal uses more of the screen, less wasted top inset */
    .modal-back{padding:14px 10px 28px;}
    .modal,#modal-inner.modal-wide,#modal-inner.modal-tkt,#modal-inner.modal-asset{max-width:100%;}
    .modal-head{padding:15px 16px;}
    .modal-body{padding:16px;}
    .ef-modal-body .ef-scroll{padding:16px;max-height:calc(100dvh - 168px);}
    .ef-modal-body .ef-foot{padding:12px 16px;}
    .ef-modal-body .ef-foot .btn{flex:1;justify-content:center;}
    .site-ed-body{max-height:none;}
    .site-ed-head{padding:16px;border-radius:0;}
    .site-ed-foot,.modal-foot{flex-wrap:wrap;}
    .site-ed-foot .btn,.modal-foot .btn{flex:1;justify-content:center;}
    /* Permission rows stack: capability label above a full-width segmented control.
       Scoped to .ef-modal-body so these win over the base .permrow rules, which
       are defined later in the stylesheet (media queries don't add specificity). */
    .ef-modal-body .permrow{flex-direction:column;align-items:stretch;gap:8px;}
    .ef-modal-body .permrow-l{min-width:0;}
    .ef-modal-body .permrow-r{width:100%;justify-content:space-between;}
    .ef-modal-body .permseg{flex:1;justify-content:center;}
    /* Panel + page headers wrap so action buttons drop below the title */
    .panel-head{flex-wrap:wrap;gap:10px;}
    .panel-head .head-actions{margin-left:0;width:100%;}
    .panel-head .head-actions .btn{flex:1;justify-content:center;}
    .topbar{flex-wrap:wrap;}
    .topbar-spacer{flex-basis:100%;height:0;}
  }
  @media(max-width:420px){
    .permseg{padding:4px 7px;font-size:12px;}
    .site-stats,.nt-prio{grid-template-columns:1fr 1fr;}
  }
  /* OAuth connector cards */
  .oauth-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(340px,100%),1fr));gap:14px;}
  .oauth-summary{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px;}
  .ocs-chip{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:6px 12px;border-radius:999px;background:var(--surface-2);color:var(--text-mute);border:1px solid var(--line);}
  .ocs-chip.ok{background:rgba(22,163,74,.1);color:#16A34A;border-color:rgba(22,163,74,.2);}
  .ocs-chip.warn{background:rgba(217,119,6,.1);color:var(--warn);border-color:rgba(217,119,6,.22);}
  .ocs-chip.err{background:rgba(220,38,38,.09);color:var(--err);border-color:rgba(220,38,38,.2);}
  .oauth-loading{color:var(--text-mute);font-size:13px;padding:14px;}
  .oauth-card{position:relative;border:1px solid var(--line);border-radius:8px;padding:16px;background:var(--surface);box-shadow:var(--shadow-sm);display:flex;flex-direction:column;gap:12px;transition:box-shadow .16s,border-color .16s;}
  .oauth-card:hover{box-shadow:var(--shadow-md);border-color:var(--line-2);}
  .oauth-card.is-connected{border-color:rgba(22,163,74,.32);}
  .oauth-card.is-connected::before{content:"";position:absolute;left:0;top:14px;bottom:14px;width:3px;border-radius:3px;background:var(--ok);}
  /* header: brand glyph + name/type + status */
  .oc-top{display:flex;align-items:center;gap:12px;}
  .oc-avatar{width:40px;height:40px;border-radius:6px;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:600;letter-spacing:.02em;color:#fff;background:var(--oc,#5A6B85);box-shadow:0 4px 12px -5px var(--oc,#5A6B85);}
  .oc-id{flex:1;min-width:0;}
  .oc-name{font-weight:600;font-size:15px;color:var(--text);line-height:1.2;letter-spacing:-.012em;}
  .oc-type{font-size:11px;color:var(--text-mute);margin-top:2px;}
  .oc-status{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:5px 10px 5px 8px;border-radius:999px;white-space:nowrap;background:var(--surface-2);color:var(--text-mute);}
  .oc-status i{width:7px;height:7px;border-radius:50%;background:currentColor;flex-shrink:0;}
  .oc-status.ok{background:rgba(22,163,74,.12);color:#16A34A;}
  .oc-status.ok i{box-shadow:0 0 0 3px rgba(22,163,74,.18);}
  .oc-status.err{background:rgba(220,38,38,.1);color:var(--err);}
  .oc-status.warn{background:rgba(217,119,6,.12);color:var(--warn);}
  .oc-status.muted{color:var(--text-dim);}
  /* device discovery strip */
  .oc-devices{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;}
  .oc-dev{border:1px solid var(--line);border-radius:6px;padding:11px 8px;text-align:center;background:var(--surface-2);}
  .oc-dev .n{font-size:20px;font-weight:600;letter-spacing:-.02em;color:var(--text);font-variant-numeric:tabular-nums;line-height:1;}
  .oc-dev .n.ok{color:#16A34A;} .oc-dev .n.warn{color:var(--warn);}
  .oc-dev .l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin-top:6px;}
  .oc-sync{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text-mute);margin-top:-2px;}
  .oc-sync svg{width:12px;height:12px;stroke:var(--text-mute);}
  .oc-empty{display:flex;align-items:flex-start;gap:8px;font-size:12px;color:var(--text-mute);line-height:1.45;background:var(--surface-2);border:1px dashed var(--line-2);border-radius:6px;padding:11px 12px;}
  .oc-empty svg{width:15px;height:15px;stroke:var(--text-mute);flex-shrink:0;margin-top:1px;}
  .oc-nodisc{font-size:12px;color:var(--text-mute);line-height:1.45;background:var(--surface-2);border-radius:6px;padding:9px 11px;}
  .oc-inherit{border-left:3px solid var(--brand-blue,#3B82F6);padding-left:9px;}
  /* credentials disclosure */
  .oc-creds{border:1px solid var(--line);border-radius:6px;overflow:hidden;}
  .oc-creds[open]{background:var(--surface-2);}
  .oc-creds > summary{cursor:pointer;list-style:none;padding:10px 13px;font-size:12px;font-weight:600;color:var(--text-mute);display:flex;align-items:center;gap:7px;user-select:none;}
  .oc-creds > summary::-webkit-details-marker{display:none;}
  .oc-creds > summary::before{content:"";width:6px;height:6px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(-45deg);transition:transform .15s;}
  .oc-creds[open] > summary::before{transform:rotate(45deg);}
  .oc-creds[open] > summary{border-bottom:1px solid var(--line);}
  .oc-creds .oauth-redirect{margin:12px 13px 0;}
  .oc-creds .oauth-fields{padding:12px 13px 0;margin-bottom:0;}
  .oc-creds-actions{padding:10px 13px 12px;}
  .oauth-note{font-size:12px;color:var(--text-mute);line-height:1.5;}
  .oauth-err{font-size:12px;color:var(--err);background:rgba(220,38,38,0.08);border-radius:6px;padding:8px 10px;line-height:1.45;}
  .oauth-redirect .lbl{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;margin-bottom:4px;}
  .oauth-redirect code{display:block;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;background:var(--surface);border:1px solid var(--line);border-radius:5px;padding:7px 9px;color:var(--text-mute);word-break:break-all;cursor:pointer;}
  .oauth-redirect code:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
  .oauth-fields{display:flex;flex-direction:column;gap:8px;}
  .oauth-fields input{width:100%;padding:9px 11px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;}
  .oauth-fields input:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .oauth-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
  .btn.sm{padding:6px 11px;font-size:12px;}
  .oauth-docs{font-size:12px;color:var(--text-mute);margin-left:auto;}
  .oauth-docs:hover{color:var(--brand-blue);}
  /* Site editor + maps + notifications */
  #modal-inner.modal-wide{max-width:760px;width:100%;}
  .site-ed-head{display:flex;align-items:flex-start;gap:14px;padding:20px 22px;background:linear-gradient(120deg,var(--brand-blue),var(--brand-purple));color:#fff;border-radius:8px 8px 0 0;}
  .site-ed-ico{width:42px;height:42px;border-radius:6px;background:rgba(255,255,255,0.18);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .site-ed-ico svg{stroke:#fff;}
  .site-ed-htext{flex:1;} .site-ed-htext h3{margin:0;font-size:16px;font-weight:600;letter-spacing:-.012em;color:#fff;} .site-ed-htext p{margin:4px 0 0;font-size:12px;opacity:.9;line-height:1.4;}   /* v1.4.10.473: a modal title, 16/600 -.012em like the user editor's .ue-htext h3 (was 20/600, the page-title size, at every width) */
  .site-ed-head .close{background:rgba(255,255,255,.15);border:none;color:#fff;border-radius:6px;cursor:pointer;width:30px;height:30px;display:flex;align-items:center;justify-content:center;}
  .site-ed-head .close svg{stroke:#fff;}
  .site-ed-body{padding:18px 22px;max-height:62vh;overflow-y:auto;}
  .site-ed-body .field{margin-bottom:12px;}
  .site-ed-foot{display:flex;justify-content:flex-end;gap:8px;padding:14px 22px;border-top:1px solid var(--line);}
  .se-addr-row{display:flex;gap:8px;} .se-addr-row input{flex:1;}
  .se-map{height:240px;border-radius:7px;border:1px solid var(--line);overflow:hidden;background:#eef2f7;z-index:0;}
  .se-map .leaflet-container{height:100%;width:100%;font:inherit;}
  .sites-map{height:340px;border-radius:8px;border:1px solid var(--line);overflow:hidden;margin-bottom:16px;background:#eef2f7;z-index:0;}
  .dash-map-key{display:flex;gap:14px;flex-wrap:wrap;align-items:center;}
  .dash-map-key .dmk{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:500;color:var(--text-mute);white-space:nowrap;}
  .dash-map-key .dmk-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;}
  .dash-map-key .dmk-dot.ok{background:var(--ok);} .dash-map-key .dmk-dot.warn{background:var(--warn);} .dash-map-key .dmk-dot.err{background:var(--err);}
  @media(max-width:560px){ .dash-map-key{display:none;} }
  .sites-map .leaflet-container{height:100%;width:100%;}
  .map-pin-badge{background:var(--brand-blue);color:#fff;border-radius:8px;font-weight:700;font-size:12px;width:30px;height:30px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,.3);border:2px solid #fff;}
  .map-pin-badge.warn{background:var(--warn);} .map-pin-badge.err{background:var(--err);}
  .map-pin-badge.ok{background:var(--ok);}
  .map-pin-badge.muted{background:#94a3b8;}
  .mon-org-row td{background:var(--bg);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);padding:7px 16px !important;border-top:1px solid var(--line);}
  .mon-org-row td strong{font-weight:inherit;}   /* v1.4.10.473: the client group label is an uppercase label, 11/600 (its <strong> drew it 11/700) */
  .mon-row:hover td{background:rgba(var(--bc-accent-rgb),.045);}
  .dash-map-key .dmk-dot.muted{background:#94a3b8;}
  .notif-bell{position:relative;}
  .notif-dot{position:absolute;top:-3px;right:-3px;min-width:16px;height:16px;padding:0 4px;border-radius:6px;background:var(--err);color:#fff;font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center;}
  .notif-pop{position:absolute;top:46px;right:0;width:360px;max-width:calc(100vw - 20px);max-height:460px;overflow-y:auto;background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 24px 60px rgba(15,23,42,.22);z-index:60;display:none;}
  .notif-pop.open{display:block;}
  .notif-item{display:flex;gap:10px;padding:12px 14px;border-bottom:1px solid var(--line);cursor:pointer;}
  .notif-item:hover{background:#f6f8fc;} .notif-item.unread{background:rgba(var(--bc-accent-rgb),.05);}
  .notif-dotc{width:8px;height:8px;border-radius:50%;margin-top:6px;flex-shrink:0;background:var(--brand-blue);}
  .notif-dotc.warn{background:var(--warn);} .notif-dotc.err{background:var(--err);}
  .nr-builder .step{border:1px solid var(--line);border-radius:7px;padding:14px;margin-bottom:12px;}
  .nr-builder .step h4{margin:0 0 4px;font-size:13px;} .nr-builder .step .hint{font-size:12px;color:var(--text-mute);margin-bottom:10px;}
  .chip-pick{display:inline-flex;align-items:center;gap:6px;padding:6px 11px;border:1px solid var(--line);border-radius:999px;cursor:pointer;font-size:12px;font-weight:500;margin:3px 5px 3px 0;user-select:none;}
  .chip-pick.on{background:var(--brand-blue);color:#fff;border-color:var(--brand-blue);}
  .ed-sec{border:1px solid var(--line);border-radius:7px;padding:14px;margin-bottom:12px;}
  .ed-sec-t{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin-bottom:10px;}
  .link-row{display:flex;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--line);border-radius:6px;margin-bottom:6px;font-size:13px;}
  .link-add{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-top:8px;}
  .link-add input{padding:7px 9px;}
  /* v1.4.10.473: the device editor's link row is one height — its two pickers stood 37px, the note 38 and Link 30 —
     and a <select class="btn"> (these two and the monitored-asset picker) is a field, 13/400, not a 500 button label */
  .link-add select,.link-add input,.link-add .btn{height:36px;box-sizing:border-box;}
  select.btn{font-weight:400;}
  .tkt-head{display:flex;align-items:flex-start;gap:14px;padding:18px 22px;background:linear-gradient(120deg,var(--brand-blue),var(--brand-purple));color:#fff;border-radius:8px 8px 0 0;}
  .tkt-head .tkt-ico{width:42px;height:42px;border-radius:6px;background:rgba(255,255,255,.18);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .tkt-head .tkt-ico svg{stroke:#fff;}
  .tkt-head h3{margin:0;font-size:20px;color:#fff;font-weight:600;letter-spacing:-.024em;}
  .tkt-head .tkt-sub{margin:3px 0 0;font-size:12px;opacity:.9;}
  .tkt-head .tkt-pills{display:flex;gap:6px;margin-top:8px;flex-wrap:wrap;}
  .tkt-head .tkt-pills .pill{background:rgba(255,255,255,.2);color:#fff;border:none;}
  .tkt-head .close{background:rgba(255,255,255,.15);border:none;color:#fff;border-radius:6px;cursor:pointer;width:30px;height:30px;display:flex;align-items:center;justify-content:center;}
  .tkt-head .close svg{stroke:#fff;}
  /* ───────── Rebuild: asset heroes · grouped register · monitoring ───────── */
  .ah-head{display:flex;align-items:center;gap:16px;padding:22px 24px;background:linear-gradient(120deg,var(--brand-blue),var(--brand-purple));color:#fff;border-radius:8px 8px 0 0;position:relative;}
  .ah-thumb{width:64px;height:64px;border-radius:8px;background:rgba(255,255,255,.18);display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden;}
  .ah-thumb img{width:100%;height:100%;object-fit:contain;}
  .ah-thumb svg{stroke:#fff;width:28px;height:28px;}
  .ah-main{flex:1;min-width:0;}
  .ah-tag{display:inline-block;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;letter-spacing:.04em;background:rgba(255,255,255,.2);padding:3px 9px;border-radius:5px;margin-bottom:7px;}
  .ah-title{margin:0;font-size:20px;font-weight:600;color:#fff;line-height:1.15;letter-spacing:-.024em;}
  /* v1.4.10.473: every Assets page-title hero (asset, help & guide) takes the phone page-title size, 18/600 — only the asset hero did; the help hero stayed 20. The editor's hero is a modal title (below) */
  @media (max-width:760px), (hover:none) and (pointer:coarse) and (max-width:1100px){ .ah-head .ah-title{font-size:18px;line-height:1.22;} }
  /* v1.4.10.473: the asset EDITOR's hero (openAssetEditor, registerAssetFromDevice) is an editor hero, so its title is the
     modal-title look 16/600 -.012em at every width, as .site-ed-htext h3 and .ue-htext h3 (was 20, 18 on a phone: the page-title
     look, which stays with the asset window and the help & guide heroes) */
  .ah-head .ae-preview .ah-title{font-size:16px;letter-spacing:-.012em;line-height:normal;}
  .ah-sub{margin:5px 0 0;font-size:13px;opacity:.92;}
  .ah-pills{display:flex;gap:6px;margin-top:11px;flex-wrap:wrap;}
  .ah-pills .pill{background:rgba(255,255,255,.18);color:#fff;border:none;}
  .ah-head .close{background:rgba(255,255,255,.15);border:none;color:#fff;border-radius:6px;cursor:pointer;width:32px;height:32px;display:flex;align-items:center;justify-content:center;position:absolute;top:16px;right:16px;}
  .ah-head .close svg{stroke:#fff;}
  .ah-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;padding:18px 22px 2px;}
  .ah-stat{border:1px solid var(--line);border-radius:7px;padding:13px 15px;}
  .ah-stat .lbl{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;}
  .ah-stat .val{font-size:20px;font-weight:600;letter-spacing:-.02em;margin-top:5px;}
  @media(max-width:640px){.ah-stats{grid-template-columns:repeat(2,1fr);}}
  .asset-groups{display:flex;flex-direction:column;}
  .ag-org{border:1px solid var(--line);border-radius:8px;margin-bottom:16px;overflow:hidden;background:var(--surface);box-shadow:var(--shadow-sm);transition:box-shadow .16s,border-color .16s;}
  .ag-org:hover{box-shadow:var(--shadow-md);border-color:var(--line-2);}
  .ag-org-head{display:flex;align-items:center;gap:14px;padding:16px 18px;border-bottom:1px solid var(--line);background:linear-gradient(120deg,rgba(var(--bc-accent-rgb),.05),rgba(var(--bc-purple-rgb),.04));}
  .ag-org-ico{width:44px;height:44px;border-radius:7px;background:linear-gradient(120deg,var(--brand-blue),var(--brand-purple));display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 4px 12px -4px rgba(var(--bc-accent-rgb),.5);}
  .ag-org-ico svg{stroke:#fff;width:22px;height:22px;}
  .ag-org-name{font-size:15px;font-weight:600;display:flex;align-items:center;gap:8px;letter-spacing:-.012em;}
  .ag-org-meta{font-size:12px;color:var(--text-mute);margin-top:2px;}
  .ag-badge{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:2px 7px;border-radius:6px;background:var(--surface-2);color:var(--text-mute);}
  /* v1.4.10.473: a count chip, 12/600 like .ag-site-count under it (was 13/700) */
  .ag-count{margin-left:auto;font-size:12px;color:var(--brand-blue);font-weight:600;background:var(--accent-glow);border-radius:6px;padding:6px 12px;font-variant-numeric:tabular-nums;}
  .ag-site{border-top:1px solid var(--line);}
  .ag-site:first-of-type{border-top:none;}
  .ag-site-head{display:flex;align-items:center;gap:12px;padding:11px 18px;background:var(--surface-2);}
  .ag-site-pin{width:30px;height:30px;border-radius:6px;background:rgba(var(--bc-accent-rgb),.1);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .ag-site-pin svg{stroke:var(--brand-blue);width:16px;height:16px;}
  .ag-site-name{font-weight:600;font-size:13px;}
  .ag-site-meta{font-size:12px;color:var(--text-mute);margin-top:1px;}
  .ag-site-count{margin-left:auto;font-size:12px;color:var(--text-mute);font-weight:600;background:var(--surface);border:1px solid var(--line);border-radius:5px;padding:3px 9px;white-space:nowrap;}
  .ag-warn{color:var(--warn);font-weight:600;}
  .ag-site table.dt tbody tr:hover{background:var(--accent-glow);}
  /* monitoring severity bar */
  .sev-bar{display:flex;border-radius:7px;overflow:hidden;margin-bottom:16px;border:1px solid var(--line);}
  .sev-seg{flex:1;padding:14px 16px;color:#fff;}
  .sev-seg .n{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;}
  .sev-seg .l{font-size:11px;font-weight:600;letter-spacing:.06em;margin-top:5px;text-transform:uppercase;opacity:.95;}
  .sev-seg.disaster{background:#E5484D;} .sev-seg.high{background:#F76808;} .sev-seg.average{background:#F5A623;}
  .sev-seg.warning{background:#F7CE46;color:#3a2e00;} .sev-seg.info{background:#5B8DEF;} .sev-seg.none{background:#94A3B8;}
  .sev-seg.zero{opacity:.45;}
  .dt tr.prob td:first-child{border-left:3px solid transparent;}
  .dt tr.prob.disaster td:first-child{border-left-color:#E5484D;} .dt tr.prob.high td:first-child{border-left-color:#F76808;}
  .dt tr.prob.average td:first-child{border-left-color:#F5A623;} .dt tr.prob.warning td:first-child{border-left-color:#F7CE46;} .dt tr.prob.info td:first-child{border-left-color:#5B8DEF;}
  .host-cpu{display:flex;align-items:center;gap:8px;}
  .host-cpu .track{width:70px;height:7px;border-radius:4px;background:var(--surface-2);overflow:hidden;}
  .host-cpu .fill{height:100%;border-radius:4px;background:var(--ok);}
  .host-cpu .fill.warn{background:var(--warn);} .host-cpu .fill.err{background:var(--err);}
  .avail{font-size:10px;font-weight:700;letter-spacing:.5px;padding:3px 8px;border-radius:6px;display:inline-block;}
  .avail.warn{background:rgba(245,166,35,.16);color:#b45309;} .avail.err{background:rgba(229,72,77,.12);color:#b91c1c;}
  .host-dot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-right:8px;vertical-align:middle;}
  .host-dot.ok{background:var(--ok);} .host-dot.warn{background:var(--warn);} .host-dot.err{background:var(--err);}
  /* v1.4.10.450: grey dot for a device with no reading yet (same grey as the Fleet row). */
  .host-dot.muted{background:#cbd5e1;}
  .mon-stats{display:flex;flex-wrap:wrap;gap:10px;}
  .mon-stat{flex:1;min-width:120px;background:var(--surface-2);border:1px solid var(--line);border-radius:7px;padding:12px 14px;}
  .mon-stat .zv{font-size:20px;font-weight:600;letter-spacing:-.02em;color:var(--text);line-height:1.1;}
  .mon-stat .zl{font-size:11px;font-weight:600;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;margin-top:4px;}
  .mon-stat.ok .zv{color:var(--ok);} .mon-stat.warn .zv{color:var(--warn);} .mon-stat.blue .zv{color:var(--brand-blue);}

  /* ── Device-type editor (icon picker + colour swatches) ── */
  .dt-ico-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(46px,100%),1fr));gap:8px;}
  .dt-ico-cell{display:flex;align-items:center;justify-content:center;height:46px;border:1px solid var(--line);border-radius:6px;background:var(--surface-2);cursor:pointer;color:var(--text-mute);transition:all .12s;}
  .dt-ico-cell:hover{border-color:var(--brand-blue);color:var(--text);}
  .dt-ico-cell.sel{border-color:var(--brand-blue);background:rgba(var(--bc-accent-rgb),.12);color:var(--brand-blue);box-shadow:0 0 0 1px var(--brand-blue) inset;}
  .dt-ico-cell svg{width:20px;height:20px;}
  .dt-color-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
  .dt-sw-grid{display:flex;flex-wrap:wrap;gap:6px;}
  .dt-sw{width:24px;height:24px;border-radius:5px;border:2px solid transparent;cursor:pointer;padding:0;outline:1px solid var(--line);transition:transform .1s;}
  .dt-sw:hover{transform:scale(1.1);}
  .dt-sw.sel{border-color:var(--text);outline:2px solid var(--text);}
  .dt-color-prev{width:24px;height:24px;border-radius:5px;border:1px solid var(--line);display:inline-block;vertical-align:middle;}
  .dt-preview{margin-top:12px;padding:10px 12px;border:1px dashed var(--line);border-radius:6px;font-size:13px;color:var(--text-mute);display:flex;align-items:center;gap:8px;}
  .dt-preview .device-icon svg{width:18px;height:18px;}

  /* ═══════════════════════ ENHANCED ASSET SYSTEM ═══════════════════════ */
  /* ── Portfolio hero band ── */
  .asset-hero{position:relative;border-radius:8px;overflow:hidden;margin-bottom:14px;
    background:linear-gradient(125deg,#1E3A8A 0%,var(--bc-blue-v1) 42%,var(--bc-purple-v1) 100%);color:#fff;
    box-shadow:0 14px 34px -20px rgba(var(--bc-accent-rgb),.55);}
  .asset-hero::before{content:"";position:absolute;inset:0;opacity:.5;pointer-events:none;
    background:radial-gradient(900px 300px at 88% -40%,rgba(255,255,255,.30),transparent 60%),
              radial-gradient(600px 280px at 8% 130%,rgba(var(--bc-purple-rgb),.55),transparent 60%);}
  .asset-hero-grid{position:absolute;inset:0;opacity:.10;pointer-events:none;
    background-image:linear-gradient(rgba(255,255,255,.6) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.6) 1px,transparent 1px);
    background-size:34px 34px;-webkit-mask-image:linear-gradient(120deg,#000,transparent 70%);mask-image:linear-gradient(120deg,#000,transparent 70%);}
  .asset-hero-inner{position:relative;display:grid;grid-template-columns:1.15fr 1fr;gap:20px;padding:17px 20px;}
  .ah-eyebrow{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.06em;
    text-transform:uppercase;background:rgba(255,255,255,.16);padding:4px 9px;border-radius:999px;margin-bottom:9px;}
  .ah-eyebrow .live-dot{background:#7CFFB2;} .ah-eyebrow .live-dot::after{background:#7CFFB2;}
  .asset-hero h2{margin:0;font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.08;color:#fff;}
  .asset-hero .ah-lead{margin:6px 0 0;font-size:12px;opacity:.92;max-width:440px;line-height:1.5;}
  .ah-hero-metrics{display:grid;grid-template-columns:repeat(2,1fr);gap:9px;margin-top:13px;}
  .ah-hm{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.18);border-radius:6px;padding:9px 12px;backdrop-filter:blur(2px);}
  .ah-hm .v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;font-variant-numeric:tabular-nums;}
  .ah-hm .l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;opacity:.85;margin-top:4px;font-weight:600;}
  .ah-hm .s{font-size:11px;opacity:.8;margin-top:2px;}
  /* Donut + health side of hero */
  .ah-hero-side{display:flex;flex-direction:column;justify-content:center;gap:12px;}
  .ah-donut-wrap{display:flex;align-items:center;gap:14px;}
  .ah-donut{position:relative;width:96px;height:96px;flex-shrink:0;}
  .ah-donut svg{width:100%;height:100%;display:block;}
  .ah-donut .center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;}
  .ah-donut .center .big{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;}
  .ah-donut .center .cap{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;opacity:.85;margin-top:2px;}
  .ah-legend{display:flex;flex-direction:column;gap:8px;font-size:11px;}
  .ah-legend .lg{display:flex;align-items:center;gap:8px;}
  .ah-legend .sw{width:10px;height:10px;border-radius:3px;flex-shrink:0;}
  .ah-legend .lg .n{margin-left:auto;font-weight:700;font-variant-numeric:tabular-nums;}
  .ah-health-bar{height:8px;border-radius:6px;overflow:hidden;display:flex;background:rgba(255,255,255,.18);}
  .ah-health-bar > span{height:100%;}
  @media(max-width:900px){.asset-hero-inner{grid-template-columns:1fr;gap:18px;}}

  /* ── Hero: org/site scoped variant ── */
  .ah-eyebrow svg{width:13px;height:13px;}
  .ah-orgpill{display:inline-flex;align-items:center;text-transform:capitalize;background:rgba(255,255,255,.22);
    padding:1px 8px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:0;margin-left:2px;}
  .ah-titlerow{display:flex;align-items:center;gap:11px;}
  .ah-brandmark{width:38px;height:38px;border-radius:6px;flex-shrink:0;display:flex;align-items:center;justify-content:center;
    font-weight:700;font-size:15px;letter-spacing:.5px;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.28);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.25);}
  .asset-hero.scoped{background:linear-gradient(125deg,#0F766E 0%,#0EA5E9 48%,var(--bc-blue-v1) 100%);
    box-shadow:0 14px 34px -20px rgba(14,165,233,.55);}
  .asset-hero.scoped h2{font-size:20px;}

  /* ── Drag & drop zones ── */
  .dropzone{border:1.6px dashed var(--line);border-radius:7px;padding:18px;text-align:center;color:var(--text-mute);
    font-size:12px;cursor:pointer;transition:all .15s;background:var(--surface-2);}
  .dropzone:hover{border-color:var(--brand-blue);color:var(--text);}
  .dropzone.drag{border-color:var(--brand-blue);background:rgba(var(--bc-accent-rgb),.08);color:var(--brand-blue);transform:scale(1.005);}
  .dropzone .dz-ico{display:flex;justify-content:center;margin-bottom:8px;color:var(--brand-blue);}
  .dropzone .dz-ico svg{width:26px;height:26px;}
  .dropzone b{color:var(--text);}
  .ae-photo-drop{position:relative;}
  .ae-photo-drop.drag{outline:2px dashed var(--brand-blue);outline-offset:3px;border-radius:6px;}

  /* ── Photo gallery ── */
  .photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(96px,100%),1fr));gap:8px;}
  .photo-cell{position:relative;aspect-ratio:1;border-radius:6px;overflow:hidden;border:1px solid var(--line);
    background:var(--surface-2);cursor:pointer;}
  .photo-cell img{width:100%;height:100%;object-fit:contain;display:block;transition:transform .2s;}
  .photo-cell:hover img{transform:scale(1.06);}
  .photo-cell .pc-overlay{position:absolute;inset:0;background:linear-gradient(180deg,transparent 40%,rgba(0,0,0,.55));
    opacity:0;transition:opacity .15s;display:flex;flex-direction:column;justify-content:flex-end;padding:6px;}
  .photo-cell:hover .pc-overlay{opacity:1;}
  .photo-cell .pc-actions{position:absolute;top:5px;right:5px;display:flex;gap:4px;opacity:0;transition:opacity .15s;}
  .photo-cell:hover .pc-actions{opacity:1;}
  .pc-btn{width:24px;height:24px;border-radius:5px;border:none;background:rgba(15,23,42,.72);color:#fff;display:flex;
    align-items:center;justify-content:center;cursor:pointer;backdrop-filter:blur(2px);}
  .pc-btn:hover{background:rgba(15,23,42,.92);}
  .pc-btn.star.on{background:var(--warn);color:#1a1300;}
  .pc-btn svg{width:13px;height:13px;}
  .photo-cell .pc-fault{position:absolute;top:5px;left:5px;background:var(--err);color:#fff;font-size:10px;font-weight:700;
    text-transform:uppercase;letter-spacing:.04em;padding:2px 6px;border-radius:6px;display:inline-flex;align-items:center;gap:3px;}
  .photo-cell .pc-fault svg{width:9px;height:9px;}
  .photo-cell .pc-feature{position:absolute;bottom:5px;left:5px;background:var(--warn);color:#1a1300;font-size:10px;font-weight:700;
    text-transform:uppercase;letter-spacing:.04em;padding:2px 6px;border-radius:6px;display:inline-flex;align-items:center;gap:3px;}
  .photo-cell .pc-feature svg{width:9px;height:9px;}
  .photo-count{font-size:11px;color:var(--text-dim);}

  /* ── Lightbox ── */
  .lightbox{position:fixed;inset:0;background:rgba(8,11,20,.92);z-index:90;display:flex;align-items:center;justify-content:center;
    flex-direction:column;padding:30px;backdrop-filter:blur(6px);}
  .lightbox img{max-width:92vw;max-height:80vh;border-radius:7px;box-shadow:0 30px 80px -20px rgba(0,0,0,.8);object-fit:contain;}
  .lightbox .lb-cap{color:#fff;margin-top:16px;font-size:13px;text-align:center;display:flex;align-items:center;gap:10px;}
  .lightbox .lb-cap .lb-fault{background:var(--err);font-size:10px;letter-spacing:.04em;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:2px 8px;border-radius:6px;}
  .lightbox .lb-close{position:absolute;top:20px;right:24px;width:42px;height:42px;border-radius:7px;border:none;
    background:rgba(255,255,255,.12);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;}
  .lightbox .lb-close:hover{background:rgba(255,255,255,.22);}
  .lightbox .lb-nav{position:absolute;top:50%;transform:translateY(-50%);width:48px;height:48px;border-radius:50%;border:none;
    background:rgba(255,255,255,.12);color:#fff;cursor:pointer;font-size:24px;display:flex;align-items:center;justify-content:center;}
  .lightbox .lb-nav:hover{background:rgba(255,255,255,.22);}
  .lightbox .lb-prev{left:24px;} .lightbox .lb-next{right:24px;}
  .lightbox .lb-actions{margin-top:16px;display:flex;gap:8px;}
  .lightbox .lb-frame{width:92vw;max-width:1000px;height:78vh;border:none;border-radius:7px;background:#fff;box-shadow:0 30px 80px -20px rgba(0,0,0,.8);}
  .lightbox .lb-noprev{display:flex;flex-direction:column;align-items:center;gap:12px;color:#fff;text-align:center;padding:40px;}
  .lightbox .lb-noprev svg{width:46px;height:46px;opacity:.6;}
  .lightbox .lb-noprev-sub{font-size:12px;color:rgba(255,255,255,.6);word-break:break-all;}

  /* ── KPI tiles with mini bars ── */
  /* ── Asset stat rail (v1.4.10.201) ───────────────────────────────────────
     Was `.akpi-grid`, an auto-fit grid of nine 100px-tall cards that wrapped
     7 + 2 at 1440px and cost ~300px of vertical space before the register.
     One row now, auto-fit so it still reflows on a laptop, and on a phone a
     single horizontally-scrollable line rather than five stacked rows.
     `.akpi-grid` is kept as an alias because the class name is old enough to
     be worth not breaking if anything else ever reached for it. */
  /* ── The collapsed estate hero (v1.4.10.201) ─────────────────────────────
     Same four figures the full hero states, on one line. Keeps the brand
     gradient so the page still reads as the asset estate, but at 40px instead
     of 270px (desktop) / 430px (phone). */
  .asset-hero.collapsed{padding:0;margin-bottom:12px;border-radius:7px;}
  .ahc-inner{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:9px 14px;color:#fff;}
  .ahc-title{display:inline-flex;align-items:center;gap:7px;font-size:12px;opacity:.95;}
  .ahc-title b{font-weight:700;}
  .ahc-title svg{width:15px;height:15px;stroke:#fff;opacity:.9;}
  .ahc-figs{display:flex;align-items:center;gap:16px;flex-wrap:wrap;min-width:0;}
  .ahc-fig{display:inline-flex;align-items:baseline;gap:5px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;opacity:.82;font-weight:600;white-space:nowrap;}
  .ahc-fig b{font-size:14px;font-weight:700;letter-spacing:-.02em;opacity:1;text-transform:none;font-variant-numeric:tabular-nums;}
  .ahc-toggle,.ah-collapse{display:inline-flex;align-items:center;gap:5px;margin-left:auto;flex-shrink:0;cursor:pointer;
    background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.24);color:#fff;
    font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;border-radius:999px;padding:5px 11px;}
  .ahc-toggle:hover,.ah-collapse:hover{background:rgba(255,255,255,.28);}
  .ahc-toggle svg,.ah-collapse svg{width:13px;height:13px;stroke:#fff;}
  .ah-collapse{position:absolute;top:12px;right:14px;z-index:2;margin-left:0;}
  @media(max-width:760px){
    /* Two lines, never three: title + Expand on the first, the figures on a
       swipeable second. Wrapping put the button on a row of its own and made
       the collapsed strip 125px, which defeats the point of collapsing it. */
    .ahc-inner{gap:8px 10px;padding:8px 12px;flex-wrap:wrap;}
    /* flex:1 1 auto made the title claim the whole 342px of available width,
       which pushed the Expand button onto a line of ITS own and made the strip
       three rows / 90px. It takes only what it needs now and ellipsises. */
    .ahc-title{flex:0 1 auto;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;order:0;}
    /* Flex wraps in DOM ORDER, and .ahc-figs has a 100% basis — so with the
       source order (title, figs, toggle) the figures took line 2 and pushed
       the button onto a line 3 of its own. `order` puts the button back beside
       the title without moving it in the markup. */
    .ahc-toggle{flex:0 0 auto;margin-left:auto;order:1;}
    .ahc-figs{order:2;flex:1 1 100%;gap:14px;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;}
    .ahc-figs::-webkit-scrollbar{display:none;}
    .ah-collapse{top:9px;right:10px;}
  }

  /* ── Register column notes (v1.4.10.201) ─────────────────────────────────
     Auto-hidden columns are NAMED rather than silently dropped, with the
     escape hatch beside the note. */
  .acol-note{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:var(--text-mute);
    background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:3px 5px 3px 11px;}
  .acol-note button{background:var(--surface);border:1px solid var(--line);border-radius:999px;cursor:pointer;
    font-size:12px;font-weight:500;color:var(--brand-blue);padding:2px 9px;}   /* v1.4.10.473: quiet chip 12/500, the size of the note it sits in (was 11) */
  .acol-note button:hover{border-color:var(--brand-blue);background:var(--accent-glow);}
  .ag-shown{margin-left:6px;font-weight:500;color:var(--text-dim);}

  /* ── Sticky register head (v1.4.10.201) ──────────────────────────────────
     6,293 rows scroll a very long way past their headings. The head sticks to
     the top of `main.main` (the app's real scroll container — the document
     itself never scrolls, see #app{overflow:hidden}), so the column you are
     reading stays labelled. Only the flat table view: the grouped view has a
     head PER SITE, and sticking several of them at once would stack. */
  table.dt.sticky-head thead th{position:sticky;top:0;z-index:3;background:var(--surface-2);
    box-shadow:inset 0 -1px 0 var(--line);}

  /* v1.4.10.202: `auto-fit` orphaned a tile. There are ALWAYS EXACTLY NINE
     figures here, so letting the browser choose a column count leaves whatever
     remainder it likes — measured: 8+1 at 1440px, 7+2 at 1366 and 1280, and
     4+4+1 at 820. One tile alone on a row reads as a mistake.

     Nine across was considered and rejected by measurement, not taste: the rail
     is 1380px wide at a 1440px viewport, so nine tiles are ~145px each, and
     after a 30px icon, its gap and the padding that leaves ~63px for the label
     — "Warranty expiring" ellipsises. So the counts are pinned to divisors of
     nine that share the rows evenly: 5+4 on a desktop, 3+3+3 on a tablet, and
     the swipeable single line on a phone (below). **If a tenth figure is ever
     added, these numbers stop dividing and must be re-chosen.** */
  .akpi-rail,.akpi-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:9px;margin-bottom:16px;}
  @media(max-width:1099px){ .akpi-rail,.akpi-grid{grid-template-columns:repeat(3,minmax(0,1fr));} }
  /* v1.4.10.236: the lifecycle alert row carries SEVEN figures now (test & tag
     joined the six that were already there, and it is the one kind actually
     over the cap on a real estate). Seven is prime, so under the shared
     repeat(5) it lays out 5+2 and under repeat(3) it lays out 3+3+1 — the
     orphan the rail discipline exists to prevent, and the exact fault v203
     measured on .tkx-rail. Two classes, so this beats the single-class rule
     above on specificity rather than fighting it with !important. */
  .akpi-grid.ap-alert-rail{grid-template-columns:repeat(7,minmax(0,1fr));gap:7px;}
  @media(max-width:1099px){ .akpi-grid.ap-alert-rail{grid-template-columns:repeat(4,minmax(0,1fr));} }
  .akpi{background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:10px 12px;position:relative;overflow:hidden;
    display:flex;align-items:center;gap:10px;min-width:0;}
  .akpi-txt{min-width:0;}
  .akpi.flat{cursor:default;}
  /* v1.4.10.375: a third line (the consumables notes) truncates like the label above it */
  .akpi .mini-l{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px;}
  .akpi-grid.cn-rail{grid-template-columns:repeat(4,minmax(0,1fr));}
  @media(max-width:1099px){ .akpi-grid.cn-rail{grid-template-columns:repeat(2,minmax(0,1fr));} }
  .akpi.flat:hover{transform:none;box-shadow:none;border-color:var(--line);}
  .akpi{box-shadow:var(--shadow-sm);transition:transform .16s ease,box-shadow .16s ease,border-color .16s;cursor:pointer;}
  .akpi:hover{transform:translateY(-2px);box-shadow:0 12px 26px -16px rgba(15,23,42,.4);border-color:var(--line-2);}
  .akpi.sel{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .akpi-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;}
  .akpi-ico{width:30px;height:30px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .akpi-ico svg{width:16px;height:16px;}
  .akpi-ico.blue{background:var(--accent-glow);color:var(--brand-blue);}
  .akpi-ico.ok{background:rgba(22,163,74,.12);color:var(--ok);}
  .akpi-ico.warn{background:rgba(217,119,6,.13);color:var(--warn);}
  .akpi-ico.err{background:rgba(220,38,38,.11);color:var(--err);}
  .akpi-ico.purple{background:rgba(var(--bc-purple-rgb),.12);color:var(--brand-purple);}
  .akpi-trend{font-size:11px;font-weight:700;color:var(--text-dim);}
  /* v1.4.10.473: line-height 1.25 (was 1.05) — the overflow:hidden box was 21px for 24px of glyph and shaved 3px off every figure */
  .akpi .v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.25;font-variant-numeric:tabular-nums;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .akpi .l{font-size:11px;color:var(--text-mute);margin-top:3px;font-weight:500;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  /* The bar became a hairline along the bottom edge of the tile rather than a
     row of its own — it is a proportion cue, not a figure, and it was costing
     16px of height nine times over. */
  .akpi .mini{position:absolute;left:0;right:0;bottom:0;height:3px;background:var(--surface-2);overflow:hidden;}
  .akpi .mini > span{display:block;height:100%;}
  /* On a phone the rail is one swipeable line. Nine tiles stacked two-up was
     five rows and ~550px before the register (v1.4.10.201). */
  @media(max-width:760px){
    .akpi-rail,.akpi-grid{display:flex;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;
      gap:8px;padding-bottom:2px;margin-bottom:12px;scroll-snap-type:x proximity;}
    .akpi-rail::-webkit-scrollbar,.akpi-grid::-webkit-scrollbar{display:none;}
    .akpi{flex:0 0 auto;min-width:146px;scroll-snap-align:start;}
    /* v1.4.10.275 — THE SUPPORT RAIL SHOWED ONE TILE OF SIX ON A PHONE.
       `.tkx-tile` carries `width:100%` (harmless in the desktop grid, where a
       grid item already stretches to its track). Here the rail is a FLEX row,
       and 100% means 100% OF THE CONTAINER — measured 6 tiles at 356px each,
       scrollWidth 2,176 against a 356px viewport, so five of the six figures
       were off-screen with nothing on screen to say they existed. The asset
       register's identical rail measures 146px a tile because no `.akpi` there
       carries a width. Specificity 0-3-0 so it outranks `.tkx-tile` (0-1-0)
       rather than relying on source order (the v203 .akpi-rail lesson). */
    .akpi-rail .akpi.tkx-tile,.akpi-grid .akpi.tkx-tile{width:auto;}
  }

  /* ── Filter / search toolbar ── */
  /* v1.4.10.264: `.asset-scopebar` itself is gone with the register's duplicate
     location bar. The `.asb-*` field styling below STAYS — the Site assets tab,
     the activity filters and the report pickers all draw their dropdowns with
     it, so deleting these would strip four other surfaces. */
  .asb-label{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);white-space:nowrap;}
  .asb-label svg{width:15px;height:15px;color:var(--brand-blue);}
  .asb-fields{display:flex;align-items:flex-end;gap:8px;flex-wrap:wrap;flex:1;}
  .asb-field{display:flex;flex-direction:column;gap:4px;min-width:150px;flex:1;}
  .asb-cap{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);padding-left:2px;}
  .asb-inrow{display:flex;align-items:center;gap:7px;}
  .asb-inrow select{flex:1;min-width:0;}
  /* Selected integrator / client / site logo beside its picker. */
  .asb-logo{flex:none;width:30px;height:30px;border-radius:6px;background:#fff;border:1px solid var(--line);
    display:flex;align-items:center;justify-content:center;overflow:hidden;padding:2px;box-shadow:var(--shadow-sm,none);}
  .asb-logo img{width:100%;height:100%;object-fit:contain;display:block;}
  .asb-field select{appearance:none;width:100%;padding:9px 30px 9px 12px;border:1px solid var(--line);border-radius:6px;background:var(--surface)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394A3B8' stroke-width='3'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") no-repeat right 11px center;
    font-family:inherit;font-size:13px;font-weight:400;color:var(--text);cursor:pointer;transition:all .14s;}
  .asb-field select:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .asb-field select.on{border-color:var(--brand-blue);background-color:rgba(var(--bc-accent-rgb),.07);font-weight:400;color:var(--brand-blue);}
  .asb-field select:disabled{opacity:.5;cursor:not-allowed;}
  .asb-arrow{color:var(--text-dim);align-self:center;margin-bottom:9px;display:flex;}
  .asb-arrow svg{width:16px;height:16px;}
  .asb-clear{display:inline-flex;align-items:center;gap:5px;align-self:center;margin-bottom:1px;background:var(--surface);border:1px solid var(--line);
    color:var(--text-mute);border-radius:6px;padding:9px 11px;font-size:12px;font-weight:600;cursor:pointer;white-space:nowrap;transition:all .14s;}
  .asb-clear:hover{border-color:var(--err);color:var(--err);}
  .asb-clear svg{width:13px;height:13px;}
  @media(max-width:760px){.asb-arrow{display:none;}.asb-field{min-width:0;width:100%;flex:1 1 100%;}}
  .asset-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--surface);border:1px solid var(--line);
    border-radius:7px;padding:11px 13px;margin-bottom:16px;box-shadow:var(--shadow-sm);}
  .atb-search{position:relative;flex:1;min-width:200px;}
  .atb-search svg{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--text-dim);pointer-events:none;}
  .atb-search input{width:100%;padding:9px 12px 9px 34px;border:1px solid var(--line);border-radius:6px;background:var(--bg);
    font-family:inherit;font-size:13px;color:var(--text);transition:all .14s;}
  .atb-search input:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);background:var(--surface);}
  .atb-sel{position:relative;}
  .atb-sel select{appearance:none;padding:9px 30px 9px 12px;border:1px solid var(--line);border-radius:6px;background:var(--bg);
    font-family:inherit;font-size:13px;color:var(--text);cursor:pointer;font-weight:400;transition:all .14s;}
  .atb-sel select:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .atb-sel::after{content:"";position:absolute;right:11px;top:50%;width:7px;height:7px;border-right:2px solid var(--text-dim);
    border-bottom:2px solid var(--text-dim);transform:translateY(-65%) rotate(45deg);pointer-events:none;}
  .atb-sel select.on{border-color:var(--brand-blue);color:var(--brand-blue);background:var(--accent-glow);}
  .atb-clear{font-size:13px;font-weight:500;color:var(--text-mute);cursor:pointer;padding:8px 6px;white-space:nowrap;background:none;border:0;font-family:inherit;}   /* v1.4.10.511: a <button> now (the phone's tap floor), drawn as the plain text it was */
  .atb-clear:hover{color:var(--err);}
  .atb-spacer{flex:1;}
  .view-toggle{display:inline-flex;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:2px;gap:2px;}
  .view-toggle button{display:inline-flex;align-items:center;justify-content:center;gap:6px;width:auto;min-width:32px;height:30px;padding:0 10px;white-space:nowrap;font-size:12px;font-weight:600;font-family:inherit;background:transparent;border:0;
    border-radius:5px;cursor:pointer;color:var(--text-dim);transition:all .12s;}
  .view-toggle button:hover{color:var(--text);}
  .view-toggle button.active{background:var(--surface);color:var(--brand-blue);box-shadow:var(--shadow-sm);}
  .filter-chips{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:14px;}
  .fchip{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:500;padding:5px 11px;border-radius:999px;
    background:var(--accent-glow);color:var(--brand-blue);border:1px solid rgba(var(--bc-accent-rgb),.22);}
  .fchip button{background:none;border:0;color:inherit;cursor:pointer;display:flex;padding:0;opacity:.7;}
  .fchip button:hover{opacity:1;}

  /* ── Asset cards (card view) ── */
  .asset-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(280px,100%),1fr));gap:14px;}
  .acard{background:var(--surface);border:1px solid var(--line);border-radius:8px;overflow:hidden;cursor:pointer;
    box-shadow:var(--shadow-sm);transition:transform .16s ease,box-shadow .16s ease,border-color .16s;position:relative;display:flex;flex-direction:column;}
  .acard:hover{transform:translateY(-3px);box-shadow:0 16px 34px -18px rgba(15,23,42,.45);border-color:var(--line-2);}
  .acard.sel{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .acard-media{height:130px;background:var(--surface-2) center/contain no-repeat;display:flex;align-items:center;justify-content:center;
    color:var(--text-dim);position:relative;border-bottom:1px solid var(--line);}
  .acard-media svg{width:38px;height:38px;opacity:.4;}
  .acard-media .acard-statusdot{position:absolute;top:10px;right:10px;}
  .acard-check{position:absolute;top:10px;left:10px;z-index:2;}
  .acard-body{padding:13px 15px 15px;flex:1;display:flex;flex-direction:column;}
  .acard-tag{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;color:var(--brand-blue);background:var(--accent-glow);
    padding:2px 7px;border-radius:5px;align-self:flex-start;margin-bottom:8px;}
  .acard-name{font-size:15px;font-weight:600;letter-spacing:-.012em;line-height:1.25;margin-bottom:3px;}
  .acard-sub{font-size:12px;color:var(--text-mute);margin-bottom:11px;}
  .acard-foot{display:flex;align-items:center;gap:7px;margin-top:auto;flex-wrap:wrap;}
  .acard-val{margin-left:auto;font-weight:700;font-size:13px;color:var(--text);font-variant-numeric:tabular-nums;}
  .acard-bar{height:4px;border-radius:3px;background:var(--surface-2);overflow:hidden;margin-top:11px;}
  .acard-bar > span{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,var(--ok),var(--warn));}

  /* ── Condition / status badges ── */
  .cond{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:3px 7px;border-radius:5px;display:inline-flex;align-items:center;gap:4px;}
  .cond.new{background:rgba(var(--bc-accent-rgb),.12);color:var(--brand-blue);}
  .cond.excellent{background:rgba(22,163,74,.13);color:var(--ok);}
  .cond.good{background:rgba(22,163,74,.10);color:#15803d;}
  .cond.fair{background:rgba(217,119,6,.13);color:var(--warn);}
  .cond.poor{background:rgba(220,38,38,.11);color:var(--err);}
  .cond.unserviceable{background:rgba(127,29,29,.16);color:#7F1D1D;}
  .cond.unrated{background:var(--surface-2);color:var(--text-dim);}
  /* Manufacturer brand mark on the asset profile hero (v1.4.10.98) */
  .ah-mfr-logo{height:26px;max-width:110px;object-fit:contain;background:#fff;border-radius:6px;padding:2px 6px;display:inline-block;vertical-align:middle;}
  /* Supplier logo in the asset profile's Supplier cell (v1.4.10.265). Sized to
     the line, not to the picture: supplier logos arrive as anything from a
     square icon to a wide wordmark, so the height is fixed, the width is
     capped and object-fit letterboxes whatever shape turns up. The white pad
     is what makes a dark-on-transparent PNG legible on both themes. */
  .asd-sup{display:inline-flex;align-items:center;gap:7px;flex-wrap:wrap;}
  .asd-sup-logo{height:22px;max-width:96px;object-fit:contain;background:#fff;border:1px solid var(--border);border-radius:5px;padding:2px 5px;display:inline-block;vertical-align:middle;flex:none;}
  .asd-sup-name{font-weight:500;}
  /* Catalogue picture thumbs in the Makes & models tables */
  .cat-img-thumb{width:40px;height:30px;object-fit:contain;padding:2px;box-sizing:border-box;border-radius:6px;border:1px solid var(--line);background:#fff;display:block;}
  .cat-img-none{width:40px;height:30px;border-radius:6px;border:1px dashed var(--line);background:var(--surface-2);display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:10px;}
  /* Test & tag editor: the section greys out when marked not required */
  .ae-tt-off{opacity:.45;pointer-events:none;}
  .ae-tt-btn.off{background:rgba(220,38,38,.1);color:var(--err);border-color:rgba(220,38,38,.35);}

  /* ── Bulk action floating bar ── */
  .bulk-bar{position:fixed;bottom:24px;left:50%;transform:translateX(-50%) translateY(20px);z-index:90;
    max-width:calc(100vw - 20px);flex-wrap:wrap;justify-content:center;
    background:#0F172A;color:#fff;border-radius:8px;padding:11px 14px;display:flex;align-items:center;gap:12px;
    box-shadow:0 22px 50px -16px rgba(0,0,0,.55);opacity:0;pointer-events:none;transition:all .22s cubic-bezier(.2,.7,.3,1);}
  .bulk-bar.show{opacity:1;pointer-events:auto;transform:translateX(-50%) translateY(0);}
  .bulk-bar .bb-count{font-weight:700;font-size:13px;background:rgba(255,255,255,.14);padding:5px 11px;border-radius:6px;white-space:nowrap;}
  .bulk-bar .bb-actions{display:flex;gap:6px;flex-wrap:wrap;}
  .bulk-bar button{background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.16);color:#fff;border-radius:6px;
    padding:7px 11px;font-size:13px;font-weight:500;cursor:pointer;font-family:inherit;display:inline-flex;align-items:center;gap:6px;transition:all .14s;}
  .bulk-bar button:hover{background:rgba(255,255,255,.2);}
  .bulk-bar button.danger:hover{background:var(--err);border-color:var(--err);}
  .bulk-bar .bb-close{background:none;border:0;opacity:.7;padding:4px;}
  .bulk-bar .bb-close:hover{opacity:1;background:none;}
  .row-check{width:16px;height:16px;accent-color:var(--brand-blue);cursor:pointer;}

  /* ── Detail: hero, lifecycle timeline, depreciation ── */
  .ah-head.lg{padding:24px 26px;}
  .ah-head .ah-quickstats{display:flex;gap:18px;margin-top:12px;flex-wrap:wrap;}
  .ah-head .ah-qs{display:flex;flex-direction:column;}
  .ah-head .ah-qs .v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;}
  .ah-head .ah-qs .l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;opacity:.82;margin-top:4px;font-weight:600;}
  .ah-actions{display:flex;gap:7px;flex-wrap:wrap;margin-top:14px;}
  /* Asset detail hero: QR tile + status pills */
  .ah-head.asd-hero{align-items:stretch;gap:18px;}
  /* v1.4.10.163: the hero's close button is absolutely positioned at top:16px /
     right:16px, and v162 grew the QR tile from 132px to 188px — tall enough that
     its top-right corner reached up INTO that button. Measured at 1400px: the X
     sat on the white card and over an 18x20px bite of the code's own modules, so
     it was covering scannable data, not just looking untidy. The QR column now
     ends before the button's gutter (48px for the button + a 10px gap) instead
     of underneath it. Below 680px the QR is a full-width row of its own — the
     button has nothing to clear there, so the padding goes back to normal. */
  .ah-head.asd-hero{padding-right:58px;}
  .ah-tagrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px;}
  .ah-statuspill{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;letter-spacing:0;padding:3px 10px;border-radius:999px;
    background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.28);color:#fff;text-transform:capitalize;}
  .ah-statuspill svg{width:12px;height:12px;stroke:#fff;}
  .ah-statuspill.ok{background:rgba(34,197,94,.32);border-color:rgba(134,239,172,.5);}
  .ah-statuspill.warn{background:rgba(245,158,11,.32);border-color:rgba(253,224,71,.5);}
  .ah-statuspill.err{background:rgba(239,68,68,.32);border-color:rgba(252,165,165,.5);}
  .ah-condpill{display:inline-flex;align-items:center;font-size:11px;font-weight:600;text-transform:capitalize;padding:3px 9px;border-radius:999px;
    background:rgba(0,0,0,.18);color:rgba(255,255,255,.92);}
  .ah-qr{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:7px;flex-shrink:0;cursor:pointer;align-self:center;
    padding:4px;border-radius:8px;transition:transform .15s;}
  .ah-qr:hover{transform:translateY(-2px) scale(1.02);}
  /* v1.4.10.155: the box CENTRES the code instead of stretching it (see drawQR)
     and is larger so a typical asset URL gets 3px modules instead of 2.
     v1.4.10.162: bigger again, and now the largest thing in the hero — this is
     the code someone scans off a screen while standing at a rack, so it is
     sized to be read at arm's length rather than to look tidy. 188px on a
     37-module code gives a whole 4px per module at 1:1 (188 = 47x4 with the
     quiet zone), which is what makes it crisp; see drawQR for why the pixel
     size must stay an exact multiple. */
  /* v1.4.10.201: 188px was ~200px of a 1140px modal — the single largest thing
     in the hero, ahead of the equipment photo, for a code that is also one
     click away on the QR-label button and reprinted full-size on the Documents
     tab. 140px still gives a 37-module code 3px per module at 1:1 (140 = 47x3
     with the quiet zone, the same exact-multiple rule drawQR relies on), which
     scans fine off a screen, and hands ~50px back to the title and actions. */
  .ah-qr-box{background:#fff;padding:8px;border-radius:8px;line-height:0;box-shadow:0 8px 22px rgba(0,0,0,.24);width:140px;height:140px;
    display:flex;align-items:center;justify-content:center;}
  /* NEVER width/height:100% for a QR — that was the 1.297x stretch that made the
     code look squashed and hurt scanning. The SVG is already drawn to fit. */
  .ah-qr-box svg{display:block;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:2px;}
  /* Code 128 tile — barcodes are wide, not square. */
  .ah-qr.is-barcode .ah-qr-box{width:264px;height:auto;min-height:94px;padding:12px 14px;}
  .ah-qr.is-barcode .ah-qr-box svg{width:100%;height:auto;}
  .ah-qr-cap{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:rgba(255,255,255,.92);}
  .ah-qr-cap svg{width:12px;height:12px;stroke:#fff;}
  /* Big hero photo (asset detail only — .xl is not used by the device modal).
     Large enough to actually see the equipment; clicks through to the
     lightbox, or to Documents to add a photo when there isn't one yet. */
  .ah-head.asd-hero .ah-thumb.xl{width:150px;height:150px;border-radius:8px;align-self:flex-start;position:relative;cursor:pointer;
    box-shadow:0 8px 22px rgba(0,0,0,.24);transition:transform .15s,box-shadow .15s;}
  .ah-head.asd-hero .ah-thumb.xl:hover{transform:translateY(-2px);box-shadow:0 12px 28px rgba(0,0,0,.3);}
  .ah-head.asd-hero .ah-thumb.xl svg{width:44px;height:44px;opacity:.9;}
  .ah-head.asd-hero .ah-thumb.xl{flex-direction:column;gap:8px;}
  .ah-thumb-add{display:inline-flex;align-items:center;gap:5px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
    color:rgba(255,255,255,.85);background:rgba(0,0,0,.18);border-radius:999px;padding:4px 10px;}
  .ah-thumb-add svg{width:12px !important;height:12px !important;}
  .ah-thumb-zoom{position:absolute;right:8px;bottom:8px;display:inline-flex;align-items:center;gap:5px;font-size:10px;font-weight:700;
    letter-spacing:.04em;text-transform:uppercase;color:#fff;background:rgba(15,23,42,.62);backdrop-filter:blur(4px);
    border-radius:999px;padding:4px 9px;opacity:0;transition:opacity .15s;pointer-events:none;}
  .ah-thumb-zoom svg{width:11px !important;height:11px !important;stroke:#fff;}
  .ah-thumb.xl:hover .ah-thumb-zoom{opacity:1;}
  @media (max-width:680px), (hover:none) and (pointer:coarse) and (max-width:1100px){.ah-head.asd-hero{flex-wrap:wrap;padding-right:26px;}.ah-qr{order:3;flex-direction:row;width:100%;justify-content:flex-start;gap:12px;margin-top:6px;}
    .ah-qr-box{width:184px;height:184px;}
    .ah-qr.is-barcode .ah-qr-box{width:236px;height:auto;}
    .ah-head.asd-hero .ah-thumb.xl{width:96px;height:96px;border-radius:7px;}
    .ah-head.asd-hero .ah-thumb.xl svg{width:30px;height:30px;}
    .ah-thumb-add{display:none;}}
  /* v1.4.10.177 — THE COMPACT PHONE HERO. At 390px the hero alone measured
     660px tall (150px thumb, 22px multi-line title, six stacked buttons and a
     184px QR), so opening an asset showed ONLY the header — the tabs and the
     Overview cards started a full screen below the fold. Everything shrinks;
     nothing is removed — the QR stays scannable at 92px and every action
     keeps its button. Target: tabs visible on open. */
  @media (max-width:680px), (hover:none) and (pointer:coarse) and (max-width:1100px){
    .ah-head.lg{padding:14px 14px 12px;gap:12px;}
    .ah-head.asd-hero .ah-thumb.xl{width:64px;height:64px;border-radius:7px;}
    .ah-head.asd-hero .ah-thumb.xl svg{width:22px;height:22px;}
    .ah-head.asd-hero .ah-title{font-size:18px;line-height:1.22;}
    .ah-head.asd-hero .ah-sub{font-size:12px;}
    .ah-head.asd-hero .ah-tagrow{gap:5px;}
    .ah-head.asd-hero .ah-quickstats{gap:12px;margin-top:8px;}
    .ah-head.asd-hero .ah-quickstats .v{font-size:14px;}
    .ah-head.asd-hero .ah-actions{margin-top:9px;gap:6px;}
    .ah-head.asd-hero .ah-actions .btn.sm{padding:7px 10px;font-size:12px;}
    .ah-head.asd-hero .ah-actions .btn.sm svg{width:13px;height:13px;}
    .ah-qr{margin-top:2px;gap:10px;}
    .ah-qr-box{width:92px;height:92px;padding:5px;border-radius:6px;}
    .ah-qr.is-barcode .ah-qr-box{width:200px;min-height:64px;padding:8px 10px;}
    .ah-qr-cap{font-size:11px;}
  }
  /* ── v1.4.10.201 — THE PHONE HERO, SECOND PASS ───────────────────────────
     v177's pass took the hero from 660px to 442px at 390x664. That is still
     two-thirds of the viewport: opening an asset showed the header and nothing
     else — the tab strip sat at ~460px and the first Overview card at ~640px,
     so every asset needed a full scroll before it said anything about itself.
     Three costs, measured, and what each buys back:

       ~115px  the 92px QR block and its caption. REMOVED on a phone — not
               hidden data: the "QR label" action is right there in the same
               hero and the Documents tab reprints it full size. It is the one
               element here that duplicates something one tap away.
       ~62px   six action buttons wrapping onto three rows. They become a
               single scrollable row of 34px icon buttons with the label read
               out by title/aria-label, so every action survives and the row
               is one line at any width.
       ~22px   a three-line title. Clamped to two lines (still the full text
               on the Specs tab and in the tooltip).

     Result ~245px, leaving 400px+ of actual content on open. Nothing is
     removed from the record — only from the header. */
  @media (max-width:680px), (hover:none) and (pointer:coarse) and (max-width:1100px){
    .ah-head.asd-hero .ah-qr{display:none;}
    .ah-head.asd-hero .ah-title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
    .ah-head.asd-hero .ah-actions{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
      scrollbar-width:none;margin-top:10px;gap:7px;padding-bottom:2px;}
    .ah-head.asd-hero .ah-actions::-webkit-scrollbar{display:none;}
    /* Icon-only: the label is collapsed to zero width rather than removed, so
       the accessible name and the tooltip still read it out. */
    .ah-head.asd-hero .ah-actions .btn.sm{flex:0 0 auto;width:40px;height:40px;padding:0;   /* v1.4.10.473: 40x40, the phone tap floor (was 38 wide — the touch layer only raised the height) */
      justify-content:center;border-radius:6px;font-size:0;line-height:0;gap:0;}
    .ah-head.asd-hero .ah-actions .btn.sm svg{width:17px;height:17px;margin:0;flex:0 0 auto;}
  }
  .ah-actions .btn{background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.2);color:#fff;box-shadow:none;}
  .ah-actions .btn:hover{background:rgba(255,255,255,.26);}
  .ah-actions .btn svg{stroke:#fff;}

  .lifecycle-track{position:relative;padding:30px 6px 8px;margin:6px 0 4px;}
  .lt-line{position:absolute;left:6px;right:6px;top:42px;height:4px;border-radius:3px;background:var(--surface-2);}
  .lt-fill{position:absolute;left:6px;top:42px;height:4px;border-radius:3px;background:linear-gradient(90deg,var(--brand-blue),var(--brand-purple));transition:width .5s ease;}
  .lt-nodes{position:relative;display:flex;justify-content:space-between;}
  .lt-node{display:flex;flex-direction:column;align-items:center;flex:1;text-align:center;position:relative;z-index:1;}
  .lt-dot{width:30px;height:30px;border-radius:50%;background:var(--surface);border:2px solid var(--line);display:flex;align-items:center;justify-content:center;color:var(--text-dim);margin-bottom:8px;transition:all .2s;}
  .lt-dot svg{width:14px;height:14px;}
  .lt-node.done .lt-dot{background:var(--brand-blue);border-color:var(--brand-blue);color:#fff;}
  .lt-node.now .lt-dot{background:#fff;border-color:var(--brand-purple);color:var(--brand-purple);box-shadow:0 0 0 4px rgba(var(--bc-purple-rgb),.16);}
  .lt-node.warn .lt-dot{background:var(--warn);border-color:var(--warn);color:#fff;}
  .lt-node.err .lt-dot{background:var(--err);border-color:var(--err);color:#fff;}
  /* v1.4.10.473: uppercase label 11/600 .06em (was 11/700 sentence case, no such look) */
  .lt-label{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text);}
  .lt-date{font-size:11px;color:var(--text-dim);margin-top:2px;}

  .depr-card{display:grid;grid-template-columns:1fr 150px;gap:18px;align-items:center;}
  .depr-spark{width:100%;height:90px;}
  .depr-spark svg{width:100%;height:100%;overflow:visible;}
  .depr-figs{display:flex;flex-direction:column;gap:10px;}
  .depr-fig .v{font-size:20px;font-weight:600;line-height:1;letter-spacing:-.02em;}
  .depr-fig .l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;margin-top:3px;}
  @media(max-width:560px){.depr-card{grid-template-columns:1fr;}}

  .countdown{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:4px 10px;border-radius:6px;}
  .countdown.ok{background:rgba(22,163,74,.1);color:var(--ok);}
  .countdown.warn{background:rgba(217,119,6,.12);color:var(--warn);}
  .countdown.err{background:rgba(220,38,38,.1);color:var(--err);}

  /* component / attachment lists */
  .comp-row,.att-row{display:flex;align-items:center;gap:10px;padding:9px 11px;border:1px solid var(--line);border-radius:6px;margin-bottom:7px;font-size:13px;cursor:pointer;transition:border-color .12s,background .12s;}
  .comp-row:hover,.att-row:hover{border-color:var(--brand-blue);background:var(--accent-glow);}
  .comp-ico,.att-ico{width:30px;height:30px;border-radius:6px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;color:var(--text-mute);flex-shrink:0;}
  .att-row .att-del{margin-left:auto;color:var(--text-dim);background:none;border:0;cursor:pointer;padding:4px;}
  .att-row .att-del:hover{color:var(--err);}

  /* ============ ASSET DETAIL: wider modal + tabbed layout ============ */
  #modal-inner.modal-asset{max-width:1140px;width:100%;max-height:calc(100dvh - 72px);display:flex;flex-direction:column;overflow:hidden;}
  #modal-inner.modal-asset > .ah-head{flex-shrink:0;border-radius:8px 8px 0 0;}
  .adt-body{padding:0 !important;display:flex;flex-direction:row;min-height:0;flex:1;}
  /* Section nav as a left rail (mirrors the asset editor's .ae-nav). */
  .adt-tabs{display:flex;flex-direction:column;gap:2px;width:226px;flex-shrink:0;align-self:stretch;
    padding:12px 12px 16px;overflow-y:auto;overflow-x:hidden;border-right:1px solid var(--line);
    background:var(--surface-2);scrollbar-width:thin;scrollbar-color:var(--line-2) transparent;}
  .adt-tabs::-webkit-scrollbar{width:7px;}
  .adt-tabs::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:4px;}
  .adt-railgroup{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);padding:13px 10px 5px;}
  .adt-railgroup:first-child{padding-top:2px;}
  .adt-tab{display:flex;align-items:center;gap:11px;width:100%;text-align:left;white-space:nowrap;
    border:1px solid transparent;background:transparent;color:var(--text-mute);font-family:inherit;
    font-size:13px;font-weight:600;padding:9px 11px;border-radius:6px;cursor:pointer;position:relative;
    transition:color .14s,background .14s,border-color .14s;}
  .adt-tab svg{width:17px;height:17px;stroke:currentColor;opacity:.9;flex-shrink:0;}
  .adt-tab > span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;}
  .adt-tab:hover{color:var(--text);background:var(--surface);}
  .adt-tab.active{color:var(--brand-blue);background:var(--surface);border-color:var(--line);box-shadow:var(--shadow-sm);font-weight:600;}
  .adt-tab.active::before{content:"";position:absolute;left:-1px;top:50%;transform:translateY(-50%);width:3px;height:18px;border-radius:0 3px 3px 0;background:linear-gradient(180deg,var(--brand-blue),var(--brand-purple));}
  /* v1.4.10.473: badge look, 10/700 uppercase .04em (was untracked) */
  .adt-tab .adt-count{flex:0 0 auto;margin-left:auto;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;line-height:1;padding:2px 7px;border-radius:10px;background:var(--surface-2);color:var(--text-mute);}
  .adt-tab.active .adt-count{background:var(--accent-glow);color:var(--brand-blue);}
  .adt-panes{padding:24px 28px;overflow-y:auto;flex:1;min-width:0;min-height:0;}
  .adt-pane{display:none;animation:adtFade .2s cubic-bezier(.22,.7,.3,1);}
  .adt-pane.active{display:block;position:relative;}
  /* Every pane opens with the same header bar: title + one-line explainer on
     the left, the per-tab Edit on the right. The Edit is a normal flex child
     (not absolutely positioned), so it can never overlap the health banner,
     headings or the at-a-glance card below it. */
  .adt-pane-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;
    margin:0 0 18px;padding:0 0 14px;border-bottom:1px solid var(--line);}
  .adt-pane-head .adt-pane-intro{margin:0;flex:1;min-width:0;}
  .adt-edit{flex-shrink:0;display:inline-flex;align-items:center;gap:6px;margin-top:1px;
    border:1px solid var(--line);background:var(--surface-2);color:var(--text-mute);
    font-family:inherit;font-size:12px;font-weight:500;padding:6px 11px;border-radius:6px;cursor:pointer;
    transition:color .12s,border-color .12s,background .12s;}
  .adt-edit:hover{color:var(--brand-blue);border-color:var(--brand-blue);background:rgba(var(--bc-accent-rgb),.08);}
  .adt-edit svg{width:14px;height:14px;}
  /* Brief highlight when a per-tab Edit jumps to a section. */
  .form-section.fs-flash{animation:fsFlash 1.6s ease;}
  @keyframes fsFlash{0%,100%{box-shadow:0 0 0 0 rgba(var(--bc-accent-rgb),0);}15%,55%{box-shadow:0 0 0 3px rgba(var(--bc-accent-rgb),.35);}}
  /* ───────── Asset editor — stepped wizard ───────── */
  .asset-editor.ae-wrap{max-width:none;padding:0;display:flex;flex-direction:column;flex:1;min-height:0;}
  .ae-wiz{display:flex;flex:1;min-height:0;}
  .ae-nav{flex:none;width:238px;border-right:1px solid var(--line);background:var(--surface-2,rgba(2,6,23,.025));padding:14px 12px;overflow-y:auto;display:flex;flex-direction:column;gap:4px;}
  .ae-nav-item{display:flex;align-items:center;gap:11px;width:100%;text-align:left;border:1px solid transparent;background:transparent;border-radius:6px;padding:10px 11px;cursor:pointer;font:inherit;color:var(--text-mute);transition:background .14s,border-color .14s,color .14s;}
  .ae-nav-item:hover{background:var(--surface);color:var(--text);}
  .ae-nav-item.active{background:var(--surface);border-color:var(--line);box-shadow:var(--shadow-sm);}
  .ae-nav-num{position:relative;flex:none;width:27px;height:27px;border-radius:6px;display:flex;align-items:center;justify-content:center;background:var(--surface);border:1px solid var(--line);font-size:12px;font-weight:700;color:var(--text-mute);transition:background .16s,color .16s,border-color .16s;}
  .ae-nav-num .n{transition:opacity .14s;}
  .ae-nav-num svg{position:absolute;width:13px;height:13px;opacity:0;stroke-width:3;}
  .ae-nav-item.active .ae-nav-num{background:linear-gradient(135deg,var(--brand-blue,var(--bc-blue-v1)),var(--brand-purple,var(--bc-purple-v1)));border-color:transparent;color:#fff;}
  .ae-nav-item.done .ae-nav-num{background:var(--ok,#16A34A);border-color:transparent;color:#fff;}
  .ae-nav-item.done:not(.active) .ae-nav-num .n{opacity:0;}
  .ae-nav-item.done:not(.active) .ae-nav-num svg{opacity:1;}
  .ae-nav-text{display:flex;flex-direction:column;gap:1px;min-width:0;}
  .ae-nav-t{font-size:13px;font-weight:500;line-height:1.2;}
  .ae-nav-item.active .ae-nav-t{color:var(--brand-blue,var(--bc-blue-v1));font-weight:600;}
  .ae-nav-s{font-size:11px;color:var(--text-dim);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .ae-stage{flex:1;min-width:0;overflow-y:auto;padding:22px 26px;}
  .ae-step-panel{display:none;}
  .ae-step-panel.active{display:block;animation:adtFade .2s ease;}
  .ae-step-panel .form-section{border:0;padding:0;margin:0 0 18px;background:transparent;box-shadow:none;}
  .ae-step-panel .form-section:last-child{margin-bottom:0;}
  .ae-step-panel.fs-flash{animation:fsFlash 1.6s ease;}
  .ae-foot{flex:none;display:flex;align-items:center;gap:12px;padding:13px 20px;border-top:1px solid var(--line);background:var(--surface);}
  .ae-foot-mid{flex:1;display:flex;align-items:center;justify-content:center;gap:11px;}
  .ae-foot-prog{display:flex;gap:6px;}
  .ae-foot-dot{width:7px;height:7px;border-radius:50%;background:var(--line-2,#CBD5E1);transition:background .2s,transform .2s;}
  .ae-foot-dot.on{background:var(--brand-blue,var(--bc-blue-v1));transform:scale(1.3);}
  .ae-foot-dot.done{background:var(--ok,#16A34A);}
  .ae-foot-count{font-size:12px;color:var(--text-mute);font-weight:600;}
  .ae-foot-right{display:flex;gap:8px;align-items:center;}
  @media(max-width:760px){
    .ae-wiz{flex-direction:column;}
    .ae-nav{width:auto;flex-direction:row;border-right:0;border-bottom:1px solid var(--line);overflow-x:auto;padding:10px;gap:6px;}
    .ae-nav-item{flex-direction:column;align-items:center;gap:5px;min-width:76px;padding:8px 6px;}
    .ae-nav-text{align-items:center;}
    .ae-nav-s{display:none;}
    .ae-nav-t{font-size:12px;text-align:center;}
    .ae-stage{padding:18px 16px;}
    .ae-foot{flex-wrap:wrap;}
    .ae-foot-mid{order:3;width:100%;}
    /* v1.4.10.473: the right-hand group takes its own full row and its buttons keep their labels on one line —
       at 390 "Start fresh" and "Create asset" wrapped to two lines and stood 58px beside the 40px Cancel / Next */
    .ae-foot-right{flex:1 1 100%;flex-wrap:wrap;}
    .ae-foot-right .btn{flex:1 1 auto;justify-content:center;white-space:nowrap;}
  }
  /* v1.4.10.511: at 390px the five 76px steps (404px with their gaps) overflowed the 370px rail with no cue, so
     Assignment sat off the edge; the steps share the width instead (aeGoStep also scrolls the active one into view) */
  @media(max-width:430px){
    .ae-nav-item{flex:1 1 0;min-width:0;padding:8px 2px;}
    .ae-nav-t{font-size:11px;}
  }
  /* v1.4.10.473: the ? inside the footer's Help button is its icon, not a tap target — the touch floor's 24px tip
     made Help 42px beside the 40px Back */
  @media (hover:none) and (pointer:coarse){ .ae-foot .btn .help-tip{width:15px;height:15px;} }
  @keyframes adtFade{from{opacity:0;transform:translateY(5px);}to{opacity:1;transform:translateY(0);}}
  .adt-pane .panel{margin:0 0 16px;}
  /* v1.4.10.258 — the Attachments pane: the gallery owns the full pane width
     now, so its thumbnails earn a larger cell; the files/label row beneath
     shares the existing two-column grid. */
  #adt-documents .photo-grid{grid-template-columns:repeat(auto-fill,minmax(min(132px,100%),1fr));gap:10px;}
  .asd-att-row{margin-top:2px;}
  .asd-att-row .panel{height:100%;}
  .adt-pane .panel:last-child{margin-bottom:0;}
  .adt-pane .asd-h:first-child{margin-top:0;}
  .adt-grid2{display:grid;grid-template-columns:1fr 1fr;gap:0 26px;align-items:start;}
  .adt-pane-intro{margin:0 0 18px;}
  .adt-pane-intro h4{font-family:var(--font-display);font-size:16px;font-weight:600;color:var(--text);margin:0 0 4px;letter-spacing:-.012em;}
  .adt-pane-intro p{font-size:12px;color:var(--text-dim);margin:0;line-height:1.5;}
  .adt-empty{text-align:center;padding:38px 16px;color:var(--text-dim);font-size:13px;}   /* v1.4.10.473: an empty state's message is 13, like .empty (inherited the modal's 14) */
  .adt-empty .adt-empty-ico{width:50px;height:50px;border-radius:8px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;margin:0 auto 13px;color:var(--text-mute);}
  .adt-empty .adt-empty-ico svg{width:22px;height:22px;}
  .asd-notes{color:var(--text-mute);line-height:1.6;margin:0;font-size:13px;white-space:pre-wrap;}

  /* ── Overview: connection & health banner (the headline state) ── */
  .asset-health{display:flex;align-items:center;gap:14px;padding:15px 18px;border-radius:8px;border:1px solid var(--line);position:relative;overflow:hidden;}
  .asset-incomplete{display:flex;align-items:center;gap:14px;padding:13px 16px;border-radius:7px;margin-bottom:16px;
    background:color-mix(in srgb,var(--warn) 13%,transparent);border:1px solid color-mix(in srgb,var(--warn) 40%,transparent);}
  .asset-incomplete .ai-ico{width:38px;height:38px;border-radius:6px;display:grid;place-items:center;flex-shrink:0;background:color-mix(in srgb,var(--warn) 20%,transparent);color:var(--warn);}
  .asset-incomplete .ai-main{flex:1;min-width:0;}
  /* v1.4.10.473: sub-heading 13/600 (inherited 14, off the role) */
  .asset-incomplete .ai-title{font-size:13px;font-weight:600;color:var(--text);}
  .asset-incomplete .ai-sub{font-size:12px;color:var(--text-mute);margin-top:2px;}
  .asset-incomplete .ai-act{flex:none;}
  /* v1.4.10.512: the asset's place in its history (retired and replaced by X / replaces Y) — a quiet note, not a warning */
  .asset-incomplete.asset-lineage{background:color-mix(in srgb,var(--brand-blue) 7%,transparent);border-color:color-mix(in srgb,var(--brand-blue) 30%,transparent);}
  .asset-incomplete.asset-lineage .ai-ico{background:color-mix(in srgb,var(--brand-blue) 14%,transparent);color:var(--brand-blue);}
  .asset-incomplete.asset-lineage .ai-title a{color:inherit;text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--brand-blue) 50%,transparent);}
  .asset-incomplete.asset-lineage .ai-sub a{color:var(--brand-blue);}
  /* v1.4.10.512: the Asset history tree on the Connected tab — roots at the top, each replacement nested one step in */
  .ap-lin-tree,.ap-lin-kids{list-style:none;margin:0;padding:0;}
  .ap-lin-kids{margin:2px 0 0 19px;padding-left:16px;border-left:2px solid var(--line-2);}
  .ap-lin-node{position:relative;padding:3px 0;}
  .ap-lin-kids>.ap-lin-node::before{content:"";position:absolute;left:-16px;top:26px;width:12px;height:2px;background:var(--line-2);}
  .ap-lin-node.ap-lin-gone>.ap-lin-card .ap-lin-ico{opacity:.7;}
  .ap-lin-step{font-size:11px;color:var(--text-mute);margin:2px 0 3px 2px;}
  .ap-lin-card{display:flex;align-items:center;gap:10px;min-height:44px;padding:7px 10px;border:1px solid var(--line);border-radius:7px;background:var(--surface);cursor:pointer;}
  .ap-lin-card:hover,.ap-lin-card:focus-visible{border-color:var(--brand-blue);outline:none;}
  .ap-lin-node.cur>.ap-lin-card{border-color:var(--brand-blue);background:color-mix(in srgb,var(--brand-blue) 8%,var(--surface));cursor:default;}
  .ap-lin-ico{width:30px;height:30px;border-radius:6px;display:grid;place-items:center;flex:none;background:var(--surface-2);color:var(--text-mute);}
  .ap-lin-ico svg{width:16px;height:16px;}
  .ap-lin-main{flex:1;min-width:0;}
  .ap-lin-tag{font-size:13px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
  .ap-lin-sub{font-size:11px;color:var(--text-dim);margin-top:1px;overflow:hidden;text-overflow:ellipsis;}
  .am-prob.am-prob-ign .am-prob-t{color:var(--text-mute);}   /* v1.4.10.512: an open alert set to Ignore notification */
  .asset-health::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;}
  .asset-health .ahx-icon{width:42px;height:42px;border-radius:6px;display:grid;place-items:center;flex-shrink:0;}
  .asset-health .ahx-icon svg{width:21px;height:21px;}
  .ahx-main{flex:1;min-width:0;}
  .ahx-state{display:flex;align-items:center;gap:9px;font-family:var(--font-display);font-size:16px;font-weight:700;letter-spacing:-.01em;line-height:1.2;}
  .ahx-led{width:9px;height:9px;border-radius:50%;flex-shrink:0;}
  .ahx-sub{font-size:13px;color:var(--text-mute);margin-top:3px;line-height:1.45;}
  .ahx-act{flex-shrink:0;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--surface);color:var(--text-mute);font:inherit;font-size:13px;font-weight:500;padding:7px 12px;border-radius:6px;cursor:pointer;transition:color .14s,border-color .14s;}
  .ahx-act:hover{color:var(--brand-blue);border-color:var(--brand-blue);}
  .ahx-act svg{width:14px;height:14px;}
  .asset-health.ah-up{background:linear-gradient(90deg,rgba(22,163,74,.09),transparent 62%);}
  .asset-health.ah-up::before{background:var(--ok);}
  .asset-health.ah-up .ahx-icon{background:rgba(22,163,74,.13);color:var(--ok);}
  .asset-health.ah-up .ahx-led{background:var(--ok);box-shadow:0 0 0 3px rgba(22,163,74,.22);animation:ahxPulse 2.4s infinite;}
  .asset-health.ah-down{background:linear-gradient(90deg,rgba(220,38,38,.09),transparent 62%);}
  .asset-health.ah-down::before{background:var(--err);}
  .asset-health.ah-down .ahx-icon{background:rgba(220,38,38,.13);color:var(--err);}
  .asset-health.ah-down .ahx-led{background:var(--err);box-shadow:0 0 0 3px rgba(220,38,38,.22);}
  .asset-health.ah-pending{background:linear-gradient(90deg,rgba(217,119,6,.10),transparent 62%);}
  .asset-health.ah-pending::before{background:var(--warn);}
  .asset-health.ah-pending .ahx-icon{background:rgba(217,119,6,.13);color:var(--warn);}
  .asset-health.ah-pending .ahx-led{background:var(--warn);}
  .asset-health.ah-idle{background:var(--surface-2);}
  .asset-health.ah-idle::before{background:var(--line-2);}
  .asset-health.ah-idle .ahx-icon{background:var(--surface);color:var(--text-mute);border:1px solid var(--line);}
  .asset-health.ah-idle .ahx-led{background:var(--text-dim);}
  @keyframes ahxPulse{0%,100%{box-shadow:0 0 0 3px rgba(22,163,74,.22);}50%{box-shadow:0 0 0 6px rgba(22,163,74,.05);}}
  @media(prefers-reduced-motion:reduce){.asset-health .ahx-led{animation:none !important;}}
  .ahx-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1px;background:var(--line);border:1px solid var(--line);border-radius:7px;overflow:hidden;margin-top:12px;}
  .ahx-fact{background:var(--surface);padding:11px 14px;}
  .ahx-fact .k{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;}
  .ahx-fact .v{font-size:13px;font-weight:600;color:var(--text);margin-top:3px;word-break:break-word;}

  /* ── Specs: titled spec cards (label ⇄ value rows) ── */
  .spec-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:start;}
  .spec-card{border:1px solid var(--line);border-radius:8px;background:var(--surface);overflow:hidden;box-shadow:var(--shadow-sm);}
  .spec-card .spec-head{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--line);background:var(--surface-2);}
  .spec-card .spec-ico{width:30px;height:30px;border-radius:6px;display:grid;place-items:center;background:var(--accent-glow);color:var(--brand-blue);flex-shrink:0;}
  .spec-card .spec-ico svg{width:16px;height:16px;}
  .spec-card .spec-title{font-family:var(--font-display);font-size:15px;font-weight:600;letter-spacing:-.012em;color:var(--text);}
  .spec-card .detail-grid{display:block;}
  .spec-card .dg-cell{display:flex;align-items:baseline;justify-content:space-between;gap:18px;padding:10px 16px;border-top:1px solid var(--line);}
  .spec-card .dg-cell:first-child{border-top:0;}
  .spec-card .dg-cell .lbl{margin:0;flex:0 0 auto;}
  .spec-card .dg-cell .val{font-size:13px;font-weight:600;text-align:right;min-width:0;word-break:break-word;}
  .spec-card .dg-cell .val a{color:var(--brand-blue);}

  /* ── Inline asset add-forms (open inside the asset tab, not a stacked modal) ── */
  .ap-form-slot{display:block;}
  .ap-form-slot:empty{display:none;}
  .ap-form{position:relative;overflow:hidden;border:1px solid var(--line-2);border-radius:7px;
    background:linear-gradient(180deg,#FAFBFE,var(--surface));box-shadow:0 6px 22px -14px rgba(30,58,138,.34),0 1px 0 rgba(255,255,255,.6) inset;
    margin:0 0 16px;opacity:0;transform:translateY(-6px);max-height:0;transition:opacity .22s ease,transform .22s ease,max-height .28s ease;}
  .ap-form.open{opacity:1;transform:none;max-height:900px;}
  .ap-form::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--grad);}
  .ap-form-head{display:flex;align-items:center;gap:10px;padding:14px 16px 12px 18px;border-bottom:1px solid var(--line);}
  .ap-form-ico{width:30px;height:30px;border-radius:6px;flex-shrink:0;display:flex;align-items:center;justify-content:center;
    background:linear-gradient(135deg,rgba(var(--bc-accent-rgb),.14),rgba(var(--bc-purple-rgb),.14));color:var(--brand-blue);}
  .ap-form-ico svg{width:16px;height:16px;}
  .ap-form-title{font-family:var(--font-display);font-size:15px;font-weight:600;letter-spacing:-.012em;color:var(--text);}
  .ap-form-x{margin-left:auto;width:28px;height:28px;border-radius:6px;border:0;background:transparent;color:var(--text-mute);
    display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .12s,color .12s;}
  .ap-form-x:hover{background:var(--surface-3);color:var(--text);}
  .ap-form-x svg{width:15px;height:15px;}
  .ap-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px 16px;padding:16px 18px;}
  .ap-form .fld{display:flex;flex-direction:column;gap:6px;margin:0;min-width:0;}
  .ap-form .fld.col2{grid-column:1 / -1;}
  /* v1.4.10.473: Quick add's labels (a <label>, which had no style at all and drew at 14/400) take the field-label look
     12/500; every <span> label of a .fld has it from the base .fld > span rule below */
  .form-grid .fld > label{font-size:12px;font-weight:500;letter-spacing:0;color:var(--text-mute);text-transform:none;}
  /* v1.4.10.473: Quick add's catalogue search placeholder is longer than a phone field (365px of 16px text in 300px):
     it ends in an ellipsis instead of being sliced */
  .form-grid .fld > input{text-overflow:ellipsis;}
  .ap-form .fld input,.ap-form .fld select,.ap-form .fld textarea{width:100%;box-sizing:border-box;padding:10px 12px;
    background:var(--surface);border:1px solid var(--line-2);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;
    transition:border-color .15s,box-shadow .15s;}
  .ap-form .fld textarea{min-height:64px;resize:vertical;line-height:1.5;}
  .ap-form .fld input:focus,.ap-form .fld select:focus,.ap-form .fld textarea:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .ap-form .fld input::placeholder,.ap-form .fld textarea::placeholder{color:var(--text-dim);}
  .ap-form-note{grid-column:1 / -1;font-size:12px;line-height:1.45;margin:-2px 0 0;}
  .ap-form-foot{display:flex;align-items:center;justify-content:flex-end;gap:9px;padding:0 18px 16px;}
  .ap-form-foot .ap-form-hint{margin-right:auto;font-size:12px;color:var(--text-dim);}
  /* Generic .fld fallback so any remaining stacked-modal uses also read cleanly */
  .fld{display:flex;flex-direction:column;gap:6px;margin:0 0 12px;}
  .fld > span{font-size:12px;font-weight:500;letter-spacing:0;color:var(--text-mute);text-transform:none;}   /* v1.4.10.473: the field-label look, 12/500 sentence case like .field label (was 11/600 uppercase .06em, the table-header look — and only the asset forms had been moved off it) */
  .fld input,.fld select,.fld textarea{width:100%;box-sizing:border-box;padding:10px 12px;background:var(--surface);
    border:1px solid var(--line-2);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;transition:border-color .15s,box-shadow .15s;}
  .fld textarea{min-height:64px;resize:vertical;}
  .fld input:focus,.fld select:focus,.fld textarea:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  @media(max-width:560px){ .ap-form-grid{grid-template-columns:1fr;} }
  @media(max-width:920px){ .adt-grid2{grid-template-columns:1fr;} }

  /* ── Consumables / spares ── */
  .cn-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px 16px;}
  .cn-form-grid .fld{margin-bottom:0;min-width:0;}
  .cn-form-grid .fld.col2{grid-column:1 / -1;}
  @media(max-width:560px){ .cn-form-grid{grid-template-columns:1fr;} }
  .mini-l{font-size:11px;color:var(--text-dim);margin-top:3px;}
  .cn-bar{margin-top:6px;max-width:220px;}
  .cn-bar-track{position:relative;height:6px;border-radius:4px;background:var(--line);overflow:visible;}
  .cn-bar-track > span{position:absolute;left:0;top:0;bottom:0;border-radius:4px;transition:width .3s;}
  .cn-bar-min{position:absolute;top:-3px;width:2px;height:12px;background:var(--text-mute);opacity:.65;border-radius:1px;}
  .cn-detail-head{display:flex;align-items:flex-start;gap:14px;margin-bottom:16px;}
  .cn-stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:12px;}
  .cn-stat{background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:13px 14px;text-align:center;}
  .cn-stat .v{font-size:20px;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums;}
  .cn-stat .l{font-size:11px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;margin-top:3px;}
  .cn-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}
  .cn-kv{display:flex;justify-content:space-between;gap:14px;padding:6px 0;border-bottom:1px solid var(--line);font-size:13px;}
  .cn-kv:last-child{border-bottom:none;}
  .cn-kv > span{color:var(--text-dim);}
  .cn-rep-head{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px;}
  /* v1.4.10.473: the on-screen report's headings had no size and took the browser's (21px and 16.38px). Section title
     16/600 and card title 15/600; scoped to the modal, so the printed copy keeps its own print sheet. */
  #cn-report .cn-rep-head h2{font-size:16px;font-weight:600;letter-spacing:-.012em;}
  #cn-report h3{font-size:15px;font-weight:600;letter-spacing:-.01em;}
  .cn-rep-figs{display:flex;gap:24px;flex-wrap:wrap;background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:16px 18px;margin-bottom:8px;}
  .cn-rep-figs .v{font-size:20px;font-weight:600;letter-spacing:-.02em;} .cn-rep-figs .l{font-size:11px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;margin-top:2px;}
  /* ── Dashboard: consumables reorder panel ── */
  .dash-reorder{display:flex;flex-direction:column;gap:2px;}
  .dro-row{display:flex;align-items:center;gap:12px;padding:10px 4px;border-bottom:1px solid var(--line);cursor:pointer;}
  .dro-row:last-child{border-bottom:none;}
  .dro-row:hover{background:var(--hover,rgba(127,127,127,.05));}
  .dro-ico{width:34px;height:34px;border-radius:6px;display:flex;align-items:center;justify-content:center;background:var(--warn-soft,rgba(217,160,40,.14));color:var(--warn);flex-shrink:0;}
  .dro-main{flex:1;min-width:0;} .dro-main .t{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}   /* v1.4.10.473: 13/600 like every row title (it inherited the page's 14) */
  .dro-main .s{font-size:12px;color:var(--text-dim);}   /* v1.4.10.473: a row's second line is meta, 12 (was 11) */
  @media(max-width:600px){
    #modal-inner.modal-asset{max-width:100%;max-height:calc(100dvh - 24px);}
    .adt-body{flex-direction:column;}
    .adt-tabs{flex-direction:row;width:auto;align-self:auto;border-right:0;border-bottom:1px solid var(--line);
      overflow-x:auto;overflow-y:hidden;padding:8px 10px;gap:6px;}
    .adt-railgroup{display:none;}
    .adt-tab{width:auto;flex-shrink:0;border-radius:6px;padding:9px 12px;font-size:13px;}   /* v1.4.10.473: a tab stays 13/600 on a phone (was 12) */
    .adt-tab.active::before{display:none;}
    .adt-tab .adt-count{margin-left:4px;}
    .adt-panes{padding:16px;}
    .spec-cards{grid-template-columns:1fr;}
  }
  /* ── v1.4.10.253 — THE SCANNED-ASSET PHONE PAGE. Scanning a QR label opens
     this modal on a phone, and three things were wrong, measured at 390×664:
     (1) the hero kept its desktop flex row, so every line of text lived in a
         264px column beside the 64px photo — the hero alone was 365px tall,
         the title wrapped four lines deep and the six-button action row was
         squeezed to 264px with the last button cut at the viewport edge;
     (2) the health banner kept icon + text + button on one 336px row, so the
         text column was 85px wide — one word per line beside View monitoring;
     (3) the modal kept its desktop insets (10px sides, 14/28px top/bottom),
         spending 20px of width and 42px of height on chrome around a page
         that IS the whole screen.
     The hero now flows AROUND the floated photo (the tag row and title share
     its rows; everything after runs the full width), the banner wraps with
     its action on a full-width row of its own, and the modal goes full-bleed
     exactly the way the v252 stocktake modal does, safe-areas respected.
     Nothing is removed — every element keeps its place, only the geometry
     changes. */
  @media(max-width:600px){
    .modal-back:has(> .modal-asset){padding:0;}
    #modal-inner.modal-asset{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;
      border-radius:0;margin:0;}
    #modal-inner.modal-asset > .ah-head{border-radius:0;
      padding-top:calc(14px + env(safe-area-inset-top));}
    #modal-inner.modal-asset > .ah-head .close{top:calc(12px + env(safe-area-inset-top));}
    #modal-inner.modal-asset .adt-panes{padding-bottom:calc(16px + env(safe-area-inset-bottom));}
    /* (1) hero: block flow around the floated photo instead of a flex row.
       The tag row and a two-line title together (~80px) clear the 64px
       thumb, so the sub, breadcrumb, quick stats and actions all get the
       full modal width. clear:left on the actions is insurance for a short
       hero (one-line title) — the button row must never sit half-beside the
       photo. */
    .ah-head.asd-hero{display:block;}
    .ah-head.asd-hero .ah-thumb.xl{float:left;margin:0 12px 8px 0;}
    .ah-head.asd-hero .ah-main{width:100%;}
    .ah-head.asd-hero .ah-actions{clear:left;}
    /* (2) the banner and the incomplete/catalogue notices share one shape
       (icon · text · action): let them wrap, text keeps flex:1, the action
       becomes a full-width row — which also lands the 40px tap floor. */
    .asset-health{flex-wrap:wrap;}
    .asset-health .ahx-act{flex:1 1 100%;justify-content:center;}
    .asset-incomplete{flex-wrap:wrap;}
    .asset-incomplete .ai-act{flex:1 1 100%;justify-content:center;}
  }

  /* category breakdown bars */
  .cat-bars{display:flex;flex-direction:column;gap:11px;}
  .cat-row{display:grid;grid-template-columns:130px 1fr 48px;gap:12px;align-items:center;font-size:12px;}
  .cat-row .cat-name{display:flex;align-items:center;gap:8px;font-weight:500;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .cat-row .cat-ico{width:24px;height:24px;border-radius:5px;background:var(--accent-glow);color:var(--brand-blue);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .cat-track{height:9px;border-radius:5px;background:var(--surface-2);overflow:hidden;}
  .cat-track > span{display:block;height:100%;border-radius:5px;background:linear-gradient(90deg,var(--brand-blue),var(--brand-purple));}
  .cat-row .cat-n{text-align:right;font-weight:700;color:var(--text-mute);font-variant-numeric:tabular-nums;}

  /* editor live preview header */
  .ae-preview{display:flex;align-items:center;gap:14px;}
  .ae-preview .aep-thumb{width:60px;height:60px;border-radius:7px;background:rgba(255,255,255,.16);display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0;border:1px solid rgba(255,255,255,.2);}
  .ae-preview .aep-thumb img{width:100%;height:100%;object-fit:contain;}
  .ae-preview .aep-thumb svg{stroke:#fff;width:26px;height:26px;}
  .ae-steps{display:flex;gap:6px;margin-top:13px;flex-wrap:wrap;}
  .ae-step{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:rgba(255,255,255,.78);
    background:rgba(255,255,255,.12);padding:5px 10px;border-radius:999px;cursor:pointer;transition:all .14s;}
  .ae-step:hover{background:rgba(255,255,255,.22);color:#fff;}
  .ae-step .num{width:16px;height:16px;border-radius:50%;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;font-size:10px;}

  /* inline catalog quick-add (manufacturer / model / category) */
  .combo-add{display:flex;gap:6px;align-items:stretch;}
  .combo-add select{flex:1;min-width:0;}
  .combo-add-btn{flex:0 0 auto;padding:0 11px;display:inline-flex;align-items:center;justify-content:center;}
  .asset-editor .combo-add-btn{min-width:40px;}   /* v1.4.10.473: the icon-only add button was 39px wide, one short of the tap floor */
  .combo-add-btn svg{width:15px;height:15px;}
  .combo-add-row{display:flex;gap:6px;margin-top:7px;}
  .combo-add-row input{flex:1;min-width:0;}
  /* asset-tag availability indicator */
  .tag-status{font-size:12px;margin-top:5px;min-height:14px;color:var(--text-dim);}
  .tag-status.checking{color:var(--text-mute);}
  .tag-status.ok{color:var(--ok);}
  .tag-status.bad{color:var(--err);}
  input.tag-ok{border-color:var(--ok)!important;}
  input.tag-bad{border-color:var(--err)!important;}
  /* sites & locations management */
  .sl-site{border:1px solid var(--line);border-radius:7px;margin-bottom:12px;overflow:hidden;}
  .sl-site-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 14px;background:var(--surface-2);flex-wrap:wrap;}
  .sl-site-title{display:flex;align-items:center;gap:8px;font-size:15px;}
  .sl-site-title b{font-weight:600;letter-spacing:-.01em;}   /* v1.4.10.473: each site card's name is a card title, 15/600 (was 14/700) */
  .sl-site-title svg{width:15px;height:15px;color:var(--text-mute);}
  .sl-site-meta{display:flex;align-items:center;gap:8px;}
  .sl-locs{padding:4px 14px 8px;}
  .sl-loc{display:flex;align-items:center;gap:12px;padding:8px 2px;border-bottom:1px solid var(--line);}
  .sl-loc:last-child{border-bottom:none;}
  .sl-loc-name{flex:1;font-size:13px;}
  .sl-code{display:inline-block;font-size:11px;font-weight:600;color:var(--brand-blue);background:var(--surface-2);border:1px solid var(--line);border-radius:5px;padding:1px 6px;margin-right:4px;}
  .sl-loc-actions{display:flex;gap:4px;}
  .sl-empty{font-size:12px;color:var(--text-dim);padding:8px 2px;}

  /* label sheet (batched — v1.4.10.319) */
  .label-sheet{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;}
  .lbl-card{border:1px solid var(--line);border-radius:6px;padding:12px;display:flex;gap:12px;align-items:center;}
  .lbl-code{width:84px;height:84px;flex-shrink:0;display:flex;align-items:center;justify-content:center;
    border-radius:6px;background:var(--surface-2,rgba(127,127,127,.05));}
  /* v1.4.10.488: a Code 128 is a wide strip; the 84px square shrank it to about 19px tall */
  .lbl-card.bc{flex-direction:column;align-items:stretch;}
  .lbl-card.bc .lbl-code{width:auto;height:auto;min-height:60px;padding:6px;}
  .lbl-tag{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:600;font-size:13px;}
  .lbl-mk{font-size:11px;color:var(--text-mute);}
  .lbl-st{font-size:11px;color:var(--text-dim);}
  .lbl-bar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:0 0 10px;padding:10px 12px;
    border:1px solid var(--line);border-radius:6px;background:var(--surface-2,rgba(127,127,127,.05));}
  .lbl-scope{font-size:12px;flex:1;min-width:180px;}
  .lbl-scope .device-meta{font-size:11px;margin-top:2px;}
  .lbl-size{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:500;color:var(--text-mute);}
  .lbl-size select{padding:4px 8px;}
  .lbl-pager{display:flex;gap:6px;}
  .lbl-prog{font-size:12px;color:var(--text-dim);min-height:16px;margin:0 0 6px;}
  @media(max-width:700px){
    .label-sheet{grid-template-columns:1fr;}
    .lbl-bar{flex-direction:column;align-items:stretch;}
    .lbl-pager button{min-height:40px;}
    .lbl-size select{min-height:40px;}
  }

  @media(max-width:760px){.asset-hero h2,.asset-hero.scoped h2{font-size:18px;}.ah-hero-metrics{grid-template-columns:1fr 1fr;}}

  /* roles & permissions */
  .permrow{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:6px 0;border-bottom:1px dashed var(--line);}
  /* Quick access presets above the per-capability overrides. */
  .perm-presets{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 12px;padding:10px 12px;
    border:1px solid var(--line);border-radius:6px;background:var(--surface-2,rgba(127,127,127,.05));}
  .perm-presets-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
  .perm-presets .btn svg{width:13px;height:13px;}
  /* ── Hover help "?" tips (asset editor fields + help guide) ──
     Pure CSS: hover or keyboard/touch focus reveals the explanation bubble. */
  .help-tip{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;margin-left:6px;
    border-radius:50%;background:var(--surface-2);border:1px solid var(--line);color:var(--text-dim);
    font-size:11px;font-weight:700;line-height:1;cursor:help;position:relative;vertical-align:1px;user-select:none;}   /* v1.4.10.473: 11 — 10px is for UPPERCASE badges only, and a "?" has no case (was 10) */
  .help-tip:hover,.help-tip:focus{color:var(--brand-blue);border-color:var(--brand-blue);outline:none;}
  .help-tip::after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 9px);transform:translateX(-50%) translateY(4px);
    width:max-content;max-width:280px;padding:9px 12px;border-radius:6px;background:var(--text,#0B0E14);color:var(--surface,#fff);
    font-size:12px;font-weight:400;line-height:1.5;text-transform:none;letter-spacing:0;white-space:normal;text-align:left;
    box-shadow:0 10px 26px rgba(0,0,0,.28);opacity:0;pointer-events:none;transition:opacity .14s,transform .14s;z-index:60;}
  .help-tip::before{content:"";position:absolute;left:50%;bottom:calc(100% + 4px);transform:translateX(-50%);
    border:5px solid transparent;border-top-color:var(--text,#0B0E14);opacity:0;transition:opacity .14s;z-index:60;}
  .help-tip:hover::after,.help-tip:focus::after{opacity:1;transform:translateX(-50%) translateY(0);}
  .help-tip:hover::before,.help-tip:focus::before{opacity:1;}
  /* Near the left edge of a modal, keep the bubble on-screen. */
  .field:first-child .help-tip::after{left:0;transform:translateX(0) translateY(4px);}
  .field:first-child .help-tip:hover::after,.field:first-child .help-tip:focus::after{transform:translateX(0) translateY(0);}
  /* Client editor — asset label format (QR vs Code 128 barcode) card picker. */
  .lbl-choice{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:2px 0 10px;}
  .lbl-choice.three{grid-template-columns:1fr 1fr 1fr;}
  @media(max-width:640px){.lbl-choice.three{grid-template-columns:1fr;}}
  @media(max-width:560px){.lbl-choice{grid-template-columns:1fr;}}
  .lbl-card{display:flex;align-items:flex-start;gap:11px;padding:12px 13px;border:1px solid var(--line);border-radius:7px;cursor:pointer;
    background:var(--surface,#fff);transition:border-color .13s,background .13s,box-shadow .13s;}
  .lbl-card input{position:absolute;opacity:0;pointer-events:none;}
  .lbl-card:hover{border-color:var(--line-2,var(--line));}
  .lbl-card.on{border-color:var(--brand-blue);background:var(--accent-glow,rgba(var(--bc-accent-rgb),.07));box-shadow:0 0 0 1px var(--brand-blue) inset;}
  .lbl-ico{flex:none;width:34px;height:34px;border-radius:6px;display:flex;align-items:center;justify-content:center;
    background:var(--surface-2);color:var(--text-mute);}
  .lbl-card.on .lbl-ico{background:var(--accent-glow,rgba(var(--bc-accent-rgb),.14));color:var(--brand-blue);}
  .lbl-ico svg{width:17px;height:17px;}
  .lbl-text{display:flex;flex-direction:column;gap:2px;min-width:0;}
  .lbl-text b{font-size:13px;color:var(--text);}
  .lbl-text small{font-size:12px;color:var(--text-dim);line-height:1.45;}
  .permrow-l{min-width:0;}
  .permrow-t{display:block;font-size:13px;font-weight:500;color:var(--text);}
  .permrow-k{display:block;font-size:11px;color:var(--text-dim);font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
  .permrow-r{display:flex;gap:4px;flex:0 0 auto;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:3px;}
  .permseg{font-size:12px;font-weight:600;color:var(--text-mute);padding:4px 9px;border-radius:5px;cursor:pointer;display:flex;align-items:center;gap:5px;white-space:nowrap;}
  .permseg input{accent-color:var(--brand-blue);}
  .permseg:has(input:checked){background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);}
  .rp-table td,.rp-table th{vertical-align:middle;}
  .rp-table th{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
  .rp-grp td{background:var(--surface-2);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);padding:7px 14px;}
  .rp-cap{font-size:13px;font-weight:500;}
  .rp-key{font-size:11px;color:var(--text-dim);font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
  .rp-table input[type=checkbox]{width:16px;height:16px;accent-color:var(--brand-blue);cursor:pointer;}

  /* ════════════ DEDICATED USER EDITOR ════════════ */
  .user-ed-head{display:flex;align-items:center;gap:14px;padding:20px 22px;
    background:linear-gradient(120deg,var(--brand-blue),var(--brand-purple));color:#fff;border-radius:8px 8px 0 0;}
  .ue-avatar{width:48px;height:48px;border-radius:7px;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.30);
    display:flex;align-items:center;justify-content:center;font-weight:600;font-size:16px;letter-spacing:.02em;flex-shrink:0;font-family:var(--font-display);}
  .ue-htext{flex:1;min-width:0;}
  .ue-htext h3{margin:0;font-size:16px;font-weight:600;color:#fff;letter-spacing:-.012em;}   /* v1.4.10.473: the editor's title is a modal title, 16/600 (was the 20px page-title size) */
  .ue-htext p{margin:3px 0 0;font-size:12px;opacity:.92;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .user-ed-head .close{background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:6px;cursor:pointer;
    width:30px;height:30px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .user-ed-head .close:hover{background:rgba(255,255,255,.28);}
  .user-ed-head .close svg{stroke:#fff;}
  /* sections inside the editor: vertical rhythm + clean icon-led headers */
  .user-editor .form-section{margin-bottom:14px;}
  .user-editor .form-section:last-of-type{margin-bottom:0;}
  .user-editor .fs-body{display:flex;flex-direction:column;gap:14px;}
  .user-editor .fs-title{display:flex;align-items:center;gap:8px;color:var(--text);}
  .user-editor .fs-title svg{width:15px;height:15px;stroke:var(--brand-blue);}
  /* the org/site/perms blocks already carry their own divider chrome — drop it inside sections */
  .user-editor .field.ef-block{border-top:0;margin-top:0;padding-top:0;}
  .user-editor .field.ef-block > label:empty{display:none;}
  .user-editor .fs-hint{margin-top:-4px;}
  /* sign-in & onboarding rows (resend welcome / reset password) */
  .ue-onboard{display:flex;flex-direction:column;gap:10px;}
  .ue-ob-row{display:flex;align-items:center;gap:14px;border:1px solid var(--line);border-radius:6px;padding:12px 14px;background:var(--surface);}
  .ue-ob-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;}
  .ue-ob-txt strong{font-size:13px;font-weight:600;color:var(--text);}
  .ue-ob-txt span{font-size:12px;color:var(--text-mute);line-height:1.45;}
  .ue-ob-row .btn{flex-shrink:0;white-space:nowrap;}
  @media(max-width:520px){.ue-ob-row{flex-direction:column;align-items:stretch;}.ue-ob-row .btn{width:100%;justify-content:center;}}
  /* card-based role picker */
  .role-cards{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;}
  .role-card{display:flex;gap:11px;align-items:flex-start;border:1.5px solid var(--line);border-radius:7px;
    padding:12px 13px;cursor:pointer;transition:all .14s;position:relative;background:var(--surface);}
  .role-card:hover{border-color:var(--line-2);}
  .role-card input{position:absolute;opacity:0;width:0;height:0;}
  .role-card.on{border-color:var(--brand-blue);background:var(--accent-glow);box-shadow:0 0 0 2px var(--accent-glow);}
  .role-card .rc-ico{width:34px;height:34px;border-radius:6px;background:var(--surface-2);display:flex;align-items:center;
    justify-content:center;color:var(--brand-blue);flex-shrink:0;transition:all .14s;}
  .role-card .rc-ico svg{width:17px;height:17px;}
  .role-card.on .rc-ico{background:var(--grad);color:#fff;}
  .role-card.on .rc-ico svg{stroke:#fff;}
  .role-card .rc-text{min-width:0;}
  .role-card .rc-name{font-size:13px;font-weight:600;}
  .role-card .rc-desc{font-size:12px;color:var(--text-mute);line-height:1.45;margin-top:2px;}
  /* custom active toggle */
  .ue-toggle{display:flex;align-items:center;gap:12px;cursor:pointer;}
  .ue-toggle input{position:absolute;opacity:0;width:0;height:0;}
  .ue-toggle .ue-tk{width:40px;height:23px;border-radius:999px;background:var(--surface-3);position:relative;transition:background .16s;flex-shrink:0;}
  .ue-toggle .ue-tk::after{content:"";position:absolute;top:2px;left:2px;width:19px;height:19px;border-radius:50%;background:#fff;box-shadow:var(--shadow-sm);transition:transform .16s;}
  .ue-toggle input:checked + .ue-tk{background:var(--brand-blue);}
  .ue-toggle input:checked + .ue-tk::after{transform:translateX(17px);}
  .ue-toggle .ue-tlabel strong{display:block;font-size:13px;font-weight:600;}
  .ue-toggle .ue-tlabel small{font-size:12px;color:var(--text-mute);}
  @media(max-width:560px){ .role-cards{grid-template-columns:1fr;} }
  /* Permission overrides must always fit inside the popup — never scroll across.
     The radio is redundant (the selected segment is highlighted), so hide it and
     let the three segments shrink to share the row. */
  .user-editor .field.ef-block,
  .user-editor .fs-grid,
  .user-editor .fs-body > *{min-width:0;}
  .permrow{flex-wrap:wrap;}
  .permrow-k{overflow-wrap:anywhere;}
  .permseg{min-width:0;}
  .permseg input{position:absolute;opacity:0;width:0;height:0;margin:0;pointer-events:none;}
  .field .permseg{display:flex;margin:0;font-weight:600;}   /* v1.4.10.473: '.field label' (block, 500, margin-bottom 7px) outranked the segment's own rule: Default / Allow / Deny drew 12/500, sat 4px from the top of their track and 11px from its bottom, and their text hugged the top of a 40px phone segment. Now a segmented control's 12/600, centred, flush in the track */
  /* On phones the control sits full-width under the label as equal thirds */
  @media(max-width:600px){ .ef-modal-body .permseg{flex:1 1 0;justify-content:center;padding:5px 4px;min-height:40px;} }   /* v1.4.10.473: Default / Allow / Deny are 40px tap targets on a phone, like every segmented control (were 28) */

  /* ════════════ USERS & ACCESS PAGE ════════════ */
  .ua-roles{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(150px,100%),1fr));gap:10px;margin-bottom:18px;}
  .ua-roli{display:flex;align-items:center;gap:11px;text-align:left;background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:12px 14px;cursor:pointer;font-family:inherit;transition:border-color .15s,transform .15s,box-shadow .15s;box-shadow:var(--shadow-sm);position:relative;overflow:hidden;}
  .ua-roli:hover{transform:translateY(-2px);box-shadow:var(--shadow-md);}
  .ua-roli.on{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .ua-roli .ua-ric{width:34px;height:34px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:var(--surface-3);color:var(--text-mute);}
  .ua-roli .ua-ric svg{width:17px;height:17px;}
  .ua-roli[data-r="all"] .ua-ric{background:var(--accent-glow);color:var(--brand-blue);}
  .ua-roli[data-r="admin"] .ua-ric{background:rgba(var(--bc-accent-rgb),0.12);color:var(--brand-blue);}
  .ua-roli[data-r="integrator"] .ua-ric{background:rgba(217,119,6,0.13);color:var(--warn);}
  .ua-roli[data-r="site_admin"] .ua-ric{background:rgba(22,163,74,0.12);color:var(--ok);}
  .ua-roli[data-r="client"] .ua-ric{background:var(--surface-3);color:var(--text-mute);}
  .ua-roli .ua-rtext{min-width:0;}
  .ua-roli .ua-rn{font-size:20px;font-weight:600;font-family:var(--font-display);line-height:1;letter-spacing:-0.02em;font-variant-numeric:tabular-nums;}
  .ua-roli .ua-rl{font-size:11px;color:var(--text-mute);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}

  .ua-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px;}
  .ua-toolbar .ua-search{position:relative;flex:1;min-width:180px;}
  .ua-toolbar .ua-search svg{position:absolute;left:11px;top:50%;transform:translateY(-50%);width:15px;height:15px;color:var(--text-mute);pointer-events:none;}
  .ua-toolbar .ua-search input{width:100%;padding:9px 12px 9px 34px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;}
  .ua-toolbar .ua-search input:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .ua-toolbar select{padding:9px 11px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;max-width:240px;}
  .ua-toolbar select.ua-pick-on{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);color:var(--brand-blue);font-weight:600;}   /* v1.4.10.491: a client / site picked */
  .ua-scope-note{display:flex;align-items:center;gap:10px;margin:-4px 0 14px;padding:9px 12px;border-radius:8px;background:var(--accent-glow);border:1px solid rgba(59,91,219,.22);font-size:13px;color:var(--text);line-height:1.5;}
  .ua-scope-note svg{width:15px;height:15px;color:var(--brand-blue);flex-shrink:0;}
  .ua-scope-note span{flex:1;min-width:0;}

  .ua-cell{display:flex;align-items:center;gap:11px;min-width:0;}
  .ua-av{width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;color:#fff;flex-shrink:0;letter-spacing:.02em;}
  .ua-av.r-admin{background:linear-gradient(135deg,var(--bc-blue-v1),#1E40AF);}
  .ua-av.r-integrator{background:linear-gradient(135deg,#F59E0B,#B45309);}
  .ua-av.r-site_admin{background:linear-gradient(135deg,#16A34A,#15803D);}
  .ua-av.r-client{background:linear-gradient(135deg,#64748B,#475569);}
  .ua-av.r-library{background:var(--brand-grad,linear-gradient(135deg,var(--bc-grad-a),var(--bc-purple)));}
  .ua-ut{min-width:0;max-width:240px;}   /* v1.4.10.473: the User column stops at 240px (a long title ellipsises, a long name wraps): with v471's access column the table ran 73px past a 1440 screen */
  .ua-un{font-weight:600;white-space:normal;overflow-wrap:anywhere;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;gap:7px;}
  .ua-you{font-size:10px;font-weight:700;text-transform:uppercase;color:var(--brand-blue);background:var(--accent-glow);border-radius:5px;padding:1px 6px;letter-spacing:.04em;}   /* v1.4.10.473: a badge is uppercase (the text already is): 10px is for uppercase badges only */
  .ua-uttl{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .ua-scope{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;color:var(--text-mute);background:var(--surface-3);border-radius:6px;padding:2px 8px;margin-right:5px;white-space:nowrap;}
  .ua-scope.full{color:var(--ok);background:rgba(22,163,74,0.10);}
  .ua-scope.ovr{color:var(--warn);background:rgba(217,119,6,0.12);}
  .ua-scope.ovr.deny{color:var(--err);background:rgba(220,38,38,0.10);}
  .ua-scope.ovr svg{width:11px;height:11px;}
  .perm-ovr-note{display:flex;gap:9px;align-items:flex-start;font-size:12px;line-height:1.55;color:var(--text-mute);background:rgba(217,119,6,0.09);border:1px solid rgba(217,119,6,0.28);border-radius:6px;padding:9px 12px;margin:2px 0 10px;}
  .perm-ovr-note.hard{background:rgba(220,38,38,0.07);border-color:rgba(220,38,38,0.30);}
  .perm-ovr-note svg{width:14px;height:14px;flex-shrink:0;margin-top:2px;color:var(--warn);}
  .perm-ovr-note.hard svg{color:var(--err);}
  .perm-ovr-note em{font-style:normal;font-weight:600;color:var(--text);}

  .ua-sw{appearance:none;-webkit-appearance:none;position:relative;width:38px;height:21px;border-radius:11px;background:var(--surface-3);border:1px solid var(--line);cursor:pointer;flex-shrink:0;transition:background .15s;vertical-align:middle;}
  .ua-sw::after{content:'';position:absolute;top:1.5px;left:1.5px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s;}
  .ua-sw:checked{background:var(--ok);border-color:var(--ok);}
  .ua-sw:checked::after{transform:translateX(17px);}
  .ua-sw:disabled{opacity:.5;cursor:not-allowed;}
  .ua-stat{display:inline-flex;align-items:center;gap:8px;}
  .ua-statlbl{font-size:12px;color:var(--text-mute);}

  .ua-empty{text-align:center;padding:46px 20px;color:var(--text-mute);}
  .ua-empty .ua-eic{width:50px;height:50px;border-radius:8px;background:var(--surface-3);display:flex;align-items:center;justify-content:center;margin:0 auto 14px;color:var(--text-mute);}
  .ua-empty .ua-eic svg{width:24px;height:24px;}
  @media(max-width:560px){ .ua-roli .ua-rn{font-size:20px;} }

  /* Role-grouped table: a sticky-ish heading row introduces each role block. */
  .ua-contact{display:flex;flex-direction:column;gap:2px;line-height:1.35;min-width:170px;}
  .ua-contact > span:first-child{overflow-wrap:anywhere;}   /* v1.4.10.473: a very long address breaks inside its column instead of pushing the table off the screen */
  .ua-phone{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--text-mute);}
  .ua-phone svg{width:12px;height:12px;flex-shrink:0;opacity:.8;}
  tr.ua-grouphdr{background:transparent;cursor:default;}
  tr.ua-grouphdr td{padding:16px 14px 7px;border:none;}
  tr.ua-grouphdr:first-child td{padding-top:4px;}
  .ua-gh-ic{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:5px;vertical-align:middle;margin-right:9px;background:var(--surface-3);color:var(--text-mute);}
  .ua-gh-ic svg{width:13px;height:13px;}
  .ua-gh-ic.r-admin{background:rgba(var(--bc-accent-rgb),0.12);color:var(--brand-blue);}
  .ua-gh-ic.r-integrator{background:rgba(217,119,6,0.13);color:var(--warn);}
  .ua-gh-ic.r-site_admin{background:rgba(22,163,74,0.12);color:var(--ok);}
  .ua-gh-ic.r-client{background:var(--surface-3);color:var(--text-mute);}
  .ua-gh-lbl{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);vertical-align:middle;}
  .ua-gh-count{display:inline-block;margin-left:8px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-mute);background:var(--surface-3);border-radius:10px;padding:1px 9px;vertical-align:middle;}   /* v1.4.10.473: a count badge, 10/700 .04em like every badge (was untracked, no badge case) */
  /* v1.4.10.471: Users grouped by integrator, and each account's access broken up by integrator */
  .ua-gh-ic.r-library{background:rgba(var(--bc-purple-v1-rgb),0.12);color:var(--brand-purple);}
  tr.ua-gh-intg td{padding-top:20px;}
  tr.ua-gh-intg .ua-gh-lbl{font-size:13px;letter-spacing:0;text-transform:none;color:var(--text);font-weight:600;}   /* v1.4.10.473: the integrator group heading is a sub-heading, 13/600 untracked (was 12.5/700 +.02em, off the scale) */
  .ua-gh-logo{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:7px;vertical-align:middle;margin-right:9px;
    background:var(--surface-3);color:var(--brand-blue);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;overflow:hidden;border:1px solid var(--line);}   /* v1.4.10.473: initials at 10px are a badge: uppercase, .04em */
  .ua-gh-logo.has{background:#fff;padding:2px;}
  .ua-gh-logo img{max-width:100%;max-height:100%;object-fit:contain;display:block;}
  .ua-gh-sub{display:inline-block;margin-left:10px;font-size:12px;color:var(--text-mute);vertical-align:middle;}   /* v1.4.10.473: a meta line, 12/400 (was 11.5, off the scale) */
  .ua-acc{display:flex;flex-direction:column;gap:4px;min-width:200px;max-width:420px;}
  .ua-acc-g{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px;font-size:12px;line-height:1.35;min-width:0;}   /* v1.4.10.473: a long access line drops under its integrator instead of squeezing into a 100px sliver */
  .ua-acc-i{display:inline-flex;align-items:center;gap:5px;flex:none;max-width:170px;font-weight:600;color:var(--text);
    background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:1px 7px;}
  .ua-acc-i span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .ua-acc-i img{width:14px;height:14px;object-fit:contain;flex:none;}
  .ua-acc-g.home .ua-acc-i{border-color:color-mix(in srgb,var(--brand-blue) 35%,var(--line));background:color-mix(in srgb,var(--brand-blue) 7%,var(--surface));}
  .ua-acc-g.other .ua-acc-i{color:var(--text-mute);font-style:italic;}
  .ua-acc-v{color:var(--text-mute);min-width:0;overflow-wrap:anywhere;}
  .ua-acc-v b{color:var(--ok);font-weight:600;}
  .ua-acc-v i{font-style:normal;font-size:11px;color:var(--warn);background:color-mix(in srgb,var(--warn) 10%,var(--surface));border-radius:4px;padding:0 4px;margin-left:2px;}
  .ua-acc-more{color:var(--brand-blue);cursor:help;white-space:nowrap;}
  .ua-acc-warn{color:var(--err);}
  .ua-acc-hid{color:var(--text-dim);cursor:help;}
  .ua-acc-badges{margin-top:5px;}
  .ua-acc.full{max-width:none;gap:7px;}
  .ua-acc.full .ua-acc-g{font-size:13px;flex-wrap:wrap;}
  .ua-acc.full .ua-acc-i{max-width:100%;}
  .ua-acc.full .ua-acc-i span{white-space:normal;overflow-wrap:anywhere;}   /* v1.4.10.473: in the profile a long integrator name wraps inside its chip (it ran 435px wide, out of its block) */
  .up-scope-acc{align-items:flex-start;}
  .acc-group-intg{margin-left:8px;font-size:11px;font-weight:400;text-transform:none;letter-spacing:0;color:var(--text-dim);}   /* v1.4.10.473: a caption, 11/400 (was 10.5/500, off the scale); .ua-acc-v i above 11 too (was 10.5) */
  .acc-group-intg::before{content:'by ';}
  @media (max-width:640px){ .ua-acc{min-width:240px;max-width:none;}   /* v1.4.10.473: the table already scrolls sideways on a phone, so the access column keeps 240px (at min-width:0 it shrank to 130px and a row grew to 386px tall) */ .ua-acc-i{max-width:130px;} .ua-gh-sub{display:block;margin:4px 0 0 0;}
    .ua-toolbar select{flex:1 1 auto;}   /* v1.4.10.473: the filters fill their line on a phone (were three ragged widths) */ }

  /* ════════════ MOBILE AUGMENTATION (full-site responsive pass) ════════════ */
  /* Site-modal stat tiles: 4-up on desktop, 2-up on phones */
  .se-statgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;}
  /* Horizontal-scroll wrapper for data tables injected outside a .panel-body.flush */
  .tbl-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;}
  @media(max-width:560px){ .se-statgrid{grid-template-columns:repeat(2,1fr);} }
  @media(max-width:760px){
    /* Any container holding a data table scrolls it instead of forcing page-wide
       overflow. Scoped to mobile so desktop layout/overflow is untouched.
       (:has() is already relied on elsewhere in this stylesheet.) */
    .panel-body:has(table.dt),
    .modal-body:has(table.dt),
    .site-ed-body:has(table.dt),
    /* v1.4.10.269: the Devices estate tree was never on this list, and the
       omission was invisible because .est-site is overflow:hidden — so its
       table did not push the page sideways, it was CUT OFF. Measured at 375px:
       table.dt.est-tbl rendered 608px (this block's own min-width:500 floor,
       plus content) inside a 251px .est-site, hiding 368px — the Status column,
       the Q-SYS fault detail and the whole actions cell simply were not there,
       with no scrollbar to hint at it. Scrolling .est-loc rather than the whole
       body keeps each table moving under its own location heading. Safe for the
       overflow-y side-effect noted above: nothing inside .est-loc escapes it. */
    .est-loc:has(table.dt),
    .ag-site:has(table.dt){ overflow-x:auto; -webkit-overflow-scrolling:touch; }
    /* Sensible floor so columns don't crush; flush tables keep their own 680
       floor via higher specificity. Wider tables exceed this and just scroll. */
    table.dt{ min-width:500px; }
    .tbl-scroll table.dt{ min-width:460px; }
    /* Reliability room cards (v1.4.10.199). Each card holds a six-column table
       with no scroller, and `.rel-room` is deliberately overflow:visible so the
       score explainers can escape the card — so the table cannot be wrapped in
       a .tbl-scroll without clipping them (overflow-x:auto forces the other
       axis to auto too). The width is driven by the Device column's min-content,
       which is the longest UNBREAKABLE token in a device name: most cards
       measure ~359px and fit, and one containing "QSC CXD4.3Q" measured 395 and
       pushed .content to 408 inside a 380 box — a page-wide sideways scroll
       that only appeared on estates with a long model code, which is why it
       reads as intermittent. Letting that column break is a structural
       guarantee rather than an arithmetic one: no token can force the table
       wider than its card. Scoped to phones; desktop is untouched. */
    .rel-room table th, .rel-room table td{ padding-left:8px; padding-right:8px; }
    .rel-room table th:first-child,
    .rel-room table td:first-child{ overflow-wrap:anywhere; word-break:break-word; }
  }
  /* Very small phones: keep the brand bar from overflowing horizontally */
  @media(max-width:380px){
    .topbrand-inner{ gap:8px; padding:0 12px; }
    .topbrand .site-picker{ max-width:88px; }
    .topbar{ padding:14px 12px 4px; }
    .content{ padding:14px 12px 40px; }
  }
  /* ============ INSIGHTS / ANALYTICS ============ */
  .spinner{width:30px;height:30px;border-radius:50%;border:3px solid var(--surface-3);border-top-color:var(--brand-blue);animation:ins-spin .8s linear infinite;margin:0 auto 14px;}
  @keyframes ins-spin{to{transform:rotate(360deg);}}
  .ins-loading{padding:80px 20px;text-align:center;color:var(--text-mute);font-size:13px;}
  .mini-select{background:var(--surface);border:1px solid var(--line);color:var(--text);padding:7px 11px;border-radius:6px;font-size:13px;font-family:inherit;cursor:pointer;transition:border-color .15s;}
  .mini-select:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}

  .ins-tabs{display:flex;align-items:center;gap:8px;margin-bottom:18px;flex-wrap:wrap;}
  .ins-tab{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 15px;border-radius:6px;border:1px solid var(--line);background:var(--surface);color:var(--text-mute);font-size:13px;font-weight:600;font-family:inherit;cursor:pointer;transition:all .14s;}
  /* v1.4.10.473: one height for the strip — the tabs were 40px (from their padding) and the Refresh / Export / settings
     buttons at the end of the row 32px (Insights, Site stats, Comms). Both are 36 on a desktop; a touch screen's
     40px floor lifts both alike. */
  .ins-tabs .btn{height:36px;}
  .ins-tab:hover{color:var(--text);border-color:var(--line-2);}
  .ins-tab.active{background:var(--accent-glow);border-color:transparent;color:var(--brand-blue);}
  .ins-tab svg{width:16px;height:16px;}

  .ins-kpis{display:grid;grid-template-columns:repeat(6,1fr);gap:13px;margin-bottom:18px;}
  .ins-kpi{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:15px 16px;position:relative;overflow:hidden;box-shadow:var(--shadow-sm);transition:transform .12s,box-shadow .12s;}
  .ins-kpi:hover{transform:translateY(-2px);box-shadow:var(--shadow-md);}
  .ins-kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--brand-blue);}
  .ins-kpi.ok::before{background:var(--ok);} .ins-kpi.warn::before{background:var(--warn);} .ins-kpi.err::before{background:var(--err);}
  .ins-kpi.purple::before{background:var(--brand-purple);} .ins-kpi.blue::before{background:var(--brand-blue);} .ins-kpi.muted::before{background:var(--text-dim);}
  .ins-kpi-head{display:flex;justify-content:space-between;align-items:center;}
  .ins-kpi-head .l{font-size:11px;color:var(--text-mute);font-weight:600;text-transform:uppercase;letter-spacing:.06em;}
  .ins-kpi-head .i{color:var(--text-dim);display:inline-flex;}
  .ins-kpi-v{font-family:var(--font-display);font-size:24px;font-weight:700;letter-spacing:-.02em;margin:7px 0 3px;display:flex;align-items:center;gap:8px;}
  .ins-kpi-s{font-size:12px;color:var(--text-dim);}
  .ins-delta{display:inline-flex;align-items:center;gap:3px;font-size:11px;font-weight:600;padding:2px 6px;border-radius:5px;}   /* v1.4.10.473: a trend pill, 11/600 like every status pill (was 700) */
  .ins-delta svg{width:12px;height:12px;}
  .ins-delta.up{color:var(--err);background:rgba(220,38,38,.10);} .ins-delta.down{color:var(--ok);background:rgba(22,163,74,.10);}

  .ins-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:18px;}
  .ins-grid-2 .panel{margin-bottom:18px;}
  .ins-key{display:flex;gap:14px;align-items:center;}
  .ins-key-i,.ins-leg{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text-mute);}
  .ins-key .dot,.ins-leg .dot{width:9px;height:9px;border-radius:3px;flex-shrink:0;}

  .ins-donut-row{display:flex;align-items:center;gap:24px;flex-wrap:wrap;}
  .ins-donut{position:relative;flex-shrink:0;}
  .ins-donut svg .ins-arc{transition:opacity .15s;} .ins-donut svg .ins-arc:hover{opacity:.82;}
  .ins-donut-c{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none;}
  .ins-donut-c .v{font-family:var(--font-display);font-size:30px;font-weight:700;letter-spacing:-.03em;}
  .ins-donut-c .l{font-size:11px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;}
  .ins-legend{display:flex;flex-direction:column;gap:9px;flex:1;min-width:140px;}
  .ins-leg{justify-content:flex-start;}
  .ins-leg .lab{flex:1;color:var(--text);} .ins-leg .num{font-weight:700;font-variant-numeric:tabular-nums;}

  .ins-chart{display:block;overflow:visible;}
  .ins-grid{stroke:var(--line);stroke-width:1;stroke-dasharray:2 4;}
  .ins-axis{fill:var(--text-dim);font-size:11px;font-family:var(--font-body);}

  .ins-bars{display:flex;flex-direction:column;gap:13px;}
  .ins-bar-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:5px;}
  .ins-bar-top .lab{font-size:13px;color:var(--text);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:70%;}
  .ins-bar-top .val{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;}
  .ins-bar-track{height:9px;background:var(--surface-2);border-radius:5px;overflow:hidden;}
  .ins-bar-fill{height:100%;border-radius:5px;transition:width .5s cubic-bezier(.2,.7,.3,1);}
  .ins-bar-sub{font-size:11px;color:var(--text-dim);margin-top:3px;}
  .ins-empty-mini{color:var(--text-dim);font-size:12px;padding:18px;text-align:center;}

  .ins-health-body{display:flex;align-items:center;gap:26px;flex-wrap:wrap;}
  .ins-gauge{flex-shrink:0;}
  .ins-gauge-num{font-family:var(--font-display);font-size:30px;font-weight:700;letter-spacing:-.03em;}
  .ins-gauge-lab{fill:var(--text-mute);font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:600;}
  .ins-factors{flex:1;min-width:200px;display:flex;flex-direction:column;gap:11px;}
  .ins-factor .ff{display:flex;justify-content:space-between;font-size:12px;color:var(--text-mute);margin-bottom:4px;}
  .ins-factor .ff span:last-child{font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;}
  .ins-factor-track{height:7px;background:var(--surface-2);border-radius:4px;overflow:hidden;}
  .ins-factor-track>div{height:100%;border-radius:4px;transition:width .5s cubic-bezier(.2,.7,.3,1);}
  /* Health score: clickable affordance + withheld-state placeholder + explainer */
  .hs-clickable{cursor:pointer;transition:filter .14s,transform .14s;}
  .hs-clickable:hover{filter:brightness(1.03);}
  .panel.ins-health.hs-clickable:hover{box-shadow:0 0 0 1px var(--brand-blue,var(--bc-blue-v1)) inset;}
  .hs-pending{display:flex;align-items:center;gap:16px;padding:6px 2px;min-height:96px;}
  .hs-pending-ico{flex:none;width:46px;height:46px;border-radius:7px;display:flex;align-items:center;justify-content:center;background:var(--surface-2,rgba(0,0,0,.04));color:var(--text-mute);}
  .hs-pending-ico svg{width:24px;height:24px;}
  .hs-pending-tx{flex:1;min-width:0;}
  .hs-pending-t{font-weight:600;font-size:15px;letter-spacing:-.012em;margin-bottom:3px;}
  .hs-pending-s{font-size:12px;color:var(--text-mute);line-height:1.45;}
  .hs-pending-link{color:var(--brand-blue,var(--bc-blue-v1));font-weight:600;white-space:nowrap;}
  .hs-pending-bar{height:6px;border-radius:4px;background:var(--surface-2,rgba(0,0,0,.06));overflow:hidden;margin-top:9px;max-width:260px;}
  .hs-pending-bar>span{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,var(--brand-blue,var(--bc-blue-v1)),var(--brand-purple,var(--bc-purple-v1)));transition:width .5s ease;}
  .dh-health.hs-pending{align-items:center;}
  /* The hero is a light --surface panel (the dark gradient version is long gone),
     so the pending state uses the same theme tokens as everywhere else — the old
     white overrides rendered white-on-white. */
  .dh-health .hs-pending-t{color:var(--text);}
  .dh-health .hs-pending-s{color:var(--text-mute);}
  .dh-health .hs-pending-ico{background:var(--surface-2);color:var(--text-mute);}
  .dh-health .hs-pending-link{color:var(--brand-blue,var(--bc-blue-v1));text-decoration:underline;}
  /* Explainer modal */
  .hx-now{display:flex;align-items:center;gap:16px;padding:14px 16px;border-radius:7px;background:var(--surface-2,rgba(0,0,0,.03));margin-bottom:16px;}
  .hx-now-num{font-family:var(--font-display);font-size:30px;font-weight:700;letter-spacing:-.03em;line-height:1;font-variant-numeric:tabular-nums;}
  .hx-now-grade{font-weight:600;font-size:15px;}   /* v1.4.10.473: 15/600, the card-title look (was 700) */
  .hx-now-sub{font-size:12px;color:var(--text-mute);margin-top:2px;}
  .hx-note{padding:12px 14px;border-radius:6px;border-left:3px solid var(--brand-blue,var(--bc-blue-v1));background:var(--accent-glow,rgba(var(--bc-accent-rgb),.07));font-size:13px;line-height:1.5;margin-bottom:16px;}
  .hx-intro{font-size:13px;color:var(--text-mute);line-height:1.55;margin:0 0 14px;}
  .hx-factors{display:flex;flex-direction:column;gap:13px;margin-bottom:20px;}
  .hx-factor-top{display:flex;justify-content:space-between;align-items:baseline;}
  .hx-factor-l{font-weight:600;font-size:13px;}
  .hx-factor-w{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--brand-blue,var(--bc-blue-v1));}   /* v1.4.10.473: the weight at its label's 13 (it inherited the page's 14) */
  .hx-factor-bar{height:7px;border-radius:4px;background:var(--surface-2,rgba(0,0,0,.06));overflow:hidden;margin:5px 0 4px;}
  .hx-factor-bar>span{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,var(--brand-blue,var(--bc-blue-v1)),var(--brand-purple,var(--bc-purple-v1)));}
  .hx-factor-d{font-size:12px;color:var(--text-mute);line-height:1.4;}
  .hx-h4{font-size:13px;font-weight:600;margin:18px 0 9px;}
  .hx-grades{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:6px;}
  .hx-grade{display:flex;align-items:center;gap:7px;padding:5px 11px;border-radius:999px;background:var(--surface-2,rgba(0,0,0,.04));font-size:12px;}
  .hx-grade-dot{width:9px;height:9px;border-radius:50%;flex:none;}
  .hx-grade-l{font-weight:600;}
  .hx-grade-r{color:var(--text-mute);font-variant-numeric:tabular-nums;}
  .hx-rules{margin:0;padding-left:18px;font-size:12px;color:var(--text-mute);line-height:1.55;}
  .hx-rules li{margin-bottom:7px;}

  .ins-mini-bar{display:flex;height:8px;border-radius:4px;overflow:hidden;background:var(--surface-3);min-width:90px;}
  .ins-mini-bar>div{height:100%;}

  /* Activity timeline */
  .ins-act-filters{display:flex;align-items:center;gap:9px;margin-bottom:14px;flex-wrap:wrap;}
  .ins-act-count{font-size:12px;color:var(--text-dim);}
  .act-timeline{padding:6px 4px;}
  .act-day{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin:16px 0 8px 6px;}
  .act-day:first-child{margin-top:4px;}
  .act-row{display:flex;gap:13px;padding:2px 6px;}
  .act-line{display:flex;flex-direction:column;align-items:center;}
  .act-dot{width:30px;height:30px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0;}
  .act-dot svg{width:14px;height:14px;}
  .act-row:not(:last-child) .act-line::after{content:"";flex:1;width:2px;background:var(--line);margin:3px 0;min-height:8px;}
  .act-body{flex:1;padding-bottom:14px;min-width:0;}
  .act-main{display:flex;align-items:center;gap:9px;font-size:13px;line-height:1.5;}
  .act-av{width:24px;height:24px;border-radius:5px;background:var(--surface-3);color:var(--text-mute);display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;flex-shrink:0;}   /* v1.4.10.473: 10px initials wear the badge look (700, uppercase, .04em); 10px is for uppercase badges only */
  .act-ent{background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:1px 7px;font-size:12px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--text-mute);}
  .act-meta{font-size:12px;color:var(--text-dim);margin-top:2px;margin-left:33px;}
  .act-more{text-align:center;padding:12px;}

  /* ── Extended insights charts (sparkline, radar, heatmap, treemap, etc.) ── */
  .ins-kpi{position:relative;}
  .ins-kpi-spark{margin-top:8px;height:30px;opacity:.95;}
  .ins-spark{display:block;width:100%;}
  .ins-kpis-tight{margin-bottom:4px;}
  .ins-vb-val{fill:var(--text-mute);font-size:11px;font-weight:700;font-family:var(--font-body);}
  .ins-axis-title{fill:var(--text-mute);font-size:11px;font-weight:500;font-family:var(--font-body);}
  .ins-now-line{stroke:var(--text-mute);stroke-width:1.2;stroke-dasharray:3 3;opacity:.6;}

  /* Radar */
  .ins-radar{display:block;margin:0 auto;}
  .ins-radar-ring{fill:none;stroke:var(--line);stroke-width:1;}
  .ins-radar-spoke{stroke:var(--line);stroke-width:1;opacity:.7;}
  .ins-radar-axlab{fill:var(--text-mute);font-size:11px;font-weight:500;font-family:var(--font-body);}
  .ins-radar-body{display:flex;flex-direction:column;align-items:center;gap:10px;}
  .ins-legend-wrap{flex-wrap:wrap;justify-content:center;}

  /* Heatmap */
  .ins-heatmap{display:block;}
  .ins-heatmap rect{transition:opacity .15s;}
  .ins-heatmap rect:hover{opacity:.75;}

  /* Treemap */
  .ins-treemap{position:relative;width:100%;border-radius:6px;overflow:hidden;background:var(--surface-2);}
  .ins-tm-cell{position:absolute;border:1.5px solid var(--surface);overflow:hidden;display:flex;flex-direction:column;justify-content:flex-end;padding:7px 9px;color:#fff;transition:filter .15s;}
  .ins-tm-cell:hover{filter:brightness(1.08);}
  .ins-tm-l{font-size:12px;font-weight:600;line-height:1.15;text-shadow:0 1px 2px rgba(0,0,0,.25);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .ins-tm-v{font-size:12px;font-weight:700;text-shadow:0 1px 2px rgba(0,0,0,.3);font-variant-numeric:tabular-nums;}

  /* Bullet */
  .ins-bullet{margin-bottom:12px;}
  .ins-bullet-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:5px;}
  .ins-bullet-top .lab{font-size:13px;color:var(--text);font-weight:500;}
  .ins-bullet-top .val{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;}
  .ins-bullet-top .val.ok{color:var(--ok);} .ins-bullet-top .val.miss{color:var(--err);}
  .ins-bullet-top .tgt{color:var(--text-dim);font-weight:500;font-size:12px;}
  .ins-bullet-track{position:relative;height:10px;background:var(--surface-2);border-radius:5px;overflow:visible;}
  .ins-bullet-fill{height:100%;border-radius:5px;transition:width .5s cubic-bezier(.2,.7,.3,1);}
  .ins-bullet-tgt{position:absolute;top:-3px;width:2px;height:16px;background:var(--text);border-radius:1px;}

  /* Funnel */
  .ins-funnel-lab{fill:#fff;font-size:12px;font-weight:600;font-family:var(--font-body);text-shadow:0 1px 2px rgba(0,0,0,.35);}

  /* Ring */
  .ins-ring{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}
  .ins-ring-c{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;}
  .ins-ring-c .v{font-family:var(--font-display);font-size:30px;font-weight:700;letter-spacing:-.03em;line-height:1;}
  .ins-ring-c .l{font-size:11px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;margin-top:3px;font-weight:600;}

  /* Asset depreciation hero */
  .ins-dep-body{display:flex;align-items:center;gap:28px;flex-wrap:wrap;}
  .ins-dep-ring{flex-shrink:0;}
  .ins-dep-figs{flex:1;min-width:240px;display:grid;grid-template-columns:1fr 1fr;gap:14px 22px;}
  .ins-dep-fig{display:flex;flex-direction:column;gap:2px;}
  .ins-dep-fig .l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;}
  .ins-dep-fig .v{font-family:var(--font-display);font-size:24px;font-weight:700;letter-spacing:-.02em;line-height:1.05;font-variant-numeric:tabular-nums;}
  .ins-dep-fig .s{font-size:11px;color:var(--text-dim);}

  /* Site ranking table */
  .ins-rank-table td,.ins-rank-table th{white-space:nowrap;}
  .ins-cellbar{position:relative;height:16px;min-width:54px;background:var(--surface-2);border-radius:4px;overflow:hidden;}
  .ins-cellbar>div{height:100%;border-radius:4px;}
  .ins-cellbar>span{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;}
  .ins-score-pill{display:inline-flex;align-items:center;justify-content:center;min-width:34px;padding:3px 8px;border-radius:5px;font-weight:600;font-size:11px;font-variant-numeric:tabular-nums;}
  .ins-score-pill.ok{background:color-mix(in srgb,var(--ok) 16%,transparent);color:var(--ok);}
  .ins-score-pill.warn{background:color-mix(in srgb,var(--warn) 18%,transparent);color:var(--warn);}
  .ins-score-pill.err{background:color-mix(in srgb,var(--err) 16%,transparent);color:var(--err);}

  @media (max-width:1100px){ .ins-kpis{grid-template-columns:repeat(3,1fr);} .ins-grid-2{grid-template-columns:1fr;} }
  @media (max-width:680px){ .ins-kpis{grid-template-columns:repeat(2,1fr);} .ins-donut-row{justify-content:center;} .ins-dep-figs{grid-template-columns:1fr 1fr;} .ins-kpi-v{font-size:20px;} .ins-dep-fig .v{font-size:20px;} .ins-rank-table{font-size:11px;} }

  /* ===== Clients (tenant hierarchy) ===== */
  .cust-group{margin-bottom:26px;}
  .cust-group-head{display:flex;align-items:center;gap:9px;font-weight:700;font-size:14px;margin:0 0 12px;color:var(--text);}
  .cust-group-head svg{width:17px;height:17px;opacity:.7;}
  .cust-group-count{margin-left:auto;font-weight:500;font-size:12px;color:var(--text-dim);}
  .cust-group-edit{margin-left:8px;background:transparent;border:1px solid var(--line);color:var(--text-mute);width:28px;height:28px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all .14s;flex-shrink:0;}
  .cust-group-edit:hover{color:var(--warn);border-color:var(--line-2);background:var(--surface-2);}
  .cust-group-edit svg{width:14px;height:14px;opacity:1;}
  .cust-group-head-link{cursor:pointer;border-radius:6px;margin:-3px -6px 9px;padding:3px 6px;transition:background .14s;}
  .cust-group-head-link:hover{background:var(--surface-2);}
  .cust-group-empty{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:13px;color:var(--text-dim);padding:10px 14px;border:1px dashed var(--line);border-radius:6px;background:var(--surface);}
  .cd-owner-link{color:inherit;text-decoration:none;border-bottom:1px dashed currentColor;cursor:pointer;}
  .cd-owner-link:hover{color:var(--accent,var(--bc-blue-v1));}
  .site-card .site-head svg.chev,.site-card .site-head .chev{margin-left:auto;}
  .site-card .addr svg{width:13px;height:13px;vertical-align:-2px;opacity:.6;margin-right:2px;}
  .cust-panel{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:16px 18px;margin-bottom:18px;box-shadow:var(--shadow-sm);}
  .cust-panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;gap:6px 10px;flex-wrap:wrap;}
  /* v1.4.10.375: the title keeps its line (with its ? tip) and a long note beside it wraps below instead —
     "Ticketing connectors" was squeezed until its ? dropped onto a second line */
  .cust-panel-head h3{margin:0;font-size:15px;font-weight:600;letter-spacing:-.012em;flex:0 1 auto;white-space:nowrap;}
  /* Client detail hero */
  .cust-cols{display:grid;grid-template-columns:1.4fr 1fr;gap:0 18px;align-items:start;}
  @media(max-width:860px){.cust-cols{grid-template-columns:1fr;}}
  .cd-hero{position:relative;display:grid;grid-template-columns:auto 1fr auto;gap:0 16px;align-items:center;
    background:linear-gradient(125deg,var(--brand-blue) 0%,var(--brand-purple,var(--bc-purple-v1)) 130%);
    border-radius:8px;padding:20px 22px;margin-bottom:18px;color:#fff;box-shadow:var(--shadow-md);overflow:hidden;}
  .cd-brand{width:56px;height:56px;border-radius:8px;background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.28);
    display:flex;align-items:center;justify-content:center;font-family:var(--font-display);font-size:20px;font-weight:700;letter-spacing:.5px;}
  .cd-id{min-width:0;}
  .cd-name{font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.35;}   /* v1.4.10.473: a long client name wraps, and wrapped lines need 1.35 (was 1.1: three lines of a 20px name in 66px on a phone) */
  .cd-owner{display:flex;align-items:center;gap:6px;font-size:12px;opacity:.9;margin-top:4px;}
  .cd-owner svg{width:14px;height:14px;}
  .cd-owner-logo{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:5px;
    background:#fff;border:1px solid rgba(255,255,255,.5);overflow:hidden;flex-shrink:0;padding:2px;}
  .cd-owner-logo img{width:100%;height:100%;object-fit:contain;display:block;}
  .cd-actions{display:flex;gap:8px;flex-shrink:0;}
  .cd-actions .btn{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.28);color:#fff;box-shadow:none;}
  .cd-actions .btn:hover{background:rgba(255,255,255,.26);}
  .cd-stats{grid-column:1 / -1;display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:18px;}
  @media(max-width:760px){.cd-stats{grid-template-columns:repeat(3,1fr);}.cd-hero{grid-template-columns:auto 1fr;}.cd-actions{grid-column:1/-1;margin-top:10px;}.cd-name{font-size:18px;}}   /* v1.4.10.473: the client / integrator name is the hero title, 18/600 on a phone like the page title above it (was 20, bigger than the page title) */
  .cd-stat{display:flex;align-items:center;gap:9px;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.16);border-radius:6px;padding:9px 11px;}
  .cd-stat .ic{width:30px;height:30px;border-radius:6px;background:rgba(255,255,255,.16);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .cd-stat .ic svg{width:16px;height:16px;stroke:#fff;}
  .cd-stat .m{min-width:0;}
  .cd-stat .v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;}
  .cd-stat .l{font-size:11px;font-weight:600;opacity:.85;margin-top:3px;text-transform:uppercase;letter-spacing:.06em;}
  .cd-stat.warn{background:rgba(254,202,128,.22);border-color:rgba(254,202,128,.4);}
  /* Client profile panel — restructured */
  .cust-profile .cust-panel-head{margin-bottom:14px;}
  /* identity strip: logo + website chip */
  .cprof-id{display:flex;align-items:center;gap:14px;padding-bottom:14px;margin-bottom:4px;border-bottom:1px dashed var(--line);}
  .cprof-logo{width:64px;height:64px;flex:0 0 64px;border-radius:7px;border:1px solid var(--line);background:var(--surface-2);
    display:flex;align-items:center;justify-content:center;overflow:hidden;}
  .cprof-logo.has{background:#fff;padding:6px;}
  .cprof-logo img{width:100%;height:100%;object-fit:contain;display:block;}
  .cprof-logo .ph svg{width:26px;height:26px;opacity:.45;color:var(--text-dim);}
  .cprof-id-main{min-width:0;flex:1;}
  .cprof-web{display:inline-flex;align-items:center;gap:7px;max-width:100%;padding:6px 12px;border-radius:999px;
    background:var(--surface-2);border:1px solid var(--line);font-size:12px;font-weight:500;color:var(--text-mute);
    text-decoration:none;cursor:pointer;transition:background .15s,border-color .15s,color .15s;}
  .cprof-web span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .cprof-web svg{width:14px;height:14px;flex-shrink:0;opacity:.75;}
  .cprof-web:hover{background:var(--accent-glow);border-color:var(--accent-2);color:var(--accent-deep);}
  .cprof-web.ghost{border-style:dashed;color:var(--text-dim);font-weight:500;background:transparent;}
  .cprof-web.ghost:hover{color:var(--accent);border-color:var(--accent-2);background:var(--accent-glow);}

  /* two-column body */
  .cprof-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px;}
  @media (max-width:640px){.cprof-grid{grid-template-columns:1fr;}}
  .cprof-block{background:var(--surface-2);border:1px solid var(--line);border-radius:7px;padding:13px 14px;min-width:0;}
  .cprof-block-head{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:600;letter-spacing:.06em;
    text-transform:uppercase;color:var(--text-dim);margin-bottom:10px;}
  .cprof-block-head svg{width:14px;height:14px;opacity:.8;}
  .cprof-addr{font-size:13px;line-height:1.55;color:var(--text);margin-bottom:10px;}
  .cprof-line{display:flex;align-items:center;gap:9px;padding:4px 0;font-size:13px;min-width:0;}
  .cprof-line:first-of-type{padding-top:0;}
  .cprof-ic{flex:0 0 26px;width:26px;height:26px;border-radius:5px;background:var(--surface);border:1px solid var(--line);
    display:flex;align-items:center;justify-content:center;color:var(--text-mute);}
  .cprof-ic svg{width:14px;height:14px;}
  .cprof-line a,.cprof-line span:not(.cprof-ic){min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .cprof-line a{color:var(--accent);text-decoration:none;font-weight:500;}
  .cprof-line a:hover{text-decoration:underline;}
  .cprof-empty{font-size:12px;color:var(--text-dim);font-style:italic;}
/* v1.4.10.472: who at the integrator looks after the client (custProfilePanel supportBlock), above the office and contact */
.cprof-support{margin-top:14px;background:color-mix(in srgb,var(--brand-blue) 4%,var(--surface));border-color:color-mix(in srgb,var(--brand-blue) 22%,var(--line));}
.cprof-support.empty{border-style:dashed;background:var(--surface);}
/* v1.4.10.473: "empty" here is the block's state, not the app's empty-state panel — that rule (padding 44/40, centred)
   reached it too and stood the unnamed "Looked after by" block 165px tall, centred, beside 13px-padded neighbours */
.cprof-block.empty{padding:13px 14px;text-align:left;}
.cprof-support.empty .cprof-empty{font-style:normal;color:var(--text-mute);}
/* v1.4.10.473: …and the empty-state panel's title rule (.empty > div, 15/600 display) reached the block's two children: the
   "Looked after by" eyebrow read 15px and the "Nobody named yet" note read as a 15/600 heading. They keep their own looks:
   the 11/600 .06em uppercase label every profile block heads with, and the 12/400 note. */
.cust-panel section.cprof-block.cprof-support.empty > div.cprof-block-head{font-family:inherit;font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--text-dim);}
.cust-panel section.cprof-block.cprof-support.empty > div.cprof-empty{font-family:inherit;font-size:12px;font-weight:400;letter-spacing:inherit;color:var(--text-mute);}

  /* contact card */
  .cprof-contact{display:flex;align-items:center;gap:11px;margin-bottom:10px;padding-bottom:11px;border-bottom:1px solid var(--line);}
  .cprof-avatar{flex:0 0 40px;width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;
    font-family:var(--font-display);font-size:14px;font-weight:600;color:#fff;
    background:linear-gradient(135deg,var(--accent-2),var(--accent-deep));}
  .cprof-contact-id{min-width:0;}
  .cprof-contact-name{font-size:13px;font-weight:600;line-height:1.2;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .cprof-contact-role{font-size:12px;color:var(--text-mute);margin-top:2px;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

  /* notes */
  .cprof-notes{margin-top:14px;padding-top:13px;border-top:1px solid var(--line);}
  .cprof-notes-head{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:600;letter-spacing:.06em;
    text-transform:uppercase;color:var(--text-dim);margin-bottom:7px;}
  .cprof-notes-head svg{width:13px;height:13px;opacity:.8;}
  .cprof-notes-body{font-size:13px;line-height:1.65;color:var(--text);}

  /* fully-empty state */
  .cprof-blank{display:flex;align-items:center;gap:14px;}
  .cprof-blank-txt{font-size:12px;color:var(--text-mute);line-height:1.55;}
  .cprof-blank-txt>strong{display:block;font-size:13px;color:var(--text);font-weight:700;margin-bottom:2px;}
  .cprof-blank-txt strong{font-weight:700;color:var(--text);}
  /* Integrator-access grant list (panel + modals) */
  .cust-grant-list{display:flex;flex-direction:column;gap:2px;max-height:300px;overflow:auto;border:1px solid var(--border,#e5e7eb);border-radius:6px;padding:6px;}
  .cust-grant-row{display:flex;align-items:flex-start;gap:10px;padding:7px 8px;border-radius:6px;cursor:pointer;}
  .cust-grant-row:hover{background:var(--bg2,#f3f4f6);}
  .cust-grant-row input{margin-top:2px;}
  .cust-grant-row span{display:flex;flex-direction:column;line-height:1.35;}
  .cust-grant-name{font-size:13px;font-weight:600;}
  .cust-modal-sec{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);margin:18px 0 10px;padding-bottom:7px;border-bottom:1px solid var(--line);}
  .cust-modal-sec .device-meta{text-transform:none;letter-spacing:0;font-weight:400;}   /* v1.4.10.473: a note beside a section label ("(optional)", "(when a client has nobody of their own named)") is a caption, 11/400 — it was shouted in the label's uppercase */
  .cust-site{border:1px solid var(--line);border-radius:7px;padding:13px 15px;margin-bottom:11px;transition:border-color .15s,box-shadow .15s;background:var(--surface);}
  .cust-site:hover{border-color:var(--line-2);box-shadow:var(--shadow-sm);}
  .cust-site-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
  .cust-site-mark{width:38px;height:38px;flex-shrink:0;border-radius:6px;display:flex;align-items:center;justify-content:center;
    background:var(--surface-2);border:1px solid var(--line);color:var(--text-dim);overflow:hidden;}
  .cust-site-mark svg{width:18px;height:18px;}
  .cust-site-mark.has{background:#fff;padding:4px;}
  .cust-site-mark.has img{width:100%;height:100%;object-fit:contain;display:block;}
  .cust-site-head .name{font-weight:600;font-size:14px;}
  .cust-site-stats{display:flex;gap:12px;font-size:12px;color:var(--text-dim);}
  .cust-loc-list{display:flex;flex-wrap:wrap;gap:7px;margin-top:11px;padding-top:11px;border-top:1px dashed var(--line);}
  .cust-loc{font-size:12px;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:4px 9px;color:var(--text);}
  .cust-loc svg{width:11px;height:11px;vertical-align:-1px;opacity:.6;}
  .cust-loc .muted{color:var(--text-dim);}
  .data-table{width:100%;border-collapse:collapse;font-size:13px;}
  .data-table th{text-align:left;font-weight:600;color:var(--text-dim);font-size:11px;text-transform:uppercase;letter-spacing:.06em;padding:7px 10px;border-bottom:1px solid var(--border,#e5e7eb);}
  .data-table td{padding:9px 10px;border-bottom:1px solid var(--border,#eef0f3);overflow-wrap:anywhere;}
  .data-table tbody tr:last-child td{border-bottom:none;}
  .chk{display:inline-flex;align-items:center;gap:7px;font-size:13px;cursor:pointer;}
  .empty-state svg{width:34px;height:34px;opacity:.4;}
  /* Base layout for modal footers + 2-col field grids (were previously unstyled). */
  .modal-foot{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:14px 22px;border-top:1px solid var(--line);}
  .grid2{display:grid;grid-template-columns:1fr 1fr;gap:0 14px;}
  @media(max-width:560px){ .grid2{grid-template-columns:1fr;} }
  /* Pretty modal header: icon chip + title + subtitle + close. */
  .cust-mh{display:flex;align-items:flex-start;gap:13px;padding:18px 22px;border-bottom:1px solid var(--line);}
  .cust-mh .ic{width:42px;height:42px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:var(--accent-glow);color:var(--brand-blue);}
  .cust-mh .ic svg{width:21px;height:21px;}
  .cust-mh.amber .ic{background:rgba(245,158,11,0.14);color:var(--warn);}
  .cust-mh.green .ic{background:rgba(22,163,74,0.13);color:var(--ok);}
  .cust-mh.violet .ic{background:rgba(var(--bc-purple-rgb),0.13);color:var(--brand-purple,var(--bc-purple-v1));}
  .cust-mh .tt{flex:1;min-width:0;padding-top:1px;}
  .cust-mh h2{margin:0;font-size:16px;font-weight:600;letter-spacing:-.012em;line-height:1.25;}
  .cust-mh .sub{font-size:12px;color:var(--text-mute);margin-top:3px;line-height:1.45;}
  .cust-mh .x{margin-left:auto;background:transparent;border:0;color:var(--text-mute);cursor:pointer;width:30px;height:30px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
  .cust-mh .x:hover{background:var(--navy-3);color:var(--text);}
  .cust-mh .x svg{width:17px;height:17px;}
  .modal-hint{font-size:12px;color:var(--text-mute);margin:-6px 0 2px;line-height:1.45;}
  .modal-hint svg{vertical-align:-2px;}
  /* Long client/integrator forms scroll inside the modal so the footer (with
     the Create/Save buttons) stays pinned and visible instead of the whole modal
     running off-screen. Mirrors the record-editor's .ef-scroll behaviour. */
  .modal-body.cust-scroll{max-height:min(66vh,620px);overflow-y:auto;}
  /* Client list header + summary stat strip. */
  .cust-list-head{display:flex;align-items:flex-start;gap:16px;margin-bottom:16px;flex-wrap:wrap;}
  .cust-list-head .clh-text{flex:1;min-width:200px;}
  .cust-list-head .clh-text h2{margin:0;font-size:16px;font-weight:600;letter-spacing:-.012em;}
  .cust-list-head .clh-text p{margin:3px 0 0;font-size:12px;color:var(--text-mute);}
  .cust-list-head .clh-actions{display:flex;gap:10px;flex-shrink:0;flex-wrap:wrap;}
  /* v1.4.10.435: four buttons (Statistics · Monthly reports · Add integrator · Add client) are wider than a phone — the
     row may never be wider than the page; its buttons wrap inside it (flex-shrink:0 kept it at its one-line width, 539px) */
  .cust-list-head .clh-actions{max-width:100%;min-width:0;}
  @media (max-width:700px){ .cust-list-head .clh-actions{flex-shrink:1;} }
  /* v1.4.10.363: a grid that fills the row — the flex strip capped each stat at
     200px, so on the Sites and Clients pages six stats stopped two-thirds of the
     way across a desktop screen with the rest of the row empty. */
  .cust-stat-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-bottom:22px;}
  .cust-stat{display:flex;align-items:center;gap:10px;background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:11px 15px;min-width:0;}
  .cust-stat > div:last-child{min-width:0;}
  .cust-stat .l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .cust-stat .ic{width:34px;height:34px;border-radius:6px;display:flex;align-items:center;justify-content:center;background:var(--accent-glow);color:var(--brand-blue);flex-shrink:0;}
  .cust-stat .ic svg{width:17px;height:17px;}
  .cust-stat.amber .ic{background:rgba(245,158,11,0.14);color:var(--warn);}
  .cust-stat.warn .ic{background:rgba(220,38,38,0.12);color:var(--err);}
  .cust-stat .v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;}
  .cust-stat .l{font-size:11px;color:var(--text-mute);margin-top:3px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;}   /* v1.4.10.473: KPI label 11/600 uppercase .06em, as every KPI tile (was 11/400) */

  /* ===== Clients — list redesign (v1_4_10_39) ===== */
  .cl-toolbar{display:flex;align-items:center;gap:12px;margin:-8px 0 20px;}
  .cl-search{flex:1;max-width:440px;display:flex;align-items:center;gap:9px;background:var(--surface);
    border:1px solid var(--line);border-radius:6px;padding:0 13px;height:42px;box-shadow:var(--shadow-sm);
    transition:border-color .15s,box-shadow .15s;}
  .cl-search:focus-within{border-color:var(--accent-2);box-shadow:0 0 0 3px var(--accent-glow);}
  .cl-search svg{width:16px;height:16px;color:var(--text-dim);flex-shrink:0;}
  .cl-search input{flex:1;border:0;background:transparent;outline:none;font-size:13px;color:var(--text);min-width:0;}
  .cl-search input::placeholder{color:var(--text-dim);}
  .cl-noresults{padding:34px 4px;text-align:center;color:var(--text-dim);font-size:13px;}
  .cl-empty{display:flex;flex-direction:column;align-items:center;gap:2px;padding:54px 24px;text-align:center;color:var(--text-dim);}
  .cl-empty>svg{width:38px;height:38px;opacity:.4;}
  .cl-empty .es-t{margin-top:12px;font-weight:600;font-size:15px;letter-spacing:-.012em;color:var(--text);font-family:var(--font-display);}
  .cl-empty .es-d{font-size:12px;max-width:400px;line-height:1.55;}
  .cl-empty .es-actions{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap;justify-content:center;}

  /* integrator section card */
  .isec{background:var(--surface);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow-sm);margin-bottom:18px;overflow:hidden;}
  .isec-head{display:flex;align-items:center;gap:13px;padding:14px 16px;border-bottom:1px solid var(--line);
    background:linear-gradient(180deg,var(--surface-2),transparent);}
  .isec-brand{width:42px;height:42px;flex-shrink:0;border-radius:6px;display:flex;align-items:center;justify-content:center;
    font-family:var(--font-display);font-weight:700;font-size:15px;color:#fff;background:var(--grad);overflow:hidden;letter-spacing:.4px;}
  .isec-brand.has{background:#fff;border:1px solid var(--line);padding:5px;}
  .isec-brand.has img{width:100%;height:100%;object-fit:contain;}
  .isec-brand.un{background:var(--surface-3);color:var(--text-dim);}
  .isec-brand.un svg{width:20px;height:20px;}
  .isec-id{min-width:0;flex:1;}
  .isec-name{display:inline-flex;align-items:center;gap:5px;max-width:100%;min-width:0;font-family:var(--font-display);
    font-weight:600;font-size:15px;letter-spacing:-.012em;color:var(--text);overflow:hidden;}
  .isec-name>span,button.isec-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  button.isec-name{background:transparent;border:0;padding:0;cursor:pointer;text-align:left;}
  button.isec-name svg{width:14px;height:14px;opacity:0;color:var(--text-dim);transition:opacity .15s,transform .15s;}
  button.isec-name:hover{color:var(--accent-deep);}
  button.isec-name:hover svg{opacity:1;transform:translateX(2px);}
  .isec-sub{font-size:12px;color:var(--text-dim);margin-top:2px;}
  .isec-roll{display:flex;align-items:center;gap:15px;font-size:12px;color:var(--text-mute);
    font-variant-numeric:tabular-nums;flex-shrink:0;}
  .isec-roll span{display:inline-flex;align-items:center;gap:5px;font-weight:600;}
  .isec-roll svg{width:14px;height:14px;opacity:.55;}
  .isec-roll span.warn{color:var(--warn);}
  .isec-roll span.warn svg{opacity:.85;}
  .isec-actions{display:flex;gap:6px;flex-shrink:0;}
  .isec-body{padding:16px;}
  .isec-empty{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:13px;color:var(--text-dim);}

  /* clients grid + card */
  .cgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(264px,100%),420px));gap:14px;justify-content:start;}
  .ccard{background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:15px 16px;cursor:pointer;
    transition:border-color .15s,box-shadow .15s,transform .15s;}
  .ccard:hover{border-color:var(--accent-2);box-shadow:var(--shadow-md);transform:translateY(-1px);}
  .ccard-head{display:flex;align-items:center;gap:11px;margin-bottom:13px;}
  .ccard-mark{width:40px;height:40px;flex-shrink:0;border-radius:6px;background:var(--accent-glow);
    border:1px solid rgba(var(--bc-accent-rgb),.18);color:var(--brand-blue);display:flex;align-items:center;justify-content:center;
    font-family:var(--font-display);font-weight:700;font-size:14px;overflow:hidden;}
  .ccard-mark.has{background:#fff;padding:4px;}
  .ccard-mark.has img{width:100%;height:100%;object-fit:contain;}
  .ccard-id{min-width:0;flex:1;}
  .ccard-name{display:flex;align-items:center;gap:7px;font-weight:600;font-size:15px;letter-spacing:-.012em;color:var(--text);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .ccard-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
  .ccard-dot.ok{background:var(--ok);}
  .ccard-dot.warn{background:var(--warn);box-shadow:0 0 0 3px color-mix(in srgb,var(--warn) 18%,transparent);}
  .ccard-owner{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--text-mute);margin-top:3px;}
  .ccard-owner svg{width:12px;height:12px;opacity:.55;flex-shrink:0;}
  .ccard-owner span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .ccard-chev{color:var(--text-dim);flex-shrink:0;display:flex;}
  .ccard-chev svg{width:18px;height:18px;}
  .ccard-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;padding-top:13px;border-top:1px solid var(--line);}
  .ccard-stat{text-align:center;min-width:0;}
  .ccard-stat .v{font-size:20px;font-weight:600;line-height:1;letter-spacing:-.02em;}
  .ccard-stat .l{font-size:11px;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;margin-top:4px;font-weight:600;}
  .ccard-stat.warn .v{color:var(--warn);}

  /* detail: balanced columns, admin zone, mobile table scroll */
  .cust-cols>div{min-width:0;}
  .cust-adminzone{margin-top:6px;}
  .cd-divider{display:flex;align-items:center;gap:9px;margin:4px 0 14px;font-family:var(--font-display);
    font-size:11px;font-weight:600;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;}
  .cd-divider svg{width:15px;height:15px;opacity:.7;}
  .cd-divider:after{content:'';flex:1;height:1px;background:var(--line);}
  .cust-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;}
  .cust-table-wrap .data-table{min-width:430px;}

  @media(max-width:680px){
    .isec-head{flex-wrap:wrap;row-gap:0;}
    .isec-id{flex:1 1 auto;}
    .isec-actions{order:2;}
    .isec-roll{order:3;width:100%;justify-content:space-between;gap:8px;margin-top:12px;padding-top:11px;border-top:1px solid var(--line);}
    .cl-search{max-width:none;}
    .ccard-stats{gap:6px;}
  }

  /* ===== Client logo ===== */
  /* Logo shown on the Clients page card mark (replaces the globe glyph). */
  .site-mark.has-logo{padding:0;overflow:hidden;background:var(--surface);border:1px solid var(--line);}
  .site-mark.has-logo img{width:100%;height:100%;object-fit:contain;display:block;}
  /* Logo in the client-detail hero (replaces the initials chip). */
  .cd-brand.has-logo{background:#fff;border-color:rgba(255,255,255,.5);padding:6px;overflow:hidden;}
  .cd-brand.has-logo img{width:100%;height:100%;object-fit:contain;display:block;border-radius:6px;}
  /* Logo block inside the Client profile panel. */
  .cust-logo-block{display:flex;align-items:center;gap:14px;margin:-2px 0 14px;padding-bottom:14px;border-bottom:1px dashed var(--line);}
  .cust-logo-thumb{width:72px;height:72px;border-radius:7px;border:1px solid var(--line);background:var(--surface-2);
    display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden;}
  .cust-logo-thumb img{width:100%;height:100%;object-fit:contain;display:block;}
  .cust-logo-thumb .ph{color:var(--text-dim);}
  .cust-logo-thumb .ph svg{width:26px;height:26px;opacity:.5;}
  .cust-logo-cap{font-size:12px;color:var(--text-mute);line-height:1.5;}
  .cust-logo-cap strong{color:var(--text);font-weight:600;display:block;font-size:13px;margin-bottom:2px;}
  /* Drag-and-drop logo dropzone in the edit-details modal. */
  .logo-drop{position:relative;display:flex;align-items:center;gap:14px;border:2px dashed var(--line-2);
    border-radius:7px;padding:14px;background:var(--surface-2);cursor:pointer;transition:border-color .15s,background .15s;}
  .logo-drop:hover{border-color:var(--brand-blue);background:var(--accent-glow);}
  .logo-drop.dragover{border-color:var(--brand-purple,var(--bc-purple-v1));background:rgba(var(--bc-purple-rgb),.08);}
  .logo-drop input[type=file]{position:absolute;inset:0;opacity:0;cursor:pointer;}
  .logo-drop-preview{width:64px;height:64px;border-radius:6px;background:#fff;border:1px solid var(--line);
    display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden;}
  .logo-drop-preview img{width:100%;height:100%;object-fit:contain;display:block;}
  .logo-drop-preview .ph{color:var(--text-dim);}
  .logo-drop-preview .ph svg{width:24px;height:24px;opacity:.5;}
  .logo-drop-text{flex:1;min-width:0;font-size:12px;color:var(--text-mute);line-height:1.5;}
  .logo-drop-text strong{display:block;color:var(--text);font-weight:600;font-size:13px;margin-bottom:2px;}
  .logo-drop-clear{position:relative;z-index:2;background:transparent;border:1px solid var(--line-2);color:var(--text-mute);
    border-radius:6px;padding:5px 10px;font-size:12px;font-weight:500;cursor:pointer;flex-shrink:0;transition:all .14s;}
  .logo-drop-clear:hover{border-color:var(--err);color:var(--err);background:rgba(220,38,38,.06);}

  /* ============ GLOBAL LOADING GUI ============ */
  /* Top progress bar — a thin gradient sliver pinned to the very top of the
     viewport that appears whenever an API request runs long, creeps toward the
     end, then completes and fades. Gives every slow fetch a single, consistent
     "something is happening" signal without blocking the UI. */
  #netbar{position:fixed;top:0;left:0;height:3px;width:0;z-index:9999;
    background:var(--grad);box-shadow:0 0 10px rgba(var(--bc-accent-rgb),0.5);
    border-radius:0 3px 3px 0;opacity:0;
    transition:width .25s cubic-bezier(.2,.7,.3,1), opacity .35s ease;
    pointer-events:none;}
  #netbar.active{opacity:1;}
  #netbar::after{content:"";position:absolute;top:0;right:0;height:100%;width:90px;
    background:linear-gradient(90deg,rgba(255,255,255,0) 0%,rgba(255,255,255,.85) 100%);
    filter:blur(2px);}

  /* Shimmer primitive — drives every skeleton block below. */
  @keyframes av-shimmer{0%{background-position:-460px 0;}100%{background-position:460px 0;}}
  .sk{position:relative;overflow:hidden;border-radius:6px;
    background:var(--surface-2);
    background-image:linear-gradient(90deg,
      rgba(226,232,242,0) 0%,
      rgba(var(--bc-purple-rgb),0.10) 28%,
      rgba(var(--bc-accent-rgb),0.14) 50%,
      rgba(var(--bc-purple-rgb),0.10) 72%,
      rgba(226,232,242,0) 100%);
    background-size:460px 100%;background-repeat:no-repeat;
    animation:av-shimmer 1.15s ease-in-out infinite;}
  @media (prefers-reduced-motion: reduce){
    .sk{animation:none;background-image:none;}
    #netbar{transition:opacity .2s ease;}
  }
  .sk-line{height:11px;margin:7px 0;}
  .sk-line.lg{height:15px;}
  .sk-line.sm{height:9px;}
  .sk-pill{height:22px;width:64px;border-radius:11px;}
  .sk-circle{border-radius:50%;}

  /* Skeleton client card — mirrors the real .site-card geometry so the page
     doesn't jump when real data swaps in. */
  .sk-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(280px,100%),1fr));gap:14px;}
  .sk-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
    padding:18px;box-shadow:var(--shadow-sm);}
  .sk-card-head{display:flex;align-items:center;gap:12px;margin-bottom:16px;}
  .sk-card-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;
    padding-top:14px;border-top:1px solid var(--line);}
  .sk-stat{display:flex;flex-direction:column;align-items:center;gap:6px;}
  .sk-strip{display:flex;gap:13px;margin-bottom:18px;flex-wrap:wrap;}
  .sk-strip .sk-card{flex:1;min-width:150px;display:flex;align-items:center;gap:12px;padding:15px 16px;}
  .sk-fade-in{animation:av-fade .4s ease both;}
  @keyframes av-fade{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:none;}}
  /* ============ PAGE HERO (per-page gradient header) ============ */
  .page-hero-host{ padding:12px 30px 0; }
  .page-hero-host:empty{ padding:0; }
  .page-hero{
    position:relative; overflow:hidden; border-radius:8px; padding:16px 24px;
    background:linear-gradient(115deg,#1E40AF 0%, var(--bc-blue-v1) 38%, #6D33E0 78%, var(--bc-purple-v1) 100%);
    box-shadow:0 22px 46px -24px rgba(56,48,140,.62), inset 0 1px 0 rgba(255,255,255,.14);
    isolation:isolate;
  }
  .page-hero::before{ /* dot grid wash */
    content:""; position:absolute; inset:0; z-index:-1;
    background-image:radial-gradient(rgba(255,255,255,.16) 1px, transparent 1.4px);
    background-size:22px 22px; opacity:.55;
    -webkit-mask-image:linear-gradient(95deg,#000,transparent 72%);
            mask-image:linear-gradient(95deg,#000,transparent 72%);
  }
  .page-hero::after{ /* purple glow blob */
    content:""; position:absolute; z-index:-1; right:-90px; top:-130px; width:340px; height:340px;
    background:radial-gradient(circle at center, rgba(167,139,250,.55), rgba(167,139,250,0) 64%);
  }
  .ph-row{ display:flex; align-items:center; gap:18px; }
  .ph-text{ flex:1; min-width:0; }
  .ph-eyebrow{ display:inline-flex; align-items:center; gap:8px; font-family:var(--font-body);
    font-size:11px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:rgba(255,255,255,.85);   /* v1.4.10.473: the uppercase label look, said here too (was mono .07em, corrected only by a rule 12,000 lines down) */
    background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.20); padding:3px 10px;
    border-radius:999px; margin-bottom:9px; }
  .ph-eyebrow .ph-live{ width:6px;height:6px;border-radius:50%;background:#7CF5C4;
    box-shadow:0 0 0 3px rgba(124,245,196,.22); animation:phpulse 2.4s ease-in-out infinite; }
  @keyframes phpulse{ 0%,100%{opacity:1} 50%{opacity:.35} }
  .page-hero .page-title{ color:#fff; font-size:20px; line-height:1.1; margin:0; }
  .page-hero .page-sub{ color:rgba(255,255,255,.84); font-size:13px; margin-top:4px; max-width:700px; }
  .ph-chips{ display:flex; flex-wrap:wrap; gap:8px; margin-top:12px; }
  .ph-chip{ display:inline-flex; align-items:center; gap:9px; background:rgba(255,255,255,.13);
    border:1px solid rgba(255,255,255,.19); border-radius:7px; padding:6px 11px; transition:transform .15s, background .15s; }
  .ph-chip:hover{ background:rgba(255,255,255,.21); transform:translateY(-1px); }
  .ph-chip .ph-cv{ font-family:var(--font-display); font-weight:600; font-size:20px; letter-spacing:-.02em; color:#fff; line-height:1; white-space:nowrap; }
  .ph-chip .ph-cl{ font-size:11px; color:rgba(255,255,255,.80); line-height:1.15; }
  .ph-chip .ph-cdot{ width:8px;height:8px;border-radius:50%; flex-shrink:0; }
  .ph-chip.tone-ok   .ph-cdot{ background:#34D399; box-shadow:0 0 8px rgba(52,211,153,.7); }
  .ph-chip.tone-warn .ph-cdot{ background:#FBBF24; box-shadow:0 0 8px rgba(251,191,36,.7); }
  .ph-chip.tone-err  .ph-cdot{ background:#FB7185; box-shadow:0 0 8px rgba(251,113,133,.7); }
  .ph-chip.tone-info .ph-cdot{ background:#A78BFA; box-shadow:0 0 8px rgba(167,139,250,.7); }
  .ph-chip.tone-plain .ph-cdot{ display:none; }
  .ph-art{ position:relative; width:74px; height:74px; flex-shrink:0; display:flex; align-items:center; justify-content:center; }
  .ph-art .ph-ring{ position:absolute; inset:0; border-radius:50%; border:1.5px dashed rgba(255,255,255,.30); animation:phspin 26s linear infinite; }
  .ph-art .ph-ring.r2{ inset:10px; border-style:solid; border-color:rgba(255,255,255,.15); animation-duration:18s; animation-direction:reverse; }
  .ph-art .ph-medal{ position:relative; width:48px; height:48px; border-radius:8px; color:#fff;
    background:rgba(255,255,255,.17); border:1px solid rgba(255,255,255,.30);
    display:flex; align-items:center; justify-content:center;
    box-shadow:inset 0 1px 0 rgba(255,255,255,.34), 0 8px 18px -8px rgba(0,0,0,.42); }
  .ph-art .ph-medal svg{ width:23px; height:23px; }
  @keyframes phspin{ to{ transform:rotate(360deg); } }
  @media (prefers-reduced-motion: reduce){ .ph-art .ph-ring{ animation:none; } .ph-eyebrow .ph-live{ animation:none; } }
  /* v1.4.10.473: the hero's gutter steps down where the content's does (920px, to 16; it stood 30px in above 16px
     panels between 861 and 920), and a page title goes to 18 at one width, a phone's ≤760 — the hero's did at ≤860,
     a plain .page-title only at ≤600, so between 601 and 860 two pages' titles were two sizes */
  @media(max-width:920px){ .page-hero-host{ padding:12px 16px 0; } }
  @media(max-width:860px){
    .page-hero{ padding:14px 16px; border-radius:8px; }
    .ph-art{ display:none; }
  }
  @media(max-width:760px){ .page-title,.page-hero .page-title{ font-size:18px; } }
  @media(max-width:600px){
    .ph-chip{ padding:7px 11px; }
    .ph-chip .ph-cv{ font-size:20px; }
  }

  /* ============ RELIABILITY — score hover explainers & methodology ============ */
  .rel-score{ position:relative; display:inline-flex; outline:none; cursor:help; }
  .rel-score .rel-tip{
    position:absolute; bottom:calc(100% + 9px); left:50%; transform:translateX(-50%) translateY(4px);
    width:268px; max-width:78vw; background:var(--surface); color:var(--text);
    border:1px solid var(--line-2); border-radius:7px; padding:12px 13px;
    box-shadow:0 20px 50px -16px rgba(15,23,42,.42), 0 2px 8px rgba(15,23,42,.10);
    opacity:0; visibility:hidden; pointer-events:none; z-index:120;
    transition:opacity .14s ease, transform .14s ease; text-align:left; font-weight:400;
  }
  .rel-score:hover .rel-tip, .rel-score:focus .rel-tip, .rel-score:focus-within .rel-tip{
    opacity:1; visibility:visible; transform:translateX(-50%) translateY(0); pointer-events:auto;
  }
  .rel-score .rel-tip::after{ content:""; position:absolute; top:100%; left:50%; transform:translateX(-50%);
    border:6px solid transparent; border-top-color:var(--surface); filter:drop-shadow(0 1px 0 var(--line-2)); }
  .rel-tip .rt-head{ display:flex; align-items:center; justify-content:space-between; gap:8px; margin-bottom:7px; }
  .rel-tip .rt-head b{ font-size:14px; }
  .rel-tip .rt-band{ font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; padding:2px 7px; border-radius:6px; }
  .rel-tip .rt-band.ok{ background:color-mix(in srgb,var(--ok) 16%,transparent); color:var(--ok); }
  .rel-tip .rt-band.warn{ background:color-mix(in srgb,var(--warn) 18%,transparent); color:var(--warn); }
  .rel-tip .rt-band.err{ background:color-mix(in srgb,var(--err) 16%,transparent); color:var(--err); }
  .rel-tip .rt-band.muted{ background:var(--surface-3); color:var(--text-mute); }
  .rel-tip .rt-formula{ font-size:11px; color:var(--text-mute); font-family:var(--font-mono);font-variant-numeric:tabular-nums; margin-bottom:9px; line-height:1.35; }
  .rel-tip .rt-row{ display:flex; align-items:center; gap:7px; margin:5px 0; font-size:12px; }
  .rel-tip .rt-l{ flex:1; min-width:0; color:var(--text-dim); }
  .rel-tip .rt-muted{ color:var(--text-mute); font-size:11px; }
  .rel-tip .rt-v{ color:var(--text-mute); white-space:nowrap; font-size:11px; }
  .rel-tip .rt-v b{ color:var(--text); }
  .rel-tip .rt-bar{ width:46px; height:5px; border-radius:3px; background:var(--surface-3); overflow:hidden; flex-shrink:0; }
  .rel-tip .rt-bar i{ display:block; height:100%; border-radius:3px; }
  .rel-tip .rt-sec{ font-size:11px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--text-mute); margin:10px 0 4px; }
  .rel-tip .rt-tip{ font-size:12px; color:var(--text-dim); line-height:1.45; margin:3px 0; }
  .rel-score.al-right .rel-tip{ left:auto; right:0; transform:translateX(0) translateY(4px); }
  .rel-score.al-right:hover .rel-tip, .rel-score.al-right:focus .rel-tip, .rel-score.al-right:focus-within .rel-tip{ transform:translateX(0) translateY(0); }
  .rel-score.al-right .rel-tip::after{ left:auto; right:14px; transform:none; }
  @media (prefers-reduced-motion: reduce){ .rel-score .rel-tip{ transition:none; } }

  .rel-meth-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr)); gap:12px; margin-bottom:16px; }
  .rel-meth-f{ background:var(--surface-2); border:1px solid var(--line); border-radius:7px; padding:13px 14px; }
  .rel-meth-top{ display:flex; align-items:center; gap:9px; margin-bottom:6px; }
  .rel-meth-w{ font-family:var(--font-display); font-weight:700; font-size:16px; color:var(--accent); }
  .rel-meth-lbl{ font-weight:600; font-size:13px; }
  .rel-meth-desc{ font-size:12px; color:var(--text-dim); line-height:1.5; margin-bottom:8px; }
  .rel-meth-imp{ font-size:12px; color:var(--ok); display:flex; gap:6px; align-items:flex-start; line-height:1.45; }
  .rel-meth-imp svg{ width:13px; height:13px; flex-shrink:0; margin-top:2px; }
  .rel-meth-bands{ display:flex; gap:14px; flex-wrap:wrap; padding-top:6px; }
  .rel-band-key{ display:inline-flex; align-items:center; gap:6px; font-size:11px; color:var(--text-dim); }
  .rel-band-key i{ width:9px; height:9px; border-radius:50%; }
  .rel-band-key.ok i{ background:var(--ok); } .rel-band-key.warn i{ background:var(--warn); } .rel-band-key.err i{ background:var(--err); }

  /* ============ DEV TEAM BOARD — age, due dates, follow-up, timeline, workload ============ */
  .dv-board-wrap{display:flex;gap:16px;align-items:flex-start;}
  .dv-card .dv-foot{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:9px;padding-top:8px;border-top:1px dashed var(--line);}
  .dv-age{font-size:11px;color:var(--text-mute);display:inline-flex;align-items:center;gap:4px;}
  .dv-due{font-size:11px;font-weight:600;display:inline-flex;align-items:center;gap:4px;padding:2px 7px;border-radius:5px;background:var(--surface-3);color:var(--text-mute);}
  .dv-due svg{width:11px;height:11px;}
  .dv-due.today{background:rgba(217,119,6,.14);color:var(--warn);}
  .dv-due.soon{background:var(--accent-glow);color:var(--brand-blue);}
  .dv-due.overdue{background:rgba(220,38,38,.13);color:var(--err);}
  .dv-card.follow{border-left:3px solid var(--warn);}
  .dv-card.overdue{border-left:3px solid var(--err);}
  .dv-follow{color:var(--err);font-size:10px;line-height:1;margin-left:1px;}
  .dv-due-note{font-size:11px;font-weight:600;margin-top:5px;}
  .dv-due-note.today{color:var(--warn);} .dv-due-note.soon{color:var(--brand-blue);} .dv-due-note.overdue{color:var(--err);} .dv-due-note.later{color:var(--text-mute);}

  /* Timeline strip */
  .dv-timeline{background:var(--bg-2);border:1px solid var(--line);border-radius:7px;padding:11px 13px;margin-bottom:16px;}
  .dv-tl-head{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);display:flex;align-items:center;gap:7px;margin-bottom:9px;}
  .dv-tl-head svg{width:14px;height:14px;}
  .dv-tl-track{display:flex;gap:9px;overflow-x:auto;padding-bottom:3px;scrollbar-width:thin;}
  .dv-tl-chip{flex-shrink:0;display:flex;flex-direction:column;align-items:flex-start;gap:2px;min-width:150px;max-width:200px;text-align:left;
    background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--text-mute);border-radius:6px;padding:8px 11px;cursor:pointer;font-family:inherit;font-size:12px;font-weight:600;transition:transform .08s,border-color .14s;}   /* v1.4.10.473: the chip's own type is its title's, 12/600 (it carried the 14px button default) */
  .dv-tl-chip:hover{transform:translateY(-1px);border-color:var(--line-2);}
  .dv-tl-chip.overdue{border-left-color:var(--err);}
  .dv-tl-chip.today{border-left-color:var(--warn);}
  .dv-tl-chip.soon{border-left-color:var(--brand-blue);}
  .dv-tl-chip.later{border-left-color:var(--text-mute);}
  .dv-tl-when{font-size:11px;font-weight:600;}   /* v1.4.10.473: a state on a chip is the status-pill weight, 11/600 (was 700) */
  .dv-tl-chip.overdue .dv-tl-when{color:var(--err);} .dv-tl-chip.today .dv-tl-when{color:var(--warn);} .dv-tl-chip.soon .dv-tl-when{color:var(--brand-blue);} .dv-tl-chip.later .dv-tl-when{color:var(--text-mute);}
  .dv-tl-id{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:400;color:var(--text-mute);}
  .dv-tl-title{font-size:12px;font-weight:600;color:var(--text);line-height:1.3;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;}
  .dv-tl-chip .dv-av.sm{width:16px;height:16px;font-size:10px;margin-top:2px;}

  /* Side "who's on what" strip */
  .dv-side{width:248px;flex-shrink:0;background:var(--bg-2);border:1px solid var(--line);border-radius:7px;padding:12px 13px;}
  .dv-side-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;}
  .dv-side-head h4{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin:0;display:flex;align-items:center;gap:7px;}
  .dv-side-head h4 svg{width:14px;height:14px;}
  .dv-side-x{border:1px solid var(--line);background:var(--surface-2);color:var(--text-mute);border-radius:6px;width:22px;height:22px;cursor:pointer;font-size:14px;line-height:1;font-family:inherit;}
  .dv-wl{margin-bottom:13px;}
  .dv-wl:last-child{margin-bottom:0;}
  .dv-wl.has-follow .dv-wl-name{color:var(--text);}
  .dv-wl-top{display:flex;align-items:center;gap:7px;min-width:0;margin-bottom:5px;}
  .dv-wl-top .dv-av{flex-shrink:0;}
  .dv-wl-count{font-size:11px;color:var(--text-mute);font-weight:700;white-space:nowrap;flex-shrink:0;margin-left:auto;}
  .dv-wl-meta{display:flex;align-items:center;flex-wrap:wrap;gap:5px;margin:-1px 0 6px;min-width:0;}
  .dv-wl-name{display:block;flex:1;min-width:0;font-size:12px;color:var(--text-dim);text-decoration:none;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  a.dv-wl-name:hover{color:var(--brand-blue);}
  .dv-wl-name.un{font-style:italic;color:var(--text-mute);}
  .dv-wl-age{font-size:11px;color:var(--text-mute);}
  .dv-wl-flag{font-size:11px;font-weight:600;color:var(--err);display:inline-flex;align-items:center;gap:3px;background:rgba(220,38,38,.11);padding:1px 6px;border-radius:5px;}
  .dv-wl-flag svg{width:11px;height:11px;}
  .dv-load-row{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;color:var(--text-dim);margin-bottom:5px;}
  .dv-load-row b{font-size:12px;color:var(--text-mute);font-weight:700;}
  .dv-load{height:6px;border-radius:4px;background:var(--surface-3);overflow:hidden;}
  .dv-load > i{display:block;height:100%;background:var(--grad);border-radius:4px;transition:width .3s;}

  /* New-fix modal */
  .dv-newfix-ico{display:inline-flex;width:18px;height:18px;color:var(--brand-blue);vertical-align:-3px;margin-right:5px;}
  .dv-nf{display:grid;grid-template-columns:1.4fr 1fr;gap:18px;margin-bottom:16px;}
  .dv-nf-side .dv-nf-card{background:var(--bg-2);border:1px solid var(--line);border-radius:7px;padding:14px;}
  .dv-nf-row{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
  .dv-opt{font-size:11px;font-weight:400;color:var(--text-mute);text-transform:none;letter-spacing:0;margin-left:5px;}
  .dv-hint{font-size:12px;color:var(--brand-blue);margin-top:5px;min-height:14px;}
  .dv-nf-actions{display:flex;gap:8px;justify-content:flex-end;}
  .dv-seg{display:flex;gap:0;border:1px solid var(--line);border-radius:6px;overflow:hidden;background:var(--surface);}
  .dv-seg button{flex:1;border:0;border-right:1px solid var(--line);background:transparent;color:var(--text-mute);font-size:12px;font-weight:600;padding:7px 4px;cursor:pointer;font-family:inherit;transition:background .12s,color .12s;}
  .dv-seg button:last-child{border-right:0;}
  .dv-seg button:hover{background:var(--surface-2);color:var(--text);}
  .dv-seg button.on{background:var(--brand-blue);color:#fff;}
  .dv-seg button.prio-p1.on{background:var(--err);} .dv-seg button.prio-p2.on{background:var(--warn);} .dv-seg button.prio-p3.on{background:var(--text-mute);}
  @media (max-width:680px){ .dv-nf{grid-template-columns:1fr;} }

  /* ============ FLOATING AVDESK LOADER (slow-load activity indicator) ============ */
  #av-loader{ position:fixed; inset:0; z-index:9998; display:none; align-items:center; justify-content:center; pointer-events:none; }
  #av-loader.show, #av-loader.out{ display:flex; }
  #av-loader .avl-card{
    display:flex; flex-direction:column; align-items:center; gap:13px;
    padding:24px 30px; border-radius:8px;
    background:color-mix(in srgb, var(--surface) 86%, transparent);
    border:1px solid var(--line); box-shadow:0 28px 70px -22px rgba(15,23,42,.45), 0 4px 14px rgba(15,23,42,.12);
    backdrop-filter:blur(7px); -webkit-backdrop-filter:blur(7px);
    transform:translateY(8px) scale(.96); opacity:0;
  }
  #av-loader.show .avl-card{ animation:avlIn .26s cubic-bezier(.2,.8,.3,1) forwards; }
  #av-loader.out  .avl-card{ animation:avlOut .28s ease forwards; }
  @keyframes avlIn{ to{ transform:translateY(0) scale(1); opacity:1; } }
  @keyframes avlOut{ from{ transform:translateY(0) scale(1); opacity:1; } to{ transform:translateY(6px) scale(.97); opacity:0; } }
  .avl-mark{ position:relative; width:74px; height:74px; display:flex; align-items:center; justify-content:center; animation:avlFloat 2.6s ease-in-out infinite; }
  .avl-mark img{ width:46px; height:46px; object-fit:contain; display:block; z-index:1; filter:drop-shadow(0 4px 10px rgba(var(--bc-accent-rgb),.30)); }
  .avl-ring{ position:absolute; inset:0; border-radius:50%; border:2px solid transparent;
    border-top-color:var(--brand-blue); border-right-color:var(--brand-purple,var(--bc-purple-v1));
    animation:avlSpin 1.05s linear infinite; }
  .avl-ring.r2{ inset:9px; border-top-color:transparent; border-right-color:transparent;
    border-bottom-color:var(--brand-purple,var(--bc-purple-v1)); border-left-color:var(--brand-blue);
    animation:avlSpin 1.7s linear infinite reverse; opacity:.7; }
  .avl-text{ font-family:var(--font-display); font-size:12px; font-weight:600; letter-spacing:.03em; color:var(--text-mute); display:inline-flex; align-items:baseline; }
  .avl-dots{ display:inline-flex; }
  .avl-dots i{ font-style:normal; animation:avlDot 1.4s infinite; opacity:.25; }
  .avl-dots i:nth-child(2){ animation-delay:.2s; }
  .avl-dots i:nth-child(3){ animation-delay:.4s; }
  @keyframes avlFloat{ 0%,100%{ transform:translateY(0); } 50%{ transform:translateY(-7px); } }
  @keyframes avlSpin{ to{ transform:rotate(360deg); } }
  @keyframes avlDot{ 0%,80%,100%{ opacity:.25; } 40%{ opacity:1; } }
  @media (prefers-reduced-motion: reduce){
    .avl-mark{ animation:none; } .avl-ring,.avl-ring.r2{ animation-duration:2.2s; } .avl-dots i{ animation:none; opacity:.7; }
    #av-loader.show .avl-card{ animation:none; transform:none; opacity:1; }
  }

  /* ===== Board live timers (v1.4.10.2) ===== */
  .dv-since,.dv-timer{font-variant-numeric:tabular-nums;font-weight:600;}
  .dv-age{font-size:11px;color:var(--text-mute);display:inline-flex;align-items:center;gap:4px;}
  .dv-age svg{width:11px;height:11px;opacity:.8;}
  .dv-countdown{font-variant-numeric:tabular-nums;font-weight:600;}   /* v1.4.10.473: 600, as the chip it sits in */
  .dv-countdown.overdue{color:var(--err);}
  .dv-due .dv-countdown{font-size:11px;}
  /* Headline clocks in the fix detail */
  .dv-clocks{display:flex;gap:12px;margin-bottom:14px;flex-wrap:wrap;}
  .dv-clock{flex:1;min-width:150px;background:var(--bg-2);border:1px solid var(--line);border-radius:7px;padding:11px 14px;}
  .dv-clock.overdue,.dv-clock.today{border-color:transparent;}
  .dv-clock.overdue{background:rgba(220,38,38,.07);box-shadow:inset 0 0 0 1px rgba(220,38,38,.28);}
  .dv-clock.today{background:rgba(217,119,6,.08);box-shadow:inset 0 0 0 1px rgba(217,119,6,.3);}
  .dv-clock.soon{box-shadow:inset 0 0 0 1px var(--accent-glow);}
  .dv-clock-lbl{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);display:flex;align-items:center;gap:6px;margin-bottom:6px;}
  .dv-clock-lbl svg{width:13px;height:13px;}
  .dv-clock-val{font-size:20px;font-weight:600;letter-spacing:-.02em;color:var(--text);font-variant-numeric:tabular-nums;line-height:1;}
  .dv-clock.overdue .dv-clock-val,.dv-clock.overdue .dv-clock-lbl{color:var(--err);}
  .dv-clock.today .dv-clock-val,.dv-clock.today .dv-clock-lbl{color:var(--warn);}
  .dv-stop.cd.overdue{color:var(--err);}
  .dv-overdue-banner{display:flex;align-items:center;gap:9px;background:rgba(220,38,38,.09);border:1px solid rgba(220,38,38,.28);color:var(--err);font-size:12px;font-weight:700;padding:10px 14px;border-radius:6px;margin-bottom:14px;}
  .dv-overdue-banner svg{width:15px;height:15px;flex-shrink:0;}

  /* ===== Zoned due-date timeline (v1.4.10.2) ===== */
  .dv-tl-sum{font-size:11px;font-weight:600;border-radius:6px;padding:2px 8px;margin-left:8px;text-transform:none;letter-spacing:0;}
  .dv-tl-sum.overdue{background:rgba(220,38,38,.13);color:var(--err);}
  .dv-tl-sum.today{background:rgba(217,119,6,.14);color:var(--warn);}
  .dv-tl-track{display:flex;gap:14px;}
  .dv-tl-lane{flex-shrink:0;min-width:170px;}
  .dv-tl-lane-h{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin-bottom:8px;padding-bottom:6px;border-bottom:1px dashed var(--line);}
  .dv-tl-lane-dot{width:7px;height:7px;border-radius:50%;background:var(--text-mute);}
  .dv-tl-lane.overdue .dv-tl-lane-dot{background:var(--err);} .dv-tl-lane.overdue .dv-tl-lane-h{color:var(--err);}
  .dv-tl-lane.today .dv-tl-lane-dot{background:var(--warn);} .dv-tl-lane.today .dv-tl-lane-h{color:var(--warn);}
  .dv-tl-lane.soon .dv-tl-lane-dot{background:var(--brand-blue);}
  .dv-tl-lane-n{margin-left:auto;font-size:10px;background:var(--surface-3);color:var(--text-mute);border-radius:6px;padding:0 7px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: badge look (it took the lane heading's .06em) */
  .dv-tl-lane-cards{display:flex;gap:9px;overflow-x:auto;padding-bottom:3px;scrollbar-width:thin;}
  .dv-tl-cd{font-size:11px;font-weight:600;font-variant-numeric:tabular-nums;}   /* v1.4.10.473: 600, as .dv-tl-when beside it */
  .dv-tl-chip.overdue .dv-tl-cd{color:var(--err);} .dv-tl-chip.today .dv-tl-cd{color:var(--warn);} .dv-tl-chip.soon .dv-tl-cd{color:var(--brand-blue);} .dv-tl-chip.later .dv-tl-cd{color:var(--text-mute);}

  /* ===== New-fix composer — drag & drop (v1.4.10.2) ===== */
  .dv-nf-previewwrap{margin-bottom:14px;}
  .dv-nf-prevlbl{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin-bottom:7px;}
  .dv-nf-preview{cursor:grab;border:1px solid var(--line-2);box-shadow:var(--shadow-md);margin-bottom:0;}
  .dv-nf-preview:active{cursor:grabbing;}
  .dv-nf-preview.dragging{opacity:.5;}
  .dv-nf-preview.drop{outline:2px dashed var(--brand-blue);outline-offset:2px;}
  .dv-nf-cols{display:grid;grid-template-columns:1fr 1fr;gap:7px;}
  .dv-nf-coltile{display:flex;align-items:center;gap:7px;border:1px solid var(--line);background:var(--surface);border-radius:6px;padding:8px 10px;font-size:12px;font-weight:600;color:var(--text-mute);cursor:pointer;font-family:inherit;text-align:left;transition:border-color .12s,background .12s,color .12s;}
  .dv-nf-coltile .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
  .dv-nf-coltile:hover{border-color:var(--line-2);color:var(--text);}
  .dv-nf-coltile.on{border-color:var(--brand-blue);background:var(--accent-glow);color:var(--brand-blue);}
  .dv-nf-coltile.drop{border-color:var(--brand-blue);border-style:dashed;background:var(--accent-glow);color:var(--brand-blue);}
  .dv-nf-palette{display:flex;flex-wrap:wrap;gap:6px;}
  .dv-nf-chip{font-size:12px;font-weight:500;border-radius:5px;padding:4px 9px;cursor:pointer;user-select:none;transition:transform .05s,filter .12s;}
  .dv-nf-chip:hover{filter:brightness(.96);}
  .dv-nf-chip:active{transform:scale(.96);}
  .dv-nf-chip.on{cursor:pointer;}
  .dv-nf-checks{display:flex;flex-direction:column;gap:6px;margin-bottom:8px;}
  .dv-nf-empty{font-size:12px;color:var(--text-dim);padding:9px 10px;background:var(--bg-2);border:1px dashed var(--line);border-radius:6px;}
  .dv-nf-check{display:flex;align-items:center;gap:9px;background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:7px 9px;}
  .dv-nf-check.over{border-color:var(--brand-blue);border-style:dashed;}
  .dv-nf-check.dragging{opacity:.45;}
  .dv-nf-grip{cursor:grab;color:var(--text-dim);font-size:12px;letter-spacing:-2px;line-height:1;flex-shrink:0;}
  .dv-nf-grip:active{cursor:grabbing;}
  .dv-nf-ck-text{flex:1;font-size:12px;color:var(--text);word-break:break-word;}
  .dv-nf-ck-x{border:0;background:transparent;color:var(--text-dim);cursor:pointer;padding:2px;display:inline-flex;border-radius:6px;line-height:0;}
  .dv-nf-ck-x svg{width:13px;height:13px;}
  .dv-nf-ck-x:hover{color:var(--err);background:rgba(220,38,38,.1);}

  /* ===== Assignment toast (v1.4.10.2) ===== */
  .dv-assign-toast{position:fixed;right:22px;bottom:22px;z-index:4000;display:flex;align-items:center;gap:11px;background:var(--surface);border:1px solid var(--line-2);border-left:3px solid var(--brand-blue);border-radius:7px;box-shadow:var(--shadow-lg);padding:11px 13px;max-width:340px;transform:translateY(14px);opacity:0;transition:transform .22s ease,opacity .22s ease;}
  .dv-assign-toast.show{transform:translateY(0);opacity:1;}
  .dv-assign-toast .dv-av{width:30px;height:30px;font-size:12px;text-transform:none;letter-spacing:0;}
  .dv-at-body{min-width:0;}
  .dv-at-h{font-size:13px;font-weight:600;color:var(--text);}
  .dv-at-s{font-size:12px;color:var(--text-mute);font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
  .dv-at-view{border:1px solid var(--brand-blue);background:var(--accent-glow);color:var(--brand-blue);font-weight:600;font-size:12px;border-radius:6px;padding:5px 11px;cursor:pointer;font-family:inherit;}
  .dv-at-view:hover{background:var(--brand-blue);color:#fff;}
  .dv-at-x{border:0;background:transparent;color:var(--text-dim);cursor:pointer;padding:3px;display:inline-flex;line-height:0;border-radius:6px;}
  .dv-at-x svg{width:14px;height:14px;}
  .dv-at-x:hover{color:var(--text);background:var(--surface-2);}
  @media (max-width:560px){ .dv-assign-toast{left:14px;right:14px;bottom:14px;max-width:none;} .dv-nf-cols{grid-template-columns:1fr;} }
  @media (prefers-reduced-motion: reduce){ .dv-assign-toast{transition:opacity .15s;} }

  /* ===== Dev Board — rich description editor, attachments, hero & menu ===== */
  /* Rich-text description editor */
  .dv-rte-wrap{border:1px solid var(--line);border-radius:6px;overflow:hidden;background:var(--surface);transition:border-color .15s,box-shadow .15s;}
  .dv-rte-wrap:focus-within{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .dv-rte-tb{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:6px 8px;background:var(--surface-2);border-bottom:1px solid var(--line);}
  .dv-rte-b{min-width:30px;height:28px;padding:0 7px;border:1px solid transparent;background:transparent;color:var(--text-mute);font-size:12px;font-weight:500;font-family:inherit;border-radius:5px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1;transition:background .12s,color .12s,border-color .12s;}
  .dv-rte-b:hover{background:var(--surface);color:var(--brand-blue);border-color:var(--line);}
  .dv-rte-b b,.dv-rte-b i,.dv-rte-b u,.dv-rte-b s{font-style:inherit;}
  .dv-rte-b svg{width:14px;height:14px;}
  .dv-rte-sep{width:1px;height:18px;background:var(--line-2);margin:0 4px;flex-shrink:0;}
  .dv-rte{min-height:150px;max-height:420px;overflow-y:auto;padding:13px 15px;font-size:13px;line-height:1.65;color:var(--text);outline:none;}
  .dv-rte:empty:before{content:attr(data-ph);color:var(--text-dim);pointer-events:none;}
  .dv-rte p{margin:0 0 10px;} .dv-rte p:last-child{margin-bottom:0;}
  .dv-rte h2,.dv-rich h2{font-size:16px;font-weight:600;letter-spacing:-.012em;margin:14px 0 8px;color:var(--text);}
  .dv-rte h3,.dv-rich h3{font-size:15px;font-weight:600;margin:12px 0 6px;color:var(--text);}
  .dv-rte ul,.dv-rte ol,.dv-rich ul,.dv-rich ol{margin:6px 0 10px;padding-left:22px;}
  .dv-rte li,.dv-rich li{margin:3px 0;}
  .dv-rte a,.dv-rich a{color:var(--brand-blue);text-decoration:underline;}
  .dv-rte blockquote,.dv-rich blockquote{margin:10px 0;padding:6px 14px;border-left:3px solid var(--line-2);color:var(--text-mute);}
  .dv-rte pre,.dv-rich pre{margin:10px 0;padding:11px 13px;background:var(--surface-3);border-radius:6px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;overflow-x:auto;white-space:pre-wrap;}
  .dv-rte code,.dv-rich code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;}
  /* Read-only rendered description */
  .dv-desc-box.dv-rich{white-space:normal;color:var(--text);}
  .dv-rich p{margin:0 0 10px;} .dv-rich p:last-child{margin-bottom:0;}

  /* Drag-and-drop attachment zone */
  .dv-drop{border:1.5px dashed var(--line-2);border-radius:6px;background:var(--surface-2);padding:16px 14px;text-align:center;cursor:pointer;transition:border-color .15s,background .15s;}
  .dv-drop:hover{border-color:var(--brand-blue);background:var(--accent-glow);}
  .dv-drop.drag{border-color:var(--brand-blue);background:var(--accent-glow);box-shadow:0 0 0 3px var(--accent-glow);}
  .dv-drop.sm{padding:11px 12px;margin-top:10px;}
  .dv-drop-in{display:flex;flex-direction:column;align-items:center;gap:3px;font-size:12px;color:var(--text-mute);pointer-events:none;}
  .dv-drop-in svg{width:18px;height:18px;color:var(--text-dim);margin-bottom:2px;}
  .dv-drop-in b{color:var(--brand-blue);font-weight:600;}
  .dv-drop-sub{font-size:11px;color:var(--text-dim);}
  /* Staged file chips (composer) */
  .dv-nf-files{display:flex;flex-wrap:wrap;gap:7px;margin-top:10px;}
  .dv-file-chip{display:inline-flex;align-items:center;gap:6px;max-width:100%;padding:5px 10px;border:1px solid var(--line);border-radius:10px;background:var(--surface);font-size:12px;color:var(--text-mute);}
  .dv-file-chip .n{max-width:170px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);}
  .dv-file-chip .s{color:var(--text-dim);}
  .dv-file-chip .x{cursor:pointer;color:var(--text-dim);font-weight:700;margin-left:2px;}
  .dv-file-chip .x:hover{color:var(--err);}

  /* Attachment list (fix detail) */
  .dv-attach-list{display:flex;flex-direction:column;gap:7px;}
  .dv-attach2{display:flex;align-items:center;gap:9px;padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);cursor:pointer;transition:background .12s,border-color .12s;}
  .dv-attach2:hover{background:var(--surface-2);border-color:var(--line-2);}
  .dv-attach2 .dv-attach2-meta{display:flex;flex-direction:column;min-width:0;flex:1;}
  .dv-attach2 .dv-attach2-meta .n{font-size:12px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .dv-attach2 .dv-attach2-meta .s{font-size:11px;color:var(--text-dim);}
  .dv-attach2 svg{width:14px;height:14px;color:var(--text-dim);flex-shrink:0;}
  .dv-attach2 .ax{margin-left:2px;color:var(--text-dim);cursor:pointer;display:inline-flex;flex-shrink:0;}
  .dv-attach2 .ax:hover{color:var(--err);}
  .dv-attach2.legacy{cursor:default;opacity:.78;}
  .dv-attach2.legacy:hover{background:var(--surface);border-color:var(--line);}

  /* Fix-detail hero header (replaces plain modal head) */
  .dv-fix-hero{display:flex;align-items:flex-start;gap:16px;padding:20px 22px;border-bottom:1px solid var(--line);border-radius:8px 8px 0 0;background:linear-gradient(120deg,rgba(var(--bc-accent-rgb),.10),rgba(var(--bc-purple-rgb),.06));}
  .dv-fix-hero.bug{background:linear-gradient(120deg,rgba(220,38,38,.11),rgba(220,38,38,.03));}
  .dv-fix-hero.design{background:linear-gradient(120deg,rgba(var(--bc-purple-rgb),.12),rgba(var(--bc-purple-rgb),.04));}
  .dv-fix-hero.feature{background:linear-gradient(120deg,rgba(var(--bc-accent-rgb),.12),rgba(var(--bc-accent-rgb),.04));}
  .dv-fix-hero.chore{background:linear-gradient(120deg,rgba(100,116,139,.12),rgba(100,116,139,.04));}
  .dv-fix-hero-ico{width:46px;height:46px;border-radius:7px;background:var(--grad);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 6px 16px rgba(var(--bc-accent-rgb),.26);}
  .dv-fix-hero.bug .dv-fix-hero-ico{background:linear-gradient(135deg,#ef4444,#b91c1c);box-shadow:0 6px 16px rgba(220,38,38,.26);}
  .dv-fix-hero.chore .dv-fix-hero-ico{background:linear-gradient(135deg,#94a3b8,#64748b);box-shadow:0 6px 16px rgba(100,116,139,.22);}
  .dv-fix-hero-ico svg{width:23px;height:23px;}
  .dv-fix-hero-main{flex:1;min-width:0;}
  .dv-fix-hero-id{font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--text-mute);text-transform:uppercase;}
  .dv-fix-hero-id .tk{color:var(--brand-blue);}
  .dv-fix-hero-title{font-family:var(--font-display);font-size:16px;font-weight:600;letter-spacing:-.012em;margin:3px 0 9px;color:var(--text);line-height:1.25;}
  .dv-fix-hero-title.editable{border-radius:5px;padding:2px 6px;margin:1px -6px 7px;outline:none;cursor:text;transition:background .12s,box-shadow .12s;}
  .dv-fix-hero-title.editable:hover{background:color-mix(in srgb,var(--surface) 70%,transparent);box-shadow:inset 0 0 0 1px var(--line-2);}
  .dv-fix-hero-title.editable:focus{background:var(--surface);box-shadow:inset 0 0 0 1px var(--brand-blue),0 0 0 3px var(--accent-glow);}
  .dv-fix-hero-title.editable:empty::before{content:attr(data-ph);color:var(--text-dim);}
  .dv-fix-hero-pills{display:flex;flex-wrap:wrap;align-items:center;gap:7px;}
  .dv-hp{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:5px;background:var(--surface);border:1px solid var(--line);color:var(--text-mute);}
  .dv-hp.kind.bug{background:rgba(220,38,38,.11);color:var(--err);border-color:transparent;}
  .dv-hp.kind.design{background:rgba(var(--bc-purple-rgb),.12);color:var(--info);border-color:transparent;}
  .dv-hp.kind.feature{background:var(--accent-glow);color:var(--brand-blue);border-color:transparent;}
  .dv-hp.kind.chore{background:var(--surface-3);color:var(--text-mute);border-color:transparent;}
  .dv-hp.prio{font-weight:600;}
  .dv-hp.prio.p1{background:rgba(220,38,38,.11);color:var(--err);border-color:transparent;}
  .dv-hp.prio.p2{background:rgba(217,119,6,.13);color:var(--warn);border-color:transparent;}
  .dv-hp.prio.p3{background:var(--surface-3);color:var(--text-mute);border-color:transparent;}
  .dv-hp.due svg{width:12px;height:12px;}
  .dv-hp.due.overdue{background:rgba(220,38,38,.11);color:var(--err);border-color:transparent;}
  .dv-hp.due.today{background:rgba(217,119,6,.13);color:var(--warn);border-color:transparent;}
  .dv-hp.who .dv-av.sm{width:17px;height:17px;font-size:10px;}
  .dv-av.sm{width:17px;height:17px;font-size:10px;}
  .dv-fix-hero-actions{display:flex;align-items:center;gap:4px;flex-shrink:0;}
  .dv-fix-hero-actions .close{background:transparent;border:0;color:var(--text-mute);cursor:pointer;width:32px;height:32px;border-radius:5px;display:flex;align-items:center;justify-content:center;}
  .dv-fix-hero-actions .close:hover{background:var(--surface);color:var(--text);}

  /* Kebab actions menu */
  .dv-menu-wrap{position:relative;}
  .dv-kebab{background:transparent;border:0;color:var(--text-mute);cursor:pointer;width:32px;height:32px;border-radius:5px;font-size:18px;line-height:1;display:flex;align-items:center;justify-content:center;}
  .dv-kebab:hover{background:var(--surface);color:var(--text);}
  .dv-menu{position:absolute;top:36px;right:0;min-width:190px;background:var(--surface);border:1px solid var(--line);border-radius:6px;box-shadow:0 16px 38px -12px rgba(15,23,42,.28),0 4px 12px -6px rgba(15,23,42,.16);padding:6px;z-index:30;display:none;flex-direction:column;gap:1px;}
  .dv-menu.open{display:flex;animation:dvMenuIn .14s ease both;}
  @keyframes dvMenuIn{from{opacity:0;transform:translateY(-4px);}to{opacity:1;transform:none;}}
  .dv-menu button{display:flex;align-items:center;gap:8px;width:100%;text-align:left;padding:8px 10px;background:transparent;border:0;border-radius:5px;font-size:13px;font-weight:500;font-family:inherit;color:var(--text);cursor:pointer;}
  .dv-menu button:hover{background:var(--surface-2);}
  .dv-menu button svg{width:14px;height:14px;color:var(--text-dim);}
  .dv-menu button.danger{color:var(--err);}
  .dv-menu button.danger:hover{background:rgba(220,38,38,.08);}
  .dv-menu button.danger svg{color:var(--err);}
  .dv-menu-sep{height:1px;background:var(--line);margin:5px 2px;}
  @media (max-width:680px){ .dv-fix-hero{flex-wrap:wrap;} .dv-fix-hero-title{font-size:16px;} }

  /* ============================================================
     Dev-post detail v2 — nicer layout, image gallery, unified
     activity stream, drop-anywhere attach, status-forward sidebar.
     ============================================================ */
  .btn.xs{padding:4px 9px;font-size:11px;border-radius:5px;}
  .btn.xs svg{width:12px;height:12px;}
  .btn.ok{background:var(--ok,#16A34A);border-color:transparent;color:#fff;}
  .btn.ok:hover{filter:brightness(1.05);}
  .dv-av.me{background:var(--grad);}

  /* Body is a drop target; overlay appears only while dragging files over it. */
  .dv-fix-body{position:relative;}
  .dv-bodydrop{position:absolute;inset:10px;border:2px dashed var(--brand-blue);border-radius:8px;
    background:var(--accent-glow);backdrop-filter:saturate(1.2);z-index:30;display:none;
    align-items:center;justify-content:center;pointer-events:none;}
  .dv-fix-body.dropping .dv-bodydrop{display:flex;}
  .dv-bodydrop-in{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--brand-blue);font-weight:600;font-size:13px;}
  .dv-bodydrop-in svg{width:30px;height:30px;}

  /* Attachments: image gallery + file rows + dropzone */
  .dv-attach-wrap{display:flex;flex-direction:column;gap:12px;}
  .dv-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(116px,1fr));gap:10px;}
  .dv-thumb{position:relative;border:1px solid var(--line);border-radius:6px;overflow:hidden;background:var(--surface-2);cursor:pointer;transition:border-color .12s,transform .12s,box-shadow .12s;}
  .dv-thumb:hover{border-color:var(--brand-blue);transform:translateY(-2px);box-shadow:0 8px 20px rgba(15,23,42,.14);}
  .dv-thumb.legacy{cursor:default;opacity:.7;}
  .dv-thumb-img{display:block;width:100%;height:92px;background-size:cover;background-position:center;background-repeat:no-repeat;background-color:var(--surface-2);position:relative;}
  .dv-thumb-img:not(.ready)::after{content:"";position:absolute;inset:0;background:
     linear-gradient(100deg,var(--surface-2) 30%,var(--surface) 50%,var(--surface-2) 70%);
     background-size:200% 100%;animation:dvShimmer 1.1s linear infinite;}
  .dv-thumb-img.failed::after{content:"image";animation:none;display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:11px;}
  .dv-thumb-img.legacy{background-color:var(--surface-2);background-image:repeating-linear-gradient(45deg,transparent,transparent 7px,color-mix(in srgb,var(--line-2) 40%,transparent) 7px,color-mix(in srgb,var(--line-2) 40%,transparent) 8px);}
  .dv-thumb-img.legacy::after{display:none !important;animation:none !important;content:none !important;}
  .dv-thumb-legacy{position:absolute;top:0;left:0;right:0;height:92px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;color:var(--text-mute);font-size:11px;font-weight:600;text-align:center;padding:6px;pointer-events:none;}
  .dv-thumb-legacy svg{width:18px;height:18px;opacity:.7;}
  @keyframes dvShimmer{0%{background-position:200% 0;}100%{background-position:-200% 0;}}
  .dv-thumb-cap{display:block;font-size:11px;color:var(--text-mute);padding:5px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-top:1px solid var(--line);}
  .dv-thumb-x{position:absolute;top:5px;right:5px;width:24px;height:24px;border-radius:5px;background:rgba(15,23,42,.62);color:#fff;display:none;align-items:center;justify-content:center;}
  .dv-thumb-x svg{width:13px;height:13px;color:#fff;}
  .dv-thumb:hover .dv-thumb-x{display:flex;}
  .dv-attach-empty{font-size:12px;color:var(--text-dim);}

  /* Unified activity stream */
  .dv-activity{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;}
  .dv-activity-empty{font-size:12px;color:var(--text-dim);margin-bottom:10px;}
  .dv-evt{display:flex;gap:10px;align-items:flex-start;padding:3px 0 3px 5px;}
  .dv-evt-dot{width:7px;height:7px;border-radius:50%;background:var(--line-2);margin-top:6px;flex-shrink:0;box-shadow:0 0 0 3px var(--surface-2);}
  .dv-evt-body{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;font-size:12px;color:var(--text-mute);}
  .dv-evt-text{color:var(--text-mute);}
  .dv-evt-when{font-size:11px;color:var(--text-dim);}

  /* Comment composer */
  .dv-cmt-compose{display:flex;gap:10px;align-items:flex-start;margin-top:4px;}
  .dv-cmt-compose-in{flex:1;border:1px solid var(--line);border-radius:6px;background:var(--surface);padding:8px 10px;transition:border-color .12s,box-shadow .12s;position:relative;}
  .dv-cmt-compose-in:focus-within{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .dv-cmt-compose-in.dropping{border-color:var(--brand-blue);border-style:dashed;box-shadow:0 0 0 3px var(--accent-glow);}
  .dv-cmt-dzhint{display:none;position:absolute;inset:0;z-index:3;align-items:center;justify-content:center;gap:8px;border-radius:6px;background:color-mix(in srgb,var(--surface) 88%,transparent);font-size:13px;font-weight:600;color:var(--brand-blue);pointer-events:none;}
  .dv-cmt-dzhint svg{width:18px;height:18px;}
  .dv-cmt-compose-in.dropping .dv-cmt-dzhint{display:flex;}
  .dv-cmt-compose-in textarea{width:100%;border:0;background:transparent;resize:none;color:var(--text);font-family:inherit;font-size:13px;line-height:1.5;outline:none;max-height:200px;overflow-y:auto;}
  .dv-cmt-compose-actions{display:flex;justify-content:flex-end;gap:7px;margin-top:6px;}

  /* Status-forward sidebar card */
  .dv-status-card{border:1px solid var(--line);border-left:4px solid var(--text-mute);border-radius:6px;background:var(--surface-2);padding:12px 13px;margin-bottom:15px;}
  .dv-status-card .lbl{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;margin-bottom:8px;}
  .dv-status-card.col-backlog{border-left-color:#94A3B8;}
  .dv-status-card.col-progress{border-left-color:var(--bc-blue-v1);}
  .dv-status-card.col-review{border-left-color:#D97706;}
  .dv-status-card.col-completed{border-left-color:#16A34A;}
  .dv-status-card.col-rejected{border-left-color:#64748B;}
  .dv-status-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;background:var(--text-mute);}
  .dv-status-card.col-backlog .dv-status-dot{background:#94A3B8;}
  .dv-status-card.col-progress .dv-status-dot{background:var(--bc-blue-v1);}
  .dv-status-card.col-review .dv-status-dot{background:#D97706;}
  .dv-status-card.col-completed .dv-status-dot{background:#16A34A;}
  .dv-status-card.col-rejected .dv-status-dot{background:#64748B;}
  .dv-status-pick{display:flex;align-items:center;gap:8px;}
  .dv-status-pick select{flex:1;padding:8px 10px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);font-size:13px;font-family:inherit;}
  .dv-status-now{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--text);}
  .dv-status-quick{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px;}

/* ============================================================
   v1.4.10.50 — Dev Team board overhaul + Archive + Asset Monitor
   ============================================================ */

/* ---- Board toolbar: view toggle + priority pulse ---- */
.dv-vseg{display:inline-flex;background:var(--bg-2);border:1px solid var(--line);border-radius:6px;padding:2px;gap:2px;}
.dv-vseg button{display:inline-flex;align-items:center;gap:6px;border:0;background:transparent;color:var(--text-mute);font:inherit;font-size:12px;font-weight:600;padding:4px 11px;border-radius:5px;cursor:pointer;}   /* v1.4.10.473: the switch is 32px, as the toolbar's fields and buttons (was 36) */
.dv-vseg button.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);}
.dv-vseg button .ico svg,.dv-vseg button svg{width:13px;height:13px;}
.dv-pulse{display:inline-flex;align-items:center;gap:6px;margin-left:2px;}
.dv-pchip{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--line);background:var(--bg-2);border-radius:999px;padding:3px 9px;font:inherit;font-size:12px;font-weight:500;cursor:pointer;color:var(--text-mute);}
.dv-pchip b{font-size:12px;}
.dv-pchip.p1{color:#DC2626;border-color:#DC262644;}
.dv-pchip.p2{color:#D97706;border-color:#D9770644;}
.dv-pchip.p3{color:var(--bc-blue-v1);border-color:#2563EB33;}
.dv-pchip.on{background:currentColor;}
.dv-pchip.on b,.dv-pchip.on{color:#fff;}
.dv-pchip.p1.on{background:#DC2626;border-color:#DC2626;}
.dv-pchip.p2.on{background:#D97706;border-color:#D97706;}
.dv-pchip.p3.on{background:var(--bc-blue-v1);border-color:var(--bc-blue-v1);}
.dv-pulse-open{font-size:11px;color:var(--text-dim);margin-left:2px;white-space:nowrap;}

/* ---- Columns: tools, quick add, collapse, tall-column scroll ---- */
.dv-col-head{position:relative;}
.dv-col-tools{display:none;align-items:center;gap:3px;margin-left:4px;}
.dv-col:hover .dv-col-tools{display:inline-flex;}
.dv-col-add{border:0;background:var(--surface-3);color:var(--text-mute);width:20px;height:20px;border-radius:6px;cursor:pointer;font-size:12px;line-height:1;display:inline-flex;align-items:center;justify-content:center;padding:0;}
.dv-col-add:hover{background:var(--brand-blue);color:#fff;}
.dv-col-add svg{width:11px;height:11px;}
.dv-col-scroll{display:flex;flex-direction:column;min-height:40px;max-height:calc(100dvh - 340px);overflow-y:auto;padding-right:6px;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:var(--line-2) transparent;}
.dv-col-scroll::-webkit-scrollbar{width:7px;}
.dv-col-scroll::-webkit-scrollbar-track{background:transparent;}
.dv-col-scroll::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:4px;}
.dv-col-scroll::-webkit-scrollbar-thumb:hover{background:var(--text-mute);}
.dv-col-scroll .dv-card{margin-bottom:9px;}
.dv-col-scroll .dv-card:last-child{margin-bottom:2px;}
.dv-quick{margin:0 2px 9px;}
.dv-quick input{width:100%;padding:9px 11px;background:var(--surface);border:1px solid var(--brand-blue);border-radius:6px;color:var(--text);font:inherit;font-size:13px;box-shadow:0 0 0 3px color-mix(in srgb, var(--brand-blue) 14%, transparent);}
.dv-quick-hint{font-size:12px;color:var(--text-dim);margin-top:4px;padding-left:2px;}
.dv-col.collapsed{flex:0 0 40px;min-width:40px;max-width:40px;display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 4px;cursor:pointer;min-height:180px;}
.dv-col.collapsed:hover{border-color:var(--line-2);}
.dv-col.collapsed .dv-col-vlabel{writing-mode:vertical-rl;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.dv-col.collapsed .dv-cnt{font-size:10px;background:var(--surface-3);color:var(--text-mute);border-radius:6px;padding:1px 6px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;}
.dv-board{grid-template-columns:none;display:flex;gap:14px;}
.dv-board .dv-col:not(.collapsed){flex:1;min-width:0;}
.dv-move .arc{margin-left:auto;}
.dv-move .arc svg{width:11px;height:11px;}

/* ---- List view + Archive table ---- */
.dv-list{width:100%;}
.dv-list th{user-select:none;white-space:nowrap;}
.dv-th{cursor:pointer;}
.dv-th:hover{color:var(--text);}
.dv-th.on{color:var(--brand-blue);}
.dv-lrow{cursor:pointer;}
.dv-lrow:hover td{background:var(--bg-2);}
.dv-lrow.overdue .dv-lid{color:var(--err);}
.dv-lid{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;color:var(--text-mute);white-space:nowrap;}
.dv-ltitle{font-size:13px;font-weight:600;color:var(--text);}
.dv-arch-banner{display:flex;align-items:center;gap:9px;background:color-mix(in srgb, var(--brand-blue) 9%, transparent);border:1px solid color-mix(in srgb, var(--brand-blue) 30%, transparent);color:var(--text);border-radius:6px;padding:9px 13px;font-size:12px;margin-bottom:12px;}
.dv-arch-banner svg{width:14px;height:14px;color:var(--brand-blue);flex-shrink:0;}

/* ---- New dev composer: numbered sections + header ---- */
.dv-nf-head h3{display:flex;align-items:center;gap:9px;flex-wrap:wrap;}
.dv-nf-headsub{font-size:12px;font-weight:500;color:var(--text-dim);letter-spacing:0;}
.dv-nf-sec{display:flex;align-items:center;gap:10px;margin:2px 0 12px;}
.dv-nf-sec.side{margin-bottom:10px;}
.dv-nf-main .dv-nf-sec:not(:first-child){margin-top:20px;padding-top:16px;border-top:1px solid var(--line);}
.dv-nf-secn{width:22px;height:22px;border-radius:50%;background:var(--brand-blue);color:#fff;font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}
.dv-nf-sect{font-size:13px;font-weight:600;color:var(--text);display:flex;flex-direction:column;line-height:1.25;}
.dv-nf-sect span{font-size:11px;font-weight:500;color:var(--text-dim);}
.dv-nf-actions{display:flex;align-items:center;gap:8px;}
.dv-nf-actions .grow{flex:1;}

/* ---- Asset Monitor tab ---- */
.am-banner{display:flex;align-items:center;gap:13px;background:var(--bg-2);border:1px solid var(--line);border-radius:7px;padding:13px 15px;margin-bottom:14px;flex-wrap:wrap;}
.am-banner.ok{border-color:color-mix(in srgb, var(--ok) 35%, var(--line));}
.am-banner.warn{border-color:color-mix(in srgb, #D97706 40%, var(--line));}
.am-banner-ico{width:36px;height:36px;border-radius:6px;background:var(--surface-3);display:flex;align-items:center;justify-content:center;color:var(--text-mute);flex-shrink:0;}
.am-banner.ok .am-banner-ico{background:color-mix(in srgb, var(--ok) 14%, transparent);color:var(--ok);}
.am-banner.warn .am-banner-ico{background:#D9770622;color:#D97706;}
.am-banner-main{flex:1;min-width:220px;}
.am-banner-t{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.am-banner-s{font-size:12px;color:var(--text-mute);margin-top:2px;line-height:1.45;}
.am-ranges{display:inline-flex;align-items:center;gap:3px;background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:3px;}
.am-ranges button{border:0;background:transparent;color:var(--text-mute);font:inherit;font-size:12px;font-weight:600;padding:5px 9px;border-radius:6px;cursor:pointer;}
.am-ranges button.on{background:var(--brand-blue);color:#fff;}
.am-ranges .am-refresh{font-size:12px;}
.am-ranges .am-refresh svg{width:12px;height:12px;}
.am-panel{margin-bottom:14px;}
.am-ph{padding:13px 16px;display:flex;align-items:center;gap:10px;}
.am-ph h3{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
.am-ph-sub{font-size:12px;color:var(--text-dim);margin-left:auto;}
.am-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-bottom:14px;}
.am-kpi{background:var(--bg-2);border:1px solid var(--line);border-radius:6px;padding:11px 13px;}
.am-kpi .k{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;}
.am-kpi .v{font-size:20px;font-weight:600;letter-spacing:-.02em;color:var(--text);margin-top:3px;font-variant-numeric:tabular-nums;}
.am-kpi.ok .v{color:var(--ok);}
.am-kpi.warn .v{color:#D97706;}
.am-kpi.err .v{color:var(--err);}
.am-sect-lbl{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin:13px 0 6px;}
.am-sect-lbl:first-child{margin-top:0;}
.am-chart{width:100%;height:150px;display:block;background:var(--bg-2);border:1px solid var(--line);border-radius:6px;}
.am-strip{width:100%;height:30px;display:block;border-radius:6px;overflow:hidden;border:1px solid var(--line);}
.am-grid{stroke:var(--line);stroke-width:1;stroke-dasharray:3 4;}
.am-ylab{fill:var(--text-dim);font-size:11px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.am-xlab{fill:var(--text-dim);font-size:11px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.am-dot{fill:transparent;}
.am-dot:hover{fill:var(--brand-blue);}
/* v1.4.10.445: amChart is now an .ins-area (plot-only SVG, HTML axes, an un-stretched dot overlay) */
.am-area .am-chart{height:var(--ia-h,128px);}
.am-area .ins-area-y span,.am-area .ins-area-x span,.am-area .ins-area-yw{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.am-area .ins-area-x span{top:6px;}
.am-area svg.am-dots{position:absolute;left:0;top:0;width:100%;height:100%;overflow:visible;pointer-events:none;}
.am-area .am-dots .am-dot{pointer-events:all;}
.am-seg.up{fill:var(--ok);}
.am-seg.part{fill:#D97706;}
.am-seg.down{fill:var(--err);}
/* v1.4.10.474: a stretch of a monitoring trend with no data (no row within the series' heartbeat): neither up nor down */
.am-seg.nodata{fill:var(--text-mute);opacity:.22;}
.am-nodata,.amp-nodata{fill:var(--text-mute);opacity:.10;}
.am-kpi .am-kpi-s{font-size:11px;color:var(--text-mute);margin-top:2px;}
.am-chart-empty{background:var(--bg-2);border:1px dashed var(--line);border-radius:6px;padding:16px;text-align:center;font-size:12px;color:var(--text-dim);}
/* ── Health checks on the Monitoring tab, v1.4.10.530 (Jay: "make the health check in the asset system look much much
   nicer"): the availability as a ring with a verdict and six tiles, the check results as a card with a clock and a
   legend, the response time and packet loss as cards with their figures beside the graph (amHealthChecksHtml) ── */
.hc-hero{display:flex;align-items:center;gap:22px;padding:2px 0 16px;border-bottom:1px solid var(--line);margin-bottom:14px;}
.hc-ring{position:relative;flex:0 0 auto;width:108px;height:108px;}
.hc-ring svg{width:108px;height:108px;transform:rotate(-90deg);display:block;}
.hc-ring .tr{fill:none;stroke:var(--surface-3,var(--line));stroke-width:9;}
.hc-ring .ar{fill:none;stroke:var(--hc-c);stroke-width:9;stroke-linecap:round;}
.hc-ring-v{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;}
.hc-ring-v b{font-family:var(--font-display);font-size:24px;font-weight:600;letter-spacing:-.03em;line-height:1;color:var(--hc-c);font-variant-numeric:tabular-nums;}
.hc-ring-v span{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-top:3px;}
.hc-text{flex:1 1 auto;min-width:0;}
.hc-vt{font-family:var(--font-display);font-size:18px;font-weight:600;letter-spacing:-.02em;line-height:1.2;display:flex;align-items:center;flex-wrap:wrap;gap:6px 10px;}
.hc-vs{font-size:13px;color:var(--text-mute);line-height:1.55;margin-top:5px;max-width:640px;}
.hc-vs b{color:var(--text);font-weight:600;}
.hc-text>.device-meta{margin-top:3px;}
.hc-tiles{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;margin-top:12px;}
.hc-tile{background:var(--surface-2);border:1px solid var(--line);border-radius:10px;padding:9px 11px;min-width:0;}
.hc-tile b{display:block;font-family:var(--font-display);font-size:18px;font-weight:600;letter-spacing:-.02em;line-height:1;font-variant-numeric:tabular-nums;}
.hc-tile b small{font-size:11px;font-weight:600;color:var(--text-mute);letter-spacing:0;margin-left:2px;}
.hc-tile span{display:block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-top:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.hc-tile.ok b{color:var(--ok);} .hc-tile.warn b{color:#D97706;} .hc-tile.err b{color:var(--err);}
.hc-card{border:1px solid var(--line);border-radius:12px;background:var(--surface);padding:12px 14px;min-width:0;}
.hc-card-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:8px;}
.hc-card-h h4{margin:0;font-size:13px;font-weight:600;letter-spacing:-.01em;}
.hc-card-h .device-meta{font-size:12px;}
.hc-chips{display:flex;gap:6px;flex-wrap:wrap;margin-left:auto;}
.hc-chip{display:inline-flex;align-items:baseline;gap:4px;background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:3px 9px;font-size:11px;color:var(--text-mute);font-variant-numeric:tabular-nums;white-space:nowrap;}
.hc-chip b{color:var(--text);font-weight:600;font-size:12px;}
.hc-card .am-chart,.hc-card .am-strip{background:var(--bg-2);}
.hc-legend{display:flex;gap:12px;flex-wrap:wrap;font-size:11px;color:var(--text-mute);margin-top:6px;}
.hc-legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:-1px;}
.hc-legend .up{background:var(--ok);} .hc-legend .part{background:#D97706;} .hc-legend .down{background:var(--err);} .hc-legend .nodata{background:var(--text-mute);opacity:.3;}
.hc-strip-x{position:relative;height:16px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;color:var(--text-dim);margin-top:4px;}
.hc-strip-x span{position:absolute;top:0;white-space:nowrap;}
.hc-charts{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:12px;margin-top:12px;}
@media (max-width:760px){
  .hc-hero{flex-direction:column;align-items:stretch;gap:12px;}
  .hc-ring{margin:0 auto;}
  .hc-text{text-align:center;}
  .hc-vt{justify-content:center;}
  .hc-vs{margin-left:auto;margin-right:auto;}
  .hc-tiles{grid-template-columns:repeat(3,minmax(0,1fr));text-align:left;}
  .hc-chips{margin-left:0;}
  .hc-charts{grid-template-columns:1fr;}
}

/* v1.4.10.150 — SSO monitoring pane */
.am-sso-detail{margin:4px 0 12px;padding:10px 13px;border-radius:6px;font-size:12px;line-height:1.5;border:1px solid var(--line);background:var(--surface-2,rgba(148,163,184,.06));}
.am-sso-detail.err{border-color:rgba(220,38,38,.35);background:rgba(220,38,38,.07);}
.am-sso-detail.warn{border-color:rgba(217,119,6,.35);background:rgba(217,119,6,.07);}
.am-sso-detail.ok{border-color:rgba(22,163,74,.3);background:rgba(22,163,74,.06);}
.am-sso-pol{display:flex;gap:9px;align-items:flex-start;margin:2px 0 10px;font-size:12px;line-height:1.5;color:var(--text-mute);}
.am-sso-pol svg{width:15px;height:15px;flex-shrink:0;margin-top:2px;color:var(--brand-blue,var(--bc-blue-v1));}
.am-prob-s a{color:var(--brand-blue,var(--bc-blue-v1));text-decoration:none;}
.am-prob{display:flex;align-items:flex-start;gap:9px;padding:8px 0;border-bottom:1px solid var(--line);}
.am-prob:last-child{border-bottom:0;}
.am-prob .dot{margin-top:5px;flex-shrink:0;}
.am-prob-main{flex:1;min-width:0;}
.am-prob-t{font-size:13px;font-weight:600;color:var(--text);}
.am-prob-s{font-size:12px;color:var(--text-dim);margin-top:1px;text-transform:capitalize;}
.am-group{margin-bottom:6px;}
.am-group-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);padding:10px 2px 6px;display:flex;align-items:center;gap:7px;}
.am-group-n{font-size:10px;background:var(--surface-3);color:var(--text-mute);border-radius:6px;padding:1px 7px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;}   /* v1.4.10.473: count badge, 10/700 uppercase .04em (was untracked) */
.am-item{border:1px solid var(--line);border-radius:6px;margin-bottom:6px;background:var(--surface);overflow:hidden;}
.am-item.open{border-color:var(--line-2);}
.am-item.bad{opacity:.75;}
.am-item-row{display:flex;align-items:center;gap:10px;width:100%;border:0;background:transparent;padding:9px 12px;cursor:pointer;font:inherit;text-align:left;color:var(--text);}
.am-item-row:disabled{cursor:default;}
.am-item-row:not(:disabled):hover{background:var(--bg-2);}
.am-item-n{flex:1;min-width:0;font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.am-item-v{font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--text);}
.am-item-t{font-size:11px;color:var(--text-dim);white-space:nowrap;min-width:56px;text-align:right;}
.am-item-x{width:18px;height:18px;border-radius:5px;background:var(--surface-3);color:var(--text-mute);font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}
.am-item-chart{padding:0 12px 12px;}
@media (max-width:900px){
  .am-banner{flex-direction:column;align-items:flex-start;}
  /* v1.4.10.473: the range picker spans the banner and its seven buttons share it - at 390 their 40px floors made it 338px
     in a 296px banner, and the banner text widened with it (28px out of the card) */
  .am-banner .am-ranges{display:flex;align-self:stretch;gap:0;}
  .am-banner .am-ranges button{flex:1 1 0;min-width:0;padding-left:0;padding-right:0;}
  .am-item-t{display:none;}
}

  /* ============ ASSETS: MAKES & MODELS / SITE ASSETS / REPORTS / QUICK ADD ============ */
  .seg{flex-wrap:wrap;}
  .mm-figs{display:flex;gap:18px;flex-wrap:wrap;font-size:12px;color:var(--text-mute);}
  /* v1.4.10.473: the strip's counts are stat figures, the small-KPI look 20/600 (was 15/700, no such look) — the same as
     the Validation tab's count strip */
  .mm-figs b{color:var(--text);font-size:20px;font-weight:600;letter-spacing:-.02em;margin-right:4px;}
  .mm-wrap{display:flex;flex-direction:column;gap:16px;}
  .mm-manu{background:var(--surface,#fff);border:1px solid var(--line);border-radius:7px;overflow:hidden;}
  .mm-mhead{display:flex;align-items:center;gap:12px;padding:13px 16px;background:var(--navy-2);border-bottom:1px solid var(--line);}
  .mm-mico{width:34px;height:34px;border-radius:6px;background:var(--accent-glow,rgba(var(--bc-accent-rgb),.12));color:var(--accent);display:flex;align-items:center;justify-content:center;flex:none;overflow:hidden;}
  .mm-mico.has{background:#fff;border:1px solid var(--line);}
  .mm-mico.has img{width:100%;height:100%;object-fit:contain;padding:3px;box-sizing:border-box;display:block;}
  .mm-mthumb{width:36px;height:27px;border-radius:6px;background:var(--surface-2);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;color:var(--text-dim);flex:none;overflow:hidden;}
  .mm-mthumb svg{width:14px;height:14px;opacity:.45;}
  .mm-mthumb.has{background:#fff;}
  .mm-mthumb.has img{width:100%;height:100%;object-fit:contain;padding:2px;box-sizing:border-box;display:block;}
  .mm-mtitle b{font-size:15px;font-weight:600;letter-spacing:-.012em;display:block;}
  .mm-mtitle span{font-size:12px;color:var(--text-mute);}
  .mm-model{border-bottom:1px solid var(--line);}
  .mm-model:last-child{border-bottom:0;}
  .mm-mrow{display:flex;align-items:center;gap:12px;width:100%;background:transparent;border:0;padding:11px 16px;cursor:pointer;font-family:inherit;font-size:13px;color:var(--text);text-align:left;transition:background .12s;}
  .mm-mrow:hover{background:var(--navy-2);}
  .mm-model.open .mm-mrow{background:var(--navy-2);}
  .mm-mchev{width:14px;color:var(--text-dim);flex:none;font-size:11px;}
  .mm-mname{flex:1;min-width:0;display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;}
  .mm-msub{font-size:12px;color:var(--text-mute);}   /* v1.4.10.473: meta 12/400 like .mm-mmeta in the same row (was 11) */
  .mm-mflags{display:flex;gap:5px;flex-wrap:wrap;}
  .mm-mmeta{font-size:12px;color:var(--text-mute);white-space:nowrap;}
  .mm-mval{font-size:12px;font-weight:600;min-width:78px;text-align:right;white-space:nowrap;}
  /* v1.4.10.473: badge look, 10/700 uppercase .04em (was untracked) */
  .mm-mcount{min-width:34px;text-align:center;background:var(--surface-3);border-radius:7px;padding:2px 9px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;}
  .mm-assets{padding:4px 16px 12px 42px;}
  .mm-arow{display:flex;align-items:center;gap:11px;padding:7px 10px;border-radius:6px;cursor:pointer;font-size:12px;transition:background .12s;}
  .mm-arow:hover{background:var(--navy-2);}
  .mm-aser{color:var(--text-mute);min-width:110px;font-size:12px;}
  .mm-aloc{flex:1;min-width:0;color:var(--text-mute);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mm-aval{min-width:70px;text-align:right;font-weight:500;font-size:12px;}
  .mm-adetail-foot{display:flex;gap:8px;padding:8px 10px 2px;}

  .sv-floor{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;margin:20px 2px 10px;color:var(--text);}
  .sv-floor:first-child{margin-top:0;}
  .sv-floor span{font-size:11px;color:var(--text-mute);font-weight:400;}
  .sv-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:14px;align-items:start;}
  .sv-room{background:var(--surface,#fff);border:1px solid var(--line);border-radius:7px;overflow:hidden;display:flex;flex-direction:column;}
  .sv-room.sv-unplaced{border-style:dashed;}
  .sv-rhead{display:flex;align-items:center;gap:10px;padding:12px 14px;border-bottom:1px solid var(--line);background:var(--navy-2);}
  .sv-rico{width:30px;height:30px;border-radius:6px;background:var(--accent-glow,rgba(var(--bc-accent-rgb),.12));color:var(--accent);display:flex;align-items:center;justify-content:center;flex:none;}
  .sv-rtitle{flex:1;min-width:0;}
  .sv-rtitle b{font-size:13px;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .sv-rtitle span{font-size:11px;color:var(--text-mute);}
  .sv-rmeta{display:flex;align-items:center;gap:8px;flex:none;}
  .sv-rval{font-size:12px;color:var(--text-mute);}
  .sv-rcount{min-width:30px;text-align:center;background:var(--surface-3);border-radius:7px;padding:2px 8px;font-size:10px;font-weight:700;}
  .sv-rbody{padding:6px 8px;}
  .sv-arow{display:flex;align-items:center;gap:9px;padding:7px 8px;border-radius:6px;cursor:pointer;font-size:12px;transition:background .12s;}
  .sv-arow:hover{background:var(--navy-2);}
  .sv-aname{flex:1;min-width:0;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .sv-aser{color:var(--text-mute);font-size:11px;max-width:110px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .sv-rempty{padding:16px 14px;font-size:12px;color:var(--text-dim);}
  .sv-rfoot{padding:8px 12px 11px;border-top:1px dashed var(--line);}

  .rpt-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(310px,1fr));gap:14px;}
  .rpt-card{background:var(--surface,#fff);border:1px solid var(--line);border-radius:7px;padding:18px;display:flex;flex-direction:column;gap:10px;transition:box-shadow .15s,border-color .15s;}
  .rpt-card:hover{border-color:var(--accent);box-shadow:0 4px 18px rgba(var(--bc-accent-rgb),.08);}
  .rpt-ico{width:38px;height:38px;border-radius:6px;background:var(--accent-glow,rgba(var(--bc-accent-rgb),.12));color:var(--accent);display:flex;align-items:center;justify-content:center;}
  .rpt-title{font-size:15px;font-weight:600;letter-spacing:-.012em;}
  .rpt-blurb{font-size:12px;color:var(--text-mute);line-height:1.55;flex:1;}
  .rpt-actions{display:flex;gap:8px;flex-wrap:wrap;}
  .rpt-colgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:8px 14px;}

  .form-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px 16px;}
  .form-grid .fld{margin:0;}
  @media(max-width:560px){ .form-grid{grid-template-columns:1fr;} }
  .qa-drop{position:absolute;top:100%;left:0;right:0;z-index:40;background:var(--surface,#fff);border:1px solid var(--line);border-radius:6px;box-shadow:0 10px 30px rgba(15,23,42,.14);max-height:280px;overflow:auto;margin-top:4px;}
  .qa-opt{display:flex;flex-direction:column;gap:2px;width:100%;background:transparent;border:0;border-bottom:1px solid var(--line);padding:9px 12px;cursor:pointer;text-align:left;font-family:inherit;font-size:13px;color:var(--text);}
  .qa-opt:last-child{border-bottom:0;}
  .qa-opt:hover{background:var(--navy-2);}
  .qa-opt span{font-size:11px;color:var(--text-mute);}
  @media (max-width:760px){
    .sv-grid{grid-template-columns:1fr;}
    .mm-mmeta,.mm-aser{display:none;}
  }

  /* ============ ASSETS ROUND 2: views bar, data health, sortable headers ============ */
  .dh-chip{display:inline-flex;align-items:center;gap:6px;background:rgba(217,119,6,.1);border:1px solid rgba(217,119,6,.35);color:var(--warn);border-radius:8px;padding:3px 11px;font-size:12px;font-weight:500;cursor:pointer;font-family:inherit;transition:background .12s;}
  .dh-chip:hover{background:rgba(217,119,6,.18);}
  /* The two routes out of an unforecastable estate (v1.4.10.202). */
  .fx-emptyacts{display:flex;gap:8px;flex-wrap:wrap;justify-content:center;margin-top:16px;}
  /* ── DATA HEALTH, v1.4.10.529 (Jay: "make the health check in the asset system look much much nicer") ──
     A score ring with a verdict and four stat tiles; one card per problem; the optional coverage as bars. The
     .dh-score / .dh-issue / .dh-head / .dh-count accordion is gone; the record rows (.dh-arow) and the duplicate
     sets (.dh-dgroup) are kept inside the cards. dhp- so nothing collides with the dashboard's dh- hero classes. */
  .dhp-head-act{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap;flex-shrink:0;}
  .dhp-hero{display:flex;align-items:center;gap:26px;padding:4px 0 18px;border-bottom:1px solid var(--line);margin-bottom:18px;}
  .dhp-ring{position:relative;flex:0 0 auto;width:132px;height:132px;}
  .dhp-ring svg{width:132px;height:132px;transform:rotate(-90deg);display:block;}
  .dhp-ring .tr{fill:none;stroke:var(--surface-3,var(--line));stroke-width:9;}
  .dhp-ring .ar{fill:none;stroke:var(--dhp-c);stroke-width:9;stroke-linecap:round;transition:stroke-dasharray .6s cubic-bezier(.2,.7,.3,1);}
  .dhp-ring-v{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;}
  .dhp-ring-v b{font-family:var(--font-display);font-size:30px;font-weight:600;letter-spacing:-.03em;line-height:1;color:var(--dhp-c);font-variant-numeric:tabular-nums;}
  .dhp-ring-v span{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-top:4px;}
  .dhp-verdict{flex:1 1 auto;min-width:0;}
  .dhp-vt{font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.15;display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;}
  .dhp-vs{font-size:13px;color:var(--text-mute);line-height:1.55;margin-top:6px;max-width:640px;}
  .dhp-vs b{color:var(--text);font-weight:600;}
  .dhp-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-top:14px;max-width:640px;}
  .dhp-stat{background:var(--surface-2);border:1px solid var(--line);border-radius:10px;padding:10px 12px;min-width:0;}
  .dhp-stat b{display:block;font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;font-variant-numeric:tabular-nums;}
  .dhp-stat span{display:block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-top:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .dhp-stat.ok b{color:var(--ok);} .dhp-stat.warn b{color:var(--warn);} .dhp-stat.err b{color:var(--err);}
  .dhp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px;grid-auto-flow:dense;}   /* dense: an opened card takes the full row and the cards after it fill the space beside the ones before */
  .dhp-card{border:1px solid var(--line);border-top:3px solid var(--warn);border-radius:12px;background:var(--surface);overflow:hidden;display:flex;flex-direction:column;min-width:0;}
  .dhp-card.open{grid-column:1 / -1;}
  .dhp-card.dupe_serial{border-top-color:var(--err);}
  .dhp-card-h{display:flex;align-items:center;gap:12px;width:100%;background:transparent;border:0;padding:14px 16px 6px;cursor:pointer;font-family:inherit;color:var(--text);text-align:left;}
  .dhp-ico{flex:0 0 auto;width:38px;height:38px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:rgba(217,119,6,.12);color:var(--warn);}
  .dhp-ico svg{width:19px;height:19px;}
  .dhp-card.dupe_serial .dhp-ico{background:rgba(220,38,38,.1);color:var(--err);}
  .dhp-cov-row .dhp-ico{background:var(--surface-2);color:var(--text-mute);}
  .dhp-card-t{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;}
  .dhp-n{font-family:var(--font-display);font-size:24px;font-weight:600;letter-spacing:-.025em;line-height:1;font-variant-numeric:tabular-nums;}
  .dhp-l{font-size:13px;font-weight:600;margin-top:3px;}
  .dh-chev{width:14px;color:var(--text-dim);font-size:12px;flex:0 0 auto;}
  .dhp-card .dh-why{padding:0 16px;margin:4px 0 0;}
  .dhp-card-a{display:flex;gap:8px;flex-wrap:wrap;padding:12px 16px 14px;margin-top:auto;}
  .dhp-card .dh-list{padding:10px 16px 14px;border-top:1px solid var(--line);background:var(--surface-2);}
  .dhp-cov{display:flex;flex-direction:column;gap:8px;}
  .dhp-cov-row{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--surface);}
  .dhp-cov-h{display:flex;align-items:center;gap:12px;width:100%;background:transparent;border:0;padding:11px 14px;cursor:pointer;font-family:inherit;color:var(--text);text-align:left;}
  .dhp-cov-h:hover{background:var(--navy-2);}
  .dhp-cov-l{flex:1 1 auto;min-width:0;font-size:13px;font-weight:600;}
  .dhp-cov-l small{display:block;font-size:12px;font-weight:400;color:var(--text-mute);line-height:1.45;margin-top:2px;}
  .dhp-cov-pct{flex:0 0 auto;font-variant-numeric:tabular-nums;font-size:15px;font-weight:600;white-space:nowrap;text-align:right;}
  .dhp-cov-pct small{display:block;font-size:11px;font-weight:600;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;}
  .dhp-cov-tr{height:6px;background:var(--surface-3,var(--line));margin:0 14px 12px 64px;border-radius:4px;overflow:hidden;}
  .dhp-cov-tr>div{height:100%;border-radius:4px;background:var(--accent);}
  .dhp-cov-row .dh-list{padding:0 14px 12px 64px;}
  .dhp-clean{display:flex;align-items:center;gap:12px;padding:14px 16px;border:1px solid rgba(22,163,74,.35);background:rgba(22,163,74,.07);border-radius:12px;font-size:13px;line-height:1.5;}
  .dhp-clean .dhp-ico{background:rgba(22,163,74,.14);color:var(--ok);}
  @media (max-width:760px){
    .dhp-hero{flex-direction:column;align-items:stretch;gap:14px;}
    .dhp-ring{margin:0 auto;}
    .dhp-verdict{text-align:center;}
    .dhp-vt{justify-content:center;}
    .dhp-vs{margin-left:auto;margin-right:auto;}
    .dhp-stats{grid-template-columns:repeat(2,minmax(0,1fr));text-align:left;}
    .dhp-grid{grid-template-columns:1fr;}
    .dhp-card-h,.dhp-cov-h{min-height:40px;}
    .dhp-card-a .btn,.dh-arow .btn{min-height:40px;}
    .dhp-cov-tr,.dhp-cov-row .dh-list{margin-left:14px;}
    .dhp-cov-row .dh-list{padding-left:14px;}
    .dh-arow{flex-wrap:wrap;}
  }
  .dh-list{padding:2px 14px 12px 36px;}
  .dh-why{font-size:12px;color:var(--text-mute);line-height:1.5;margin-bottom:8px;}
  .dh-arow{display:flex;align-items:center;gap:10px;padding:6px 9px;border-radius:6px;cursor:pointer;font-size:12px;transition:background .12s;}
  .dh-arow:hover{background:var(--navy-2);}
  .dh-aname{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .dh-asite,.dh-aser{color:var(--text-mute);font-size:12px;}
  .dh-more{font-size:12px;color:var(--text-dim);padding:6px 9px;}
  th.th-sort{cursor:pointer;user-select:none;white-space:nowrap;}
  th.th-sort:hover{color:var(--text);}
  th.th-sort.on{color:var(--accent);}

  /* ============ LIFECYCLE & BUDGET: analytics suite ============ */
  .fx-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:14px;margin-bottom:18px;}
  .fx-kpi{background:var(--surface,#fff);border:1px solid var(--line);border-top:3px solid var(--kc,var(--brand-blue));border-radius:7px;padding:14px 16px;}
  .fx-kpi .v{font-size:20px;font-weight:600;letter-spacing:-.02em;}
  .fx-kpi .l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin-top:3px;}
  .fx-kpi .s{font-size:12px;color:var(--text-dim);margin-top:2px;}
  .fxd-wrap{display:flex;align-items:center;gap:20px;flex-wrap:wrap;}
  .fxd-legend{flex:1;min-width:180px;display:flex;flex-direction:column;gap:7px;}
  .fxd-leg{display:flex;align-items:center;gap:9px;font-size:11px;}
  .fxd-dot{width:10px;height:10px;border-radius:3px;flex:none;}
  .fxd-lab{flex:1;color:var(--text-mute);}
  .fx-deprline{margin-top:16px;}
  .fx-deprbar{height:8px;border-radius:5px;background:var(--surface-3);overflow:hidden;}
  .fx-deprbar span{display:block;height:100%;border-radius:5px;background:linear-gradient(90deg,var(--brand-blue),var(--brand-purple));}
  .fx-matrix th,.fx-matrix td{white-space:nowrap;}
  .fx-yr{margin-bottom:18px;}
  .fx-yr:last-child{margin-bottom:0;}
  .fx-yrhead{display:flex;align-items:center;gap:10px;padding:8px 2px;border-bottom:2px solid var(--line);margin-bottom:2px;}
  .fx-yrhead b{font-size:15px;font-weight:600;letter-spacing:-.012em;}
  .fx-yrmeta{font-size:12px;color:var(--text-mute);}
  .fx-lifebar{height:6px;border-radius:4px;background:var(--surface-3);overflow:hidden;max-width:160px;}
  .fx-lifebar span{display:block;height:100%;border-radius:4px;}

  /* ============ SITE ASSETS: master–detail explorer ============ */
  .svx-wrap{display:grid;grid-template-columns:320px minmax(0,1fr);gap:16px;align-items:start;}
  .svx-rail{background:var(--surface,#fff);border:1px solid var(--line);border-radius:7px;overflow:hidden;display:flex;flex-direction:column;max-height:calc(100dvh - 240px);min-height:320px;position:sticky;top:14px;}
  .svx-railhead{padding:13px 15px;border-bottom:1px solid var(--line);background:var(--navy-2);}
  .svx-railhead b{display:block;font-size:15px;font-weight:600;letter-spacing:-.012em;}
  .svx-railhead span{font-size:11px;color:var(--text-mute);}
  .svx-list{overflow-y:auto;padding:6px;scrollbar-width:thin;}
  .svx-floor{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);background:var(--surface,#fff);padding:10px 9px 5px;}
  .svx-floor span{font-weight:500;letter-spacing:0;text-transform:none;color:var(--text-dim);}
  .svx-row{display:flex;align-items:center;gap:8px;width:100%;background:transparent;border:1px solid transparent;border-radius:6px;padding:8px 10px;cursor:pointer;font-family:inherit;font-size:12px;color:var(--text);text-align:left;transition:background .12s,border-color .12s;}
  .svx-row:hover{background:var(--navy-2);}
  .svx-row.sel{background:var(--accent-glow,rgba(var(--bc-accent-rgb),.1));border-color:var(--brand-blue);}
  .svx-row.unpl{border-style:dashed;border-color:var(--line);}
  .svx-rname{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:500;}
  .svx-rcode{display:inline-block;margin-left:7px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;color:var(--accent);}
  .svx-rcount{min-width:26px;text-align:center;background:var(--surface-3);border-radius:6px;padding:1px 7px;font-size:10px;font-weight:700;flex:none;}
  .svx-rcount.zero{opacity:.45;font-weight:500;}
  .svx-detail{background:var(--surface,#fff);border:1px solid var(--line);border-radius:7px;overflow:hidden;min-height:320px;}
  .svx-dhead{display:flex;align-items:center;gap:13px;padding:15px 18px;border-bottom:1px solid var(--line);background:var(--navy-2);flex-wrap:wrap;}
  .svx-dtitle{flex:1;min-width:180px;}
  .svx-dtitle b{display:block;font-size:15px;font-weight:600;letter-spacing:-.012em;}
  .svx-dtitle > span{font-size:12px;color:var(--text-mute);}
  .svx-subrooms{font-size:11px;color:var(--text-dim);margin-top:3px;}
  .svx-dstats{display:flex;gap:18px;flex-wrap:wrap;}
  .svx-dstats > div{text-align:right;}
  .svx-dstats b{display:block;font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.1;}
  .svx-dstats span{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
  .svx-dstats .warn b{color:var(--warn);}
  .svx-dstats .muted b{color:var(--text-mute);}
  .svx-dbody{padding:8px 10px;max-height:calc(100dvh - 330px);overflow-y:auto;scrollbar-width:thin;}
  .svx-dfoot{padding:10px 14px;border-top:1px dashed var(--line);}
  .svx-overview{padding:18px 20px;}
  .svx-ovhead{display:flex;align-items:center;gap:12px;margin-bottom:10px;color:var(--text);}
  .svx-ovhead svg{width:26px;height:26px;color:var(--accent);}
  .svx-ovhead b{display:block;font-size:15px;font-weight:600;letter-spacing:-.012em;}
  .svx-ovhead span{font-size:12px;color:var(--text-mute);}
  .svx-ovlist{display:flex;flex-direction:column;gap:6px;}
  .svx-ovrow{display:flex;align-items:center;gap:10px;width:100%;background:transparent;border:1px solid var(--line);border-radius:6px;padding:9px 12px;cursor:pointer;font-family:inherit;font-size:12px;color:var(--text);text-align:left;transition:border-color .12s,background .12s;}
  .svx-ovrow:hover{border-color:var(--brand-blue);background:var(--accent-glow,rgba(var(--bc-accent-rgb),.08));}
  @media (max-width:860px){
    .svx-wrap{grid-template-columns:1fr;}
    .svx-rail{position:static;max-height:300px;}
    .svx-dbody{max-height:none;}
  }

  /* ====== ASSET DETAIL: overview card grid (v1.4.10.168) ======
     Replaces the old place-strip + two-column rail. Cards flow into as many
     columns as the modal is wide; a card with nothing to say is not rendered
     at all (see ovCard in js/05-assets.js), so this grid is never padded out
     with empty sections. `.span2` is for the lifecycle card, which carries a
     timeline and a chart and needs the width when there is room for it. */
  /* v1.4.10.201 — WHY THE CARDS ARE PACKED INTO EXPLICIT COLUMNS.
     In a grid, a row advances on its TALLEST card, so Connection (two rows on
     an unmonitored asset) beside Status & compliance (seven) left a hole about
     120px tall, and the taller a card got the bigger the hole beside it. The
     card set is deliberately variable — ovCard() renders nothing for a card
     with nothing to say — so unequal heights are the normal case here, not the
     exception, and a row-based layout is the wrong shape for it.

     CSS `columns:2` was tried first and rejected: the browser's balancer
     cannot split a card (break-inside:avoid), and on a real asset it put 665px
     in the left column against 301px in the right — a worse imbalance than the
     grid it replaced, and not something the stylesheet can steer. The cards
     are therefore assigned to columns in JS by ovBalance() (js/05-assets.js),
     which places each card in order into whichever column is currently
     shortest — the masonry rule, deterministic and testable. THE COLUMN COUNT
     LIVES IN TWO PLACES AND MUST AGREE: `ovBalance(cards, 2)` and this rule.
     Below 900px both collapse to one. */
  .asd-ovcards{display:flex;align-items:flex-start;gap:16px;margin-top:18px;flex-wrap:wrap;}
  .asd-ovcol{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:16px;}
  .asd-ovcards > .asd-card.span2{flex:1 1 100%;}
  @media (max-width:900px){ .asd-ovcards{flex-direction:column;} .asd-ovcol{width:100%;flex:0 0 auto;} }
  .asd-card{border:1px solid var(--line);border-radius:7px;background:var(--surface,#fff);overflow:hidden;min-width:0;}
  .asd-card-h{display:flex;align-items:center;gap:9px;padding:11px 15px;border-bottom:1px solid var(--line);background:var(--surface-2);
    font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:600;color:var(--text-mute);}
  .asd-card-h svg{width:14px;height:14px;flex:none;color:var(--accent);}
  .asd-card-b{padding:4px 0 0;}
  .asd-card-b > *:last-child{margin-bottom:0;}
  .asd-kv{display:block;}
  .asd-kv-row{display:flex;align-items:flex-start;gap:14px;padding:9px 15px;border-top:1px solid var(--line);font-size:13px;min-width:0;}
  .asd-kv-row:first-child{border-top:0;}
  .asd-kv-row .k{flex:0 0 118px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;padding-top:2px;}
  .asd-kv-row .v{flex:1 1 auto;min-width:0;color:var(--text);display:flex;align-items:center;gap:7px;flex-wrap:wrap;word-break:break-word;}
  .asd-kv-row .v a{cursor:pointer;}
  /* One line instead of a column of em-dashes: everything this record is still
     missing, named once, at the foot of the card it belongs to. */
  .asd-kv-missing{padding:9px 15px;border-top:1px dashed var(--line);background:var(--surface-2);
    font-size:12px;line-height:1.55;color:var(--text-dim);}
  .asd-kv-missing b{color:var(--text-mute);font-weight:600;}
  .asd-card-chips{display:flex;gap:8px;flex-wrap:wrap;padding:12px 15px 2px;}
  .asd-card .lifecycle-track{margin:14px 15px 4px;}
  .asd-card .depr-card{margin:12px 15px;}
  .asd-card .asd-h{margin:16px 15px 0;}
  .asd-card .asd-notes{padding:12px 15px;margin:0;}
  /* v1.4.10.318 — the Overview's Notes card is the history log now, so it
     needs the tab's shape in miniature: who + when on one line, the body
     under it, a hairline between entries and a way through to the tab. */
  .asd-note{padding:11px 15px;border-bottom:1px solid var(--line);}
  .asd-note:last-of-type{border-bottom:0;}
  .asd-note-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:4px;}
  .asd-note-h b{font-size:12px;font-weight:600;color:var(--text);}
  .asd-note-h .device-meta{font-size:11px;}
  .asd-note-b{color:var(--text-mute);line-height:1.55;font-size:13px;overflow-wrap:anywhere;}
  .asd-note-more{padding:9px 15px;border-top:1px dashed var(--line);background:var(--surface-2);font-size:12px;}
  .asd-note-more a{cursor:pointer;color:var(--brand);font-weight:600;}
  /* The 40px tap floor is keyed off viewport width across this codebase
     (v1.4.10.128), not pointer:coarse — a phone-width browser on a laptop
     still gets thumb-sized targets. */
  @media(max-width:700px){ .asd-note-more a{display:inline-block;min-height:40px;line-height:40px;} }
  @media (max-width:700px){
    .asd-ovcards{gap:12px;margin-top:14px;}
    .asd-kv-row{flex-direction:column;gap:3px;padding:9px 13px;}
    .asd-kv-row .k{flex:none;padding-top:0;}
  }

  /* Model editor — "apply this device type to the register" panel (v1.4.10.168) */
  .ce-type-apply{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:space-between;
    border:1px solid var(--line);border-radius:6px;background:var(--surface-2);padding:10px 12px;}
  .ce-type-apply .cta-lines{flex:1 1 220px;min-width:0;font-size:12px;line-height:1.6;color:var(--text);}
  .ce-type-apply .cta-btns{display:flex;gap:8px;flex-wrap:wrap;}

  /* ============ ASSET DETAIL: two-column overview + facts card ============ */
  .asd-ovgrid{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:22px 34px;align-items:start;}
  @media (max-width:900px){ .asd-ovgrid{grid-template-columns:1fr;gap:24px;} }
  .asd-facts{border:1px solid var(--line);border-radius:7px;overflow:hidden;background:var(--surface,#fff);}
  .adf-row{display:flex;align-items:center;gap:12px;padding:11px 15px;border-top:1px solid var(--line);font-size:13px;}
  .adf-row:first-child{border-top:0;}
  .adf-row:nth-child(even){background:var(--navy-2);}
  .adf-ico{width:26px;height:26px;border-radius:5px;background:var(--accent-glow,rgba(var(--bc-accent-rgb),.1));color:var(--accent);display:flex;align-items:center;justify-content:center;flex:none;}
  .adf-ico svg{width:13px;height:13px;}
  .adf-lbl{width:96px;flex:none;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;}
  .adf-val{flex:1;min-width:0;display:flex;align-items:center;gap:7px;flex-wrap:wrap;}

  /* ============ ROOM PHOTOS + SETTINGS SUB-NAV (v54) ============ */
  .svx-photo{position:relative;border-bottom:1px solid var(--line);background:var(--navy-2);}
  .svx-photo img{display:block;width:100%;max-height:360px;object-fit:contain;background:var(--surface-2);cursor:zoom-in;}
  .svx-photo-acts{position:absolute;right:12px;bottom:12px;display:flex;gap:8px;opacity:0;transition:opacity .15s;}
  .svx-photo:hover .svx-photo-acts{opacity:1;}
  .svx-photo-acts .btn{backdrop-filter:blur(6px);background:rgba(15,23,42,.62);color:#fff;border-color:rgba(255,255,255,.25);}
  .svx-photo-acts .btn.danger{background:rgba(153,27,27,.72);}
  .svx-photo-loading{display:flex;align-items:center;justify-content:center;min-height:120px;}
  .svx-photo-drop{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;text-align:center;
    margin:14px;padding:26px 20px;border:2px dashed var(--line-2,var(--line));border-radius:7px;cursor:pointer;
    color:var(--text-mute);transition:border-color .15s,background .15s;}
  .svx-photo-drop svg{width:26px;height:26px;opacity:.7;}
  .svx-photo-drop b{font-size:13px;color:var(--text);}
  .svx-photo-drop span{font-size:12px;max-width:420px;line-height:1.5;}
  .svx-photo-drop:hover,.svx-photo-drop.over{border-color:var(--brand-blue);background:var(--accent-glow,rgba(var(--bc-accent-rgb),.07));}
  .fx-basis{display:inline-block;margin-left:4px;font-size:11px;font-weight:600;letter-spacing:0;color:var(--accent);background:var(--accent-glow,rgba(var(--bc-accent-rgb),.12));border-radius:6px;padding:1px 5px;vertical-align:1px;}
  .cs-nav{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-bottom:16px;}
  .cs-pill{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--line);background:var(--surface,#fff);
    color:var(--text-mute);font-family:inherit;font-size:12px;font-weight:600;padding:7px 13px;border-radius:10px;cursor:pointer;   /* v1.4.10.473: 12/600, the segmented-control look of the Assets tab row above it (was 13) */
    transition:color .13s,border-color .13s,background .13s;white-space:nowrap;}
  .cs-pill:hover{color:var(--text);border-color:var(--line-2,var(--line));}
  .cs-pill.active{color:var(--brand-blue);border-color:var(--brand-blue);background:var(--accent-glow,rgba(var(--bc-accent-rgb),.08));}
  .cs-n{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;background:var(--surface-3);border-radius:6px;padding:1px 7px;color:var(--text-mute);}   /* v1.4.10.473: badge look (was untracked) */
  .cs-pill.active .cs-n{background:var(--brand-blue);color:#fff;}
  .cs-search{margin-left:auto;min-width:230px;}
  /* v1.4.10.473: a placeholder longer than a phone ("Search manufacturers, models, suppliers, device types, statuses…"
     is 520px of 16px text in a 308px field) ends in an ellipsis instead of being sliced mid-word */
  .cs-search input{text-overflow:ellipsis;}
  @media (max-width:720px){ .cs-search{margin-left:0;flex:1 1 100%;} }

  /* ════════ Asset management — Help & guide modal ════════ */
  .hg-nav{display:flex;flex-direction:column;gap:2px;width:226px;flex-shrink:0;align-self:stretch;
    padding:12px 12px 16px;overflow-y:auto;border-right:1px solid var(--line);background:var(--surface-2);
    scrollbar-width:thin;scrollbar-color:var(--line-2) transparent;}
  .hg-item{display:flex;align-items:center;gap:11px;width:100%;text-align:left;border:1px solid transparent;
    background:transparent;color:var(--text-mute);font-family:inherit;font-size:13px;font-weight:500;
    padding:9px 11px;border-radius:6px;cursor:pointer;transition:color .14s,background .14s,border-color .14s;}
  .hg-item svg{width:16px;height:16px;stroke:currentColor;opacity:.9;flex-shrink:0;}
  .hg-item span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .hg-item:hover{color:var(--text);background:var(--surface);}
  .hg-item.active{color:var(--brand-blue);background:var(--surface);border-color:var(--line);box-shadow:var(--shadow-sm);font-weight:600;}
  .hg-body{padding:26px 30px;overflow-y:auto;flex:1;min-width:0;min-height:0;}
  .hg-pane{display:none;animation:adtFade .2s cubic-bezier(.22,.7,.3,1);max-width:760px;}
  .hg-pane.active{display:block;}
  .hg-pane h3{display:flex;align-items:center;gap:10px;font-family:var(--font-display);font-size:16px;font-weight:600;
    letter-spacing:-.012em;margin:0 0 12px;color:var(--text);}
  .hg-pane h3 svg{width:19px;height:19px;stroke:var(--brand-blue);}
  .hg-pane p{font-size:13px;line-height:1.65;color:var(--text-mute);margin:0 0 12px;}
  .hg-pane b{color:var(--text);}
  .hg-step{display:flex;gap:13px;align-items:flex-start;margin:0 0 12px;}
  .hg-step-n{flex:none;width:26px;height:26px;border-radius:6px;display:flex;align-items:center;justify-content:center;
    background:var(--accent-glow,rgba(var(--bc-accent-rgb),.1));color:var(--brand-blue);font-size:12px;font-weight:700;margin-top:1px;}
  .hg-step b{display:block;font-size:13px;color:var(--text);margin-bottom:2px;}
  .hg-step p{margin:0;font-size:13px;}
  .hg-tip{display:flex;gap:9px;align-items:flex-start;margin:12px 0;padding:11px 13px;border-radius:6px;
    background:rgba(22,163,74,.08);border:1px solid rgba(22,163,74,.22);font-size:12px;line-height:1.55;color:var(--text-mute);}
  .hg-tip svg{width:15px;height:15px;flex:none;stroke:var(--ok);margin-top:1px;}
  .hg-tip.warn{background:rgba(217,119,6,.08);border-color:rgba(217,119,6,.25);}
  .hg-tip.warn svg{stroke:var(--warn);}
  .hg-dl{border:1px solid var(--line);border-radius:7px;overflow:hidden;margin:0 0 14px;}
  .hg-dl-row{display:grid;grid-template-columns:172px 1fr;gap:14px;padding:10px 14px;border-top:1px solid var(--line);}
  .hg-dl-row:first-child{border-top:0;}
  .hg-dl-row:nth-child(even){background:var(--navy-2);}
  .hg-dl-k{font-size:12px;font-weight:700;color:var(--text);}
  .hg-dl-v{font-size:12px;color:var(--text-mute);line-height:1.55;}
  @media(max-width:600px){
    .hg-nav{flex-direction:row;width:auto;border-right:0;border-bottom:1px solid var(--line);overflow-x:auto;padding:8px 10px;gap:6px;}
    .hg-item{width:auto;flex-shrink:0;padding:8px 11px;font-size:12px;}
    .hg-item span{white-space:nowrap;}
    .hg-body{padding:16px;}
    .hg-dl-row{grid-template-columns:1fr;gap:3px;}
  }
  .seg-btn.seg-help{margin-left:auto;display:inline-flex;align-items:center;color:var(--brand-blue);font-weight:600;}
  .seg-btn.seg-help:hover{background:var(--accent-glow,rgba(var(--bc-accent-rgb),.08));}

  /* Client profile — read-only settings block (asset labels, ticket prefix) */

  /* ══ CLIENT PAGE REBUILD (v1.4.10.320) ═══════════════════════════════════
     The estate tree (site → floor → location), the hero meta chips and the
     rebuilt profile strip. The 700px breakpoint is this codebase's tap-floor
     rule (v128) — NOT `pointer:coarse`, which a narrow window on a laptop
     never matches (the v318 lesson). */
  .cd-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px;}
  .cd-chip{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;
    padding:3px 9px;border-radius:999px;background:rgba(255,255,255,.16);color:#fff;
    border:1px solid rgba(255,255,255,.22);white-space:nowrap;}
  .cd-chip svg{width:12px;height:12px;opacity:.9;}

  .cest-sub{margin-left:auto;font-weight:400;font-size:12px;color:var(--text-dim);}
  .cust-panel-head .btn{margin-left:10px;}
  .cest-search{position:relative;display:flex;align-items:center;gap:8px;margin:2px 0 12px;
    border:1px solid var(--line);border-radius:6px;padding:0 10px;background:var(--surface-2);}
  .cest-search svg{width:15px;height:15px;color:var(--text-dim);flex-shrink:0;}
  .cest-search input{flex:1;min-width:0;border:0;background:transparent;outline:none;
    font-size:13px;color:var(--text);padding:9px 0;}
  .cest-x{border:0;background:transparent;cursor:pointer;color:var(--text-dim);display:flex;padding:4px;border-radius:6px;}
  .cest-x:hover{background:var(--surface);color:var(--text);}
  .cest-x svg{width:13px;height:13px;}

  .cest-site{border:1px solid var(--line);border-radius:7px;margin-bottom:10px;background:var(--surface);overflow:hidden;}
  .cest-site:hover{border-color:var(--line-2);}
  .cest-site.is-open{box-shadow:var(--shadow-sm);}
  .cest-site-head{display:flex;align-items:center;gap:11px;flex-wrap:wrap;padding:12px 14px;cursor:pointer;}
  .cest-site-head:hover{background:var(--surface-2);}
  .cest-site-head:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;}
  .cest-chev{display:inline-flex;flex-shrink:0;color:var(--text-dim);transition:transform .15s;}
  .cest-chev svg{width:15px;height:15px;}
  .cest-chev.open{transform:rotate(90deg);}
  .cest-mark{width:36px;height:36px;flex-shrink:0;border-radius:6px;display:flex;align-items:center;justify-content:center;
    background:var(--surface-2);border:1px solid var(--line);color:var(--text-dim);}
  .cest-mark svg{width:17px;height:17px;}
  .cest-mark.has{background:#fff;padding:4px;}
  .cest-mark.has img{width:100%;height:100%;object-fit:contain;display:block;}
  .cest-id{flex:1;min-width:0;}
  .cest-name{font-weight:600;font-size:15px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;letter-spacing:-.012em;}
  .cest-addr{font-size:12px;color:var(--text-dim);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .cest-match{font-size:11px;font-weight:600;color:var(--accent);background:var(--accent-glow);
    border-radius:999px;padding:2px 8px;}
  .cest-stats{display:flex;gap:11px;font-size:12px;color:var(--text-dim);flex-shrink:0;}
  .cest-stats span{display:inline-flex;align-items:center;gap:4px;}
  .cest-stats svg{width:13px;height:13px;opacity:.75;}
  .cest-stats .warn{color:var(--warn);font-weight:600;}
  .cest-actions{display:flex;gap:6px;flex-shrink:0;}

  .cest-site-body{border-top:1px solid var(--line);background:var(--surface-2);padding:4px 14px 12px;}
  .cest-floor{border-bottom:1px dashed var(--line);}
  .cest-floor:last-child{border-bottom:0;}
  .cest-floor-head{display:flex;align-items:center;gap:8px;padding:9px 2px;cursor:pointer;}
  .cest-floor-head:hover .cest-floor-n{color:var(--accent);}
  .cest-floor-head:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;}
  .cest-floor-n{font-size:13px;font-weight:600;color:var(--text);}
  .cest-floor-m{font-size:12px;color:var(--text-dim);margin-left:auto;}
  .cest-chips{display:flex;flex-wrap:wrap;gap:6px;padding:2px 0 11px;}
  .cest-loc{display:inline-flex;align-items:center;gap:6px;max-width:100%;font-size:12px;text-align:left;
    background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:5px 9px;color:var(--text);
    cursor:pointer;font-family:inherit;transition:border-color .12s,background .12s;}
  .cest-loc:hover{border-color:var(--accent-2);background:var(--accent-glow);color:var(--accent-deep);}
  .cest-loc-n{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:230px;}
  .cest-loc-c{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;color:var(--text-dim);
    background:var(--surface-2);border-radius:5px;padding:1px 5px;}
  .cest-loc-m{font-size:11px;color:var(--text-dim);}
  .cest-more{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:0 0 11px;}
  .cest-empty{font-size:12px;color:var(--text-dim);padding:10px 2px;}

  .cust-u{display:flex;align-items:center;gap:9px;min-width:0;}
  .cust-u-av{flex:0 0 28px;width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;
    font-size:11px;font-weight:600;background:var(--accent-glow);color:var(--accent-deep);}
  .cust-u-id{min-width:0;display:flex;flex-direction:column;}
  .cust-u-n{font-weight:600;}
  .cust-never{color:var(--text-dim);font-style:italic;}

  .cprof-id-name{font-size:15px;font-weight:600;letter-spacing:-.012em;line-height:1.2;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .cprof-id-sub{font-size:12px;color:var(--text-mute);margin:3px 0 8px;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .cprof-since{color:var(--text-dim);}
  .cprof-logo.is-add{position:relative;cursor:pointer;border-style:dashed;padding:0;font-family:inherit;}
  .cprof-logo.is-add:hover{border-color:var(--accent-2);background:var(--accent-glow);}
  .cprof-logo-add{position:absolute;right:-5px;bottom:-5px;width:20px;height:20px;border-radius:50%;
    background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;
    box-shadow:var(--shadow-sm);}
  .cprof-logo-add svg{width:12px;height:12px;}
  .cprof-block-head .cprof-blk-act{margin-left:auto;display:inline-flex;align-items:center;gap:4px;
    font-size:11px;font-weight:500;letter-spacing:0;color:var(--accent);text-decoration:none;text-transform:none;}
  .cprof-block-head .cprof-blk-act:hover{text-decoration:underline;}
  .cprof-block-head .cprof-blk-act svg{width:12px;height:12px;}
  .cprof-add{border:0;background:transparent;padding:0;color:var(--accent);font-weight:600;
    font-size:12px;cursor:pointer;font-family:inherit;font-style:normal;}
  .cprof-add:hover{text-decoration:underline;}
  .cprof-gaps{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:13px;padding:9px 11px;
    border:1px dashed var(--line-2);border-radius:6px;background:var(--surface-2);
    font-size:12px;color:var(--text-mute);}
  .cprof-gaps svg{width:14px;height:14px;opacity:.7;flex-shrink:0;}
  .cprof-gaps span{flex:1;min-width:120px;}

  @media(max-width:700px){
    .cest-site-head{gap:9px;padding:11px 12px;}
    .cest-stats{width:100%;order:5;}
    .cest-actions{order:6;margin-left:auto;}
    .cest-actions .btn{min-height:40px;min-width:40px;}
    .cest-floor-head{min-height:40px;}
    .cest-loc{min-height:40px;}
    .cest-loc-n{max-width:150px;}
    .cest-search input{min-height:40px;}
    .cest-x{min-height:40px;min-width:40px;align-items:center;justify-content:center;}
    .cd-chips{gap:5px;}
  }

  .cprof-settings{margin-top:4px;}
  .cprof-set-row{display:grid;grid-template-columns:120px 1fr;gap:12px;align-items:center;padding:8px 0;border-top:1px dashed var(--line);font-size:12px;}
  .cprof-set-row:first-of-type{border-top:0;}
  .cprof-set-k{display:flex;align-items:center;font-weight:500;color:var(--text);font-size:12px;}   /* v1.4.10.473: a setting's name is a label, 12/500 (was 12/700) */
  .cprof-set-v{display:flex;align-items:center;gap:7px;color:var(--text-mute);flex-wrap:wrap;}
  .cprof-set-v svg{width:14px;height:14px;stroke:var(--brand-blue);flex:none;}
  .site-label-chip{font-size:11px;vertical-align:1px;}
  .site-label-chip svg{width:10px;height:10px;vertical-align:-1px;}

  /* Grouped register — real org / site logos in place of the generic glyphs */
  .ag-org-ico.has-logo{background:#fff;border:1px solid var(--line);padding:3px;overflow:hidden;}
  .ag-org-ico.has-logo img{width:100%;height:100%;object-fit:contain;display:block;border-radius:6px;}
  .ag-site-pin.has-logo{background:#fff;border:1px solid var(--line);padding:2px;overflow:hidden;}
  .ag-site-pin.has-logo img{width:100%;height:100%;object-fit:contain;display:block;border-radius:5px;}

  /* ════════ Help guide — annotated visual figures (mock UI renderings) ════════ */
  .hg-fig{margin:14px 0 18px;}
  .hgm-win{border:1px solid var(--line);border-radius:7px;overflow:hidden;background:var(--surface,#fff);box-shadow:var(--shadow-sm,0 1px 3px rgba(0,0,0,.07));}
  .hgm-winbar{display:flex;align-items:center;gap:6px;padding:8px 12px;background:var(--surface-2);border-bottom:1px solid var(--line);}
  .hgm-winbar span{width:9px;height:9px;border-radius:50%;background:var(--line-2,var(--line));}
  .hgm-winbar em{font-style:normal;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);margin-left:8px;}
  .hgm-body{padding:14px 16px;display:flex;flex-direction:column;gap:10px;font-size:12px;color:var(--text-mute);}
  .hgm-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  .hgm-spacer{flex:1;}
  .hgm-cap{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
  .hgm-cap svg{width:11px;height:11px;vertical-align:-1px;}
  .hgm-mut{font-size:11px;color:var(--text-dim);}
  .hgm-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 11px;border-radius:6px;border:1px solid var(--line);
    background:var(--surface);font-size:12px;font-weight:600;color:var(--text-mute);white-space:nowrap;}
  .hgm-btn.pri{background:linear-gradient(120deg,var(--brand-blue),var(--brand-purple));color:#fff;border-color:transparent;}
  .hgm-btn.ghost{background:var(--surface-2);}
  .hgm-btn.danger{color:var(--err);border-color:rgba(220,38,38,.4);}
  .hgm-btn.link{color:var(--brand-blue);border-color:transparent;background:transparent;}
  .hgm-btn.glass{background:rgba(var(--bc-accent-rgb),.10);border-color:rgba(var(--bc-accent-rgb),.22);color:var(--brand-blue);}
  .hgm-sel{display:inline-flex;align-items:center;gap:7px;padding:6px 11px;border-radius:6px;border:1px solid var(--line);
    background:var(--surface);font-size:12px;color:var(--text-mute);white-space:nowrap;}
  .hgm-sel.on{border-color:var(--brand-blue);color:var(--text);font-weight:600;}
  .hgm-sel i{font-style:normal;font-size:10px;color:var(--text-dim);}
  .hgm-inp{display:inline-flex;align-items:center;gap:7px;padding:6px 12px;border-radius:6px;border:1px solid var(--line);
    background:var(--surface);font-size:12px;color:var(--text-dim);flex:1;min-width:180px;}
  .hgm-inp svg{width:12px;height:12px;}
  .hgm-pill{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:999px;font-size:11px;font-weight:600;
    background:var(--surface-2);border:1px solid var(--line);color:var(--text-mute);white-space:nowrap;}
  .hgm-pill.ok{background:rgba(22,163,74,.12);border-color:rgba(22,163,74,.3);color:var(--ok);}
  .hgm-pill.warn{background:rgba(217,119,6,.12);border-color:rgba(217,119,6,.3);color:var(--warn);}
  .hgm-pill.fault{background:rgba(220,38,38,.1);border-color:rgba(220,38,38,.3);color:var(--err);}
  .hgm-pill.feat{background:rgba(var(--bc-purple-rgb),.12);border-color:rgba(var(--bc-purple-rgb),.3);color:var(--brand-purple);}
  .hgm-pill.tag{font-family:var(--font-mono);font-variant-numeric:tabular-nums;letter-spacing:.5px;}
  .hgm-pill.chip{}
  .hgm-seg{display:inline-flex;gap:3px;padding:3px;border-radius:6px;background:var(--surface-2);border:1px solid var(--line);flex-wrap:wrap;}
  .hgm-seg-b{padding:4px 9px;border-radius:6px;font-size:11px;font-weight:600;color:var(--text-dim);white-space:nowrap;}
  .hgm-seg-b.on{background:var(--surface);color:var(--brand-blue);box-shadow:var(--shadow-sm,0 1px 2px rgba(0,0,0,.08));}
  .hgm-arrow{font-style:normal;color:var(--text-dim);font-size:13px;}
  /* v1.4.10.514: a drawn "what needs doing" tile */
  .hgm-tile{display:inline-flex;flex-direction:column;gap:2px;padding:6px 10px;border-radius:6px;border:1px solid var(--line);background:var(--surface);
    font-size:15px;font-weight:600;color:var(--text);line-height:1.2;min-width:84px;}
  .hgm-tile small{font-size:11px;font-weight:500;color:var(--text-dim);white-space:nowrap;}
  .hgm-tile.on{border-color:var(--brand-blue);box-shadow:0 0 0 3px rgba(var(--bc-accent-rgb),.14);}
  .hgm-logo{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:5px;background:#fff;
    border:1px solid var(--line);font-size:10px;font-weight:700;color:var(--brand-blue);flex:none;}
  .hgm-logo.warm{color:#C2410C;}
  .hgm-mark{display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;border-radius:50%;flex:none;
    background:var(--brand-blue);color:#fff;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;box-shadow:0 0 0 3px rgba(var(--bc-accent-rgb),.18);margin:0 2px;}   /* v1.4.10.473: badge look (was untracked) */
  /* v1.4.10.514: a real screenshot in the guide (img/help/), with the numbered marks laid over it by percentage */
  .hg-shot .hgm-body{padding:0;position:relative;display:block;}
  .hg-shot img{display:block;width:100%;height:auto;}
  .hg-shot .hg-shot-m{position:absolute;transform:translate(-50%,-50%);width:20px;height:20px;font-size:11px;box-shadow:0 0 0 3px rgba(255,255,255,.9),0 2px 8px rgba(15,23,42,.35);}
  /* v1.4.10.515: the picture opens full size (hgShotOpen); the corner chip says so and shows as you point at it */
  .hg-shot .hgm-body{cursor:zoom-in;}
  .hg-shot .hgm-body:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
  .hg-shot-zoom{position:absolute;right:8px;bottom:8px;display:inline-flex;align-items:center;gap:5px;padding:4px 9px;border-radius:var(--r-ctl);
    background:rgba(15,23,42,.72);color:#fff;font-size:11px;font-weight:600;opacity:0;transition:opacity .15s;pointer-events:none;}
  .hg-shot-zoom svg{width:12px;height:12px;stroke:#fff;}
  .hg-shot .hgm-body:hover .hg-shot-zoom,.hg-shot .hgm-body:focus-visible .hg-shot-zoom{opacity:1;}
  @media (hover:none){ .hg-shot-zoom{opacity:1;} }
  .hg-lightbox{z-index:1200;cursor:zoom-out;}
  .hg-lightbox img{max-width:min(96vw,1600px);max-height:84vh;cursor:default;background:#fff;}
  .hg-shot.phone .hgm-win{max-width:300px;margin:0 auto;}
  .hg-fig-notes{margin:9px 2px 0;display:flex;flex-direction:column;gap:5px;}
  .hg-fig-note{display:flex;gap:8px;align-items:flex-start;font-size:12px;color:var(--text-mute);line-height:1.5;}
  .hg-fig-note .hgm-mark{margin-top:1px;}
  .hgm-split{display:flex;gap:12px;align-items:stretch;}
  .hgm-rail{display:flex;flex-direction:column;gap:4px;width:150px;flex:none;padding:8px;border:1px solid var(--line);border-radius:6px;background:var(--surface-2);}
  .hgm-rail.sm{width:110px;}
  .hgm-rail-i{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;font-size:11px;color:var(--text-dim);}
  .hgm-rail-i b{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:6px;background:var(--surface);border:1px solid var(--line);font-size:10px;flex:none;}
  .hgm-rail-i span{display:flex;flex-direction:column;line-height:1.25;font-weight:600;}
  .hgm-rail-i small{font-weight:500;font-size:11px;opacity:.8;}
  .hgm-rail-i.on{background:var(--surface);color:var(--brand-blue);box-shadow:var(--shadow-sm,0 1px 2px rgba(0,0,0,.08));}
  .hgm-stage{flex:1;min-width:0;display:flex;flex-direction:column;gap:9px;padding:4px 2px;}
  .hgm-fld{display:flex;align-items:center;gap:8px;}
  .hgm-fld label{display:inline-flex;align-items:center;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);width:74px;flex:none;}
  .hgm-panehead{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding-bottom:8px;border-bottom:1px solid var(--line);}
  .hgm-panehead span{display:flex;flex-direction:column;line-height:1.3;}
  .hgm-panehead b{font-size:12px;font-weight:600;color:var(--text);}
  .hgm-panehead small{font-size:11px;color:var(--text-dim);}
  .hgm-banner{padding:9px 12px;border-radius:6px;font-size:12px;font-weight:600;border:1px solid var(--line);}
  .hgm-banner.ok{background:rgba(22,163,74,.08);border-color:rgba(22,163,74,.25);color:var(--ok);}
  .hgm-hero{display:flex;gap:12px;align-items:center;padding:12px;border-radius:7px;background:linear-gradient(125deg,#1E3A8A,var(--bc-blue-v1) 48%,var(--bc-purple-v1));color:#fff;}
  .hgm-photo{display:flex;align-items:center;justify-content:center;width:58px;height:58px;border-radius:7px;background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.25);flex:none;}
  .hgm-photo svg{stroke:#fff;width:22px;height:22px;}
  .hgm-hero-mid{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px;}
  .hgm-hero-mid b{font-size:13px;font-weight:600;}
  .hgm-hero-mid small{font-size:11px;opacity:.85;}
  .hgm-hero .hgm-btn.glass{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.25);color:#fff;font-size:11px;padding:4px 8px;}
  .hgm-hero-qr{display:flex;flex-direction:column;align-items:center;gap:4px;flex:none;}
  .hgm-hero-qr small{font-size:10px;font-weight:700;letter-spacing:.6px;opacity:.9;}
  .hgm-qr{display:grid;grid-template-columns:repeat(3,1fr);gap:2px;width:44px;height:44px;background:#fff;border-radius:6px;padding:6px;}
  .hgm-qr i{background:#0B0E14;border-radius:2px;}
  .hgm-qr i:nth-child(2){border-radius:50%;opacity:.85;}
  .hgm-barc{display:inline-flex;align-items:stretch;gap:2px;height:30px;background:#fff;border-radius:6px;padding:5px 8px;}
  .hgm-barc i{width:2px;background:#0B0E14;}
  .hgm-barc i:nth-child(3n){width:4px;} .hgm-barc i:nth-child(4n){width:1px;}
  .hgm-barc-txt{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10px;letter-spacing:2px;color:var(--text);}
  .hgm-2col{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
  .hgm-3col{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;}
  .hgm-card{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:11px 12px;border:1px solid var(--line);border-radius:6px;background:var(--surface);}
  .hgm-card b{font-size:12px;color:var(--text);}
  .hgm-card small{font-size:11px;color:var(--text-dim);line-height:1.45;}
  .hgm-card svg{width:16px;height:16px;stroke:var(--text-mute);}
  .hgm-card.pick.on{border-color:var(--brand-blue);background:var(--accent-glow,rgba(var(--bc-accent-rgb),.07));box-shadow:0 0 0 1px var(--brand-blue) inset;}
  .hgm-label{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px;border:2px solid var(--text);border-radius:6px;background:#fff;color:#0B0E14;}
  .hgm-label.col{flex-direction:column;align-items:center;gap:6px;}
  .hgm-label span{display:flex;flex-direction:column;gap:1px;}
  .hgm-label b{font-size:11px;color:#0F766E;}
  .hgm-label i{font-style:normal;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:700;font-size:13px;letter-spacing:1px;}
  .hgm-label small{font-size:11px;color:#555;line-height:1.4;}
  .hgm-drop{display:flex;align-items:center;gap:8px;padding:12px;border:2px dashed var(--line-2,var(--line));border-radius:6px;font-size:11px;color:var(--text-dim);}
  .hgm-drop svg{width:16px;height:16px;}
  .hgm-photo-cell{position:relative;height:56px;border-radius:6px;background:linear-gradient(135deg,var(--surface-2),var(--line));border:1px solid var(--line);padding:5px;}
  .hgm-photo-cell .hgm-pill{position:absolute;top:5px;left:5px;font-size:11px;padding:2px 6px;}
  .hgm-kpi{display:flex;flex-direction:column;gap:1px;padding:8px 12px;border:1px solid var(--line);border-radius:6px;background:var(--surface);}
  .hgm-kpi b{font-size:14px;color:var(--text);}
  .hgm-kpi small{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;}
  .hgm-dot{width:8px;height:8px;border-radius:50%;flex:none;}
  .hgm-dot.ok{background:var(--ok);}
  .hg-faq{margin:16px 0 4px;border:1px solid var(--line);border-radius:7px;overflow:hidden;}
  .hg-faq-h{display:flex;align-items:center;gap:8px;padding:10px 14px;background:var(--surface-2);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
  .hg-faq-h svg{width:13px;height:13px;}
  .hg-faq-row{padding:10px 14px;border-top:1px solid var(--line);}
  .hg-faq-q{font-size:12px;font-weight:700;color:var(--text);margin-bottom:3px;}
  .hg-faq-a{font-size:12px;color:var(--text-mute);line-height:1.55;}
  @media(max-width:640px){.hgm-2col,.hgm-3col{grid-template-columns:1fr;}.hgm-split{flex-direction:column;}.hgm-rail{width:auto;flex-direction:row;overflow-x:auto;}}

  /* Notifications — "How you're notified" clarity panel */
  .notif-chan-row{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:6px;}
  @media(max-width:700px){.notif-chan-row{grid-template-columns:1fr;}}
  .notif-chan{display:flex;align-items:center;gap:11px;padding:11px 13px;border:1px solid var(--line);border-radius:7px;background:var(--surface);opacity:.72;}
  .notif-chan.on{opacity:1;border-color:rgba(22,163,74,.35);}
  .notif-chan svg{width:17px;height:17px;stroke:var(--text-mute);flex:none;}
  .notif-chan.on svg{stroke:var(--ok);}
  .notif-chan>div{flex:1;min-width:0;}
  .notif-chan b{display:block;font-size:12px;color:var(--text);}
  .notif-chan small{font-size:11px;color:var(--text-dim);line-height:1.45;display:block;}
  .notif-toggle{position:relative;display:inline-block;width:38px;height:22px;flex:none;cursor:pointer;}
  .notif-toggle input{opacity:0;width:0;height:0;}
  .notif-toggle span{position:absolute;inset:0;border-radius:999px;background:var(--line-2,var(--line));transition:background .15s;}
  .notif-toggle span::after{content:"";position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25);transition:transform .15s;}
  .notif-toggle input:checked + span{background:var(--ok);}
  .notif-toggle input:checked + span::after{transform:translateX(16px);}
  /* v1.4.10.473: on touch the switch's label is a 40x40 tap area (it was the 38x22 track itself). The track is drawn
     where it was (inset 9px 1px) and the negative margins hand the row back the extra 18px / 2px, so nothing moves. */
  @media (hover:none) and (pointer:coarse){
    .notif-toggle{width:40px;height:40px;margin:-9px -1px;}
    .notif-toggle span{inset:9px 1px;}
  }
  .notif-sub-group{margin-top:12px;}
  .notif-sub-g{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);margin-bottom:4px;}
  .notif-sub-row{display:flex;align-items:center;gap:12px;padding:8px 2px;border-top:1px dashed var(--line);}
  .notif-sub-row:first-of-type{border-top:0;}
  .notif-sub-what{flex:1;min-width:0;}
  .notif-sub-what b{font-size:12px;color:var(--text);display:block;}
  .notif-sub-what small{font-size:11px;color:var(--text-dim);}
  .notif-sub-row .pill svg{width:10px;height:10px;vertical-align:-1px;}
  /* v1.4.10.219 — the always-on block sits under the rule-driven ones and is
     visibly a different KIND of thing: these follow their feature and there is
     no rule behind them to go and edit. */
  .notif-sub-group.notif-auto{margin-top:16px;padding-top:12px;border-top:1px solid var(--line);}
  /* The timing hint under the rule editor's Timing select — one line that says
     what the chosen timing actually does (they did nothing at all until v219). */
  .nr-tm-hint{margin-top:4px;}

  /* ══════════ Role dashboards, grouped Device Estate & Sites branding (1_4_10_61) ══════════ */
  /* Brand marks — org/site logo, or gradient initials fallback (matches .isec-brand). */
  .dbrand{width:36px;height:36px;flex-shrink:0;border-radius:6px;display:flex;align-items:center;justify-content:center;
    font-family:var(--font-display);font-weight:700;font-size:13px;color:#fff;background:var(--grad);overflow:hidden;letter-spacing:.4px;}
  .dbrand.sm{width:30px;height:30px;border-radius:6px;font-size:11px;}
  .dbrand.md{width:38px;height:38px;border-radius:6px;font-size:14px;}
  .dbrand.lg{width:46px;height:46px;border-radius:7px;font-size:16px;}
  .dbrand.has{background:#fff;border:1px solid var(--line);padding:4px;}
  .dbrand.has img{width:100%;height:100%;object-fit:contain;}

  /* Live status rollup chips (n online · n warning · …) used at every tier. */
  .rlchips{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:11px;color:var(--text-mute);margin-top:5px;}
  .rlc{display:inline-flex;align-items:center;gap:5px;white-space:nowrap;}
  .rlc .dot{width:7px;height:7px;}

  /* Integrator portfolio rows (admin dashboard). */
  .iprow-head,.iprow{display:grid;grid-template-columns:46px 1.6fr 2fr 64px 90px;gap:14px;align-items:center;}
  .iprow-head{padding:0 8px 7px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
  .iprow-head span:first-child{width:46px;}
  .iprow{padding:12px 8px;border-radius:6px;cursor:pointer;transition:background .14s;}
  .iprow+.iprow{border-top:1px solid var(--line);border-radius:0;}
  .iprow:hover{background:var(--surface-2);}
  .iprow-id{min-width:0;}
  .iprow-name{font-weight:600;font-size:13px;font-family:var(--font-display);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .iprow-sub{font-size:12px;color:var(--text-mute);margin-top:2px;}
  .iprow-bar{min-width:0;}
  .iprow-bar .rlchips{margin-top:6px;}
  .iprow-health,.iprow-tix{justify-self:end;}
  @media (max-width:860px){
    .iprow-head{display:none;}
    .iprow{grid-template-columns:38px 1fr auto;grid-auto-rows:auto;}
    .iprow-bar{grid-column:1/-1;}
  }

  /* Client health board + client "my sites" card grid. */
  .clbgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));gap:14px;}   /* v1.4.10.438: auto-fit — two clients share the band instead of two cards and two empty tracks */
  .clbcard{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:15px 16px;cursor:pointer;
    box-shadow:var(--shadow-sm);transition:transform .15s,box-shadow .15s,border-color .15s;display:flex;flex-direction:column;gap:9px;}
  .clbcard:hover{transform:translateY(-2px);box-shadow:var(--shadow-md,0 8px 22px -10px rgba(15,23,42,.22));border-color:var(--line-2);}
  .clb-head{display:flex;align-items:center;gap:11px;}
  .clb-id{flex:1;min-width:0;}
  .clb-name{font-weight:600;font-size:15px;letter-spacing:-.012em;font-family:var(--font-display);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .clb-sub{font-size:12px;color:var(--text-mute);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .clbcard .rlchips{margin-top:0;}
  .clb-locs{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .clb-foot{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:auto;padding-top:2px;}
  .clb-foot .pill{font-size:11px;}
  .clb-val{margin-left:auto;font-size:12px;color:var(--text-mute);font-weight:600;white-space:nowrap;}

  /* Grouped Device Estate: Integrator › Client › Site › Location. */
  .est-int{border:1px solid var(--line);border-radius:var(--radius);margin:14px 0;overflow:hidden;background:var(--surface);}
  .est-int-head{display:flex;align-items:center;gap:13px;padding:13px 16px;background:var(--surface-2);cursor:pointer;user-select:none;}
  .est-int-head:hover{background:var(--surface-3);}
  .est-int-id{min-width:0;flex:0 1 auto;max-width:34%;}
  .est-int-name{display:block;font-family:var(--font-display);font-weight:600;font-size:15px;letter-spacing:-.012em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .est-int-meta{display:block;font-size:12px;color:var(--text-mute);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .est-int-body{padding:6px 14px 14px;}
  .est-cli{border:1px solid var(--line);border-radius:7px;margin-top:10px;overflow:hidden;}
  .est-cli-head{display:flex;align-items:center;gap:11px;padding:11px 14px;cursor:pointer;user-select:none;background:var(--surface);}
  .est-cli-head:hover{background:var(--surface-2);}
  .est-cli-id{min-width:0;flex:0 1 auto;max-width:34%;}
  .est-cli-name{display:block;font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .est-cli-meta{display:block;font-size:12px;color:var(--text-mute);   /* v1.4.10.473: meta line 12, as the integrator's above it (was 11) */margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .est-cli-body{padding:0 12px 12px;}
  .est-site{border:1px solid var(--line);border-radius:6px;margin-top:9px;overflow:hidden;background:var(--surface);}
  .est-site-head{display:flex;align-items:center;gap:10px;padding:10px 13px;cursor:pointer;user-select:none;}
  .est-site-head:hover{background:var(--surface-2);}
  .est-site-id{min-width:0;flex:0 1 auto;max-width:36%;display:flex;align-items:center;gap:7px;flex-wrap:wrap;}
  .est-site-name{font-weight:600;font-size:13px;}
  .est-site-meta{font-size:12px;color:var(--text-mute);}   /* v1.4.10.473: meta line 12, as the integrator's and client's (was 11) */
  .est-site-body{padding:2px 12px 11px;}
  .est-roll{flex:1;min-width:120px;}
  .est-roll .rlchips{margin-top:5px;}
  .est-chev{display:inline-flex;flex-shrink:0;color:var(--text-dim);transition:transform .15s;}
  .est-chev svg{width:14px;height:14px;}
  .est-chev.open{transform:rotate(90deg);}
  .est-loc{margin-top:9px;}
  .est-loc-head{display:flex;align-items:center;gap:8px;padding:6px 4px 5px;font-size:11px;color:var(--text-mute);}
  .est-loc-ico{display:inline-flex;color:var(--text-dim);}
  .est-loc-ico svg{width:12px;height:12px;}
  .est-loc-name{font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
  .est-loc-meta{font-size:11px;}
  .est-loc-head .rlchips{margin:0 0 0 auto;}
  .est-tbl{margin:0;border:1px solid var(--line);border-radius:6px;overflow:hidden;}
  .est-tbl td{padding:9px 12px;}
  @media (max-width:860px){
    .est-roll{display:none;}
    .est-int-id,.est-cli-id,.est-site-id{max-width:none;flex:1;}
  }

  /* Sites overview strip: red variant for the health tile. */
  .cust-stat.err .ic{background:rgba(220,38,38,0.12);color:var(--err);}

/* ════════════════════════════════════════════════════════════════════
   ODY PROXIES — Diagnostics (v1.4.10.63)
   Proxy-fleet cards with expandable vitals; charts reuse the .am-*
   styling from the asset Monitor tab.
   ════════════════════════════════════════════════════════════════════ */
.opx-card{border:1px solid var(--line);border-radius:7px;margin-bottom:9px;background:var(--surface);overflow:hidden;}
.opx-card.open{border-color:var(--line-2);box-shadow:0 1px 6px rgba(15,23,42,0.05);}
.opx-row{display:flex;align-items:center;gap:12px;width:100%;border:0;background:transparent;padding:13px 15px;cursor:pointer;font:inherit;text-align:left;color:var(--text);}
.opx-row:hover{background:var(--bg-2);}
.opx-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;box-shadow:0 0 0 3px var(--surface-2);}
.opx-dot.ok{background:var(--ok);}
.opx-dot.warn{background:#D97706;}
.opx-dot.err{background:var(--err);}
.opx-dot.muted{background:var(--text-dim);}
.opx-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;}
.opx-name{font-size:13px;font-weight:700;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.opx-name .pill{font-size:11px;}
.opx-meta{font-size:12px;color:var(--text-dim);}
.opx-sites{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;}
.opx-site{font-size:11px;font-weight:600;background:var(--surface-3);color:var(--text-mute);border:1px solid var(--line);border-radius:5px;padding:2px 8px;white-space:nowrap;}
.opx-site i{font-style:normal;color:var(--text-dim);font-weight:500;margin-left:2px;}
.opx-site.none{background:transparent;border-style:dashed;color:var(--text-dim);font-weight:500;}
.opx-detail{border-top:1px solid var(--line);padding:14px 15px 15px;background:var(--bg-2);}
.opx-detail .am-chart,.opx-detail .am-strip,.opx-detail .am-chart-empty{background:var(--surface);}
.opx-detail .am-kpi{background:var(--surface);}
.opx-hint{display:inline-block;margin-top:6px;font-size:12px;color:var(--text-dim);}
.opx-cap{font-size:11px;font-weight:700;color:var(--text-dim);margin:9px 0 4px;}
.opx-now{font-size:12px;color:var(--text-mute);margin:0 0 5px;}
.opx-now b{color:var(--text);font-variant-numeric:tabular-nums;}
.opx-extras{font-size:11px;color:var(--text-dim);margin:6px 0 2px;}
.opx-extras b{color:var(--text-mute);font-variant-numeric:tabular-nums;}
.opx-leg{display:flex;flex-wrap:wrap;gap:12px;margin:2px 0 5px;}
.opx-leg-i{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:500;color:var(--text-mute);}
.opx-leg-i i{width:10px;height:3px;border-radius:2px;display:inline-block;}
.opx-leg-i b{color:var(--text);font-variant-numeric:tabular-nums;}
.opx-note{display:flex;align-items:center;gap:9px;font-size:12px;color:var(--text-mute);padding:12px 16px;}
.opx-note.warn{color:#92400E;}
.opx-note svg{flex-shrink:0;}
.opx-ranges{flex-shrink:0;}
@media (max-width:900px){
  .opx-row{align-items:flex-start;}
  .opx-dot{margin-top:5px;}
}

/* ── Ody proxy vitals grid (v1.4.10.64): compact section cards so charts stay
   ~320–560 px wide instead of stretching across the whole monitor page. ── */
.opx-vitals{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:12px;align-items:start;}
.opx-sec{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:11px 13px 12px;min-width:0;}
.opx-sec.span{grid-column:1 / -1;}
.opx-sec-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin:0 0 8px;}
.opx-sec .am-chart-empty{background:var(--bg-2);}
.opx-svg{height:104px;}
.opx-sec .am-strip{height:26px;margin-bottom:2px;}
.opx-kpis{margin-bottom:12px;}
.opx-kpis .am-kpi{padding:9px 12px;}
.opx-kpis .am-kpi .v{font-size:20px;}
.opx-for{font-size:12px;font-weight:500;color:var(--text-mute);}
.opx-for b{color:var(--text);font-weight:700;}
.opx-for.none{color:var(--text-dim);font-style:italic;}
.opx-connect{margin-left:6px;vertical-align:1px;}
.opx-extras.err{color:var(--err);}
.opx-extras.err b{color:var(--err);}
.opx-extras.span{grid-column:1 / -1;margin:0;}
@media (max-width:760px){ .opx-vitals{grid-template-columns:1fr;} }

/* ============ ASSETS MOBILE PASS (1_4_10_65) ============
   Phone-width (≤600px) layout for the asset management area + the app shell
   rows it depends on. Root cause fixed above (#app minmax(0,1fr)); the rules
   here make each block genuinely comfortable at 390px rather than merely
   not-overflowing. */

/* ── App shell: header becomes two rows on phones ──
   Row 1: brand ……………… bell · avatar. Row 2: the three scope pickers,
   equal thirds, full width — big enough to read and tap. */
@media(max-width:600px){
  .topbrand{height:auto;}
  .topbrand-inner{flex-wrap:wrap;padding:8px 12px 10px;row-gap:8px;}
  .topbrand .tb-spacer{flex:1 1 auto;min-width:0;}
  .topbrand .site-picker{flex:1 1 30%;max-width:none;min-width:0;order:5;font-size:13px;}
  /* v1.4.10.473: three pickers in thirds were 110px at 390 — "All integrators" read "All int…" and "All clients"
     "All clie…" (113px and 77px of 16px text in 64px). The site picker carries the longest labels ("All sites for this
     integrator" is 205px of 16px text) and is the tier used most, so it takes a full row whenever another picker sits
     above it: a platform admin's integrator and client pickers share a row (the client picker 132px while it reads
     "All clients", half each once a client is in focus), and an integrator's client and site pickers share one until
     a client is in focus. */
  .topbrand .intg-picker:not(:empty) ~ #site-picker,.topbrand .cust-picker.scoped ~ #site-picker{flex-basis:100%;}
  .topbrand .intg-picker:not(:empty) ~ .cust-picker:not(.scoped){flex:0 0 132px;}
  /* v1.4.10.473: with the signed-in chrome painted, the avatar + sign-out block (90px) wrapped onto the pickers' row and
     squeezed "All integrators" into 124px. A platform admin's integrator and client pickers now share row 2 on their own,
     and the avatar block sits beside the site picker on row 3 (266px holds "All sites for this integrator"). */
  .topbrand:has(.intg-picker:not(:empty):not([style*="none"])) .user-foot{order:6;}
  .topbrand .intg-picker:not(:empty):not([style*="none"]){flex:1 1 150px;}   /* a real basis, or it squeezes into row 1's leftover */
  .topbrand .intg-picker:not(:empty):not([style*="none"]) ~ #site-picker{order:7;flex:1 1 0;}
}

/* ── Asset area tab strip: swipeable row instead of a 3-deep ragged wrap ── */
@media(max-width:700px){
  #content .seg{display:flex;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;max-width:100%;}
  #content .seg::-webkit-scrollbar{display:none;}
  #content .seg .seg-btn{flex:none;white-space:nowrap;padding:8px 13px;}
  #content .seg .seg-btn.seg-help{margin-left:4px;}
}

/* ── Hero: tighter padding, metrics stay 2-up but may compress ── */
@media(max-width:600px){
  .asset-hero{border-radius:8px;}
  .asset-hero .asset-hero-grid{padding:0;}
  .asset-hero-inner{padding:18px 16px;gap:14px;}
  .ah-hero-metrics{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;}
  .ah-hm{min-width:0;padding:8px 10px;}
  .ah-hm .v{font-size:20px;}
  .asset-hero h2{font-size:18px;}
  .ah-donut-wrap{gap:12px;}
}
@media(max-width:360px){
  .ah-hero-metrics{grid-template-columns:1fr;}
}

/* ── KPI tiles: fixed 2-up on phones (auto-fit alone leaves orphans) ── */
@media(max-width:600px){
  .akpi-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px;}
  .akpi{padding:12px 13px;border-radius:7px;}
  .akpi .v{font-size:20px;}
}

/* ── Toolbar: search full-width, then filters in a 2-up grid, then actions ── */
@media(max-width:600px){
  .asset-toolbar{padding:10px;gap:8px;}
  .asset-toolbar .atb-search{flex:1 1 100%;min-width:0;}
  .asset-toolbar .atb-sel{flex:1 1 calc(50% - 4px);min-width:0;}
  .asset-toolbar .atb-sel select{width:100%;min-width:0;}
  .asset-toolbar .atb-spacer{display:none;}
  .asset-toolbar .view-toggle{order:8;}
  .asset-toolbar .btn{flex:1 1 calc(50% - 4px);justify-content:center;order:9;}
  .asset-toolbar .btn.primary{flex-basis:100%;}
  .asset-toolbar .atb-clear{flex:1 1 100%;text-align:center;padding:4px 0;}
  /* v1.4.10.473: one field height down the stacked filters — MEASURED search 45, selects 43, the location picker 40
     (and 13px text among 16px fields), the Sort select 43 beside a 46px view toggle. Now 40 each, the touch layer's one
     floor (44 stood 4px taller than every other screen's fields); the picker reads 16px like its neighbours, and the
     toggle's three 40px buttons fill a 40px frame whose line is drawn inside it (as .mt-viewseg does). */
  .asset-toolbar .atb-search input,.asset-toolbar .atb-sel select,.asset-toolbar .atb-sel.atb-loc .avsel-btn{height:40px;}
  .asset-toolbar .atb-sel.atb-loc .avsel-btn{font-size:16px;}
  .asset-toolbar .view-toggle{padding:0;border:0;outline:1px solid var(--line);outline-offset:-1px;}
  .asset-toolbar .view-toggle button{min-width:40px;}
}

/* ── Saved-views bar + count line ── */
@media(max-width:600px){
}

/* ── Grouped view: site header rows wrap; value column yields ── */
@media(max-width:600px){
  .ag-sitehead{flex-wrap:wrap;row-gap:4px;}
  .ag-siteval{flex-basis:100%;text-align:left;}
}

/* ── Bulk bar: full-width sheet at the bottom on phones ── */
@media(max-width:600px){
  .bulk-bar{left:10px;right:10px;transform:translateY(20px);width:auto;max-width:none;
    flex-wrap:wrap;justify-content:center;}
  .bulk-bar.show{transform:translateY(0);}
  .bulk-bar .bb-actions{justify-content:center;}
}

/* ── Detail modal: header QR block already reflows ≤680; tighten pane pads ── */
@media(max-width:600px){
  /* v1.4.10.253: the order:-1 + margin-left:auto pair that lived here put the
     Edit button visually LEFT of the pane title — the intro is flex:1 with
     min-width:0, so the row never wraps, the free space margin-left:auto was
     meant to absorb never exists, and order:-1 simply painted the button
     first. Title left, Edit right (the desktop order) is correct here too. */
  .adt-pane-head{flex-wrap:wrap;}
}

/* ── Consumables / catalog / site-assets / reports cards inherit their own
     auto-fit grids; ensure the few fixed-min grids can shrink ── */
@media(max-width:600px){
  .sv-grid{grid-template-columns:1fr;}
  .rpt-grid{grid-template-columns:1fr;}
  .mm-mrow{flex-wrap:wrap;row-gap:2px;}
  .mm-mval{min-width:0;}
}

/* ── Mobile pass, residuals: comfortable touch sizes + last overflow ── */
@media(max-width:600px){
  /* Panel-head action buttons may be several — let them wrap, never poke out */
  .panel-head .head-actions{flex-wrap:wrap;}
  /* Saved-views select renders sub-20px tall without this */
  /* 16px stops iOS Safari auto-zooming the field on focus */
  .atb-search input,.asset-toolbar select{font-size:16px;}
}
@media(max-width:700px){
  #content .seg .seg-btn{min-height:36px;}
}
@media(max-width:600px){
  /* Row-level actions get thumb-sized without changing desktop density */
  .btn.sm{min-height:34px;}
  .btn.xs{min-height:28px;}
  .ra-btn{min-height:34px;}
}

/* ============================================================
   1_4_10_70 — Dev Team QoL: my-card highlights, pop-out chat
   dock, voice chat, dashboard "Assigned to you", notif pills
   ============================================================ */

/* ---- Board: cards assigned to the signed-in member ---- */
.dv-card.mine{border-color:rgba(var(--bc-accent-rgb),.5);
  box-shadow:0 0 0 1.5px rgba(var(--bc-accent-rgb),.28), var(--shadow-sm);
  background:linear-gradient(0deg, rgba(var(--bc-accent-rgb),.055), rgba(var(--bc-accent-rgb),.055)), var(--surface);}
.dv-card.mine:hover{box-shadow:0 0 0 1.5px rgba(var(--bc-accent-rgb),.42), var(--shadow-md);}
.dv-mine-chip{display:inline-flex;align-items:center;padding:1px 7px;border-radius:999px;
  background:var(--brand-blue);color:#fff;font-size:10px;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;line-height:1.5;}
.dv-lrow.mine td:first-child{box-shadow:inset 3px 0 0 var(--brand-blue);}
.dv-lrow.mine{background:rgba(var(--bc-accent-rgb),.045);}
.dv-pchip.minechip{color:var(--brand-blue);border-color:rgba(var(--bc-accent-rgb),.4);}
.dv-pchip.minechip.on{background:var(--accent-glow);}

/* ---- Pop-out Team-chat dock ---- */
#dv-dock{position:fixed;right:22px;bottom:22px;z-index:1600;width:340px;height:460px;
  display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--line-2);
  border-radius:8px;box-shadow:0 18px 50px rgba(2,6,23,.28), var(--shadow-md);overflow:hidden;}
#dv-dock .dv-dock-head{display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:9px 10px 9px 13px;border-bottom:1px solid var(--line);background:var(--surface-2);
  cursor:grab;user-select:none;touch-action:none;}
#dv-dock .dv-dock-head:active{cursor:grabbing;}
#dv-dock .dv-dock-title{display:inline-flex;align-items:center;gap:7px;font-size:13px;font-weight:600;}
#dv-dock .dv-dock-title svg{width:15px;height:15px;color:var(--brand-blue);}
#dv-dock .dv-dock-acts{display:inline-flex;gap:2px;}
#dv-dock .dv-dock-acts button{border:0;background:transparent;cursor:pointer;color:var(--text-mute);
  width:26px;height:26px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;}
#dv-dock .dv-dock-acts button:hover{background:var(--bg-2);color:var(--text);}
#dv-dock .dv-dock-acts svg{width:14px;height:14px;}
#dv-dock .dv-dock-voice:empty{display:none;}
#dv-dock .dv-dock-scroll{flex:1;overflow-y:auto;padding:12px 12px 6px;}
.dv-dock-empty{padding:26px 10px;text-align:center;font-size:12px;color:var(--text-dim);}
.dv-dock-msg{margin-bottom:9px;max-width:92%;}
.dv-dock-msg.mine{margin-left:auto;text-align:right;}
.dv-dock-who{font-size:11px;font-weight:700;color:var(--text-mute);margin:4px 0 2px;display:flex;gap:6px;align-items:baseline;}
.dv-dock-msg.mine .dv-dock-who{justify-content:flex-end;}
.dv-dock-who span{font-weight:500;color:var(--text-dim);font-size:11px;}
.dv-dock-text{display:inline-block;text-align:left;background:var(--surface-2);border:1px solid var(--line);
  border-radius:6px;padding:6px 10px;font-size:12px;line-height:1.45;word-break:break-word;}
.dv-dock-msg.mine .dv-dock-text{background:var(--accent-glow);border-color:rgba(var(--bc-accent-rgb),.25);}
.dv-dock-reply{font-size:11px;color:var(--text-dim);margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dv-dock-img{display:block;margin-top:4px;}
.dv-dock-img img{max-width:170px;max-height:120px;border-radius:6px;border:1px solid var(--line);display:inline-block;}
.dv-dock-doc{display:inline-flex;align-items:center;gap:6px;margin-top:4px;font-size:12px;
  border:1px solid var(--line);border-radius:6px;padding:4px 8px;color:var(--text);text-decoration:none;background:var(--surface-2);}
.dv-dock-doc svg{width:12px;height:12px;color:var(--text-mute);}
#dv-dock .dv-dock-compose{display:flex;gap:7px;align-items:flex-end;padding:9px;border-top:1px solid var(--line);background:var(--surface-2);}
#dv-dock .dv-dock-compose textarea{flex:1;resize:none;min-height:34px;max-height:90px;border:1px solid var(--line);
  border-radius:6px;padding:7px 10px;font:inherit;font-size:13px;background:var(--surface);color:var(--text);}
#dv-dock .dv-dock-compose textarea:focus{outline:none;border-color:var(--brand-blue);}
#dv-dock .dv-dock-compose .btn{padding:7px 10px;}
@media (max-width:640px){ #dv-dock{width:calc(100vw - 24px);right:12px;left:auto;height:52vh;} }

/* ---- Voice chat bar (Chat tab + dock) ---- */
.dv-voice{display:flex;align-items:center;gap:9px;flex-wrap:wrap;border:1px solid var(--line);
  border-radius:7px;background:var(--surface);padding:9px 12px;margin-bottom:14px;box-shadow:var(--shadow-sm);}
.dv-voice.compact{margin:0;border-left:0;border-right:0;border-top:0;border-radius:0;box-shadow:none;
  background:var(--surface-2);padding:7px 10px;}
.dv-voice .grow{flex:1;}
.dv-voice-hint{font-size:12px;color:var(--text-dim);}
.dv-voice-live{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;
  letter-spacing:.06em;text-transform:uppercase;color:var(--ok);}
.dv-voice-peer{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);
  border-radius:999px;padding:3px 9px 3px 4px;font-size:11px;font-weight:600;color:var(--text-mute);}
.dv-voice-peer.ok{border-color:rgba(22,163,74,.4);color:var(--text);}
.dv-voice-peer.err{border-color:rgba(220,38,38,.4);color:var(--err);}
.dv-voice-peer .mut{font-size:10px;font-weight:700;color:var(--warn);text-transform:uppercase;letter-spacing:.04em;}
#dv-voice-bar:empty{display:none;}

/* ---- Dashboard: Assigned to you ---- */
.pill.purple{background:rgba(var(--bc-purple-rgb),.12);color:var(--brand-purple);}
.dmw .panel-body{padding-top:10px;}
.dmw-row{display:flex;align-items:center;gap:11px;padding:9px 10px;border-radius:6px;cursor:pointer;}
.dmw-row:hover{background:var(--bg-2);}
.dmw-row + .dmw-row{margin-top:2px;}
.dmw-main{flex:1;min-width:0;}
.dmw-main .t{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dmw-main .s{font-size:12px;color:var(--text-mute);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dmw-main .s .dmw-ref{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}   /* v1.4.10.473: the ticket / Dev Team ref in the code face, as on the Tickets list (the line was all Poppins) */
.dmw-go{color:var(--text-dim);display:inline-flex;flex-shrink:0;}
.dmw-go svg{width:14px;height:14px;}

/* ═══════ Sites ▸ site detail & location detail (in-page drill-down) ═══════ */
.sd-crumb{margin:0 0 12px;}
.sd-hero{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:16px 18px;flex-wrap:wrap;}
.sd-hero-main{display:flex;align-items:center;gap:14px;min-width:0;flex:1;}
.sd-hero-ico{width:44px;height:44px;border-radius:7px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;color:var(--brand-blue);flex:none;}
.sd-hero-ico svg{width:22px;height:22px;}
.sd-hero-text{min-width:0;}
.sd-hero-name{font-size:18px;font-weight:700;letter-spacing:-0.01em;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.sd-hero-sub{display:flex;gap:6px;flex-wrap:wrap;color:var(--text-mute);font-size:12px;margin-top:3px;}
.sd-hero-sub span:not(:last-child)::after{content:"·";margin-left:6px;color:var(--text-dim);}
.sd-hero-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;}
.sd-cols{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(0,1fr);gap:14px;align-items:start;}
.sd-col-main,.sd-col-side{display:grid;gap:14px;min-width:0;}
@media(max-width:980px){ .sd-cols{grid-template-columns:minmax(0,1fr);} }
.sd-loc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;}
.sd-loc-card{display:flex;align-items:center;gap:11px;border:1px solid var(--line);border-radius:7px;background:var(--surface);padding:10px 12px;cursor:pointer;transition:border-color .12s, box-shadow .12s, transform .12s;min-width:0;}
.sd-loc-card:hover{border-color:var(--brand-blue);box-shadow:0 3px 10px rgba(var(--bc-accent-rgb),.09);transform:translateY(-1px);}
.sd-loc-thumb{width:58px;height:44px;border-radius:6px;overflow:hidden;flex:none;background:var(--surface-2);}
.sd-loc-thumb img{width:100%;height:100%;object-fit:cover;display:block;}
.sd-loc-thumb-ph{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--text-dim);}
.sd-loc-thumb-ph svg{width:18px;height:18px;}
.sd-loc-body{flex:1;min-width:0;}
.sd-loc-name{font-weight:600;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sd-loc-meta{display:flex;gap:5px;flex-wrap:wrap;align-items:center;margin-top:4px;}
.sd-loc-caret{color:var(--text-dim);flex:none;display:inline-flex;}
.sd-loc-caret svg{width:14px;height:14px;}
/* Location page */
.loc-photo{position:relative;min-height:120px;}
.loc-photo-img{width:100%;max-height:340px;object-fit:cover;display:block;}
.loc-photo-ph{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:150px;color:var(--text-dim);background:linear-gradient(140deg,var(--surface-2),var(--surface-3));font-size:13px;text-align:center;padding:14px;}
.loc-photo-ph svg{width:22px;height:22px;}
.loc-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px;margin-top:12px;}
.loc-facts>div{border:1px solid var(--line);border-radius:6px;padding:8px 11px;min-width:0;}
.loc-facts > div > span{display:block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:2px;}   /* v1.4.10.473: the label only - ".loc-facts span" also caught the note inside a value, so "Not set, so QR visitors can only lodge a ticket" read as an uppercase label */
.loc-facts strong{font-size:12px;font-weight:600;word-break:break-word;}
.loc-tkt-row{display:flex;align-items:center;gap:8px;padding:7px 9px;border:1px solid var(--line);border-radius:6px;margin-bottom:6px;cursor:pointer;transition:border-color .12s;}
.loc-tkt-row:hover{border-color:var(--brand-blue);}
.loc-media-row{display:flex;align-items:center;gap:9px;padding:7px 0;border-bottom:1px solid var(--line);}
.loc-media-row:last-of-type{border-bottom:none;}
.loc-media-ico{flex:none;font-size:13px;width:28px;height:28px;border-radius:6px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;}
.loc-media-ico.video{color:var(--brand-blue);}
.loc-media-acts{display:flex;align-items:center;gap:4px;flex:none;}
.loc-media-act{border:1px solid var(--line);background:var(--surface);color:var(--brand-blue);border-radius:5px;padding:3px 8px;font-size:11px;font-weight:500;cursor:pointer;text-decoration:none;line-height:1.4;
  display:inline-flex;align-items:center;min-height:30px;box-sizing:border-box;}   /* v1.4.10.473: as tall as the remove button beside it (23 beside 30) */
@media (max-width:700px),(hover:none) and (pointer:coarse){ .loc-media-act{min-height:40px;} }   /* v1.4.10.473: the Open link is an <a>, which the touch floor misses (23px) */
.loc-media-act:hover{border-color:var(--brand-blue);}
.loc-src-toggle{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:4px 0 10px;}
.loc-src-btn{border:1.5px solid var(--line);background:var(--surface);border-radius:6px;padding:9px 11px;text-align:left;cursor:pointer;font:inherit;font-size:12px;font-weight:700;color:var(--text);}
.loc-src-btn span{display:block;font-weight:500;font-size:11px;color:var(--text-mute);margin-top:2px;line-height:1.45;}
.loc-src-btn.on{border-color:var(--brand-blue);background:color-mix(in srgb, var(--brand-blue) 7%, var(--surface));}
.loc-qr-check{border:1px solid var(--line);border-radius:6px;padding:9px 11px;margin-top:10px;}
.loc-qr-check-row{display:flex;align-items:center;gap:7px;padding:2.5px 0;font-size:12px;color:var(--text-mute);}
.loc-qr-check-row.ok{color:var(--text);}
.loc-qr-check-dot{flex:none;width:16px;height:16px;border-radius:50%;background:var(--surface-2);color:var(--text-dim);font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;}
.loc-qr-check-row.ok .loc-qr-check-dot{background:color-mix(in srgb, #16A34A 15%, var(--surface));color:#16A34A;}
/* Interactive room layout */
.loc-layout-canvas{position:relative;width:100%;aspect-ratio:16/9;background:linear-gradient(140deg,var(--surface-2),var(--surface-3));background-size:cover;background-position:center;touch-action:none;user-select:none;}
.loc-layout-canvas.has-photo{background-color:var(--surface-3);}
/* v1.4.10.445: an uploaded layout picture sets the canvas's shape, so pin percentages land on the same spot of it at any width */
.loc-layout-canvas.has-plan{aspect-ratio:auto;background:var(--surface-3);}
.loc-layout-img{display:block;width:100%;height:auto;pointer-events:none;-webkit-user-drag:none;}
.loc-layout-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:12px;padding:14px;text-align:center;}
.loc-pin{position:absolute;width:28px;height:28px;margin:-14px 0 0 -14px;border-radius:50%;background:var(--brand-blue);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;box-shadow:0 2px 8px rgba(15,23,42,.35), 0 0 0 2.5px #fff;cursor:pointer;transition:transform .1s;}
.loc-pin:hover{transform:scale(1.12);z-index:3;}
.loc-pin.edit{cursor:grab;}
.loc-pin.edit:active{cursor:grabbing;}
.loc-pin-x{position:absolute;top:-7px;right:-7px;width:16px;height:16px;border-radius:50%;background:var(--err,#DC2626);color:#fff;font-size:11px;line-height:15px;text-align:center;font-weight:700;cursor:pointer;box-shadow:0 1px 4px rgba(15,23,42,.3);}
.loc-layout-bar{display:flex;align-items:center;gap:8px;padding:10px 14px;border-top:1px solid var(--line);flex-wrap:wrap;}
/* v1.4.10.473: on a phone the hint takes its own line above the buttons - beside them it was squeezed to a 95px column three lines deep */
@media (max-width:700px){ .loc-layout-bar > .device-meta,.loc-photo + div > .device-meta{min-width:100%;} .loc-photo + div{flex-wrap:wrap;} }
.loc-unplaced{display:flex;gap:6px;flex-wrap:wrap;padding:0 14px 12px;}
.loc-chip{display:inline-flex;align-items:center;gap:4px;border:1px dashed var(--line-2);background:var(--surface-2);border-radius:999px;padding:4px 11px;font-size:12px;font-weight:500;cursor:pointer;color:var(--text);}
.loc-chip:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
.loc-chip svg{width:12px;height:12px;}
.loc-legend{padding:10px 14px 12px;border-top:1px solid var(--line);display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:5px 14px;}
.loc-legend-row{display:flex;align-items:center;gap:8px;padding:3px 0;min-width:0;font-size:11px;}
.loc-legend-n{flex:none;width:19px;height:19px;border-radius:50%;background:var(--brand-blue);color:#fff;font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;}

/* ═══ 1.4.10.75 — site & room detail heroes, room gallery, QR sticker, modals ═══ */

/* Detail hero: the full-gradient identity header used by the site and room
   drill-downs (the universal page hero is suppressed on those views). Reuses
   the ph-* chip/eyebrow primitives so it reads as one family with the rest of
   the app. The room variant can carry the room photo as a dimmed backdrop. */
.det-hero{
  position:relative; overflow:hidden; border-radius:8px; padding:18px 24px;
  margin-bottom:16px;
  background:linear-gradient(115deg,#1E40AF 0%, var(--bc-blue-v1) 38%, #6D33E0 78%, var(--bc-purple-v1) 100%);
  box-shadow:0 22px 46px -24px rgba(56,48,140,.62), inset 0 1px 0 rgba(255,255,255,.14);
  isolation:isolate;
}
.det-hero::before{ /* dot grid wash */
  content:""; position:absolute; inset:0; z-index:-1;
  background-image:radial-gradient(rgba(255,255,255,.16) 1px, transparent 1.4px);
  background-size:22px 22px; opacity:.55;
  -webkit-mask-image:linear-gradient(95deg,#000,transparent 72%);
          mask-image:linear-gradient(95deg,#000,transparent 72%);
}
.det-hero::after{ /* glow blob */
  content:""; position:absolute; z-index:-1; right:-90px; top:-130px; width:340px; height:340px;
  background:radial-gradient(circle at center, rgba(167,139,250,.55), rgba(167,139,250,0) 64%);
}
.det-hero.has-photo{
  background-image:linear-gradient(115deg, rgba(23,37,84,.92) 0%, rgba(var(--bc-accent-rgb),.78) 45%, rgba(109,51,224,.72) 100%), var(--dh-photo);
  background-size:cover; background-position:center;
}
.det-hero.has-photo::before{ opacity:.25; }
.det-hero .page-title{ color:#fff; font-size:20px; line-height:1.12; margin:0; display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.det-hero .page-sub{ color:rgba(255,255,255,.84); font-size:13px; margin-top:4px; max-width:720px; }
.dh-tag{
  font-family:var(--font-mono);font-variant-numeric:tabular-nums; font-size:12px; font-weight:600; letter-spacing:.04em;
  color:#fff; background:rgba(255,255,255,.16); border:1px solid rgba(255,255,255,.30);
  border-radius:6px; padding:3px 9px; vertical-align:middle;
}
.dh-mark{ flex:none; background:rgba(255,255,255,.92); border-radius:8px; padding:6px; box-shadow:0 6px 18px rgba(15,23,42,.25); }
.dh-actions{ display:flex; flex-direction:column; gap:8px; flex:none; align-items:stretch; }
.det-hero .btn.ghost{ background:rgba(255,255,255,.13); border-color:rgba(255,255,255,.32); color:#fff; }
.det-hero .btn.ghost:hover{ background:rgba(255,255,255,.24); border-color:rgba(255,255,255,.5); color:#fff; }
.det-hero .btn.primary{ background:#fff; color:#1E40AF; border-color:#fff; }
.det-hero .btn.primary:hover{ background:rgba(255,255,255,.9); }
@media (max-width:760px){
  .det-hero{ padding:15px 16px; } .det-hero .page-title{ font-size:18px; }
  .det-hero .ph-row{ flex-direction:column; align-items:flex-start; gap:12px; }
  .dh-actions{ flex-direction:row; flex-wrap:wrap; width:100%; }
  .dh-actions .btn{ flex:1 1 auto; justify-content:center; white-space:nowrap; }   /* v1.4.10.473: labels stay on one line and the row wraps - three to a row wrapped "Site / stats" and "Edit / location" to 50px beside 40px buttons */
}

/* Room gallery on the site page — photo-forward cards that scale to hundreds
   of rooms (thumbs lazy-load via IntersectionObserver as cards scroll in). */
.sd-room-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(min(228px,100%),1fr)); gap:12px; }
.sd-room-card{
  border:1px solid var(--line); border-radius:8px; background:var(--surface); overflow:hidden;
  cursor:pointer; min-width:0; display:flex; flex-direction:column;
  transition:border-color .12s, box-shadow .12s, transform .12s;
}
.sd-room-card:hover{ border-color:var(--brand-blue); box-shadow:0 6px 18px rgba(var(--bc-accent-rgb),.13); transform:translateY(-2px); }
.sd-room-thumb{ position:relative; aspect-ratio:16/9; background:var(--surface-2); overflow:hidden; }
.sd-room-thumb img{ width:100%; height:100%; object-fit:cover; display:block; }
.sd-room-ph{
  width:100%; height:100%; display:flex; flex-direction:column; gap:4px;
  align-items:center; justify-content:center; color:var(--text-dim);
  background:linear-gradient(140deg,var(--surface-2),var(--surface-3)); font-size:11px;
}
.sd-room-ph svg{ width:18px; height:18px; }
.sd-room-ph.shimmer{ position:relative; overflow:hidden; }
.sd-room-ph.shimmer::after{
  content:""; position:absolute; inset:0;
  background:linear-gradient(100deg, transparent 30%, rgba(255,255,255,.10) 50%, transparent 70%);
  animation:sdshimmer 1.6s ease-in-out infinite;
}
@keyframes sdshimmer{ 0%{transform:translateX(-100%);} 100%{transform:translateX(100%);} }
.sd-room-code{
  position:absolute; left:8px; top:8px; font-family:var(--font-mono);font-variant-numeric:tabular-nums;
  font-size:11px; font-weight:600; letter-spacing:.04em; color:#fff;
  background:rgba(15,23,42,.62); border:1px solid rgba(255,255,255,.25);
  border-radius:5px; padding:2px 7px; backdrop-filter:blur(3px);
}
.sd-room-qr{
  position:absolute; right:8px; top:8px; font-size:10px; font-weight:700; letter-spacing:.04em; text-transform:uppercase;
  color:#065F46; background:#A7F3D0; border-radius:6px; padding:2px 6px;
}   /* v1.4.10.473: the badge look, 10/700 uppercase .04em */
.sd-room-body{ padding:10px 12px 11px; }
.sd-room-name{ font-weight:600; font-size:13px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sd-room-meta{ display:flex; gap:5px; flex-wrap:wrap; align-items:center; margin-top:5px; }

/* Room filter box (shows on sites with more than a handful of rooms). */
.sd-room-search{
  display:flex; align-items:center; gap:7px; flex:1; min-width:220px; max-width:420px;
  border:1px solid var(--line); border-radius:6px; background:var(--surface); padding:5px 10px;
}   /* v1.4.10.473: 5px (was 6) - the box stands 34 like the pickers and buttons in its row (was 36) */
.sd-room-search svg{ width:14px; height:14px; color:var(--text-dim); flex:none; }
.sd-room-search input{
  flex:1; min-width:0; border:0; outline:0; background:transparent; color:var(--text); font-size:13px;
  text-overflow:ellipsis;   /* v1.4.10.473: a placeholder longer than a phone's field ends in an ellipsis, not mid-word */
}

/* Room asset rows */
.loc-asset-row:hover td{ background:var(--surface-2); }

/* Modal header icon badge ("Add to this room" and friends). */
.mh-badge{
  display:inline-flex; align-items:center; justify-content:center; width:30px; height:30px;
  border-radius:6px; background:linear-gradient(135deg,var(--bc-blue-v1),var(--bc-purple-v1)); color:#fff; flex:none;
}
.mh-badge svg{ width:16px; height:16px; }

/* On-screen QR sticker preview — mirrors the printed label. */
.loc-qr-sticker{
  background:#fff; border:1.5px solid #E2E8F2; border-radius:8px;
  padding:14px 14px 12px; text-align:center; color:#0F172A;
  box-shadow:0 4px 14px rgba(15,23,42,.08);
}
.loc-qr-brand{ font-size:11px; letter-spacing:.06em; font-weight:600; color:var(--bc-blue-v1); text-transform:uppercase; margin-bottom:7px; }   /* v1.4.10.473: the eyebrow look, 11/600 .06em (was 10/700 tracked .22em); the printed sticker matches */
.loc-qr-code{
  display:inline-block; font-family:var(--font-mono);font-variant-numeric:tabular-nums; font-size:11px;
  background:#F2F5FA; border:1px solid #E2E8F2; border-radius:6px; padding:1.5px 7px; margin-bottom:4px; color:#0F172A;
}
.loc-qr-room{ font-size:15px; font-weight:600; letter-spacing:-.01em; line-height:1.35; }   /* v1.4.10.473: card title 15/600 (was 700); a two-line room name keeps 1.35 */
.loc-qr-site{ font-size:12px; color:#5A6B85; margin-top:2px; }
.loc-qr-canvas{ display:flex; justify-content:center; padding:8px 0 2px; }
.loc-qr-canvas svg{ border-radius:6px; }
.loc-qr-cap{ font-size:13px; font-weight:600; margin-top:4px; }   /* v1.4.10.473: the call to action is a sub-heading, 13/600, as on the printed label (was 12/700, no role's look) */
.loc-qr-phone{ margin-top:7px; font-size:12px; font-weight:600; border-top:1px dashed #E2E8F2; padding-top:7px; }

/* ═══════════ Team-chat pop-out window (/chat) ═══════════
   The pop-out is this same app in a chrome-less mode: hide every piece of the
   shell except the chat surface, and let the chat panel fill the window so it
   behaves like a proper standalone chat client on a second monitor. */
body.chat-popout .topbrand,
body.chat-popout .topnav,
body.chat-popout .page-hero-host,
body.chat-popout .app-footer,
body.chat-popout #dv-dock{ display:none !important; }
body.chat-popout .main{ padding:0; margin:0; max-width:none; }
body.chat-popout .content{ padding:10px 12px 12px; max-width:none; height:100vh; height:100dvh; display:flex; flex-direction:column; box-sizing:border-box; }
body.chat-popout .chat-popout-head{
  display:flex; align-items:center; gap:8px; padding:4px 4px 10px;
  font-size:13px; color:var(--text);
}
body.chat-popout .chat-popout-head svg{ width:17px; height:17px; color:var(--brand-blue); }
body.chat-popout #dv-voice-bar{ flex-shrink:0; }
body.chat-popout .dv-chat{ flex:1; min-height:0; grid-template-columns:1fr; }
body.chat-popout .dv-chat-panel{ height:100%; min-height:0; }
body.chat-popout .dv-chat-side{ display:none; }   /* members list lives in the main app */
@media (min-width:640px){
  body.chat-popout .dv-chat{ grid-template-columns:1fr 200px; }
  body.chat-popout .dv-chat-side{ display:block; overflow-y:auto; max-height:100%; }
}

/* Group Call system lines in Team chat ("X joined the Group Call"). */
.dv-msg-sys{
  display:flex; align-items:center; justify-content:center; gap:6px;
  margin:8px auto; padding:3px 12px; max-width:90%;
  font-size:12px; color:var(--text-dim);
  background:var(--bg-2); border:1px solid var(--line); border-radius:999px;
}
.dv-msg-sys svg{ width:13px; height:13px; opacity:.7; flex-shrink:0; }
.dv-msg-sys .t{ font-size:11px; color:var(--text-dim); opacity:.75; }
.dv-msg-sys.sm{ font-size:11px; margin:6px auto; padding:2px 10px; }

/* ════════════ 1.4.10.78 — Sites-area quick nav, per-site panels, help,
   maintenance editor v2, Ody availability ════════════ */

/* Asset editor: the "Monitor with Ody" segment when the chosen site can't
   offer it (Ody switched off / no proxy). Still visible so the WHY is
   readable, but clearly inert. */
.ae-mon-seg.unavailable{opacity:.5;cursor:not-allowed;filter:grayscale(.4);}
.ae-mon-seg.unavailable:hover{border-color:var(--line);box-shadow:none;background:var(--surface);}

/* ── Site page — section tabs (v1.4.10.189) ────────────────────────────────
   Replaces the quick-nav chip row: every site area is its own page now, so
   this is a real tab strip, not a set of scroll anchors. */
.sd-tabstrip{display:flex;gap:4px;flex-wrap:wrap;margin:16px 0 14px;border-bottom:1px solid var(--line);padding-bottom:0;}
.sd-tab{appearance:none;display:inline-flex;align-items:center;gap:7px;border:0;border-bottom:2px solid transparent;
  background:none;color:var(--text-mute);padding:9px 14px;font-size:13px;font-weight:600;cursor:pointer;
  border-radius:6px 6px 0 0;transition:color .13s,border-color .13s,background .13s;white-space:nowrap;}
.sd-tab svg{width:15px;height:15px;flex:none;}
.sd-tab:hover{color:var(--text);background:var(--surface-2);}
.sd-tab.on{color:var(--brand-blue);border-bottom-color:var(--brand-blue);background:none;}
.sd-tab-n{display:inline-flex;align-items:center;justify-content:center;min-width:19px;height:17px;padding:0 5px;
  border-radius:999px;background:var(--surface-2);color:var(--text-mute);font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;}   /* v1.4.10.473: count badge, 10/700 uppercase .04em (was untracked) */
.sd-tab.on .sd-tab-n{background:var(--accent-glow);color:var(--brand-blue);}
.sd-tabbody{min-width:0;}

/* Overview → "Where next" cards, one per other tab. */
.sd-jumps{display:grid;gap:8px;}
.sd-jump{appearance:none;display:flex;align-items:center;gap:11px;width:100%;text-align:left;cursor:pointer;
  border:1px solid var(--line);border-radius:6px;background:var(--surface);padding:10px 12px;
  transition:border-color .13s,box-shadow .13s,transform .13s;}
.sd-jump:hover{border-color:var(--brand-blue);box-shadow:0 3px 10px rgba(var(--bc-accent-rgb),.09);transform:translateY(-1px);}
.sd-jump-ico{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;flex:none;
  border-radius:6px;background:var(--accent-glow);color:var(--brand-blue);}
.sd-jump-ico svg{width:15px;height:15px;}
.sd-jump-txt{flex:1;min-width:0;display:block;}
.sd-jump-txt b{display:block;font-size:13px;font-weight:600;color:var(--text);}
.sd-jump-txt span{display:block;font-size:12px;color:var(--text-mute);margin-top:2px;overflow-wrap:anywhere;}
.sd-jump-go{color:var(--text-dim);flex:none;display:inline-flex;}
.sd-jump-go svg{width:14px;height:14px;}

/* ── Locations browser (v1.4.10.189) ──────────────────────────────────────
   Toolbar, collapsible Building → Level bands, compact room rows. */
.sd-loctools{padding:12px 14px;margin-bottom:12px;}
.sd-loctools-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.sd-loctools-row .sd-room-search{flex:1 1 260px;min-width:0;}
.sd-loctools-row .ex-sel{max-width:100%;}
.sd-loctools-row .ex-sel,.sd-loctools-row .sd-chiptog,.sd-loctools-row > .btn{min-height:34px;}   /* v1.4.10.375: 27px pickers beside 31px chips. v1.4.10.473: one row height, 34 - the pickers stood 33, the chip 32 and Expand / Collapse all 27 beside the 34px view toggle */
.bl-step{align-self:stretch;min-width:42px;justify-content:center;}   /* v1.4.10.375: − / + as tall as the number between them (v1.4.10.473: its 16/700 never applied, .btn.sm's 12/500 outranks it, so it is gone) */
.sd-loctools-sum{margin-top:9px;font-size:12px;color:var(--text-mute);}
.sd-chiptog{appearance:none;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);
  background:var(--surface);color:var(--text-mute);border-radius:999px;padding:6px 12px;font-size:12px;
  font-weight:500;cursor:pointer;transition:color .13s,border-color .13s,background .13s;}
.sd-chiptog svg{width:13px;height:13px;}
.sd-chiptog:hover{color:var(--warn);border-color:var(--warn);}
.sd-chiptog.on{color:var(--warn);border-color:var(--warn);background:rgba(217,119,6,.08);}
.sd-viewtog{display:inline-flex;border:1px solid var(--line);border-radius:6px;overflow:hidden;}
.sd-viewtog button{appearance:none;border:0;background:var(--surface);color:var(--text-mute);cursor:pointer;
  display:inline-flex;align-items:center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600;}
.sd-viewtog button svg{width:13px;height:13px;}
.sd-viewtog button+button{border-left:1px solid var(--line);}
.sd-viewtog button.on{background:var(--accent-glow);color:var(--brand-blue);}

.sd-locpanel{padding:0;overflow:hidden;margin-bottom:10px;}
.sd-band{appearance:none;display:flex;align-items:center;gap:10px;width:100%;text-align:left;cursor:pointer;
  border:0;background:none;padding:11px 14px;color:var(--text);}
.sd-band:hover{background:var(--surface-2);}
.sd-band-bldg{font-size:15px;font-weight:600;letter-spacing:-.01em;}   /* v1.4.10.473: a building band is a card title, 15/600, as the Rooms page draws the same building (was 14/700) */
.sd-band-lvl{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);
  border-top:1px solid var(--line);}
.sd-locpanel > .sd-lvl:first-child > .sd-band-lvl{border-top:0;}
.sd-band-ico{display:inline-flex;color:var(--brand-blue);flex:none;}
.sd-band-ico svg{width:16px;height:16px;}
.sd-band-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sd-band-meta{margin-left:auto;font-size:12px;font-weight:400;color:var(--text-mute);text-transform:none;letter-spacing:0;white-space:nowrap;}   /* v1.4.10.473: meta line 12/400 (was 500) */
.sd-band-lvl .pill{text-transform:none;}   /* v1.4.10.473: a status pill reads in sentence case; inside the uppercase level band it inherited "1 NEEDS ATTENTION" while the building band's said "1 needs attention" */
.sd-band > .pill{flex:none;white-space:nowrap;}   /* v1.4.10.473: the attention pill keeps its one line (squeezed, it wrapped into a 30px two-line blob) */
.sd-caret{display:inline-flex;color:var(--text-dim);flex:none;transition:transform .15s;}
.sd-caret svg{width:14px;height:14px;}
.sd-bldg.on > .sd-band > .sd-caret,.sd-lvl.on > .sd-band > .sd-caret{transform:rotate(90deg);}
.sd-band-body{padding:0;}
.sd-lvl > .sd-band-body:not(:empty){padding:4px 14px 14px;}
.sd-bldg > .sd-band-body:not(:empty){padding-bottom:2px;}

.sd-locrows{display:grid;gap:6px;}
.sd-locrow{display:grid;grid-template-columns:minmax(0,1fr) auto auto 16px;align-items:center;gap:12px;
  border:1px solid var(--line);border-radius:6px;background:var(--surface);padding:8px 11px;cursor:pointer;
  transition:border-color .12s,box-shadow .12s;}
.sd-locrow:hover{border-color:var(--brand-blue);box-shadow:0 2px 8px rgba(var(--bc-accent-rgb),.08);}
.lr-main{display:flex;align-items:center;gap:8px;min-width:0;}
.lr-code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;color:var(--brand-blue);
  background:var(--accent-glow);border-radius:5px;padding:2px 6px;flex:none;}
.lr-name{font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
.lr-tags{display:flex;align-items:center;gap:5px;flex-wrap:wrap;justify-content:flex-end;}
.lr-assets{font-size:12px;color:var(--text-mute);white-space:nowrap;}
.lr-assets b{color:var(--text);font-size:13px;}
.lr-go{color:var(--text-dim);display:inline-flex;}
.lr-go svg{width:14px;height:14px;}

/* Phones: the row stacks instead of growing a sideways scroller. */
@media (max-width:700px){
  .sd-tabstrip{gap:2px;overflow-x:auto;flex-wrap:nowrap;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
  .sd-tabstrip::-webkit-scrollbar{display:none;}
  .sd-tab{padding:9px 11px;}   /* v1.4.10.473: a tab is 13/600 on a phone too (was 12); the strip scrolls sideways */
  /* v1.4.10.473: the room toolbar's controls stand 40 like the phone floor (the chip stood 32 under the 34 desktop rule
     above, which outranks the touch floor); the search box's own 40 is the touch layer's (its input no longer adds one) */
  .sd-loctools-row .ex-sel,.sd-loctools-row .sd-chiptog,.sd-loctools-row > .btn{min-height:40px;}
  /* v1.4.10.473: every control fills the row it wraps to, so the stack reads as one column (four pickers stood at four
     widths and Collapse all sat alone); the view switch takes its own row and Expand / Collapse all pair under it */
  .sd-loctools-row > *{flex:1 1 auto;}
  .sd-loctools-row .sd-viewtog{flex:1 1 100%;}
  .sd-viewtog button{flex:1 1 0;justify-content:center;}
  .sd-loctools-row .sd-chiptog,.sd-loctools-row > .btn{justify-content:center;}
  /* v1.4.10.473: a band's counts and attention pill drop to a second line under the name (squeezed onto one line the
     building name shrank to "E…" and the pill wrapped); the meta line is 12/400 here too */
  .sd-band{flex-wrap:wrap;row-gap:4px;}
  .sd-band-name{flex:1 1 60%;}
  .sd-band-meta{margin-left:24px;}
  .sd-band > .pill{margin-left:auto;}
  .sd-locrow{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"main go" "tags assets";row-gap:6px;}
  .lr-main{grid-area:main;}
  .lr-go{grid-area:go;}
  .lr-tags{grid-area:tags;justify-content:flex-start;}
  .lr-assets{grid-area:assets;text-align:right;}
  .sd-lvl > .sd-band-body:not(:empty){padding:4px 10px 12px;}
}

/* Site page help guide rows. */
.sdh-row{display:flex;align-items:flex-start;gap:12px;padding:11px 0;border-top:1px solid var(--line);}
.sdh-row:first-of-type{border-top:0;padding-top:2px;}
.sdh-text{flex:1;min-width:0;}
.sdh-t{font-weight:600;font-size:13px;margin-bottom:2px;}
.sdh-b{font-size:12px;color:var(--text-mute);line-height:1.65;}
.sdh-row .btn{flex-shrink:0;margin-top:2px;white-space:nowrap;}

/* Maintenance editor v2 — labelled steps + work-type cards + duration row. */
.me-ed .site-ed-body{padding-top:14px;}
.me-step{border:1px solid var(--line);border-radius:7px;padding:14px 16px;margin-bottom:12px;background:var(--surface);}
.me-step-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:12px;}
.me-step-n{flex-shrink:0;width:22px;height:22px;border-radius:50%;background:var(--brand-blue);color:#fff;
  display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;margin-top:1px;}
.me-step-t{font-weight:600;font-size:13px;}
.me-step-s{font-size:12px;color:var(--text-mute);margin-top:1px;line-height:1.5;}
.me-type-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:8px;}
.me-type-card{appearance:none;text-align:left;border:1px solid var(--line);background:var(--surface);border-radius:6px;
  padding:9px 11px;cursor:pointer;display:grid;grid-template-columns:10px 1fr;grid-column-gap:8px;align-items:center;
  color:var(--text);transition:border-color .13s,box-shadow .13s;}
.me-type-card .me-type-dot{width:10px;height:10px;border-radius:3px;background:var(--c);grid-row:1 / span 2;}
.me-type-card .me-type-l{font-weight:600;font-size:12px;}
.me-type-card .me-type-d{grid-column:2;font-size:11px;color:var(--text-mute);line-height:1.4;margin-top:1px;}
.me-type-card:hover{border-color:var(--c);}
.me-type-card.on{border-color:var(--c);box-shadow:0 0 0 1px var(--c) inset;}
.me-durs{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:2px;}
.me-status-seg{flex-wrap:wrap;}

/* Print-month button rides in the maintenance head; keep it tidy on mobile. */
.mt-head-actions{flex-wrap:wrap;row-gap:8px;}

/* Site SLA / estate panels reuse .health-row + data-table; the collapsed
   business-hours block just needs a calm summary marker. */
.sd-bh summary::-webkit-details-marker{color:var(--text-dim);}
.sd-bh[open] summary{margin-bottom:2px;}
/* v1.4.10.473: a closed block draws nothing but its summary. Chrome still lays a closed <details>' body out at full size
   (content-visibility), so the 519px business-hours form measured as spilling out of the 31px summary on the Support tab */
.sd-bh:not([open]) > :not(summary){display:none;}

/* ── Per-site clock (v1.4.10.188) ──────────────────────────────────────────
   The site's own timezone + working window, shown on its SLA panel, and the
   small "local time there" chip used wherever a site-scoped time is shown to
   a viewer whose own clock is different. */
.sd-clock{margin-top:14px;border:1px solid var(--line);border-radius:7px;padding:12px 14px;background:var(--surface-2,var(--bg-soft,transparent));}
.sd-clock-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.sd-clock-ico{display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;border-radius:6px;background:var(--accent-glow);color:var(--brand-blue);flex-shrink:0;}
.sd-clock-ico svg{width:17px;height:17px;}
.sd-clock-t{font-weight:600;font-size:13px;}
.sd-clock-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(150px,100%),1fr));gap:10px;margin:12px 0 8px;}
.sd-clock-grid > div{display:flex;flex-direction:column;gap:2px;font-size:13px;}
.site-clock{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--text-mute);white-space:nowrap;}
.site-clock svg{width:13px;height:13px;}
.alog-local{color:var(--text-mute);}
@media (max-width:700px){
  .sd-clock{padding:11px 12px;}
  .sd-clock-head .btn{margin-left:auto;}
}

/* Site-page columns: a grid item's default min-width is min-content, so the
   SLA / estate panels were sized by their widest TABLE and grew to ~680px
   inside a 366px column on a phone — the panels themselves hung off the side
   of the page instead of the tables scrolling inside their .cust-table-wrap.
   (Pre-existing since the site page was columned; found while fitting the
   site-clock block, v1.4.10.188.) */
.sd-col-main > *, .sd-col-side > *{min-width:0;}

/* ============================================================
   1_4_10_80 — Mobile completeness pass + named friendly URLs
   ============================================================ */

/* ── Mobile search: magnifier button in the brand bar opens a full-width
   search row (the desktop search box is hidden ≤600px and there's no ⌘K on a
   touch keyboard — search was unreachable on phones). ── */
.msearch-btn{display:none;}
@media(max-width:600px){
  .msearch-btn{display:inline-flex;}
  /* .search-open drops the (otherwise hidden) search box into its own
     full-width row under the pickers. */
  .topbrand.search-open .search-box{display:block;flex:1 1 100%;order:10;min-width:0;}
  .topbrand.search-open .search-box input{width:100%;font-size:16px;}   /* 16px stops iOS focus-zoom */
  .topbrand.search-open .search-box input:focus{width:100%;}
  .topbrand.search-open .msearch-btn{color:var(--brand-blue);border-color:var(--brand-blue);background:var(--accent-glow);}
  /* Results sheet: full width of the row, capped so the keyboard never
     swallows it entirely. */
  .search-results{left:0;right:0;width:auto;max-height:min(440px,55dvh);}
}

/* ── iOS focus-zoom guard: any text field or select inside a modal reads at
   16px on phones, so tapping a form field never zooms the whole page. ── */
@media(max-width:600px){
  #modal input[type="text"],#modal input[type="email"],#modal input[type="password"],
  #modal input[type="number"],#modal input[type="search"],#modal input[type="url"],
  #modal input[type="tel"],#modal input[type="date"],#modal input[type="time"],
  #modal input[type="datetime-local"],#modal input:not([type]),
  #modal select,#modal textarea{font-size:16px;}
}

/* ── Notched phones (viewport-fit=cover): keep the shell and content clear of
   the sensor housing and home indicator. max() keeps every existing padding
   as the floor, so non-notched devices are untouched. ── */
@supports(padding:max(0px)){
  @media(max-width:600px){
    .topbrand-inner{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right));}
    .topnav{padding-left:max(4px,env(safe-area-inset-left));padding-right:max(4px,env(safe-area-inset-right));}
    .content{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right));
      padding-bottom:calc(40px + env(safe-area-inset-bottom));}
    /* v1.4.10.473: the page hero keeps the content's gutter — it sat 16px in above panels 12px in */
    .page-hero-host:not(:empty){padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right));}
    .af-inner{padding-bottom:calc(14px + env(safe-area-inset-bottom));}
    .modal-back{padding-bottom:calc(28px + env(safe-area-inset-bottom));}
  }
}

/* ── data-table parity with .dt: any container holding one scrolls it on
   phones instead of forcing page-wide overflow (covers future call sites that
   forget the .cust-table-wrap wrapper). ── */
@media(max-width:760px){
  .panel-body:has(table.data-table),
  .modal-body:has(table.data-table){overflow-x:auto;-webkit-overflow-scrolling:touch;}
  table.data-table{min-width:430px;}
}

/* ============================================================
   1_4_10_81 — Camera capture everywhere, ticket attachments,
   profile pictures + fixes
   ============================================================ */

/* ── Camera capture sheet (shared by every upload surface) ── */
.cam-sheet{position:fixed;inset:0;background:rgba(8,12,22,.92);z-index:1700;display:flex;flex-direction:column;   /* v1.4.10.429: above the 1600 Team-chat dock —
   at 400 the dock floated over the capture sheet and covered the shutter bar on a phone; still under the 4000/9990 alert layers */
  align-items:center;justify-content:center;gap:0;backdrop-filter:blur(4px);}
.cam-stage{position:relative;flex:1;min-height:0;width:100%;display:flex;align-items:center;justify-content:center;padding:18px;}
.cam-stage video{max-width:100%;max-height:100%;border-radius:8px;background:#000;
  box-shadow:0 18px 60px rgba(0,0,0,.5);}
.cam-hint{position:absolute;color:#cbd5e1;font-size:13px;background:rgba(15,23,42,.7);padding:8px 16px;border-radius:10px;}
/* v1.4.10.325: a refused camera keeps the sheet open, says why, and offers the
   native camera app as a button (a fresh tap — see camCapture in js/01-core.js). */
.cam-hint.cam-hint-err{display:flex;flex-direction:column;align-items:center;gap:12px;max-width:min(440px,calc(100vw - 48px));
  text-align:center;font-size:13px;line-height:1.45;color:#f1f5f9;padding:16px 18px;border-radius:8px;background:rgba(15,23,42,.88);}
.cam-hint.cam-hint-err #cam-fallback{min-height:40px;}
.cam-bar{display:flex;align-items:center;justify-content:center;gap:44px;width:100%;
  padding:14px 0 calc(22px + env(safe-area-inset-bottom, 0px));}
.cam-shutter{width:64px;height:64px;border-radius:50%;border:4px solid #fff;background:rgba(255,255,255,.25);
  cursor:pointer;transition:transform .1s,background .15s;}
.cam-shutter:not(:disabled):hover{background:rgba(255,255,255,.45);}
.cam-shutter:not(:disabled):active{transform:scale(.92);}
.cam-shutter:disabled{opacity:.4;cursor:default;}
.cam-side{width:46px;height:46px;border-radius:50%;border:1px solid rgba(255,255,255,.35);background:rgba(255,255,255,.1);
  color:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .15s;}
.cam-side:hover{background:rgba(255,255,255,.22);}
.cam-side svg{width:18px;height:18px;}

/* ── Slim dropzone variant (ticket cards, add-attachment, new-ticket form) ── */
.dropzone.dz-slim{display:flex;align-items:center;justify-content:center;gap:8px;padding:12px 14px;font-size:12px;
  color:var(--text-mute);border:1.5px dashed var(--line-2);border-radius:6px;cursor:pointer;background:var(--surface-2);
  transition:border-color .15s,background .15s;text-align:center;flex-wrap:wrap;}
.dropzone.dz-slim:hover,.dropzone.dz-slim.drag{border-color:var(--brand-blue);background:var(--accent-glow);color:var(--text);}
.dropzone.dz-slim svg{flex-shrink:0;}

/* ── Staged new-ticket files ── */
.nt-att-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;}
.nt-att-chip{display:inline-flex;align-items:center;gap:6px;max-width:100%;background:var(--surface-2);
  border:1px solid var(--line);border-radius:8px;padding:4px 6px 4px 10px;font-size:12px;}
.nt-att-chip .nac-n{max-width:180px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.nt-att-chip button{background:transparent;border:0;color:var(--text-dim);cursor:pointer;width:20px;height:20px;
  border-radius:50%;display:inline-flex;align-items:center;justify-content:center;}
.nt-att-chip button:hover{background:var(--surface-3);color:var(--err);}

/* ── Composer drop state ── */
.tkd-composer.drag{outline:2px dashed var(--brand-blue);outline-offset:-4px;border-radius:7px;}

/* ── Top-right avatar: photo mode ── */
.avatar.has-photo{padding:0;overflow:hidden;background:var(--surface-3);}
.avatar img{width:100%;height:100%;object-fit:cover;display:block;border-radius:inherit;}

/* ── My profile: picture row ── */
.mp-avatar-row{display:flex;gap:16px;align-items:flex-start;border:1px solid var(--line);border-radius:7px;
  padding:14px;margin-bottom:16px;background:var(--surface-2);transition:border-color .15s,background .15s;}
.mp-avatar-row.drag{border-color:var(--brand-blue);border-style:dashed;background:var(--accent-glow);}
.mp-avatar{width:72px;height:72px;border-radius:8px;background:var(--grad);color:#fff;display:flex;align-items:center;
  justify-content:center;font-weight:600;font-size:20px;font-family:var(--font-display);flex-shrink:0;overflow:hidden;}
.mp-avatar img{width:100%;height:100%;object-fit:cover;display:block;}
.mp-avatar-acts{flex:1;min-width:0;}
@media(max-width:480px){ .mp-avatar-row{flex-direction:column;align-items:center;text-align:center;}
  .mp-avatar-acts > div:last-child{justify-content:center;} }

/* ── FIX: modal close buttons written as class="x" had NO styling inside
   .modal-head (only .close was styled) — they rendered as bare default
   buttons across ~40 modals (check-in, clone, QR sheet, add attachment…).
   Same treatment as .close. ── */
.modal-head .x{margin-left:auto;background:transparent;border:0;color:var(--text-mute);cursor:pointer;width:32px;height:32px;
  border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.modal-head .x:hover{background:var(--navy-3);color:var(--text);}

/* ============================================================
   1_4_10_82 — Profile redesign, 2FA, maintenance works files
   ============================================================ */

/* ── Error toasts (see toast() fix) ── */
.toast.err{border-color:rgba(220,38,38,.4);}
.toast.err .toast-ico{color:var(--err);}
/* v1.4.10.652: warnings (toast(msg, 'warn')): amber, the warning sign on an amber tile */
.toast.warn{border-color:rgba(217,119,6,.4);}
.toast.warn .toast-ico{background:rgba(217,119,6,.13);color:var(--warn);}

/* ── My profile: hero, tabs, cards ── */
.mp-hero{display:flex;align-items:center;gap:16px;padding:20px 22px;background:var(--navy-2);border-bottom:1px solid var(--line);}
.mp-hero .mp-avatar{width:64px;height:64px;font-size:20px;}
.mp-hero-text{min-width:0;flex:1;}
.mp-hero-name{font-family:var(--font-display);font-size:16px;font-weight:600;letter-spacing:-.012em;}
.mp-hero-sub{font-size:12px;color:var(--text-mute);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.mp-hero-pills{display:flex;gap:6px;margin-top:7px;flex-wrap:wrap;}
.mp-tabs{display:flex;gap:2px;padding:8px 14px 0;border-bottom:1px solid var(--line);background:var(--navy-2);}
.mp-tab{display:inline-flex;align-items:center;gap:7px;background:transparent;border:0;border-bottom:2px solid transparent;
  padding:9px 13px;font:inherit;font-size:13px;font-weight:600;color:var(--text-mute);cursor:pointer;transition:color .13s,border-color .13s;}
.mp-tab:hover{color:var(--text);}
.mp-tab.on{color:var(--brand-blue);border-bottom-color:var(--brand-blue);}
.mp-pane{padding:18px 22px 22px;display:flex;flex-direction:column;gap:14px;}
.mp-card{border:1px solid var(--line);border-radius:7px;padding:16px;background:var(--surface);}
.mp-card-h{display:flex;align-items:center;gap:8px;font-size:15px;font-weight:600;letter-spacing:-.01em;margin-bottom:12px;}   /* v1.4.10.473: card title 15/600 -.01em like every card title (was -.012em) */
.mp-card-h svg{color:var(--brand-blue);}
.mp-card .mp-avatar-row{border:0;padding:0;margin:0;background:transparent;}
/* v1.4.10.473: Security > the password box before "Set up two-factor" sits in no .fld, so it drew as a bare 26px browser
   input (inset border, square corners) beside a 36px button: the field look, at the button's height */
.mp-card > div > input[type=password]{align-self:stretch;min-height:36px;box-sizing:border-box;max-width:100%;padding:0 12px;background:var(--surface);
  border:1px solid var(--line-2);border-radius:6px;color:var(--text);font:inherit;font-size:13px;transition:border-color .15s,box-shadow .15s;}
.mp-card > div > input[type=password]:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
@media(max-width:700px){ .mp-card > div > input[type=password]{min-height:40px;flex:1 1 100%;} .mp-card > div:has(> input[type=password]) > .btn{flex:1 1 100%;justify-content:center;} }   /* v1.4.10.473: on a phone the box and its button each take the line (220px box, 168px button below it: two ragged widths) */
.mp-avatar.sm{width:64px;height:64px;font-size:20px;}
@media(max-width:560px){
  .mp-hero{padding:16px;}
  .mp-pane{padding:14px;}
  .mp-tabs{overflow-x:auto;scrollbar-width:none;}
  .mp-tab{white-space:nowrap;}
}

/* ── 2FA enrolment ── */
.mp-2fa-setup{display:flex;gap:20px;align-items:flex-start;flex-wrap:wrap;}
.mp-2fa-qr{background:#fff;border:1px solid var(--line);border-radius:7px;padding:10px;flex-shrink:0;}
.mp-2fa-key{flex:1;min-width:220px;}
.mp-2fa-secret{display:inline-block;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;
  padding:8px 12px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:13px;letter-spacing:.08em;cursor:pointer;margin-top:4px;word-break:break-all;}
.mp-2fa-secret:hover{border-color:var(--brand-blue);}
.mp-2fa-ok{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ok,#16A34A);font-weight:600;}
.mp-2fa-recovery{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px;}
.mp-2fa-recovery code{background:var(--surface-2);border:1px dashed var(--line-2);border-radius:6px;padding:8px 10px;
  font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:13px;text-align:center;letter-spacing:.04em;}

/* ── Access pane ── */
.mp-org-chips{display:flex;flex-wrap:wrap;gap:8px;}
.mp-org-chip{display:inline-flex;align-items:center;gap:7px;background:var(--surface-2);border:1px solid var(--line);
  border-radius:8px;padding:6px 13px;font-size:12px;font-weight:500;}
.mp-org-chip svg{color:var(--brand-blue);}
.mp-sites{max-height:300px;overflow-y:auto;display:flex;flex-direction:column;gap:12px;padding-right:4px;}
.mp-sitegroup-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:5px;}
.mp-site-row{display:flex;align-items:center;gap:9px;padding:6px 8px;border-radius:6px;font-size:12px;}
.mp-site-row:hover{background:var(--surface-2);}
.mp-site-ico{color:var(--text-dim);display:inline-flex;flex-shrink:0;}
.mp-site-n{font-weight:600;flex-shrink:0;}
.mp-site-a{color:var(--text-mute);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}

/* ── Maintenance job view ── */
.mtv-dot{width:12px;height:12px;border-radius:4px;background:var(--c);flex-shrink:0;}
.mtv-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:4px 22px;margin-bottom:14px;}
.mtv-row{display:flex;flex-direction:column;gap:1px;padding:7px 0;border-bottom:1px solid var(--line);min-width:0;}
.mtv-k{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
.mtv-v{font-size:13px;overflow:hidden;text-overflow:ellipsis;}
.mtv-notes{background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:12px 14px;font-size:13px;line-height:1.6;margin-bottom:16px;}
.mtv-notes-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:4px;}
.mtv-att-h{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;margin:4px 0 10px;}   /* v1.4.10.473: sub-heading 13/600 (was 700) */
.mtv-att-h svg{color:var(--brand-blue);}
.mtv-photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px;margin-bottom:12px;}
.mtv-photo{position:relative;aspect-ratio:4/3;border:1px solid var(--line);border-radius:6px;overflow:hidden;cursor:pointer;background:var(--surface-2);}
.mtv-photo img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .18s;}
.mtv-photo:hover img{transform:scale(1.04);}
.mtv-photo-ph{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--text-dim);}
.mtv-photo-del{position:absolute;top:6px;right:6px;opacity:0;transition:opacity .13s;}
.mtv-photo:hover .mtv-photo-del{opacity:1;}
@media(hover:none){ .mtv-photo-del{opacity:1;} }

/* ── Calendar chip attachment badge ── */
.mtcal-att{display:inline-flex;align-items:center;gap:2px;font-size:11px;opacity:.85;margin-left:3px;vertical-align:1px;}
.mtcal-att svg{width:9px;height:9px;}

/* ============================================================
   1_4_10_83 — Admin account security (2FA reset, lockouts, policy)
   ============================================================ */
.sec-grid{max-width:640px;}
.sec-sub{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);
  margin:2px 0 8px;padding-bottom:4px;border-bottom:1px solid var(--line);}
.sec-locks-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);padding:12px 16px 6px;}
.ue-2fa{background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:12px 14px;}

/* ── Rooms page (1.4.10.86) ────────────────────────────────────────────── */
.rm-row{display:flex;align-items:center;gap:10px;padding:10px 10px 10px 12px;border-radius:6px;
        background:var(--bg-2, transparent);border:1px solid var(--line);cursor:pointer;transition:background .14s, border-color .14s;}
.rm-row:hover{background:var(--panel-hover, rgba(var(--bc-accent-rgb),.05));border-color:var(--line-2, var(--line));}

/* ── v1.4.10.111: manufacturer/model presentation cards ── */
/* Catalogue presentation-card head (v1.4.10.118): kind pill + name on the left,
   Edit + close pinned right so nothing can overlap the title. */
.mmc-head{gap:12px;}
.mmc-title{min-width:0;flex:1;display:flex;align-items:center;gap:10px;overflow:hidden;}
.mmc-kind{flex-shrink:0;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-mute);border:1px solid var(--line);background:var(--surface-2);border-radius:999px;padding:4px 10px;}
.mmc-title-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:600;letter-spacing:-.012em;}
.mmc-actions{margin-left:auto;display:flex;gap:8px;align-items:center;flex-shrink:0;}
.mmc-actions .close{margin-left:0;}
/* Makes & models settings rows are fully clickable (v1.4.10.118) */
tr.cat-rowlink{cursor:pointer;}
tr.cat-rowlink:hover td{background:var(--surface-2);}
.mmcard{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap;}
.mmcard-hero{flex:0 0 220px;max-width:220px;height:170px;border:1px solid var(--line);border-radius:8px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;overflow:hidden;padding:12px;}
.mmcard-hero img{max-width:100%;max-height:100%;object-fit:contain;display:block;}
.mmcard-noimg{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--text-dim);font-size:12px;}
.mmcard-noimg svg{width:34px;height:34px;opacity:.5;}
.mmcard-main{flex:1;min-width:240px;}
.mmcard-name{font-size:15px;font-weight:600;letter-spacing:-.012em;display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px;}
.mmcard-grid{margin-top:0;}
.mmcard-models{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.mmcard-modelchip{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;cursor:pointer;background:var(--surface);}
.mmcard-modelchip:hover{border-color:var(--brand-blue);}
.mmcard-modelchip img{width:26px;height:26px;object-fit:contain;border-radius:6px;background:#fff;}
.mmcard-modelchip .mm-noimg{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-dim);}
@media (max-width:640px){ .mmcard-hero{flex-basis:100%;max-width:100%;} }
/* Clickable make/model in the asset hero title */
.ah-cat-link{cursor:pointer;border-bottom:1px dashed rgba(255,255,255,.45);}
.ah-cat-link:hover{border-bottom-color:#fff;}
/* ── v1.4.10.111 (item 4): support-address banner on the tickets page ── */
.tkx-mailbanner{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 14px;padding:10px 14px;border:1px solid var(--line);border-radius:7px;background:linear-gradient(120deg,rgba(var(--bc-accent-rgb),.07),rgba(var(--bc-purple-rgb),.07));font-size:13px;}
.tkx-mail-ico{display:inline-flex;color:var(--brand-blue);}
.tkx-mail-lead{color:var(--text-mute);font-weight:600;}
.tkx-mailwrap{display:inline-flex;align-items:center;gap:6px;}
.tkx-mailchip{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;background:var(--surface);border:1px solid var(--brand-blue);color:var(--brand-blue);font-weight:500;text-decoration:none;font-size:12px;}
.tkx-mailchip:hover{background:var(--brand-blue);color:#fff;}
.tkx-mailsite{font-size:12px;color:var(--text-dim);}

  /* ═══ v1.4.10.126 — tabbed user editor ═══ */
  /* Tab strip between the gradient header and the scrolling body. */
  .ue-tabs{display:flex;gap:2px;padding:6px 14px 0;background:var(--surface);border-bottom:1px solid var(--line);
    overflow-x:auto;overflow-y:hidden;scrollbar-width:none;flex-shrink:0;}   /* overflow-y: x:auto made y auto too — a 1px scroll (v1.4.10.375) */
  .ue-tabs::-webkit-scrollbar{display:none;}
  .ue-tab{appearance:none;background:none;border:0;border-bottom:2.5px solid transparent;margin-bottom:-1px;
    padding:10px 13px 11px;font:inherit;font-size:13px;font-weight:600;color:var(--text-mute);cursor:pointer;
    display:inline-flex;align-items:center;gap:7px;white-space:nowrap;border-radius:6px 6px 0 0;transition:color .12s,background .12s;}
  .ue-tab svg{width:14px;height:14px;stroke:currentColor;flex-shrink:0;}
  .ue-tab:hover{color:var(--text);background:var(--bg-2);}
  .ue-tab.on{color:var(--brand-blue);border-bottom-color:var(--brand-blue);}
  .ue-pane{display:none;}
  .ue-pane.on{display:block;animation:adtFade .16s ease;}
  .ue-pane .form-section:last-of-type{margin-bottom:0;}

  /* Grouped toggle cards: each switch is a row in one bordered card instead of
     loose labels floating in the section. */
  .ue-toggle-group{border:1px solid var(--line);border-radius:6px;background:var(--surface);overflow:hidden;}
  .ue-toggle-group .ue-toggle{padding:12px 14px;margin:0;}
  .ue-toggle-group .ue-toggle + .ue-toggle{border-top:1px solid var(--line);}
  .ue-toggle-group .ue-toggle:hover{background:var(--bg-2);}

  /* Footer-resident error line — visible from any tab, any scroll position. */
  .ef-foot #ef-error{margin-right:auto;align-self:center;color:var(--err);font-size:12px;line-height:1.4;
    text-align:left;min-height:0;max-width:60%;}
  .ef-foot #ef-error:empty{display:none;}

  /* Permission matrix: each catalogue group is a card with a header row. */
  .perm-group{border:1px solid var(--line);border-radius:6px;overflow:hidden;margin:0 0 12px;background:var(--surface);}
  .perm-group:last-child{margin-bottom:0;}
  .perm-group-head{display:flex;align-items:center;gap:8px;padding:9px 13px;background:var(--bg-2);
    border-bottom:1px solid var(--line);font-size:11px;font-weight:600;color:var(--text-mute);
    text-transform:uppercase;letter-spacing:.06em;}
  .perm-group-n{font-weight:700;color:var(--text-dim);background:var(--surface-2,rgba(0,0,0,.04));
    border-radius:99px;padding:1px 8px;font-size:10px;letter-spacing:.04em;}   /* v1.4.10.473: a badge tracks .04em (was 0) */
  .perm-group .permrow{padding:9px 13px;margin:0;border-bottom:1px solid var(--line);}
  .perm-group .permrow:last-child{border-bottom:0;}
  .perm-group .permrow:hover{background:var(--bg-2);}

  /* v1.4.10.491: the user editor's permissions as switches (efRenderPerms): what the person ends up with, on or off */
  .pm-top{display:flex;align-items:center;justify-content:space-between;gap:10px 14px;flex-wrap:wrap;margin:0 0 10px;}
  .pm-sum{font-size:13px;color:var(--text-mute);line-height:1.5;}
  .pm-sum b{color:var(--text);font-weight:600;}
  .pm-sum .pm-sum-ch{color:var(--warn,#B45309);}
  .pm-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  .pm-search{position:relative;}
  .pm-search svg{position:absolute;left:10px;top:50%;transform:translateY(-50%);width:14px;height:14px;color:var(--text-mute);pointer-events:none;}
  .pm-search input{width:210px;padding:7px 10px 7px 30px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-size:13px;font-family:inherit;}
  .pm-search input:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
  .pm-show{display:inline-flex;border:1px solid var(--line);border-radius:6px;overflow:hidden;background:var(--surface);}
  .pm-show button{border:0;background:transparent;color:var(--text-mute);font:inherit;font-size:12px;font-weight:500;padding:7px 11px;cursor:pointer;}
  .pm-show button+button{border-left:1px solid var(--line);}
  .pm-show button.on{background:var(--accent-glow);color:var(--brand-blue);font-weight:600;}
  .pm-grid{column-count:2;column-gap:12px;}
  .pm-group{break-inside:avoid;display:inline-block;width:100%;margin:0 0 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface);overflow:hidden;}
  .pm-group.has-ch{border-color:rgba(217,119,6,.45);}
  .pm-ghead{display:flex;align-items:center;flex-wrap:wrap;gap:2px 8px;padding:8px 10px 6px 8px;}
  .pm-gname{display:inline-flex;align-items:center;gap:6px;border:0;background:transparent;color:var(--text);font:inherit;font-size:13px;font-weight:600;cursor:pointer;padding:2px 4px;border-radius:4px;min-width:0;text-align:left;}
  .pm-gname svg{width:13px;height:13px;color:var(--text-mute);transition:transform .15s;flex-shrink:0;}
  .pm-group.shut .pm-gname svg{transform:rotate(-90deg);}
  .pm-gname:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
  .pm-gcount{font-size:12px;color:var(--text-mute);white-space:nowrap;}
  .pm-gcount b{color:var(--text);font-weight:600;}
  .pm-gch{color:var(--warn,#B45309);font-weight:500;}
  .pm-gacts{margin-left:auto;display:inline-flex;gap:2px;}
  .pm-gacts button{border:0;background:transparent;color:var(--text-mute);font:inherit;font-size:12px;padding:3px 6px;border-radius:4px;cursor:pointer;white-space:nowrap;}
  .pm-gacts button:hover{background:var(--bg-2);color:var(--brand-blue);}
  .pm-meter{height:3px;margin:0 12px 4px;border-radius:99px;background:var(--surface-3,rgba(120,130,150,.15));overflow:hidden;}
  .pm-meter i{display:block;height:100%;background:var(--brand-blue);border-radius:inherit;transition:width .2s;}
  .pm-group.shut .pm-rows{display:none;}
  .pm-group.shut .pm-meter{margin-bottom:8px;}
  .pm-row{display:flex;align-items:center;gap:10px;padding:7px 12px;border-top:1px solid var(--line);}
  .pm-row:hover{background:var(--bg-2);}
  .pm-row-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;}
  .pm-lbl{font-size:13px;color:var(--text);line-height:1.4;}
  .pm-row:not(.on) .pm-lbl{color:var(--text-mute);}
  .pm-why{font-size:11px;color:var(--text-dim);line-height:1.4;display:inline-flex;align-items:center;gap:4px;}
  .pm-why svg{width:11px;height:11px;}
  .pm-row.changed .pm-why{color:var(--warn,#B45309);font-weight:500;}
  .pm-row.changed.on .pm-why{color:var(--ok,#15803D);}
  .pm-undo{display:none;border:0;background:transparent;color:var(--brand-blue);font:inherit;font-size:12px;font-weight:500;padding:3px 6px;border-radius:4px;cursor:pointer;flex-shrink:0;}
  .pm-row.changed .pm-undo{display:inline-block;}
  .pm-row.locked .pm-undo{display:none;}
  .pm-undo:hover{background:var(--accent-glow);}
  .pm-row label.pm-sw{position:relative;display:inline-flex;flex-shrink:0;cursor:pointer;margin:0;padding:0;}   /* .field label is display:block */
  .pm-sw input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:inherit;}
  .pm-sw span{display:block;width:36px;height:20px;border-radius:99px;background:var(--surface-3,#CBD5E1);position:relative;transition:background .16s;}
  .pm-sw span::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:var(--shadow-sm);transition:transform .16s;}
  .pm-sw input:checked + span{background:var(--brand-blue);}
  .pm-row.changed .pm-sw input:checked + span{background:var(--ok,#16A34A);}
  .pm-sw input:checked + span::after{transform:translateX(16px);}
  .pm-sw input:focus-visible + span{outline:2px solid var(--brand-blue);outline-offset:2px;}
  .pm-sw input:disabled{cursor:not-allowed;}
  .pm-sw input:disabled + span{opacity:.5;}
  .pm-row.locked .pm-sw input:disabled + span{opacity:.75;}
  .pm-empty{padding:18px;text-align:center;font-size:13px;color:var(--text-mute);border:1px dashed var(--line);border-radius:8px;}
  @media (max-width:760px){ .pm-grid{column-count:1;} .pm-search input{width:100%;} .pm-tools{width:100%;} .pm-search{flex:1 1 100%;} }   /* v1.4.10.504: the search on its own row (beside the four Show buttons it had 120px: "Find a capab…") */
  @media (max-width:640px){ .pm-row{padding:9px 12px;min-height:44px;} .pm-sw span{width:42px;height:24px;} .pm-sw span::after{width:20px;height:20px;} .pm-sw input:checked + span::after{transform:translateX(18px);} .pm-gacts button{min-height:32px;} }

  @media (max-width:640px){
    .ue-tabs{padding:4px 10px 0;}
    .ue-tabs:has(> .ue-tab:nth-child(4)){display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:2px;overflow:visible;}   /* v1.4.10.473: four tabs go two rows of two, every tab in view (at 13/600 they need 437px of a 358px strip and the last showed only "Sign-in &" at the edge); three (the Integrator Boss's editor) still fit one row */
    .ue-tab{padding:9px 10px 10px;justify-content:center;}   /* v1.4.10.473: a tab stays 13/600 on a phone like every other tab strip (was 12) */
    .ue-tab svg{display:none;}
    /* The tab strip adds ~44px of chrome above the body on small screens (~86px as two rows). */
    .ue-tabs ~ .ef-modal-body .ef-scroll{max-height:calc(100dvh - 242px);}   /* v1.4.10.473: 242, was 212 (the foot sat below the fold and the sheet scrolled 30px) */
    .ue-tabs:has(> .ue-tab:nth-child(4)) ~ .ef-modal-body .ef-scroll{max-height:calc(100dvh - 284px);}   /* v1.4.10.473: two rows of tabs */
    .ef-foot #ef-error{max-width:100%;flex-basis:100%;}
    .ef-foot{flex-wrap:wrap;}
  }

  /* ═══════════════ v1.4.10.127 — Asset Notes tab ═══════════════
     Composer card on top (assets.notes holders only), then the running
     log: one card per note, author + full date/time stamp, delete on
     your own notes (or any, for asset editors / admins). */
  .anote-composer textarea{width:100%;min-height:76px;resize:vertical;border:1px solid var(--line);
    border-radius:6px;background:var(--bg-2);color:var(--text);font:inherit;font-size:13px;
    line-height:1.5;padding:10px 12px;box-sizing:border-box;}
  .anote-composer textarea:focus{outline:none;border-color:var(--brand-blue);background:var(--surface);}
  .anote-composer-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:10px;}
  .anote-hint{font-size:12px;color:var(--text-dim);line-height:1.4;}
  .anote-list{display:flex;flex-direction:column;gap:10px;margin-top:14px;}
  .anote{border:1px solid var(--line);border-radius:6px;background:var(--surface);padding:12px 14px;}
  .anote-top{display:flex;align-items:center;gap:10px;}
  .anote-avatar{width:30px;height:30px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;
    justify-content:center;font-size:12px;font-weight:600;color:#fff;
    background:linear-gradient(135deg,var(--brand-blue),var(--brand-purple,var(--bc-purple-v1)));}
  .anote-who{flex:1;min-width:0;}
  .anote-author{font-weight:600;font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .anote-when{font-size:12px;color:var(--text-dim);}
  .anote-body{margin-top:9px;font-size:14px;line-height:1.55;color:var(--text);word-wrap:break-word;overflow-wrap:anywhere;}
  .anote .att-del{flex-shrink:0;}
  @media (max-width:640px){
    .anote-composer-foot{flex-wrap:wrap;}
    .anote-hint{flex-basis:100%;order:2;}
  }

/* ════════════════════════════════════════════════════════════════════
   1_4_10_128 — MOBILE SHELL PASS (Safari iPhone)
   Four shell-level fixes the earlier per-area passes never covered:
   1. iOS focus-zoom killed EVERYWHERE (login, header, page filters —
      not just modal fields): any editable field reads at 16px on
      phones, the threshold below which Safari force-zooms the page.
   2. A real mobile menu: ≤760px the horizontally-scrolling top nav
      (invisible scrollbar — half the menus looked missing) is replaced
      by a hamburger opening a full-height slide-in drawer.
   3. Body scroll-lock while any overlay is open, so iOS stops
      scrolling the page underneath a modal / the drawer.
   4. Thumb-sized tap targets + momentum/overscroll hygiene.
   ════════════════════════════════════════════════════════════════════ */

/* ── Base hygiene (all sizes; no visual change on desktop) ── */
html{-webkit-text-size-adjust:100%;text-size-adjust:100%;}
button,.nav-item,.nav-dd-trigger,.nav-dd-item,.icon-btn{-webkit-tap-highlight-color:transparent;}
.modal-back,.ef-scroll,.mnav-scroll,.search-results,.nav-dd-menu{-webkit-overflow-scrolling:touch;overscroll-behavior:contain;}

/* ── 1 · Global iOS focus-zoom guard ──
   Safari zooms the whole page when a focused field is under 16px and the
   zoom does NOT undo on blur — the single biggest "site is broken on my
   iPhone" cause. Applies to every editable field at phone widths;
   !important intentionally outranks each component's 12–13.5px setting. */
@media(max-width:700px){
  input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]):not([type=file]):not([type=button]):not([type=submit]):not([type=reset]),
  select,textarea{font-size:16px !important;}
  /* v1.4.10.179: the ticket action-bar's labelled selects — at the forced
     16px the longest status ("Waiting on Client") needs the extra room. */
  .tkd-ctl > select{max-width:200px;}
  .tkd-actionbar .tkd-ctl{max-width:100%;}
}

/* ── 2 · Mobile nav drawer ── */
.mnav-btn{display:none;}
@media(max-width:760px){
  .topnav{display:none;}               /* strip replaced by the drawer */
  .mnav-btn{display:inline-flex;}
}
.mnav{position:fixed;inset:0;z-index:120;display:none;}
.mnav.open{display:block;}
.mnav-back{position:absolute;inset:0;background:rgba(15,23,42,.48);backdrop-filter:blur(3px);
  opacity:0;transition:opacity .18s ease;}
.mnav.open .mnav-back{opacity:1;}
.mnav-panel{position:absolute;top:0;bottom:0;left:0;width:min(320px,86vw);background:var(--surface);
  border-right:1px solid var(--line);box-shadow:0 0 44px rgba(15,23,42,.35);display:flex;flex-direction:column;
  transform:translateX(-102%);transition:transform .2s ease;
  padding-top:env(safe-area-inset-top,0px);padding-left:env(safe-area-inset-left,0px);}
.mnav.open .mnav-panel{transform:translateX(0);}
.mnav-head{display:flex;align-items:center;gap:11px;padding:13px 14px;border-bottom:1px solid var(--line);}
.mnav-head .logo-mark{width:30px;height:30px;flex:none;}
.mnav-title{flex:1;min-width:0;}
.mnav-title b{display:block;font-family:var(--font-display);font-size:14px;font-weight:600;letter-spacing:-.012em;}
.mnav-title span{display:block;font-size:11px;color:var(--text-mute);}
.mnav-close{width:40px;height:40px;border-radius:6px;border:1px solid var(--line);background:var(--surface-2);
  color:var(--text-mute);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex:none;}
.mnav-close svg{width:17px;height:17px;}
.mnav-scroll{flex:1;overflow-y:auto;padding:8px 10px 14px;scrollbar-width:thin;}
.mnav-sec{margin-top:12px;}
.mnav-sec:first-child{margin-top:4px;}
.mnav-sec-t{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);
  padding:0 8px 5px;}
.mnav-row{display:flex;align-items:center;gap:12px;width:100%;min-height:46px;padding:10px 11px;border:0;
  border-radius:6px;background:transparent;color:var(--text-mute);cursor:pointer;font-family:inherit;
  font-size:13px;font-weight:500;text-align:left;transition:background .12s,color .12s;}
.mnav-row:active{background:var(--surface-2);}
.mnav-row.active{background:var(--accent-glow);color:var(--brand-blue);font-weight:600;}
.mnav-row .ico{width:19px;height:19px;display:inline-flex;align-items:center;justify-content:center;
  color:var(--text-dim);flex:none;}
.mnav-row.active .ico{color:var(--brand-blue);}
.mnav-row .nav-badge{margin-left:auto;background:var(--err);color:#fff;font-size:10px;padding:1px 7px;
  border-radius:6px;font-weight:700;min-width:19px;text-align:center;}
.mnav-foot{border-top:1px solid var(--line);padding:10px 12px calc(12px + env(safe-area-inset-bottom,0px));
  display:flex;align-items:center;gap:11px;}
.mnav-foot .avatar{width:34px;height:34px;flex:none;}
.mnav-foot-id{flex:1;min-width:0;}
.mnav-foot-id b{display:block;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.mnav-foot-id span{display:block;font-size:11px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.mnav-foot .icon-btn{flex:none;}

/* ── 3 · Body scroll-lock (applied by JS only at phone widths) ── */
body.scroll-locked{position:fixed;left:0;right:0;width:100%;overflow:hidden;}

/* ── 4 · Thumb-sized tap targets on phones (desktop density untouched) ── */
@media(max-width:700px){
  .icon-btn{width:40px;height:40px;}
  .btn{min-height:40px;}
  .btn.sm{min-height:36px;}
  .btn.xs{min-height:30px;}
  .nav-dd-item{min-height:44px;}
  .site-picker{min-height:38px;}
  .modal-head .modal-x,.ef-head-x{width:40px;height:40px;}
  .att-del{width:36px;height:36px;}
}


/* ============================================================
   Rostering  (module 1.4.10.132 · rebuilt 1.4.10.133)
   Staff × day roster grid, approvals queue, templates, patterns.
   ============================================================ */
  .rost-wrap{ display:flex; flex-direction:column; gap:14px; }

  /* ── Top bar ─────────────────────────────────────────────── */
  .rost-bar{ display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap;
             background:var(--surface); border:1px solid var(--line); border-radius:var(--radius);
             padding:10px 14px; box-shadow:var(--shadow-sm); }
  .rost-bar-left{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; min-width:0; }
  .rost-bar-right{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
  .rost-bar-ico{ display:inline-flex; width:20px; height:20px; color:var(--brand-blue); }
  .rost-bar-ico svg{ width:20px; height:20px; }
  .rost-site-sel{ font-size:13px; font-weight:400; color:var(--text); background:var(--surface);   /* v1.4.10.473: a field is 13/400 (was 500) */
                  border:1px solid var(--line-2); border-radius:6px; padding:7px 10px; cursor:pointer; max-width:230px; }
  .rost-site-fixed{ font-size:15px; font-weight:600; letter-spacing:-.012em; color:var(--text); }
  .rost-tabs{ display:inline-flex; background:var(--surface-2); border:1px solid var(--line); border-radius:6px; padding:3px; }
  .rost-tab{ border:0; background:transparent; color:var(--text-mute); font-size:13px; font-weight:600;
             padding:6px 13px; border-radius:5px; cursor:pointer; display:inline-flex; align-items:center; gap:6px; }
  .rost-tab:hover{ color:var(--text); }
  .rost-tab.on{ background:var(--surface); color:var(--text); box-shadow:var(--shadow-sm); }
  .rost-tab-badge{ display:inline-flex; align-items:center; justify-content:center; min-width:17px; height:17px;
                   padding:0 5px; border-radius:10px; background:var(--warn); color:#fff; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; }   /* v1.4.10.473: badge look */
  .rost-period{ display:inline-flex; align-items:center; gap:5px; }
  .rost-nav-btn{ width:30px; height:30px; display:inline-flex; align-items:center; justify-content:center;
                 border:1px solid var(--line-2); background:var(--surface); border-radius:6px; cursor:pointer; color:var(--text-mute); }
  .rost-nav-btn:hover{ background:var(--surface-2); color:var(--text); }
  .rost-nav-btn svg{ width:15px; height:15px; }
  .rost-today-btn{ border:1px solid var(--line-2); background:var(--surface); border-radius:6px; padding:6px 11px;
                   font-size:12px; font-weight:500; color:var(--text-mute); cursor:pointer; }
  .rost-today-btn:hover{ background:var(--surface-2); color:var(--text); }
  .rost-period-lbl{ font-size:13px; font-weight:600; color:var(--text); }   /* v1.4.10.473: a label line is 13/600, as every other in the area (700 is for b / strong, KPIs and badges) */

  /* ── Legend ──────────────────────────────────────────────── */
  .rost-legend{ display:flex; align-items:center; gap:8px 16px; flex-wrap:wrap; padding:0 2px; }
  .rost-legend-item{ display:inline-flex; align-items:center; gap:6px; font-size:11px; color:var(--text-mute); font-weight:500; }
  .rost-dot{ width:11px; height:11px; border-radius:3px; display:inline-block; flex-shrink:0; }
  .rost-dot.lv{ border-radius:50%; }
  .rost-legend-empty{ font-size:12px; color:var(--text-dim); }

  /* ── Layout ──────────────────────────────────────────────── */
  .rost-cols{ display:grid; grid-template-columns:minmax(0,1fr) 312px; gap:16px; align-items:start; }
  .rost-cols.solo{ grid-template-columns:minmax(0,1fr); }
  .rost-col-main{ min-width:0; }
  .rost-col-side{ display:flex; flex-direction:column; gap:14px; }

  /* ── Loading skeleton ────────────────────────────────────── */
  .rost-skel{ background:var(--surface); border:1px solid var(--line); border-radius:var(--radius); padding:14px; }
  .rost-skel-row{ height:44px; border-radius:6px; margin-bottom:9px;
    background:linear-gradient(90deg,var(--surface-2) 25%,var(--surface-3) 37%,var(--surface-2) 63%);
    background-size:400% 100%; animation:rostShimmer 1.3s ease-in-out infinite; }
  .rost-skel-row:last-child{ margin-bottom:0; }
  @keyframes rostShimmer{ 0%{background-position:100% 0} 100%{background-position:0 0} }

  /* ── THE ROSTER GRID (people × days) ─────────────────────── */
  .rost-grid-wrap{ padding:0; overflow-x:auto; }
  .rost-grid{ min-width:920px; }
  .rost-g-head,.rost-g-row{ display:grid; grid-template-columns:196px repeat(7,minmax(0,1fr)); }
  .rost-g-head{ position:sticky; top:0; z-index:3; background:var(--surface-2); border-bottom:1px solid var(--line-2); }
  .rost-g-corner{ position:sticky; left:0; z-index:4; background:var(--surface-2); border-right:1px solid var(--line-2);
                  padding:9px 12px; display:flex; align-items:center; justify-content:space-between; gap:6px;
                  font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }
  .rost-g-day{ padding:9px 10px; text-align:center; border-right:1px solid var(--line); display:flex;
               flex-direction:column; align-items:center; gap:1px; }
  .rost-g-day:last-child{ border-right:0; }
  .rost-g-dow{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }
  .rost-g-num{ font-size:15px; font-weight:700; color:var(--text); line-height:1.1; }
  .rost-g-day.today .rost-g-dow{ color:var(--brand-blue); }
  .rost-g-day.today .rost-g-num{ color:#fff; background:var(--brand-blue); border-radius:50%;
                                 width:24px; height:24px; display:inline-flex; align-items:center; justify-content:center; font-size:13px; }
  .rost-g-row{ border-bottom:1px solid var(--line); }
  .rost-g-row:last-child{ border-bottom:0; }
  .rost-g-row:hover .rost-g-person{ background:var(--surface-2); }
  .rost-g-row.open-row{ background:color-mix(in srgb, var(--brand-blue) 4%, var(--surface)); }
  .rost-g-person{ position:sticky; left:0; z-index:2; background:var(--surface); border-right:1px solid var(--line-2);
                  padding:9px 11px; display:flex; align-items:center; gap:9px; min-width:0; }
  .rost-g-row.open-row .rost-g-person{ background:color-mix(in srgb, var(--brand-blue) 4%, var(--surface)); }
  .rost-g-who{ display:flex; flex-direction:column; min-width:0; flex:1; }
  .rost-g-name{ font-size:13px; font-weight:600; color:var(--text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }   /* v1.4.10.473: a row's name is the sub-heading look, 13/600 (was 12/700), as the crew board's */
  .rost-g-sub{ font-size:11px; color:var(--text-dim); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .rost-av{ width:28px; height:28px; border-radius:50%; flex-shrink:0; display:inline-flex; align-items:center; justify-content:center;
            background:var(--surface-3); color:var(--text-mute); font-size:11px; font-weight:600; letter-spacing:0; }   /* v1.4.10.473: initials untracked, as the task avatars (was .02em) */
  .rost-av.open{ background:color-mix(in srgb, var(--brand-blue) 14%, var(--surface)); color:var(--brand-blue); }
  .rost-av.open svg{ width:14px; height:14px; }
  .rost-av.lg{ width:36px; height:36px; font-size:13px; font-weight:600; text-transform:none; letter-spacing:0; }   /* v1.4.10.473: 13px initials keep the plain look (the phone's 10px badge look is for the small ones) */
  .rost-g-cell{ border-right:1px solid var(--line); padding:6px; min-height:60px;
                display:flex; flex-direction:column; gap:4px; position:relative; }
  .rost-g-cell:last-child{ border-right:0; }
  .rost-g-cell.today{ background:color-mix(in srgb, var(--brand-blue) 3%, transparent); }
  .rost-g-cell.on-leave{ background:repeating-linear-gradient(135deg,transparent,transparent 5px,var(--surface-2) 5px,var(--surface-2) 10px); }
  .rost-add{ opacity:0; position:absolute; right:5px; bottom:5px; width:21px; height:21px; border:1px dashed var(--line-2);
             background:var(--surface); color:var(--text-dim); border-radius:6px; cursor:pointer;
             display:inline-flex; align-items:center; justify-content:center; transition:opacity .12s; }
  .rost-g-cell:hover .rost-add{ opacity:1; }
  .rost-add:hover{ border-style:solid; border-color:var(--brand-blue); color:var(--brand-blue); }
  .rost-add svg{ width:12px; height:12px; }
  .rost-mini{ border:1px solid var(--line-2); background:var(--surface); color:var(--text-dim); font-size:11px;
              font-weight:500; border-radius:6px; padding:2px 6px; cursor:pointer; }
  .rost-mini:hover{ color:var(--brand-blue); border-color:var(--brand-blue); }
  .rost-mini.pat{ opacity:0; width:22px; height:22px; display:inline-flex; align-items:center; justify-content:center; padding:0; flex-shrink:0; }
  .rost-g-row:hover .rost-mini.pat{ opacity:1; }
  .rost-mini.pat svg{ width:12px; height:12px; }
  /* v1.4.10.422 — a touch screen has no hover, so the day's "+" and the person's
     normal-week button stayed at opacity:0: a phone or iPad could not see where to
     add a shift, and the invisible "+" still took the taps on the right-hand part
     of the chip above it (23 of 50 chip points at 390x664). Shown, 40px, and the
     "+" sits in the cell's flow under its chips, so it never covers one. */
  @media (hover:none){
    .rost-add{ opacity:1; position:static; align-self:flex-end; margin-top:auto; min-width:40px; min-height:40px; }
    .rost-mini.pat{ opacity:1; width:40px; height:40px; }
  }

  /* ── Shift chip ──────────────────────────────────────────── */
  .rost-chip{ --sc:#64748B; text-align:left; border:0; border-left:3px solid var(--sc); background:var(--surface-2);
              background:color-mix(in srgb, var(--sc) 11%, var(--surface)); border-radius:5px; padding:5px 7px;
              cursor:pointer; display:flex; flex-direction:column; gap:1px; position:relative; width:100%;
              transition:transform .1s, filter .1s; font-size:12px; font-weight:600; }   /* v1.4.10.473: the chip's own type is its time line's (it carried the 14px button default) */
  .rost-chip:hover{ filter:brightness(.97); transform:translateY(-1px); }
  .rost-chip.open{ border-left-style:dashed; background:var(--surface);
                   background:repeating-linear-gradient(135deg,var(--surface-2),var(--surface-2) 5px,var(--surface) 5px,var(--surface) 10px); }
  .rost-chip.draft{ opacity:.62; }
  .rost-chip-time{ font-size:12px; font-weight:600; color:var(--text); font-variant-numeric:tabular-nums; white-space:nowrap; }   /* v1.4.10.473: 12/600, as a chip's label (was 700) */
  .rost-chip-time sup,.rost-ag-time sup{ color:var(--info); font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; }   /* v1.4.10.473: the +1 is a 10px badge (a bare <sup> was 10.83px) */
  .rost-chip-role{ font-size:11px; font-weight:400; color:var(--text-mute); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .rost-chip-open{ font-size:10px; font-weight:700; color:var(--brand-blue); text-transform:uppercase; letter-spacing:.04em; }
  /* v1.4.10.473: the Draft flag sat absolute over the chip's top-right corner and hid the end time ('07:00–1');
     it now takes its own line under the time. The pending count shrinks to its number instead of stretching across. */
  .rost-chip-flag{ position:static; font-size:10px; font-weight:700; text-transform:uppercase;
                   letter-spacing:.04em; padding:1px 5px; border-radius:10px; background:var(--surface-3); color:var(--text-mute); }
  .rost-chip > .rost-chip-flag{ align-self:flex-start; margin-top:2px; }
  .rost-chip-flag.pend{ position:static; background:var(--warn); color:#fff; display:inline-block; }
  /* v1.4.10.450: declined leave in the side panel is flagged, not drawn like booked leave */
  .rost-chip-flag.dec{ position:static; background:var(--err); color:#fff; display:inline-block; }
  .rost-lv-chip{ --lc:#64748B; font-size:11px; font-weight:600; color:var(--lc); border:1px dashed var(--lc);
                 background:color-mix(in srgb, var(--lc) 8%, var(--surface)); border-radius:6px; padding:3px 7px;
                 display:inline-block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .rost-lv-chip.pending{ opacity:.75; }
  .rost-lv-chip em{ font-style:normal; opacity:.75; }

  /* ── Month grid ──────────────────────────────────────────── */
  .rost-month{ padding:0; overflow:hidden; }
  .rost-mhead{ display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); background:var(--surface-2); border-bottom:1px solid var(--line-2); }   /* v1.4.10.473: minmax(0,1fr), so a wide day never widens its column off the heading's (as the task calendar) */
  .rost-mhead span{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em;
                    color:var(--text-mute); text-align:center; padding:8px 0; }
  .rost-mgrid{ display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); }
  .rost-mcell{ min-height:92px; border-right:1px solid var(--line); border-bottom:1px solid var(--line);
               padding:6px 7px; cursor:pointer; display:flex; flex-direction:column; gap:3px; }
  .rost-mcell:nth-child(7n){ border-right:0; }
  .rost-mcell:hover{ background:var(--surface-2); }
  .rost-mcell.out{ background:var(--surface-2); }
  .rost-mcell.out .rost-mnum{ color:var(--text-dim); }
  .rost-mcell.today .rost-mnum{ background:var(--brand-blue); color:#fff; border-radius:50%; width:21px; height:21px;
                                display:inline-flex; align-items:center; justify-content:center; }
  .rost-mnum{ font-size:12px; font-weight:600; color:var(--text); }   /* v1.4.10.473: 600 (was 700) */
  .rost-mdots{ display:flex; align-items:center; gap:3px; flex-wrap:wrap; }
  .rost-mdot{ width:7px; height:7px; border-radius:2px; }
  .rost-mmore{ font-size:11px; color:var(--text-dim); font-weight:600; }
  .rost-mcount{ font-size:11px; color:var(--text-mute); margin-top:auto; }
  .rost-mleave{ font-size:11px; color:var(--text-dim); }

  /* ── My shifts ───────────────────────────────────────────── */
  .rost-mine-head{ display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap;
                   padding:14px 16px; border-bottom:1px solid var(--line); }
  .rost-mine-stats{ display:flex; gap:24px; flex-wrap:wrap; }
  .rost-stat{ display:flex; flex-direction:column; }
  .rost-stat strong{ font-size:20px; font-weight:600; letter-spacing:-.02em; color:var(--text); line-height:1.1; }
  .rost-stat span{ font-size:11px; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); font-weight:600; }
  .rost-stat.warn strong{ color:var(--warn); }
  .rost-mine-actions{ display:flex; gap:8px; flex-wrap:wrap; }
  .rost-ag{ display:flex; flex-direction:column; }
  .rost-ag-date{ font-size:12px; font-weight:600; color:var(--text-mute); background:var(--surface-2);   /* v1.4.10.473: 600 (was 700) */
                 padding:7px 16px; border-bottom:1px solid var(--line); display:flex; align-items:center; gap:8px; }
  .rost-ag-row{ display:flex; align-items:center; gap:14px; padding:11px 16px; border-bottom:1px solid var(--line);
                border-left:3px solid var(--sc); cursor:pointer; flex-wrap:wrap; }
  .rost-ag-row:hover{ background:var(--surface-2); }
  .rost-ag-time{ font-size:13px; font-weight:600; color:var(--text); min-width:118px; font-variant-numeric:tabular-nums; }
  .rost-ag-role{ font-size:13px; color:var(--text); font-weight:600; }   /* v1.4.10.473: an agenda line's time and role are 13/600 (were 700) */
  .rost-ag-meta{ font-size:12px; color:var(--text-mute); }
  .rost-ag-site{ font-size:12px; color:var(--text-dim); margin-left:auto; text-align:right; }

  /* ── Approvals ───────────────────────────────────────────── */
  .rost-sec-h{ display:flex; align-items:center; gap:9px; font-size:11px; font-weight:600; text-transform:uppercase;
               letter-spacing:.06em; color:var(--text-mute); margin:4px 0 10px; }
  .rost-sec-h svg{ width:15px; height:15px; }
  .rost-sec-h span{ background:var(--surface-3); color:var(--text-mute); border-radius:10px; padding:1px 8px; font-size:10px; font-weight:700; letter-spacing:.04em; }   /* v1.4.10.473: badge look (it took the heading's .06em) */
  .rost-appr-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(320px,1fr)); gap:12px; margin-bottom:20px; }
  .rost-appr-card{ --lc:var(--bc-blue-v1); background:var(--surface); border:1px solid var(--line); border-top:3px solid var(--lc);
                   border-radius:7px; overflow:hidden; box-shadow:var(--shadow-sm); display:flex; flex-direction:column; }
  .rost-appr-top{ display:flex; align-items:center; gap:10px; padding:12px 14px 8px; }
  .rost-appr-who{ display:flex; flex-direction:column; min-width:0; flex:1; }
  .rost-appr-who strong{ font-size:13px; color:var(--text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .rost-appr-who span{ font-size:11px; color:var(--text-dim); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .rost-appr-kind{ font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:#fff;
                   border-radius:10px; padding:3px 9px; white-space:nowrap; }
  .rost-appr-body{ padding:0 14px 12px; display:flex; flex-direction:column; gap:6px; flex:1; }
  .rost-appr-when{ font-size:13px; font-weight:600; color:var(--text); }   /* v1.4.10.473: 600 (was 700) */
  .rost-appr-when span{ font-weight:500; color:var(--text-mute); font-size:12px; }
  .rost-appr-reason{ font-size:12px; color:var(--text-mute); font-style:italic; }
  .rost-appr-clash{ display:flex; align-items:center; gap:6px; font-size:12px; font-weight:600; color:var(--warn);
                    background:color-mix(in srgb, var(--warn) 9%, var(--surface)); border-radius:5px; padding:5px 8px; }
  .rost-appr-clash svg{ width:13px; height:13px; flex-shrink:0; }
  .rost-appr-actions{ display:flex; gap:8px; justify-content:flex-end; padding:10px 14px; border-top:1px solid var(--line);
                      background:var(--surface-2); }

  /* ── Side panels ─────────────────────────────────────────── */
  .rost-side-panel{ padding:0; overflow:hidden; }
  .rost-side-head{ display:flex; align-items:center; gap:8px; padding:11px 13px; border-bottom:1px solid var(--line);
                   font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em;
                   color:var(--text-mute); background:var(--surface-2); }
  .rost-side-head svg{ width:15px; height:15px; }
  .rost-side-empty{ padding:16px 13px; color:var(--text-dim); font-size:12px; }
  .rost-open-row,.rost-req-row,.rost-leave-row{ display:flex; align-items:center; gap:10px; padding:10px 13px; border-bottom:1px solid var(--line); }
  .rost-open-row:last-child,.rost-req-row:last-child,.rost-leave-row:last-child{ border-bottom:0; }
  .rost-open-row{ border-left:3px solid var(--sc); }
  .rost-leave-row{ border-left:3px solid var(--lc); }
  .rost-open-main,.rost-req-main,.rost-leave-main{ flex:1; min-width:0; }
  .rost-open-when,.rost-req-when,.rost-leave-when{ font-size:12px; font-weight:600; color:var(--text); }   /* v1.4.10.473: a side-panel row's title is 600 (was 700) */
  .rost-open-role{ font-size:12px; color:var(--text-mute); }
  .rost-req-who{ font-size:12px; color:var(--text); font-weight:600; }
  .rost-req-type.claim{ color:var(--brand-blue); }
  .rost-req-type.drop{ color:var(--warn); }
  .rost-req-when{ font-size:12px; color:var(--text-mute); font-weight:500; margin-top:1px; }
  .rost-req-note{ font-size:12px; color:var(--text-mute); font-style:italic; margin-top:3px; }
  .rost-req-actions,.rost-leave-actions{ display:flex; gap:5px; flex-shrink:0; }
  .rost-leave-kind{ font-size:10px; text-transform:uppercase; letter-spacing:.04em; font-weight:700; margin-left:4px; }
  .rost-leave-who{ font-size:12px; color:var(--text-mute); margin-top:1px; }
  .rost-leave-row.pending{ background:color-mix(in srgb, var(--warn) 6%, var(--surface)); }
  /* v1.4.10.450: declined leave reads as not booked */
  .rost-leave-row.declined{ opacity:.6; }
  .rost-leave-row.declined .rost-leave-when{ text-decoration:line-through; }

  /* ── Empty states ────────────────────────────────────────── */
  .rost-empty{ text-align:center; padding:46px 24px; }
  .rost-empty.sm{ padding:30px 20px; }
  .rost-empty-ico{ width:46px; height:46px; margin:0 auto 14px; color:var(--brand-blue); opacity:.5; }
  .rost-empty-ico.ok{ color:var(--ok); opacity:.6; }
  .rost-empty-ico svg{ width:46px; height:46px; }
  .rost-empty h3{ font-size:15px; color:var(--text); margin:0 0 6px; }
  .rost-empty p{ font-size:12px; color:var(--text-mute); max-width:440px; margin:0 auto; line-height:1.6; }

  /* ── Modal shell ─────────────────────────────────────────── */
  .rost-modal{ display:flex; flex-direction:column; max-height:88vh; }
  .rost-modal.wide{ min-width:min(640px,86vw); }
  .rost-modal-head{ display:flex; align-items:center; justify-content:space-between; padding:15px 18px; border-bottom:1px solid var(--line); }
  .rost-modal-head h3{ font-size:16px; margin:0; color:var(--text); }
  .rost-x{ width:28px; height:28px; border:0; background:transparent; color:var(--text-dim); border-radius:5px;
           cursor:pointer; display:inline-flex; align-items:center; justify-content:center; flex-shrink:0; }
  .rost-x:hover{ background:var(--surface-2); color:var(--text); }
  .rost-x svg{ width:16px; height:16px; }
  .rost-modal-body{ padding:16px 18px; overflow-y:auto; display:flex; flex-direction:column; gap:12px; }
  .rost-modal-foot{ display:flex; align-items:center; justify-content:space-between; gap:10px; padding:13px 18px; border-top:1px solid var(--line); }
  .rost-modal-foot > div{ display:flex; gap:8px; }
  .rost-del{ color:var(--err); }

  /* ── Form atoms ──────────────────────────────────────────── */
  .rost-field{ display:flex; flex-direction:column; gap:4px; }
  .rost-field label{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }
  .rost-field input,.rost-field select,.rost-field textarea,.rost-in{
      font-size:13px; color:var(--text); background:var(--surface); border:1px solid var(--line-2);
      border-radius:6px; padding:8px 10px; font-family:inherit; width:100%; }
  .rost-field input,.rost-in{ text-overflow:ellipsis; }   /* v1.4.10.473: an example placeholder longer than a phone's field ends in an ellipsis */
  .rost-field input:focus,.rost-field select:focus,.rost-field textarea:focus,.rost-in:focus{
      outline:none; border-color:var(--brand-blue); box-shadow:0 0 0 3px var(--accent-glow); }
  .rost-field-row{ display:flex; gap:10px; }
  .rost-field-row .rost-field{ flex:1; min-width:0; }
  .rost-opt{ text-transform:none; font-weight:500; color:var(--text-dim); letter-spacing:0; }
  .rost-check{ display:flex; align-items:center; gap:8px; font-size:13px; color:var(--text); cursor:pointer; }
  .rost-check.sm{ font-size:13px; font-weight:400; text-transform:none; letter-spacing:0; color:var(--text-mute); }
  .rost-check input{ width:16px; height:16px; accent-color:var(--brand-blue); flex-shrink:0; }
  .rost-help{ font-size:12px; color:var(--text-mute); line-height:1.55; margin:0; }
  .rost-repeat{ border:1px solid var(--line); border-radius:6px; padding:10px 12px; background:var(--surface-2); }
  .rost-rep-opts{ margin-top:10px; display:flex; flex-direction:column; gap:10px; }
  .rost-rep-days{ display:flex; gap:6px; flex-wrap:wrap; }
  .rost-day-toggle{ display:inline-flex; align-items:center; gap:4px; font-size:12px; color:var(--text-mute);
                    background:var(--surface); border:1px solid var(--line-2); border-radius:5px; padding:5px 8px; cursor:pointer; }
  .rost-day-toggle input{ accent-color:var(--brand-blue); }
  .rost-confirm p{ font-size:13px; color:var(--text); line-height:1.6; margin:0 0 14px; }
  .rost-confirm-actions{ display:flex; gap:8px; justify-content:flex-end; flex-wrap:wrap; }
  .rost-detail{ display:flex; flex-direction:column; gap:8px; background:var(--surface-2); border:1px solid var(--line);
                border-radius:6px; padding:12px 14px; }
  .rost-detail-row{ display:flex; align-items:baseline; gap:12px; font-size:13px; }
  .rost-detail-row span{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em;
                         color:var(--text-mute); min-width:76px; flex-shrink:0; }
  .rost-detail-row strong{ color:var(--text); font-weight:700; }

  /* ── Tools menu ──────────────────────────────────────────── */
  .rost-tool{ display:flex; align-items:flex-start; gap:12px; padding:12px 13px; border:1px solid var(--line);
              border-radius:6px; cursor:pointer; transition:border-color .12s, background .12s; }
  .rost-tool:hover{ border-color:var(--brand-blue); background:var(--surface-2); }
  .rost-tool-ico{ display:inline-flex; width:34px; height:34px; border-radius:6px; flex-shrink:0;
                  align-items:center; justify-content:center; background:var(--surface-3); color:var(--brand-blue); }
  .rost-tool-ico svg{ width:17px; height:17px; }
  .rost-tool strong{ display:block; font-size:13px; color:var(--text); }
  .rost-tool small{ display:block; font-size:12px; color:var(--text-mute); line-height:1.5; margin-top:2px; }

  /* ── Templates ───────────────────────────────────────────── */
  .rost-tpl-row{ display:flex; gap:8px; flex-wrap:wrap; }
  .rost-tpl{ --tc:var(--bc-blue-v1); border:1px solid var(--line-2); border-left:3px solid var(--tc); background:var(--surface);
             border-radius:6px; padding:6px 10px; cursor:pointer; display:flex; flex-direction:column; text-align:left; gap:1px; }
  .rost-tpl:hover{ border-color:var(--tc); background:var(--surface-2); }
  .rost-tpl.on{ background:color-mix(in srgb, var(--tc) 12%, var(--surface)); border-color:var(--tc); }
  .rost-tpl strong{ font-size:12px; color:var(--text); font-weight:700; }
  .rost-tpl span{ font-size:11px; color:var(--text-mute); font-variant-numeric:tabular-nums; }
  .rost-tpl-head,.rost-tpl-row-edit,.rost-tpl-add{ display:grid; grid-template-columns:1fr 110px 110px 78px 36px; gap:8px; align-items:center; }
  .rost-tpl-head{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); padding:0 2px; }
  .rost-tpl-row-edit{ padding:4px 0; }
  .rost-tpl-add{ margin-top:10px; padding-top:12px; border-top:1px solid var(--line); grid-template-columns:1fr 110px 110px 78px auto; }
  .rost-in.brk{ text-align:center; }

  /* ── Weekly pattern editor ───────────────────────────────── */
  .rost-pat-head,.rost-pat-row{ display:grid; grid-template-columns:106px 108px 108px 74px minmax(0,1fr); gap:8px; align-items:center; }
  .rost-pat-head{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); padding:0 2px 4px; }
  .rost-pat-row{ padding:4px 0; }
  .rost-pat-row.off{ opacity:.45; }
  .rost-pat-day{ display:flex; align-items:center; gap:7px; font-size:12px; font-weight:600; color:var(--text); cursor:pointer; }   /* v1.4.10.473: 600 (was 700) */
  .rost-pat-day input{ width:16px; height:16px; accent-color:var(--brand-blue); }
  .rost-pat-quick{ display:flex; gap:8px; margin-top:12px; padding-top:12px; border-top:1px solid var(--line); flex-wrap:wrap; }
  .rost-gen-note{ display:flex; align-items:center; gap:7px; font-size:12px; color:var(--text-mute);
                  background:var(--surface-2); border-radius:6px; padding:8px 10px; }
  .rost-gen-note svg{ width:14px; height:14px; flex-shrink:0; }

  /* ── Leave type picker ───────────────────────────────────── */
  .rost-kind-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(190px,1fr)); gap:7px; }
  .rost-kind{ --kc:#64748B; display:flex; align-items:center; gap:8px; border:1px solid var(--line-2); border-radius:6px;
              padding:9px 10px; cursor:pointer; position:relative; transition:border-color .12s, background .12s;
              flex-wrap:wrap; row-gap:4px; }   /* v1.4.10.473: "needs approval" drops under a long name (it ran 47px out of the Compassionate Leave tile) */
  .rost-kind:hover{ background:var(--surface-2); }
  .rost-kind input{ position:absolute; opacity:0; pointer-events:none; }
  .rost-kind-dot{ width:11px; height:11px; border-radius:50%; background:var(--kc); flex-shrink:0; }
  .rost-kind-lbl{ font-size:13px; font-weight:600; text-transform:none; letter-spacing:0; color:var(--text); }
  .rost-kind-tag{ margin-left:auto; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em;
                  color:var(--text-dim); white-space:nowrap; }
  .rost-kind:has(input:checked){ border-color:var(--kc); background:color-mix(in srgb, var(--kc) 9%, var(--surface)); }
  .rost-kind:has(input:checked) .rost-kind-lbl{ color:var(--kc); }

  /* ── Add-entry chooser (v1.4.10.134) ─────────────────────── */
  .rost-modal-sub{ font-size:12px; color:var(--text-mute); margin-top:2px; }
  .rost-pick-h{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em;
                color:var(--text-mute); margin:2px 0 -4px; }
  .rost-pick-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(228px,1fr)); gap:8px; }
  .rost-pick{ --pc:#64748B; display:flex; align-items:center; gap:10px; text-align:left; width:100%;
              border:1px solid var(--line-2); border-radius:6px; background:var(--surface); padding:10px 12px;
              cursor:pointer; transition:border-color .12s, background .12s, transform .12s; }
  .rost-pick:hover{ border-color:var(--pc); background:color-mix(in srgb, var(--pc) 7%, var(--surface)); transform:translateY(-1px); }
  .rost-pick.work{ border-left:3px solid var(--pc); }
  .rost-pick-dot{ width:11px; height:11px; border-radius:3px; background:var(--pc); flex-shrink:0; }
  .rost-pick-dot.round{ border-radius:50%; }
  .rost-pick-main{ display:flex; flex-direction:column; min-width:0; flex:1; }
  .rost-pick-main strong{ font-size:13px; font-weight:700; color:var(--text); }
  .rost-pick-main small{ font-size:11px; color:var(--text-mute); line-height:1.45; margin-top:1px; }
  .rost-pick-tag{ font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em;
                  color:var(--text-dim); white-space:nowrap; }
  .rost-pick-go{ color:var(--text-dim); display:inline-flex; flex-shrink:0; }
  .rost-pick-go svg{ width:14px; height:14px; }

  /* ── Add-entry chooser, restructured (v1.4.10.138) ────────── */
  /* NB: `rost-add` is the tiny hover "+" button in a grid cell — a modal
     must never carry that class or it inherits opacity:0 and a 21px box. */
  .rost-addpick .rost-modal-body{ gap:15px; }
  .rost-add-ctx{ display:flex; flex-wrap:wrap; gap:8px; padding:10px 11px; border-radius:6px;
                 background:var(--surface-2); border:1px solid var(--line); }
  .rost-ctx-chip{ display:inline-flex; align-items:center; gap:7px; min-width:0; font-size:11px; font-weight:600;
                  color:var(--text); background:var(--surface); border:1px solid var(--line-2);
                  border-radius:999px; padding:4px 11px 4px 9px; }
  .rost-ctx-chip svg{ width:14px; height:14px; color:var(--brand-blue); flex-shrink:0; }
  .rost-ctx-chip span{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .rost-ctx-chip.muted{ color:var(--text-mute); font-weight:500; }
  .rost-ctx-chip.muted svg{ color:var(--text-dim); }
  .rost-ctx-chip em{ font-style:normal; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em;
                     color:#B45309; background:color-mix(in srgb, #D97706 16%, var(--surface));
                     border-radius:4px; padding:1px 5px; }
  .rost-pick-sec{ display:flex; flex-direction:column; gap:9px; }
  .rost-pick-sec .rost-pick-h{ display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; margin:0; }
  .rost-pick-h small{ font-size:11px; font-weight:500; text-transform:none; letter-spacing:0; color:var(--text-dim); }
  .rost-pick.away{ padding:9px 11px; }
  .rost-pick.away:hover{ transform:none; }
  .rost-pick-grid.away{ grid-template-columns:repeat(auto-fill,minmax(198px,1fr)); gap:7px; }
  .rost-pick-tag.ok{ color:var(--ok); }
  .rost-foot-note{ font-size:11px; color:var(--text-dim); }
  .rost-av.xs{ width:20px; height:20px; border-radius:50%; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; flex-shrink:0;   /* v1.4.10.473: 10px initials take the badge look */
               display:inline-flex; align-items:center; justify-content:center;
               background:var(--surface-3); color:var(--text-mute); }

  /* ── People on this roster (participants) ─────────────────── */
  .rost-ppl-sec{ display:flex; flex-direction:column; gap:8px; }
  .rost-ppl-row{ display:flex; align-items:center; gap:10px; padding:8px 11px; border:1px solid var(--line);
                 border-radius:6px; background:var(--surface); }
  .rost-ppl-row.pick{ cursor:pointer; transition:border-color .12s, background .12s; }
  .rost-ppl-row.pick:hover{ border-color:var(--brand-blue); background:var(--surface-2); }
  .rost-ppl-row input[type=checkbox]{ width:16px; height:16px; accent-color:var(--brand-blue); flex-shrink:0; }
  .rost-ppl-main{ display:flex; flex-direction:column; min-width:0; flex:1; }
  .rost-ppl-main strong{ font-size:13px; font-weight:700; color:var(--text);
                         overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .rost-ppl-main small{ font-size:11px; color:var(--text-mute); line-height:1.45;
                        overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .rost-ppl-tag{ font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; white-space:nowrap;
                 border-radius:4px; padding:2px 6px; flex-shrink:0;
                 color:#B45309; background:color-mix(in srgb, #D97706 16%, var(--surface)); }
  .rost-ppl-tag.warn{ color:var(--err); background:color-mix(in srgb, var(--err) 12%, var(--surface)); }
  .rost-ppl-own{ display:flex; flex-wrap:wrap; gap:6px; }
  .rost-ppl-chip{ display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:600; color:var(--text-mute);
                  background:var(--surface-2); border:1px solid var(--line); border-radius:999px; padding:4px 11px 4px 5px; }
  .rost-g-tag{ font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; white-space:nowrap;
               border-radius:4px; padding:1px 4px; margin-left:5px;
               color:#B45309; background:color-mix(in srgb, #D97706 16%, var(--surface)); }
  .rost-g-tag.off{ color:var(--text-dim); background:var(--surface-3); }

  /* ── Segmented control (shift type) ──────────────────────── */
  .rost-seg{ display:inline-flex; width:100%; background:var(--surface-2); border:1px solid var(--line);
             border-radius:6px; padding:3px; gap:3px; }
  .rost-seg-btn{ --pc:var(--brand-blue); flex:1; border:0; background:transparent; color:var(--text-mute);
                 font-size:12px; font-weight:600; font-family:inherit; padding:7px 10px; border-radius:5px;
                 cursor:pointer; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .rost-seg-btn:hover{ color:var(--text); }
  .rost-seg-btn.on{ background:var(--surface); color:var(--pc); box-shadow:var(--shadow-sm); }
  .rost-seg-hint{ font-size:12px; color:var(--text-mute); margin-top:5px; }

  /* ── Off-site markers ────────────────────────────────────── */
  .rost-chip.offsite{ border-left-style:double; border-left-width:4px; }
  .rost-chip-off,.rost-off-tag{ font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em;
                 color:#B45309; background:color-mix(in srgb, #D97706 16%, var(--surface));
                 border-radius:4px; padding:1px 5px; white-space:nowrap; display:inline-block; }
  .rost-dot.off{ border-radius:3px; border:1px solid color-mix(in srgb, #D97706 60%, transparent); }

  /* ── Positions ───────────────────────────────────────────── */
  .rost-pos-row{ display:flex; align-items:center; gap:9px; padding:6px 0; }
  .rost-pos-row input[type=color],.rost-pos-add input[type=color]{ width:34px; height:34px; border:1px solid var(--line-2);
      border-radius:5px; padding:2px; background:var(--surface); cursor:pointer; flex-shrink:0; }
  .rost-pos-name{ flex:1; min-width:0; font-size:13px; color:var(--text); background:var(--surface); border:1px solid var(--line-2);
                  border-radius:6px; padding:0 10px; height:34px; }
  .rost-pos-add{ display:flex; align-items:center; gap:9px; margin-top:12px; padding-top:12px; border-top:1px solid var(--line); }
  .rost-pos-add input[type=text]{ flex:1; min-width:0; font-size:13px; color:var(--text); background:var(--surface);   /* v1.4.10.473: min-width 0, so Add stays in the row on a phone (it ran 11px out) */
                                  border:1px solid var(--line-2); border-radius:6px; padding:0 10px; height:34px; }
  .rost-pos-row .btn,.rost-pos-add .btn{ min-height:34px; }   /* v1.4.10.473: a position row's swatch, name and button share one 34px height (were 32/36/22, and 32/38/30 in the add row) */

  /* ── Site-page module panel ──────────────────────────────── */
  .rost-mod-row{ display:flex; align-items:center; gap:12px; padding:8px 0; }
  .rost-mod-main{ flex:1; min-width:0; }
  .rost-mod-name{ font-size:13px; font-weight:600; color:var(--text); }
  .rost-mod-desc{ font-size:12px; color:var(--text-mute); line-height:1.5; margin-top:2px; }
  .rost-switch{ width:42px; height:24px; border-radius:20px; border:0; background:var(--surface-3); position:relative;
                cursor:pointer; flex-shrink:0; transition:background .15s; }
  .rost-switch.on{ background:var(--brand-blue); }
  .rost-switch-dot{ position:absolute; top:3px; left:3px; width:18px; height:18px; border-radius:50%; background:#fff;
                    box-shadow:var(--shadow-sm); transition:left .15s; }
  .rost-switch.on .rost-switch-dot{ left:21px; }
  .rost-modcfg{ display:flex; flex-direction:column; gap:8px; margin-top:8px; padding-top:10px; border-top:1px solid var(--line); }
  .rost-modhint{ font-size:12px; color:var(--text-dim); line-height:1.5; }

  /* ── Responsive ──────────────────────────────────────────── */
  @media(max-width:1080px){
    .rost-cols{ grid-template-columns:minmax(0,1fr); }
    .rost-col-side{ flex-direction:row; flex-wrap:wrap; }
    .rost-col-side .rost-side-panel{ flex:1; min-width:250px; }
  }
  @media(max-width:760px){
    .rost-bar{ padding:10px 12px; }
    .rost-bar-left,.rost-bar-right{ width:100%; }
    .rost-bar-right{ justify-content:space-between; }
    .rost-tabs{ width:100%; }
    .rost-tab{ flex:1; justify-content:center; padding:7px 8px; }
    .rost-site-sel{ max-width:100%; flex:1; }
    .rost-grid{ min-width:780px; }
    /* v1.4.10.422: the normal-week button was display:none here — and it is the only
       way into a person's pattern, so a phone could not set one. It takes the
       avatar's place, and the column is 16px wider (was 132px) so a name keeps the
       85px it had beside the avatar. */
    .rost-g-head,.rost-g-row{ grid-template-columns:148px repeat(7,minmax(0,1fr)); }
    .rost-g-person{ padding:8px; gap:6px; }
    .rost-av{ width:24px; height:24px; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; }   /* v1.4.10.473: at 10px, the badge look */
    .rost-mini.pat{ order:-1; }
    .rost-g-person:has(.rost-mini.pat) > .rost-av{ display:none; }
    .rost-mcell{ min-height:66px; }
    .rost-field-row{ flex-direction:column; }
    /* v1.4.10.473: the phone modal's 16px gutter (as #modal's) and the select's arrow tight to its edge, so the
       crew modals' default "No site (workshop, travel or training)" is not cut (it had 280px for 289) */
    .rost-modal-body{ padding-left:16px; padding-right:16px; }
    .rost-field select{ padding-right:4px; }
    .rost-appr-grid{ grid-template-columns:minmax(0,1fr); }
    .rost-tpl-head,.rost-tpl-row-edit,.rost-tpl-add{ grid-template-columns:1fr 1fr; }
    .rost-tpl-head{ display:none; }
    .rost-pat-head{ display:none; }
    .rost-pat-row{ grid-template-columns:1fr 1fr; gap:6px; padding:8px 0; border-bottom:1px solid var(--line); }
    .rost-pat-day{ grid-column:1 / -1; }
    .rost-pat-row .rost-pat-pos{ grid-column:1 / -1; }
    .rost-pick-grid,.rost-pick-grid.away{ grid-template-columns:minmax(0,1fr); }
    .rost-add-ctx{ flex-direction:column; align-items:flex-start; }
    .rost-foot-note{ display:none; }
    .rost-seg{ flex-direction:column; }
    .rost-seg-btn{ width:100%; }
    .rost-mine-stats{ gap:16px; }
    .rost-ag-time{ min-width:0; }
    .rost-ag-site{ width:100%; text-align:left; margin-left:0; }
  }

/* Roles & permissions — drift repair banner (v1.4.10.135). Shown when a stored
   role holds less than its built-in default, i.e. a capability was deleted by a
   save that couldn't draw it rather than deliberately unticked. */
.rp-gap{display:flex;gap:10px;align-items:flex-start;margin:0 16px 4px;padding:12px 14px;
  border:1px solid var(--warn,#B45309);border-radius:6px;background:rgba(180,83,9,.07);}
.rp-gap svg{width:18px;height:18px;flex:0 0 18px;margin-top:1px;color:var(--warn,#B45309);}
.rp-gap-h{font-weight:600;font-size:13px;margin-bottom:2px;}
.rp-gap-s{font-size:12px;color:var(--text-dim);margin-bottom:8px;line-height:1.45;}
.rp-gap-row{display:flex;gap:10px;align-items:center;justify-content:space-between;
  flex-wrap:wrap;padding:6px 0;border-top:1px solid var(--line);font-size:12px;}
.rp-gap-row code{font-size:12px;background:var(--bg-soft,rgba(0,0,0,.05));padding:1px 5px;border-radius:4px;}
@media (max-width:700px){ .rp-gap{margin:0 12px 4px;} .rp-gap-row{align-items:flex-start;} }

/* Roles & permissions — the Site Admin ⊆ Client rule switch (v1.4.10.137). */
.rp-cap-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  flex-wrap:wrap;padding:12px 16px;border-top:1px solid var(--line);}
.rp-cap-lbl{display:flex;align-items:flex-start;gap:9px;cursor:pointer;font-size:13px;}
.rp-cap-lbl strong{font-weight:600;}   /* v1.4.10.473: a switch's title is 13/600, as in the user editor and Settings > Security (was bold 700) */
.rp-cap-lbl input{width:16px;height:16px;margin-top:1px;accent-color:var(--brand-blue);cursor:pointer;flex:0 0 16px;}
.rp-cap-lbl input:disabled{cursor:not-allowed;opacity:.55;}
.rp-cap-lbl small{display:block;margin-top:2px;font-size:12px;color:var(--text-dim);line-height:1.45;max-width:64ch;}
.rp-cap-note{font-size:12px;color:var(--text-mute);}

/* ════════ Support tickets — sortable column headers (v1.4.10.147) ════════ */
.tkx-table th.tkx-th{cursor:pointer;user-select:none;white-space:nowrap;}
.tkx-table th.tkx-th:hover{color:var(--text);background:var(--surface-2);}
.tkx-table th.tkx-th.on{color:var(--accent);}
  /* ── Ticket list pager (v1.4.10.151 — 20 tickets a page) ── */
  .tkx-pager{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:14px 2px 4px;}
  .tkx-pgcount{font-size:12px;color:var(--text-mute);}
  .tkx-pgbtns{display:flex;align-items:center;gap:4px;flex-wrap:wrap;}
  .tkx-pg{min-width:34px;height:34px;padding:0 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-size:13px;font-weight:500;cursor:pointer;transition:background .12s ease,border-color .12s ease;}
  .tkx-pg:hover:not(:disabled):not(.on){border-color:var(--line-2);background:var(--surface-2);}
  .tkx-pg.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600;cursor:default;}
  .tkx-pg:disabled{opacity:.45;cursor:default;}
  .tkx-pg.nav{padding:0 12px;white-space:nowrap;}
  .tkx-pg-ellip{color:var(--text-dim);padding:0 3px;user-select:none;}
  @media (max-width:700px){
    .tkx-pager{justify-content:center;}
    .tkx-pg{min-width:40px;height:40px;font-size:13px;}
  }

/* ════════ Site Wiki (v1.4.10.147) ════════ */
.wk-layout{display:grid;grid-template-columns:290px minmax(0,1fr);gap:16px;align-items:start;}
.wk-scrim{display:none;}
.wk-side{background:var(--surface);border:1px solid var(--line);border-radius:8px;
  display:flex;flex-direction:column;max-height:calc(100vh - 190px);max-height:calc(100dvh - 190px);
  min-height:320px;position:sticky;top:84px;overflow:hidden;}
.wk-side-head{padding:12px 12px 8px;border-bottom:1px solid var(--line);display:flex;flex-direction:column;gap:8px;}
.wk-sitepick{width:100%;}
.wk-sitename{font-weight:600;font-size:15px;letter-spacing:-.012em;padding:2px 2px 0;}
.wk-search{position:relative;display:flex;align-items:center;}
.wk-search-ico{position:absolute;left:9px;color:var(--text-dim);display:inline-flex;}
.wk-search-ico svg{width:14px;height:14px;}
.wk-search input{width:100%;padding:8px 30px 8px 30px;border:1px solid var(--line-2);border-radius:6px;
  background:var(--surface-2);font-size:13px;color:var(--text);}
.wk-search input:focus{outline:none;border-color:var(--accent);background:var(--surface);}
.wk-search-x{position:absolute;right:6px;border:0;background:none;color:var(--text-dim);cursor:pointer;
  display:inline-flex;padding:3px;border-radius:6px;}
.wk-search-x:hover{color:var(--text);background:var(--surface-3);}
.wk-search-x svg{width:13px;height:13px;}
.wk-side-body{flex:1;overflow-y:auto;padding:8px 6px;}
.wk-side-foot{padding:10px 12px;border-top:1px solid var(--line);}
.wk-side-note{padding:10px 10px;font-size:12px;color:var(--text-dim);}
.wk-row{display:flex;align-items:center;gap:5px;padding:6px 8px;border-radius:6px;cursor:pointer;
  font-size:13px;font-weight:500;color:var(--text);line-height:1.35;min-height:32px;}
.wk-row:hover{background:var(--surface-2);}
.wk-row.on{background:var(--accent-glow);color:var(--accent-deep);font-weight:600;}
.wk-row .wk-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wk-caret{border:0;background:none;cursor:pointer;color:var(--text-dim);padding:2px;line-height:1;
  transform:rotate(0deg);transition:transform .12s ease;flex:0 0 auto;font-size:11px;}
.wk-caret.open{transform:rotate(90deg);}
.wk-caret-sp{width:15px;flex:0 0 15px;}
.wk-pin{font-size:11px;flex:0 0 auto;}
.wk-result{padding:8px 10px;border-radius:6px;cursor:pointer;}
.wk-result:hover{background:var(--surface-2);}
.wk-result-title{font-size:13px;font-weight:600;}
.wk-result-snip{font-size:12px;color:var(--text-mute);margin-top:2px;line-height:1.45;}

.wk-main{min-width:0;}
.wk-head{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap;}
.wk-pagesbtn{display:none;}
.wk-spacer{flex:1;}
.wk-crumbs{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0;font-size:13px;}
.wk-crumb{color:var(--text-mute);cursor:pointer;}
.wk-crumb:hover{color:var(--accent);text-decoration:underline;}
.wk-crumb.on{color:var(--text);font-weight:700;cursor:default;}
.wk-crumb-sep{color:var(--text-dim);}
.wk-menuwrap{position:relative;}
.wk-menu{display:none;position:absolute;right:0;top:calc(100% + 6px);z-index:60;background:var(--surface);
  border:1px solid var(--line-2);border-radius:6px;box-shadow:0 10px 30px rgba(15,23,42,.14);min-width:180px;padding:5px;}
.wk-menu.open{display:block;}
.wk-menu button{display:block;width:100%;text-align:left;border:0;background:none;padding:8px 10px;border-radius:5px;
  font-size:13px;font-weight:500;color:var(--text);cursor:pointer;}
.wk-menu button:hover{background:var(--surface-2);}
.wk-menu button > svg{vertical-align:middle;margin-top:-2px;}   /* v1.4.10.473: the icon centred on its label (it sat 4.5px high on the baseline) */
.wk-menu button.danger{color:var(--err);}
.wk-menu button.danger:hover{background:rgba(220,38,38,.08);}

.wk-article{padding:22px 26px 20px;}
.wk-h1{margin:0 0 4px;font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.25;}
.wk-meta{font-size:12px;color:var(--text-dim);margin-bottom:16px;}
.wk-meta-link{color:var(--accent);cursor:pointer;}
.wk-meta-link:hover{text-decoration:underline;}
.wk-blank{color:var(--text-dim);}

/* Rendered wiki content — shared by the view pane, the editor and revision previews. */
.wk-content{font-size:14px;line-height:1.7;color:var(--text);word-wrap:break-word;overflow-wrap:break-word;}
.wk-content h1{font-size:18px;margin:20px 0 8px;letter-spacing:-.024em;}
.wk-content h2{font-size:16px;margin:18px 0 7px;letter-spacing:-.012em;}
.wk-content h3{font-size:15px;margin:16px 0 6px;}
.wk-content h4{font-size:11px;font-weight:600;margin:14px 0 5px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}   /* v1.4.10.473: an uppercase heading is the uppercase-label look, 11/600 .06em (was 13px) */
.wk-content p{margin:0 0 10px;}
.wk-content ul,.wk-content ol{margin:0 0 10px;padding-left:24px;}
.wk-content li{margin:3px 0;}
.wk-content blockquote{margin:10px 0;padding:8px 14px;border-left:3px solid var(--accent);
  background:var(--surface-2);border-radius:0 6px 6px 0;color:var(--text-mute);}
.wk-content pre{margin:10px 0;padding:12px 14px;background:#0F172A;color:#E2E8F2;border-radius:6px;
  font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;overflow-x:auto;white-space:pre-wrap;word-break:break-word;}
.wk-content code{font-family:var(--font-source);font-size:12px;background:var(--surface-3);padding:1px 5px;border-radius:5px;}
.wk-content pre code{background:none;padding:0;}
.wk-content a{color:var(--accent);text-decoration:none;}
.wk-content a:hover{text-decoration:underline;}
.wk-content img{max-width:100%;height:auto;border-radius:6px;border:1px solid var(--line);margin:6px 0;}
.wk-content img.wk-img-loading{min-height:60px;min-width:120px;background:var(--surface-2);}
.wk-content img.wk-img-missing{opacity:.4;}
.wk-content hr{border:0;border-top:1px solid var(--line-2);margin:16px 0;}
.wk-content table{border-collapse:collapse;margin:10px 0;width:100%;font-size:13px;}
.wk-content th,.wk-content td{border:1px solid var(--line-2);padding:7px 10px;text-align:left;vertical-align:top;}
.wk-content th{background:var(--surface-2);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}   /* v1.4.10.473: a table header reads as every table header in the app, 11/600 uppercase .06em (was 13/700) */
.wk-content mark{background:rgba(var(--bc-accent-rgb),.16);border-radius:3px;padding:0 2px;}

/* Attachments panel */
.wk-atts{margin-top:20px;border-top:1px solid var(--line);padding-top:12px;}
.wk-atts-head{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);
  margin-bottom:8px;display:flex;align-items:center;gap:6px;}
.wk-atts-head .cn{background:var(--surface-3);border-radius:99px;padding:1px 7px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: a count is the badge look, 10/700 uppercase .04em (it took the label's .06em) */
.wk-att{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;font-size:13px;}
.wk-att:hover{background:var(--surface-2);}
.wk-att-ico{flex:0 0 auto;}
.wk-att-name{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
.wk-att-meta{color:var(--text-dim);font-size:12px;margin-left:auto;white-space:nowrap;flex:0 0 auto;}

/* Editor */
.wk-editwrap{padding:16px 18px 14px;}
.wk-ed-title{width:100%;border:0;border-bottom:1px solid var(--line);background:none;font-size:20px;font-weight:600;
  letter-spacing:-.024em;color:var(--text);padding:4px 2px 10px;margin-bottom:10px;}
.wk-ed-title:focus{outline:none;border-bottom-color:var(--accent);}
.wk-toolbar{display:flex;align-items:center;gap:3px;flex-wrap:wrap;padding:6px;border:1px solid var(--line);
  border-radius:6px;background:var(--surface-2);margin-bottom:12px;position:sticky;top:70px;z-index:20;}
.wk-tbtn{border:0;background:none;border-radius:5px;padding:6px 9px;font-size:12px;font-weight:500;color:var(--text);cursor:pointer;
  line-height:1;display:inline-flex;align-items:center;gap:4px;min-height:30px;}
.wk-tbtn:hover{background:var(--surface-3);}
.wk-tbtn svg{width:14px;height:14px;}
.wk-tsep{width:1px;height:18px;background:var(--line-2);margin:0 4px;flex:0 0 1px;}
.wk-editor{min-height:340px;border:1px solid var(--line-2);border-radius:6px;padding:14px 16px;background:var(--surface);}
.wk-editor:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow);}
.wk-ed-hint{font-size:12px;color:var(--text-dim);margin-top:8px;}

/* Link-to-page picker + history */
.wk-linklist{max-height:320px;overflow-y:auto;display:flex;flex-direction:column;gap:2px;}
.wk-linkopt{text-align:left;border:0;background:none;padding:8px 10px;border-radius:6px;font-size:13px;font-weight:500;color:var(--text);cursor:pointer;}
.wk-linkopt:hover{background:var(--surface-2);}
.wk-linkopt > svg{vertical-align:middle;margin-top:-2px;}   /* v1.4.10.473: the folder icon centred on its label, as in .wk-menu */
.wk-revlist{max-height:360px;overflow-y:auto;display:flex;flex-direction:column;gap:2px;}
.wk-rev{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:6px;}
.wk-rev:hover{background:var(--surface-2);}
.wk-rev-main{display:flex;align-items:baseline;gap:8px;min-width:0;flex:1;flex-wrap:wrap;}
.wk-rev-no{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;color:var(--text-dim);}
.wk-rev-title{font-weight:600;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wk-rev-meta{font-size:12px;color:var(--text-dim);}
.wk-revbody{max-height:46vh;overflow-y:auto;border:1px solid var(--line);border-radius:6px;padding:12px 14px;}
.wk-mv-label{display:block;font-size:12px;font-weight:500;color:var(--text-mute);margin-bottom:5px;}

/* Phone: the sidebar becomes a slide-over opened by the Pages button. */
@media (max-width: 900px){
  .wk-layout{grid-template-columns:minmax(0,1fr);}
  .wk-side{position:fixed;left:0;top:0;bottom:0;width:min(320px, 86vw);max-height:none;border-radius:0 8px 8px 0;
    z-index:210;transform:translateX(-102%);transition:transform .18s ease;box-shadow:0 0 40px rgba(15,23,42,.25);}
  .wk-layout.side-open .wk-side{transform:translateX(0);}
  .wk-layout.side-open .wk-scrim{display:block;position:fixed;inset:0;background:rgba(15,23,42,.35);z-index:205;}
  .wk-pagesbtn{display:inline-flex;}
  .wk-article{padding:16px 14px 14px;}
  .wk-h1{font-size:18px;}
  .wk-toolbar{top:58px;}
  .wk-att-meta{display:none;}
}
.wk-node{min-width:0;}

/* ── v1.4.10.148: categories, cards, TOC, video, drag-drop ── */
.wk-side-foot{display:flex;gap:8px;}
.wk-row.wk-cat{font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-top:4px;}
.wk-row.wk-cat.on{color:var(--accent-deep);}
.wk-cat-ico{display:inline-flex;flex:0 0 auto;color:var(--text-dim);}
.wk-cat-ico svg{width:13px;height:13px;}
.wk-row.on .wk-cat-ico{color:var(--accent-deep);}
.wk-cat-n{margin-left:auto;background:var(--surface-3);border-radius:99px;padding:0 7px;font-size:10px;font-weight:700;color:var(--text-mute);text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: badge look (tracked 0) */
.wk-h1-cat{display:inline-flex;vertical-align:-2px;margin-right:8px;color:var(--text-mute);}
.wk-h1-cat svg{width:20px;height:20px;}
.wk-kind-pill{display:inline-block;background:var(--surface-3);border-radius:99px;padding:1px 8px;font-size:10px;font-weight:700;
  text-transform:uppercase;letter-spacing:.04em;color:var(--text-mute);}

/* Child-page cards ("In this section" / category contents) */
.wk-kids{margin-top:20px;border-top:1px solid var(--line);padding-top:12px;}
.wk-kids-head{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);
  margin-bottom:10px;display:flex;align-items:center;gap:6px;}
.wk-kids-head .cn{background:var(--surface-3);border-radius:99px;padding:1px 7px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: badge look */
.wk-kids-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;}
.wk-kid{display:flex;align-items:flex-start;gap:10px;text-align:left;border:1px solid var(--line);border-radius:7px;
  background:var(--surface);padding:12px 13px;cursor:pointer;min-height:56px;transition:border-color .1s ease, box-shadow .1s ease;}
.wk-kid:hover{border-color:var(--accent);box-shadow:0 2px 10px rgba(15,23,42,.06);}
.wk-kid-ico{flex:0 0 auto;color:var(--text-dim);display:inline-flex;margin-top:1px;}
.wk-kid-ico svg{width:16px;height:16px;}
.wk-kid-body{min-width:0;display:flex;flex-direction:column;gap:2px;}
.wk-kid-title{font-size:13px;font-weight:600;color:var(--text);line-height:1.35;}
.wk-kid-meta{font-size:11px;color:var(--text-dim);}
.wk-kid-add{border-style:dashed;background:var(--surface-2);}
.wk-kid-add .wk-kid-title{color:var(--text-mute);}
.wk-kid-ex{font-size:12px;color:var(--text-mute);line-height:1.4;overflow:hidden;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;}
.wk-kid-cat{background:var(--surface-2);}                 /* a sub-category reads as structure, not content */
.wk-kid-cat .wk-kid-ico{color:var(--accent);}
/* Grouped child sections (v1.4.10.187) — a busy category splits into
   Sub-categories / Documents / Spreadsheets / Pages, each with its own light
   sub-header, so the page reads at a glance. Under "Wiki order" the children
   stay in one grid and these never render. */
.wk-kidgroup{margin-top:16px;}
.wk-kidgroup:first-child{margin-top:0;}
.wk-kidgroup-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;
  color:var(--text-dim);margin-bottom:8px;display:flex;align-items:center;gap:6px;}
.wk-kidgroup-h .cn{background:var(--surface-3);border-radius:99px;padding:0 6px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;line-height:16px;}   /* v1.4.10.473: badge look */
/* Gentle nudge to file loose items when a category structure already exists */
.wk-home-hint{font-size:12px;color:var(--text-mute);background:var(--surface-2);
  border:1px solid var(--line);border-radius:6px;padding:8px 11px;margin:0 0 10px;line-height:1.45;}

/* "On this page" table of contents */
.wk-toc{border:1px solid var(--line);border-radius:7px;background:var(--surface-2);padding:12px 16px;margin:0 0 16px;
  max-width:340px;}
.wk-toc-head{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:6px;}
.wk-toc a{display:block;font-size:12px;color:var(--text-mute);cursor:pointer;padding:2.5px 0;line-height:1.4;}
.wk-toc a:hover{color:var(--accent);}
.wk-toc a.wk-toc-l2{padding-left:12px;}
.wk-toc a.wk-toc-l3{padding-left:24px;}

/* Video + embeds */
.wk-content video{display:block;width:100%;max-width:720px;border-radius:6px;border:1px solid var(--line);
  margin:8px 0;background:#000;}
.wk-content iframe{display:block;width:100%;max-width:720px;aspect-ratio:16/9;border:0;border-radius:6px;
  margin:8px 0;background:#000;}
.wk-content video.wk-img-loading{min-height:120px;}

/* Drag-drop target highlight */
.wk-editor.wk-drop-hot{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow);background:var(--accent-glow);}

/* Modal inputs (link / video dialogs) */
.wk-modal-in{width:100%;padding:9px 11px;border:1px solid var(--line-2);border-radius:6px;background:var(--surface);
  font-size:13px;color:var(--text);}
.wk-modal-in:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow);}

/* ── Spreadsheet Find: whole-workbook results (v1.4.10.319) ── */
.wsf-all{margin-top:12px;font-size:12px;}
.wsf-hint{margin-top:6px;font-size:12px;color:var(--text-dim);line-height:1.45;}
.wsf-res{margin-top:10px;}
.wsf-note{font-size:12px;color:var(--text-mute);margin-bottom:6px;}
.wsf-note.err{color:var(--err);}
.wsf-list{max-height:min(46vh,360px);overflow:auto;border:1px solid var(--line);border-radius:6px;}
.wsf-tab{position:sticky;top:0;z-index:1;display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:6px 10px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-mute);background:var(--surface-2,rgba(127,127,127,.06));border-bottom:1px solid var(--line);}
.wsf-tab b{font-size:11px;color:var(--text-dim);}
.wsf-hit{display:flex;align-items:baseline;gap:8px;padding:7px 10px;cursor:pointer;
  border-bottom:1px solid var(--line);font-size:12px;}
.wsf-hit:last-child{border-bottom:0;}
.wsf-hit:hover,.wsf-hit:focus{background:var(--accent-glow,rgba(var(--bc-accent-rgb),.08));outline:none;}
.wsf-hit.on{background:var(--accent-glow,rgba(var(--bc-accent-rgb),.12));}
.wsf-ref{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;color:var(--accent);flex-shrink:0;min-width:44px;}
.wsf-txt{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wsf-fx{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;color:var(--text-dim);flex-shrink:0;max-width:38%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
@media(max-width:700px){
  .wsf-hit{flex-wrap:wrap;padding:9px 10px;min-height:40px;}
  .wsf-fx{max-width:100%;}
  .wsf-list{max-height:44vh;}
}
.wk-or{display:flex;align-items:center;gap:10px;margin:12px 0;color:var(--text-dim);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;}
.wk-or::before,.wk-or::after{content:'';flex:1;height:1px;background:var(--line-2);}

/* Phone polish for the new pieces */
@media (max-width: 700px){
  .wk-kids-grid{grid-template-columns:1fr;}
  .wk-toc{max-width:none;}
  .wk-content table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;}
  .wk-tbtn{min-height:40px;min-width:40px;justify-content:center;}
  .wk-side-foot{flex-direction:column;}
  .wk-content video,.wk-content iframe{max-width:none;}
}

/* ── Q-SYS Reflect device mapping (v1.4.10.149) ─────────────────────────── */
.qsy-wrap{display:flex;flex-direction:column;min-height:0;}
.qsy-body{padding-top:6px;}
.qsy-intro{color:var(--text-mute);font-size:12px;line-height:1.6;margin:2px 0 14px;}
.qsy-head-actions{display:flex;align-items:center;gap:8px;margin-right:8px;}
.qsy-core-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px;}
.qsy-core-card{border:1px solid var(--line);border-radius:7px;padding:14px;cursor:pointer;background:var(--surface,#fff);transition:border-color .12s, box-shadow .12s;}
.qsy-core-card:hover{border-color:var(--brand-blue);box-shadow:0 2px 10px rgba(0,0,0,.06);}
.qsy-core-top{display:flex;align-items:center;justify-content:space-between;gap:8px;}
.qsy-core-name{font-weight:600;font-size:15px;letter-spacing:-.012em;display:flex;align-items:center;gap:7px;min-width:0;overflow:hidden;text-overflow:ellipsis;}
.qsy-core-nums{display:flex;gap:14px;margin:10px 0 4px;}
.qsy-num .n{font-weight:600;font-size:20px;letter-spacing:-.02em;line-height:1.1;}
.qsy-num .n.ok{color:var(--ok);}
.qsy-num .l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
.qsy-core-bad{display:flex;gap:6px;flex-wrap:wrap;margin:2px 0 4px;}
.qsy-ct{font-size:11px;font-weight:600;border:1px solid var(--line);border-radius:10px;padding:1px 8px;color:var(--text-mute);}
.qsy-ct.err{color:var(--err);border-color:var(--err);}
.qsy-ct.warn{color:var(--warn);border-color:var(--warn);}
.qsy-core-asset{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px;margin-top:8px;padding-top:8px;border-top:1px dashed var(--line);}
.qsy-core-cta{margin-top:8px;font-size:12px;font-weight:600;color:var(--brand-blue);}
.qsy-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:2px 0 8px;}
.qsy-search{flex:1;min-width:224px;border:1px solid var(--line);border-radius:6px;padding:0 10px;height:32px;box-sizing:border-box;font-size:13px;background:var(--surface,#fff);}   /* v1.4.10.473: 32 tall like the Cores button and the filter groups in its row (was 38); 224 wide so "Search name, model, serial, IP…" is not cut (was 170), and still one toolbar line beside both filter groups (230 wrapped the Mapped group onto a second line) */
.qsy-fgroup{display:flex;border:1px solid var(--line);border-radius:6px;overflow:hidden;}
.qsy-fbtn{border:0;background:transparent;padding:0 8px;min-height:30px;font-size:12px;font-weight:600;cursor:pointer;color:var(--text-mute);white-space:nowrap;}   /* v1.4.10.473: 30 + the group's border = 32, the toolbar's height (was 34); 8px sides (was 10) so both groups and an uncut search fit the 820px mapper on one line */
.qsy-fbtn.on{background:var(--brand-blue);color:#fff;font-weight:600;}
.qsy-countline{margin:0 0 10px;}
.qsy-sys-head{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:14px 0 4px;}
.qsy-rows{border:1px solid var(--line);border-radius:7px;overflow:hidden;}
.qsy-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-top:1px solid var(--line);}
.qsy-row:first-child{border-top:0;}
.qsy-row-main{min-width:0;flex:1;}
.qsy-row-name{font-weight:600;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.qsy-row-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end;}
.qsy-chip{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--ok);color:var(--ok);border-radius:10px;padding:3px 10px;font-size:12px;font-weight:500;cursor:pointer;background:transparent;}
.qsy-x{padding:2px 8px;}
@media (min-width:701px){ .qsy-row-actions .btn,.qsy-row-actions .qsy-chip{min-height:32px;box-sizing:border-box;} }   /* v1.4.10.473: one height across a device row's controls (the chip and unlink button were 26, a Link button 30); a phone keeps its 40 */
.qsy-why{font-weight:400;font-size:11px;opacity:.85;margin-left:4px;}
.qsy-pick{border:1px solid var(--brand-blue);border-radius:7px;margin:6px 10px 10px;padding:10px;display:flex;flex-direction:column;gap:8px;background:var(--surface,#fff);}
.qsy-pick .qsy-search{width:100%;}
.qsy-pick-list{max-height:240px;overflow:auto;}
.qsy-pick-row{padding:7px 6px;border-radius:6px;cursor:pointer;}
.qsy-pick-row:hover{background:rgba(0,0,0,.045);}
.qsy-pick-row.is-bound{opacity:.55;cursor:not-allowed;}
@media (max-width:700px){
  .qsy-core-grid{grid-template-columns:1fr;}
  .qsy-toolbar{flex-direction:column;align-items:stretch;}
  .qsy-fgroup{width:100%;}
  .qsy-fbtn{flex:1;min-height:40px;}
  .qsy-search{font-size:16px;}
  .qsy-row{flex-wrap:wrap;}
  .qsy-row-actions{width:100%;justify-content:flex-start;padding-left:22px;}
  .qsy-chip{min-height:40px;}   /* v1.4.10.473: the linked-asset chip opens the asset, so it is a 40px tap target like the unlink button beside it (was 26) */
  .qsy-head-actions .btn{min-height:40px;}
  .qsy-wrap .site-ed-head{flex-wrap:wrap;}
  .qsy-head-actions{order:1;flex:1 0 100%;margin-right:0;}
  .qsy-head-actions:empty{display:none;}   /* v1.4.10.473: on a phone Auto-match takes its own line under the title; between the title and the close it squeezed the title into a 74px column and wrapped itself to 48px */
}

/* v1.4.10.150 — inline Q-SYS picker in the asset editor */
#ae-qsys-map .ae-qsys-chip{display:flex;align-items:center;gap:9px;padding:9px 12px;border:1px solid var(--line);border-radius:6px;background:var(--surface-2,rgba(148,163,184,.06));font-size:12px;}
#ae-qsys-map .ae-qsys-chip svg{width:15px;height:15px;color:var(--brand-blue,var(--bc-blue-v1));flex-shrink:0;}
#ae-qsys-map .ae-qsys-chip-t{flex:1;min-width:0;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
#ae-qsys-map .ae-qsys-cores{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(230px,100%),1fr));gap:9px;margin-top:9px;}
#ae-qsys-map .ae-qsys-core{display:flex;flex-direction:column;gap:4px;text-align:left;padding:10px 12px;border:1px solid var(--line);border-radius:6px;background:var(--bg-2);cursor:pointer;min-height:40px;}
#ae-qsys-map .ae-qsys-core:hover{border-color:var(--brand-blue,var(--bc-blue-v1));}
#ae-qsys-map .ae-qsys-core-t{display:flex;align-items:center;gap:7px;font-weight:600;font-size:13px;}
#ae-qsys-map .ae-qsys-core-s{font-size:12px;color:var(--text-dim);}
#ae-qsys-map .ae-qsys-pickhead{display:flex;gap:8px;align-items:center;margin-top:10px;}
#ae-qsys-map .ae-qsys-q{flex:1;min-width:0;}
#ae-qsys-map .ae-qsys-list{margin-top:8px;max-height:290px;overflow-y:auto;border:1px solid var(--line);border-radius:6px;background:var(--bg-2);}
#ae-qsys-map .ae-qsys-sys{padding:7px 12px 4px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);position:sticky;top:0;background:var(--bg-2);}
#ae-qsys-map .ae-qsys-dev{display:flex;align-items:center;gap:9px;width:100%;text-align:left;padding:8px 12px;border:0;border-top:1px solid var(--line);background:transparent;cursor:pointer;min-height:40px;font-size:12px;}
#ae-qsys-map .ae-qsys-dev:hover{background:var(--surface-2,rgba(148,163,184,.08));}
#ae-qsys-map .ae-qsys-dev.taken{opacity:.5;cursor:not-allowed;}
#ae-qsys-map .ae-qsys-dev-t{flex:1;min-width:0;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
#ae-qsys-map .ae-qsys-dev-s{font-size:11px;color:var(--text-dim);flex-shrink:0;}
@media (max-width:700px){ #ae-qsys-map .ae-qsys-q{font-size:16px;} }

/* ══════════ v1.4.10.152 ══════════ */
/* Shared user avatar chip: photo when uploaded, coloured initials otherwise. */
/* v1.4.10.473: 600 .02em is the 11px+ initials' look (avatars of 28px and up). userAv() gives initials on the 10px step
   (27px and under) the badge look, 10/700 uppercase .04em, inline beside their size — the per-container copies of it
   (tickets, ticket hero, maintenance, Your work) are gone */
.u-av{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;color:#fff;
  font-weight:600;letter-spacing:.02em;overflow:hidden;flex-shrink:0;vertical-align:middle;}
.u-av img{width:100%;height:100%;object-fit:cover;display:block;}
.cv-av.photo{padding:0;overflow:hidden;background:var(--surface-3);}
.cv-av.photo img{width:100%;height:100%;object-fit:cover;display:block;border-radius:inherit;}
.dv-av.photo{padding:0;overflow:hidden;background:var(--surface-3);}
.dv-av.photo img{width:100%;height:100%;object-fit:cover;display:block;border-radius:inherit;}
.ua-av.photo{padding:0;overflow:hidden;background:var(--surface-3);}
.ua-av.photo img{width:100%;height:100%;object-fit:cover;display:block;border-radius:inherit;}
/* v1.4.10.491: the User profile popup's hero shows the person's picture (64px, opens full size) */
.dv-hero-top .dv-hero-ico.up-photo{width:64px;height:64px;border:0;cursor:zoom-in;box-shadow:0 0 0 3px var(--surface),0 6px 18px rgba(15,23,42,.16);}
.dv-hero-top .dv-hero-ico.up-photo:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}

/* User editor — profile picture drop zone (header avatar + Profile tab row). */
.ue-avatar{cursor:pointer;overflow:hidden;position:relative;}
.ue-avatar.photo{padding:0;background:var(--surface-3);}
.ue-avatar img{width:100%;height:100%;object-fit:cover;display:block;border-radius:inherit;}
.ue-avatar.drag{outline:2px dashed var(--brand-blue);outline-offset:2px;}
.ue-av-row{display:flex;gap:14px;align-items:flex-start;border:1.5px dashed var(--line);border-radius:7px;
  padding:14px;transition:border-color .12s ease, background .12s ease;}
.ue-av-row.drag{border-color:var(--brand-blue);background:var(--accent-glow);}
.ue-av-mini{width:56px;height:56px;border-radius:50%;background:var(--brand-blue);color:#fff;display:flex;
  align-items:center;justify-content:center;font-weight:600;font-size:18px;flex-shrink:0;overflow:hidden;}
.ue-av-mini.photo{background:var(--surface-3);}
.ue-av-mini img{width:100%;height:100%;object-fit:cover;display:block;}
.ue-av-acts{flex:1;min-width:0;}

/* Ticket detail — Linked tickets card + link search. */
.lk-row{position:relative;}
.lk-row .rel-subj{cursor:pointer;}
.lk-row .rel-subj:hover{text-decoration:underline;}
.lk-x{background:none;border:0;color:var(--text-dim);cursor:pointer;padding:2px;border-radius:6px;
  display:inline-flex;flex-shrink:0;}
.lk-x:hover{color:var(--err);background:var(--surface-2);}
.lk-x svg{width:12px;height:12px;}
.tkt-lksearch{margin-top:8px;display:flex;flex-direction:column;gap:6px;}
.tkt-lksearch input{max-width:none;width:100%;}
.tkt-lklist{max-height:220px;overflow:auto;border:1px solid var(--line);border-radius:6px;padding:4px;}
.tkt-lkhit{padding:7px 9px;border-radius:6px;cursor:pointer;font-size:12px;}
.tkt-lkhit:hover{background:var(--surface-2);}

/* Ticket detail — asset picker (Properties card). */
.tkt-astbtn{text-align:left;cursor:pointer;display:inline-flex;align-items:center;gap:6px;max-width:100%;}
.tkt-astbtn .tkt-astcar{color:var(--text-dim);font-size:10px;margin-left:auto;}
.tkt-astpick{margin:6px 0 4px;border:1px solid var(--line);border-radius:7px;padding:10px;background:var(--surface-1);
  box-shadow:0 8px 22px rgba(14,26,44,.10);}
.tkt-astpick input{max-width:none;width:100%;min-height:34px;}
.tkt-astlist{max-height:240px;overflow:auto;margin-top:6px;}
.tkt-astgrp{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);
  font-weight:600;padding:4px 2px 2px;}
.tkt-asthit{padding:7px 9px;border-radius:6px;cursor:pointer;font-size:12px;}
.tkt-asthit:hover{background:var(--surface-2);}
/* The room the ticket already carries, inside the v215 room picker. */
.tkt-asthit.sel{background:var(--accent-soft,rgba(var(--bc-accent-rgb),0.10));box-shadow:inset 2px 0 0 var(--accent);}

/* Composer — the "…and Resolve / Close" send option (replies only). */
.tkt-aftersend{max-width:170px;}
.tkd-composer.note-mode .tkt-aftersend{display:none;}
@media (max-width:700px){
  .tkt-aftersend{max-width:none;flex:1 1 100%;}
  .tkt-astpick{padding:8px;}
  /* v1.4.10.215 — the v213 lesson again: the sidebar's own controls were
     floored, but the PICKER PANEL's search input and its result rows sit
     inside that surface and were never measured. 34px on a 390px phone. */
  .tkt-astpick input{min-height:40px;}
  .tkt-asthit{min-height:40px;}
}

/* Service vendor contact line under the In-Service vendor picker (v1.4.10.153) */
/* ── v1.4.10.270: the Assignment card STACKS its label above its control ─────
   Releasing the 170px cap was necessary and not sufficient. The sidebar rail is
   360px, the card body 322px and the "Assignee" key eats 56 of it, so a control
   sitting BESIDE its label can never have more than 228px — and this card's
   values are the longest in the product: "Name — Job Title" from the eligible-
   assignee list (v152), 40-character ICC room names (v215), asset tags with a
   picker caret. "Matthew Borg (no longer eligible)" needs 263px. No cap tuning
   fixes an arithmetic problem.

   Stacked, every control gets the full 294px, which is a 29% gain over the best
   the side-by-side layout could ever offer. A <select> has no text-overflow, so
   for the genuinely extreme name the markup also carries a title attribute —
   the value stays readable rather than merely wider.

   Scoped to #tkd-props-card (1,1,0) so the other .ex-row users across the app —
   which hold short values and read well side by side — are untouched. */
#tkd-props-card .ex-row{flex-direction:column;align-items:stretch;gap:5px;}
#tkd-props-card .ex-row .ex-k{font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:600;}
#tkd-props-card .ex-row .ex-sel{width:100%;min-width:0;flex:0 0 auto;text-align:left;}
#tkd-props-card .ex-row .ex-v{text-align:left;}
#tkd-props-card .ex-row.tkt-svmeta{gap:0;}

/* ── v1.4.10.270: SLA waiver band + the two SLA controls ────────────────────
   The band is amber, not green. Green would say "met"; this is "breached, and
   accepted" — two different facts, and the clocks above are still red. */
.tkd-slawv{margin-top:13px;padding:10px 11px;border-radius:6px;
  background:rgba(217,119,6,.09);border:1px solid rgba(217,119,6,.28);}
.tkd-slawv-h{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;
  text-transform:uppercase;letter-spacing:.06em;color:var(--warn,#B45309);}
.tkd-slawv-h svg{width:13px;height:13px;}
.tkd-slawv-b{margin-top:5px;font-size:12px;line-height:1.5;color:var(--text);word-break:break-word;}
.tkd-slawv-m{margin-top:4px;font-size:11px;color:var(--text-mute);}
.tkd-slaops{display:flex;flex-wrap:wrap;gap:7px;margin-top:13px;padding-top:12px;border-top:1px solid var(--line);}
.tkd-slaops .btn{flex:1 1 auto;justify-content:center;}
.tkd-slapick{display:flex;flex-direction:column;gap:8px;}
.tkd-slapick-r{display:flex;align-items:flex-start;gap:10px;padding:11px 12px;cursor:pointer;
  border:1px solid var(--line);border-radius:6px;background:var(--surface);}
.tkd-slapick-r:hover{border-color:var(--brand-blue,var(--bc-blue-v1));}
.tkd-slapick-r.on{border-color:var(--brand-blue,var(--bc-blue-v1));background:var(--accent-glow);}
.tkd-slapick-r input{margin-top:2px;flex:0 0 auto;}
.tkd-slapick-t{display:flex;flex-direction:column;gap:3px;min-width:0;font-size:13px;}
.tkd-slapick-t .device-meta{font-size:12px;}
@media(max-width:760px){ .tkd-slaops .btn{min-height:40px;} .tkd-slapick-r{min-height:40px;} }

/* v1.4.10.270 — the unlisted-supplier reconcile row. The select is the widest
   thing in it and it holds vendor names, so it gets the room and the button
   never wraps under it. */
.sup-unl{border-color:rgba(217,119,6,.32);}
.sup-unl-act{display:flex;align-items:center;gap:7px;justify-content:flex-end;}
.sup-unl-sel{max-width:none;min-width:0;flex:1 1 auto;}
@media(max-width:760px){ .sup-unl-act{flex-wrap:wrap;} .sup-unl-act .btn{min-height:40px;} .sup-unl-sel{min-height:40px;width:100%;} }

.ex-row.tkt-svmeta{padding-top:0;margin-top:-4px;}
.ex-row.tkt-svmeta a{color:var(--text-mute);text-decoration:none;}
.ex-row.tkt-svmeta a:hover{color:var(--brand-blue);text-decoration:underline;}

/* Wiki v1.4.10.153: chunked-upload progress pill (fixed, bottom-right) */
.wk-upl{position:fixed;right:16px;bottom:16px;z-index:1200;display:flex;align-items:center;gap:10px;
  background:var(--surface-1,#fff);border:1px solid var(--line);border-radius:6px;box-shadow:0 6px 24px rgba(15,23,42,.18);
  padding:10px 14px;font-size:12px;max-width:min(360px,calc(100vw - 32px));}
.wk-upl-name{max-width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text-mute);}
.wk-upl-bar{flex:1;min-width:90px;height:6px;border-radius:4px;background:var(--surface-3);overflow:hidden;}
.wk-upl-bar>span{display:block;height:100%;background:var(--brand-blue,var(--bc-blue-v1));border-radius:4px;transition:width .2s;}
.wk-upl-pct{color:var(--text-mute);min-width:34px;text-align:right;font-variant-numeric:tabular-nums;}

/* Wiki v1.4.10.153: sidebar drag-reorder — the drop target grows a top bar */
.wk-row.wk-row-drop{box-shadow:inset 0 2px 0 var(--brand-blue,var(--bc-blue-v1));background:var(--surface-2);}
.wk-row[draggable="true"]{cursor:grab;}
.wk-row[draggable="true"]:active{cursor:grabbing;}

/* ══════════════════════════════════════════════════════════════════════════
   Wiki spreadsheets (v1.4.10.156) — a live grid several people share.
   Layout notes worth keeping: the grid is ONE table inside a scrolling
   viewport. The column header (and any frozen rows) live in <thead> with
   position:sticky, and frozen columns get an inline sticky left offset from
   wsFrozenColStyle() — so both pinned axes survive the row windowing that
   keeps a 20,000-row sheet cheap to draw.
   ═════════════════════════════════════════════════════════════════════════ */
/* The panel is height-BOUNDED and the grid is the only thing that grows, so the
   tab bar and the save status are always on screen. Before v1.4.10.157 the grid
   took min(66vh,640px) and the panel simply grew past the bottom of the window:
   with the app shell not scrolling, the tab bar landed at y≈1040 in a 900px
   viewport and every worksheet after the first was UNREACHABLE. Matches the
   wiki sidebar's own budget so the two line up. */
.ws-panel{padding:0;overflow:hidden;display:flex;flex-direction:column;position:relative;   /* v1.4.10.541: relative, so .ws-clip sits in its corner */
  max-height:calc(100vh - 190px);max-height:calc(100dvh - 190px);min-height:420px;}
/* v1.4.10.541: the grid's clipboard proxy (wsRenderPage in js/14-sheets.js): a read-only textarea that holds the keyboard
   focus for the grid, so the browser aims its copy, cut and paste at it. Out of the flow in the panel's corner, one pixel,
   invisible, and never under the pointer; 16px type so a phone does not zoom in on it when it is focused. It must stay
   focusable, so never display:none or visibility:hidden here. */
.ws-panel textarea.ws-clip{position:absolute;left:0;top:0;width:1px;height:1px;min-width:0;max-width:1px;min-height:0;max-height:1px;   /* outranks the coarse-pointer textarea minimum (88px) below */
  margin:0;padding:0;border:0;outline:none;opacity:0;overflow:hidden;resize:none;font-size:16px;line-height:1;
  pointer-events:none;background:transparent;color:transparent;}
.ws-title-row,.ws-toolbar,.ws-fbar,.ws-tabs-row,.ws-warn{flex:none;}
/* The sheet's own actions (peers, Rename, Download, full screen, page menu)
   live INSIDE the panel from v1.4.10.190 — they have to travel with it when it
   fills the screen, and the breadcrumb head above is hidden there. */
.ws-title-row{padding:14px 16px 10px;border-bottom:1px solid var(--line);
  display:flex;align-items:flex-start;gap:10px;flex-wrap:wrap;}
.ws-title-txt{min-width:0;flex:1 1 320px;}
.ws-title-acts{display:flex;align-items:center;gap:6px;flex:none;margin-left:auto;min-width:0;max-width:100%;}   /* v1.4.10.473: never wider than the row (see .ws-peers) */
.ws-h1{margin:0;font-size:20px;font-weight:600;letter-spacing:-.024em;display:flex;align-items:center;gap:9px;}
.ws-h1 svg{opacity:.7;flex:none;}
.ws-sub{margin-top:4px;color:var(--text-mute);font-size:12px;}
.ws-warn{margin:10px 16px 0;padding:9px 12px;border-radius:6px;font-size:12px;
  background:rgba(217,119,6,.08);border:1px solid rgba(217,119,6,.28);color:#92400E;}

/* Toolbar */
.ws-toolbar{display:flex;align-items:center;gap:3px;flex-wrap:wrap;padding:8px 12px;
  border-bottom:1px solid var(--line);background:var(--surface-2);}
.ws-tbtn{border:1px solid transparent;background:transparent;border-radius:5px;cursor:pointer;
  min-width:30px;height:30px;padding:0 7px;font-size:12px;font-weight:500;color:var(--text);line-height:1;}
.ws-tbtn:hover{background:var(--surface);border-color:var(--line);}
.ws-tbtn:active{background:var(--surface-3);}
.ws-tsep{width:1px;height:20px;background:var(--line-2);margin:0 5px;flex:none;}
.ws-tsel{height:30px;border:1px solid var(--line);border-radius:5px;background:var(--surface);
  font-size:13px;color:var(--text);padding:0 6px;max-width:132px;}

/* Formula bar */
.ws-fbar{display:flex;align-items:center;gap:8px;padding:7px 12px;border-bottom:1px solid var(--line);}
.ws-fref{min-width:78px;font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;
  color:var(--text-mute);border-right:1px solid var(--line);padding-right:8px;}
.ws-fx{font-style:italic;font-weight:700;color:var(--text-dim);font-size:12px;}
.ws-fin{flex:1;min-width:0;height:30px;border:1px solid var(--line);border-radius:5px;
  padding:0 9px;font-size:13px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;background:var(--surface);color:var(--text);}
.ws-fin:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.ws-fval{font-size:12px;color:var(--text-mute);white-space:nowrap;max-width:38%;overflow:hidden;text-overflow:ellipsis;
  font-variant-numeric:tabular-nums;}

/* The grid */
.ws-vp{flex:1 1 auto;min-height:180px;overflow:auto;outline:none;background:var(--surface);
  overscroll-behavior:contain;}
.ws-tbl{border-collapse:separate;border-spacing:0;table-layout:fixed;width:max-content;/*overridden inline with an exact px width — v1.4.10.162*/font-size:13px;}
.ws-tbl th,.ws-tbl td{border-right:1px solid var(--line);border-bottom:1px solid var(--line);}
.ws-hdr th{position:sticky;top:0;z-index:6;background:var(--surface-3);color:var(--text-mute);
  font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;height:29px;text-align:center;cursor:pointer;
  user-select:none;position:sticky;}   /* v1.4.10.473: the grid's letters and numbers are table headers, 11/600 uppercase .06em (were 12/700) */
/* v1.4.10.289: --accent-glow is translucent, so a selected column's letter let the
   cells scrolling under it show through ("C2.6" printed over "A"). Layer it on
   the opaque chrome colour. */
.ws-hdr th.on{background:linear-gradient(var(--accent-glow),var(--accent-glow)),var(--surface-3);color:var(--brand-blue);}
.ws-hdr th.fz{z-index:7;}
.ws-corner{position:sticky;left:0;top:0;z-index:8;background:var(--surface-3);}
/* Stacking order inside the grid, highest first (v1.4.10.165). Everything here
   is position:sticky or absolute, so these layers WILL overlap each other as
   the sheet is scrolled, and the order has to be stated once, in one place:
     8  the corner (over both the letters and the row numbers)
     7  column letter of a frozen column (over the letters scrolling under it)
     6  the column letters
     5  row numbers — including a frozen row's row number
     4  the drawing layer            ── see .ws-objlayer
     3  a frozen row's cells
     2  a frozen column's body cells
     0  ordinary cells
   Two calls worth keeping: the CHROME (letters, numbers, corner) is above
   everything, because it is how you know where you are — that is the bug in
   Jay's screenshot. Shapes sit ABOVE the frozen panes rather than below: a
   legend box parked over column A on a sheet with a frozen first column would
   otherwise have its left edge permanently hidden, which trades one disappearing
   thing for another.
   The frozen-column offset is still written inline (it is per column) but its
   z-index is NOT: an inline z-index outranks every rule here, which is exactly
   how the body came to be painted over the column letters. */
.ws-tbl td.fz{z-index:2;}
.ws-ch{position:relative;}
.ws-grip{position:absolute;right:-3px;top:0;width:7px;height:100%;cursor:col-resize;z-index:2;}
.ws-grip:hover{background:var(--brand-blue);opacity:.5;}
.ws-rh{position:sticky;left:0;z-index:5;background:var(--surface-3);color:var(--text-mute);
  font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;text-align:center;cursor:pointer;user-select:none;
  font-variant-numeric:tabular-nums;}
.ws-rh.on{background:linear-gradient(var(--accent-glow),var(--accent-glow)),var(--surface-3);color:var(--brand-blue);}
/* Frozen rows sit in the <thead> and are individually sticky (a <tr> cannot
   be). `top` is written inline per row by wsRowHtml — without it the offset
   resolves to auto and a frozen row scrolls away like any other. */
.ws-r.ws-frz th,.ws-r.ws-frz td{position:sticky;z-index:3;background:var(--surface);}
.ws-r.ws-frz th{z-index:6;}          /* v1.4.10.289: ABOVE the scrolling row numbers (also 5) — at 5 the tbody's
                                        later-in-DOM gutter painted over the frozen row's number once scrolled, so
                                        a frozen header row read as row 108 */
.ws-r.ws-frz td.fz{z-index:3;}       /* frozen row ∩ frozen column — one layer, no conflict */
.ws-c{padding:0 6px;height:28px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  cursor:cell;position:relative;background:var(--surface);color:var(--text);}
.ws-c.a-l{text-align:left;} .ws-c.a-c{text-align:center;} .ws-c.a-r{text-align:right;font-variant-numeric:tabular-nums;}
.ws-c.b{font-weight:700;} .ws-c.i{font-style:italic;} .ws-c.u{text-decoration:underline;}
.ws-c.wrap{white-space:normal;overflow:hidden;line-height:1.25;}
.ws-c.sel{background:var(--accent-glow);}
.ws-c.cur{box-shadow:inset 0 0 0 2px var(--brand-blue);}
/* Somebody else's cell. The colour is theirs (--pk, set per cell) and matches
   their chip, their column letter and their row number. */
.ws-c.peer{box-shadow:inset 0 0 0 2px var(--pk,var(--bc-blue-v1));}
.ws-rh.peer{box-shadow:inset 3px 0 0 0 var(--pk,var(--bc-blue-v1));color:var(--pk,var(--bc-blue-v1));}
.ws-c .ws-err{color:var(--err);font-weight:700;font-size:12px;}
.ws-sp td{border:none;padding:0;background:var(--surface);}
.ws-cellin{width:100%;height:26px;border:none;outline:none;background:transparent;
  font:inherit;color:var(--text);padding:0;}

/* Peer cursors + presence chips */
.ws-peer-tag{position:absolute;top:-9px;right:-1px;z-index:5;color:#fff;font-size:11px;font-weight:600;
  border-radius:4px;padding:1px 3px;line-height:1.1;pointer-events:none;letter-spacing:0;}
.ws-peer-tag.typing{animation:ws-peer-blink 1.1s ease-in-out infinite;}
@keyframes ws-peer-blink{0%,100%{opacity:1;}50%{opacity:.45;}}
/* Column letter of a column somebody else is working in. */
.ws-chp{position:absolute;left:0;right:0;bottom:0;display:flex;justify-content:center;gap:2px;pointer-events:none;}
.ws-chp i{width:8px;height:3px;border-radius:2px;display:block;}
.ws-ch.pon{color:var(--pk,var(--bc-blue-v1));background:color-mix(in srgb, var(--pk,var(--bc-blue-v1)) 12%, var(--surface-3));}
.ws-ch.ptyping{font-weight:700;}
.ws-peers{display:flex;align-items:center;gap:5px;margin-right:6px;flex-wrap:nowrap;min-width:0;
  overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
/* v1.4.10.473: once enough people were in the sheet the action row ran past the panel's right edge (.ws-panel clips):
   four peers at a tablet's 800px, one on a phone, cut off the page menu, Full screen and Download. The row is capped at
   its own width now and the peer strip is what gives way, scrolling sideways like the menu bar; the chips keep their
   size (and "also here" its one line). The 3px padding keeps the typing ring inside the scroller, the margin puts every
   chip and button back where it was (the 6px to Rename is 3 + 3). */
.ws-peers:not(:empty){padding:3px;margin:-3px 3px -3px -3px;}
.ws-peers::-webkit-scrollbar{display:none;}
.ws-peers > *{flex:none;}
.ws-peer{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;color:var(--text);
  background:var(--surface-2);border:1px solid var(--pc,var(--bc-blue-v1));border-radius:999px;padding:2px 8px 2px 2px;
  max-width:190px;overflow:hidden;min-height:28px;}   /* v1.4.10.473: one 28px chip height — the peer avatars are 22px now (18px clipped two initials), and the "+N" chip read 25px beside them */
.ws-peer-av{display:inline-flex;flex-shrink:0;border-radius:50%;box-shadow:0 0 0 2px var(--pc,var(--bc-blue-v1));}
.ws-peer-av .u-av{border-radius:50%;overflow:hidden;}
.ws-peer-nm{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ws-peer-at{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:#fff;background:var(--pc,var(--bc-blue-v1));border-radius:5px;   /* v1.4.10.473: badge look */
  padding:1px 5px;font-variant-numeric:tabular-nums;flex-shrink:0;}
.ws-peer.away{opacity:.62;}
.ws-peer.typing{box-shadow:0 0 0 3px color-mix(in srgb, var(--pc,var(--bc-blue-v1)) 22%, transparent);}
.ws-peer.more{background:var(--text-dim);border-color:var(--text-dim);color:#fff;padding:3px 8px;}
.ws-peer-lbl{font-size:12px;color:var(--text-mute);margin-left:2px;}

/* Tab bar + save status */
.ws-tabs-row{display:flex;align-items:center;gap:10px;border-top:1px solid var(--line-2);
  padding:7px 12px;background:var(--surface-2);}
.ws-tabs{display:flex;align-items:center;gap:4px;overflow-x:auto;flex:1;min-width:0;scrollbar-width:thin;}
/* flex:0 0 auto is load-bearing, not tidiness (v1.4.10.196). The strip is a
   SCROLLER, but a flex item shrinks before its container overflows, so four
   worksheets on a 326px strip were squeezed to 50px each and every name was
   ellipsised down to "Rack…" — the tabs were unreadable while the scrollbar
   they were supposed to use sat unused. Tabs keep their natural width and the
   strip scrolls, which is what it was built to do. */
.ws-tab{flex:0 0 auto;border:1px solid var(--line);background:var(--surface);border-radius:5px 5px 0 0;
  padding:5px 11px;font-size:13px;font-weight:600;cursor:pointer;color:var(--text-mute);white-space:nowrap;max-width:190px;
  overflow:hidden;text-overflow:ellipsis;}
.ws-tab:hover{background:var(--surface-3);}
.ws-tab.on{background:var(--surface);color:var(--brand-blue);font-weight:600;border-bottom-color:var(--surface);
  box-shadow:inset 0 2px 0 var(--brand-blue);}
.ws-tab.add,.ws-tab.del{color:var(--text-dim);padding:5px 9px;border-radius:5px;}
.ws-tab.del:hover{color:var(--err);border-color:var(--err);}
.ws-status{font-size:12px;color:var(--text-mute);white-space:nowrap;min-width:74px;text-align:right;}

/* Download split button */
.ws-dlwrap{position:relative;}
.ws-dlmenu{display:none;position:absolute;right:0;top:calc(100% + 5px);z-index:60;min-width:210px;
  background:var(--surface);border:1px solid var(--line);border-radius:6px;
  box-shadow:0 12px 32px rgba(15,23,42,.16);padding:5px;}
.ws-dlmenu.open{display:block;}
.ws-dlmenu button{display:block;width:100%;text-align:left;border:none;background:transparent;
  padding:8px 10px;border-radius:5px;font-size:13px;font-weight:500;cursor:pointer;color:var(--text);}
.ws-dlmenu button:hover{background:var(--surface-2);}

/* Sidebar affordances for sheet pages */
.wk-sheet-ico{display:inline-flex;align-items:center;color:var(--text-dim);flex:none;}
.wk-sheet-ico svg{width:14px;height:14px;}
.wk-kind-tag{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--text-dim);background:var(--surface-3);border-radius:4px;padding:1px 4px;margin-left:auto;flex:none;}

/* Phones: the grid keeps scrolling both ways; the chrome around it gets
   thumb-sized, and the formula bar becomes the primary way to type a value. */

/* ══════════ Wiki sidebar, colours and navigation (v1.4.10.158) ══════════ */
.wk-side-tools{display:flex;align-items:center;gap:5px;}
.wk-sortsel{flex:1;min-width:0;height:28px;border:1px solid var(--line-2);border-radius:6px;background:var(--surface-2);
  color:var(--text-mute);font-size:13px;padding:0 6px;cursor:pointer;}
.wk-sortsel:focus{outline:none;border-color:var(--accent);}
.wk-side-sp{flex:0 0 2px;}
.wk-side-ico{border:1px solid var(--line-2);background:var(--surface-2);color:var(--text-mute);border-radius:6px;
  width:28px;height:28px;cursor:pointer;font-size:13px;line-height:1;}
.wk-side-ico:hover{background:var(--surface-3);color:var(--text);}
.wk-side-n{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim);background:var(--surface-3);border-radius:99px;padding:2px 7px;}
/* The foot was four flex:1 buttons that wrapped into a ragged block — Jay:
   "Bottom of the menu, fix the layout as they dont align." One full-width
   primary button and one menu instead, so it lines up at every width. */
.wk-side-foot{padding:10px;border-top:1px solid var(--line);display:block;}
.wk-newwrap{position:relative;}
.wk-newbtn{width:100%;display:flex;align-items:center;justify-content:center;gap:6px;}
.wk-caret-dn{font-size:10px;opacity:.8;}
/* Opening UPWARDS and stretching to the button's width is right for the
   sidebar foot and wrong everywhere else. v1.4.10.158 put it on the shared
   .wk-newmenu class, so the same rule reached the "New here" card and the
   contents-page cards: with .wk-kid-addwrap re-setting `top`, the panel had
   BOTH top and bottom pinned, collapsed to ~12px, and spilled its buttons
   outside a box its own container then clipped (v1.4.10.160). Scoped. */
.wk-side-foot .wk-newmenu{bottom:calc(100% + 6px);top:auto;left:0;right:0;min-width:0;}
.wk-menu-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);
  padding:6px 10px 4px;}
.wk-menu-sep{height:1px;background:var(--line-2);margin:4px 6px;}
.wk-menu-sub{display:block;font-size:11px;color:var(--text-dim);font-weight:400;margin-top:1px;}
.wk-menu button .wk-menu-sub{white-space:normal;}
.wk-dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:5px;vertical-align:middle;}
.wk-kid-addwrap{position:relative;}
.wk-kid-addwrap .wk-menu{left:0;top:calc(100% + 4px);right:auto;bottom:auto;min-width:250px;}
.wk-swatches{display:flex;flex-wrap:wrap;gap:8px;}
.wk-swatch{width:34px;height:34px;border-radius:6px;border:2px solid transparent;cursor:pointer;padding:0;
  box-shadow:0 0 0 1px var(--line-2) inset;}
.wk-swatch:hover{transform:scale(1.08);}
.wk-swatch.on{border-color:var(--text);}
.wk-swatch.none{background:linear-gradient(135deg,var(--surface) 45%,#DC2626 46%,#DC2626 54%,var(--surface) 55%);}
/* v1.4.10.161 — category colour, made reachable without the ⋯ menu. */
.wk-swatch.sm{width:24px;height:24px;border-radius:5px;border-width:2px;}
.wk-hexrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.wk-hexlab{font-size:12px;color:var(--text-mute);}
.wk-hexin{width:118px;border:1px solid var(--line);border-radius:6px;background:var(--surface);
  color:var(--text);padding:7px 9px;font-size:13px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;letter-spacing:.04em;}
.wk-hexin:focus{outline:0;border-color:var(--accent);}
/* ── v1.4.10.162: the colour picker, laid out ──────────────────────────────
   Three labelled bands (what's on now / palette / your own colour) and a real
   footer, so the dialog reads as one decision instead of a strip of squares
   with a stray text box under it. */
.wk-colhead{margin:0 0 14px;}
.wk-colhead h3{margin:0 0 5px;font-size:16px;}
.wk-colhead p{margin:0;font-size:12px;line-height:1.45;color:var(--text-mute);}
.wk-colnow{display:flex;align-items:center;gap:9px;background:var(--surface-2);border:1px solid var(--line);
  border-radius:6px;padding:9px 12px;margin-bottom:16px;}
.wk-colnow-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
.wk-colnow-chip{width:22px;height:22px;border-radius:6px;flex:none;box-shadow:0 0 0 1px var(--line-2) inset;}
.wk-colnow-chip.none{background:linear-gradient(135deg,var(--surface) 44%,#DC2626 45%,#DC2626 55%,var(--surface) 56%);}
.wk-colnow-v{font-size:13px;font-weight:600;color:var(--text);}
.wk-colsec{margin-bottom:16px;}
.wk-colsec-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-dim);margin-bottom:8px;}
.wk-colgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(88px,1fr));gap:8px;}
.wk-ct{display:flex;flex-direction:column;align-items:center;gap:6px;padding:9px 6px 8px;cursor:pointer;
  background:var(--surface);border:1.5px solid var(--line);border-radius:6px;font-family:inherit;
  transition:border-color .13s,transform .13s,box-shadow .13s;min-width:0;}
.wk-ct:hover{border-color:var(--text-dim);transform:translateY(-1px);box-shadow:0 3px 9px rgba(0,0,0,.09);}
.wk-ct.on{border-color:var(--accent,var(--bc-blue-v1));box-shadow:0 0 0 2px rgba(var(--bc-accent-rgb),.16);}
.wk-ct-sw{width:100%;height:30px;border-radius:5px;box-shadow:0 0 0 1px var(--line-2) inset;}
.wk-ct-sw.none{background:linear-gradient(135deg,var(--surface-2) 44%,#DC2626 45%,#DC2626 55%,var(--surface-2) 56%);}
.wk-ct-nm{font-size:12px;font-weight:600;color:var(--text-mute);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;max-width:100%;}
.wk-ct.on .wk-ct-nm{color:var(--text);}
.wk-ct.is-custom .wk-ct-nm{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.wk-colnative{width:44px;height:34px;padding:2px;border:1px solid var(--line);border-radius:6px;
  background:var(--surface);cursor:pointer;flex:none;}
.wk-colhint{font-size:12px;color:var(--text-dim);margin-top:7px;}
.wk-colfoot{display:flex;justify-content:flex-end;padding-top:13px;border-top:1px solid var(--line);}
@media(max-width:700px){
  .wk-colgrid{grid-template-columns:repeat(3,1fr);gap:7px;}
  .wk-ct{padding:8px 5px;min-height:44px;}
  .wk-ct-sw{height:34px;}
  .wk-hexin{flex:1 1 120px;min-width:0;font-size:16px;}
  .wk-colnative{width:48px;height:40px;}
}
.wk-ed-colour{display:flex;align-items:center;gap:7px;flex-wrap:wrap;
  padding:9px 0 4px;margin-bottom:6px;border-bottom:1px solid var(--line);}
.wk-ed-colour-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-dim);margin-right:2px;}
.wk-ed-colour-h{font-size:12px;color:var(--text-dim);flex:1 1 100%;margin-top:1px;}
.wk-colbtn{display:inline-flex;align-items:center;gap:2px;}
.wk-colbtn .wk-dot{width:12px;height:12px;border:1px solid var(--line);}
.wk-tinted .wk-h1{margin-top:2px;}
.wk-prevnext{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:22px;border-top:1px solid var(--line);padding-top:14px;}
.wk-pn{border:1px solid var(--line);background:var(--surface);border-radius:6px;padding:9px 12px;cursor:pointer;
  display:flex;flex-direction:column;gap:2px;min-width:0;text-align:left;}
.wk-pn.next{text-align:right;}
.wk-pn:hover{border-color:var(--accent);background:var(--surface-2);}
.wk-pn-dir{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);}
.wk-pn-title{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* ══════════ Spreadsheet: menu bar, palettes, shapes, charts (v1.4.10.158) ══════════ */
/* The bar WRAPS rather than scrolls (v1.4.10.160). overflow-x:auto made the
   36px strip clip on both axes, so every drop-down opened inside it and was
   invisible — Jay: "none of them work". Two rows on a narrow phone is a far
   smaller cost than a menu bar that does nothing. */
.ws-mbar{display:flex;align-items:center;gap:2px;padding:5px 10px;border-bottom:1px solid var(--line);
  background:var(--surface-2);flex:none;flex-wrap:wrap;row-gap:2px;}
.ws-mwrap{position:relative;flex:none;}
.ws-m{border:0;background:transparent;border-radius:5px;padding:5px 10px;font-size:13px;font-weight:500;
  color:var(--text);cursor:pointer;white-space:nowrap;}
.ws-m:hover{background:var(--surface-3);}
.ws-mbar-sp{flex:1;min-width:8px;}
.ws-mbar-hint{font-size:11px;color:var(--text-dim);white-space:nowrap;}
.ws-mm{display:none;position:absolute;left:0;top:calc(100% + 5px);z-index:70;min-width:232px;max-height:min(70vh,520px);
  overflow-y:auto;background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:5px;
  box-shadow:0 14px 34px rgba(15,23,42,.16);}
.ws-mm.open{display:block;}
.ws-mm button{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;text-align:left;
  border:0;background:transparent;padding:7px 10px;border-radius:5px;font-size:13px;font-weight:500;color:var(--text);cursor:pointer;}
.ws-mm button:hover{background:var(--surface-2);}
.ws-mm button.on{color:var(--brand-blue);font-weight:600;}
.ws-mm-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);
  padding:7px 10px 3px;}
.ws-mm-k{font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap;}
.ws-mm-sep{height:1px;background:var(--line-2);margin:4px 6px;}
.ws-mm-note{font-size:11px;color:var(--text-dim);padding:6px 10px 4px;border-top:1px solid var(--line-2);margin-top:4px;line-height:1.45;}
.ws-tbtn.on{background:var(--accent-glow);border-color:var(--brand-blue);color:var(--brand-blue);}
.ws-tsel-font{min-width:76px;} .ws-tsel-size{min-width:58px;}
.ws-swline{display:block;height:3px;border-radius:2px;margin-top:2px;min-width:14px;}
.ws-popwrap{position:relative;display:inline-flex;}
.ws-pop{display:none;position:absolute;left:0;top:calc(100% + 5px);z-index:70;min-width:190px;
  background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:8px;
  box-shadow:0 14px 34px rgba(15,23,42,.16);}
.ws-pop.open{display:block;}
.ws-pop-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin-bottom:6px;}
.ws-pop button{border:0;background:transparent;border-radius:5px;padding:6px 9px;font-size:13px;font-weight:500;color:var(--text);
  cursor:pointer;display:block;width:100%;text-align:left;}
.ws-pop button:hover{background:var(--surface-2);}
.ws-pop-col{min-width:0;} .ws-pop-bd{min-width:0;}
.ws-colgrid{display:grid;grid-template-columns:repeat(7,20px);gap:5px;}
.ws-colgrid button{width:20px;height:20px;padding:0;border-radius:5px;border:1px solid var(--line-2);}
.ws-colgrid button:hover{transform:scale(1.14);}
.ws-pop-clear{margin-top:8px;font-size:12px;color:var(--text-mute);border-top:1px solid var(--line-2);
  padding-top:7px !important;border-radius:0 !important;}
.ws-bdgrid{display:grid;grid-template-columns:repeat(4,34px);gap:4px;}
.ws-bdgrid button{width:34px;height:30px;text-align:center;border:1px solid var(--line-2);}
/* Cells: the v158 style additions */
.ws-c.st{text-decoration:line-through;}
.ws-c.u.st{text-decoration:underline line-through;}
.ws-c.v-t{vertical-align:top;} .ws-c.v-m{vertical-align:middle;} .ws-c.v-b{vertical-align:bottom;}
.ws-c.mg{white-space:normal;}
.ws-c.ws-cov{background:transparent;}
.ws-c.ws-hit{outline:2px solid var(--warn,#D97706);outline-offset:-2px;}
.ws-tbl.nogrid th,.ws-tbl.nogrid td{border-color:transparent;}
.ws-tbl.nogrid .ws-hdr th,.ws-tbl.nogrid .ws-rh{border-color:var(--line);}
.ws-note-dot{position:absolute;top:1px;right:1px;width:0;height:0;
  border-top:7px solid var(--warn,#D97706);border-left:7px solid transparent;}
.ws-c{position:relative;}
.ws-ch .ws-fbtn{position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:10px;cursor:pointer;
  color:var(--text-dim);padding:0 2px;}
.ws-ch.filt{background:var(--accent-glow);color:var(--brand-blue);}
.ws-ch .ws-fbtn:hover{color:var(--brand-blue);}
.ws-filterlist{max-height:300px;overflow-y:auto;border:1px solid var(--line-2);border-radius:6px;padding:4px;}
/* ── v1.4.10.162: the Sort dialog + sort straight off the column ▾ ────────── */
.ws-fsort{display:flex;gap:6px;flex-wrap:wrap;padding-bottom:10px;border-bottom:1px solid var(--line);}
.ws-sorthead{margin:0 0 14px;}
.ws-sorthead h3{margin:0 0 5px;font-size:16px;}
.ws-sorthead p{margin:0;font-size:12px;line-height:1.5;color:var(--text-mute);}
.ws-sortwarn{font-size:12px;line-height:1.45;background:var(--surface-2);border:1px solid var(--line);
  border-left:3px solid var(--warn,#D97706);border-radius:6px;padding:8px 11px;margin-bottom:12px;color:var(--text-mute);}
.ws-sortwarn.err{border-left-color:var(--err,#DC2626);}
.ws-sortopts{display:flex;flex-direction:column;gap:7px;padding:11px 12px;background:var(--surface-2);
  border:1px solid var(--line);border-radius:6px;margin-bottom:14px;}
.ws-sortchk{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text);cursor:pointer;}
.ws-sortchk input{width:15px;height:15px;accent-color:var(--brand-blue,var(--bc-blue-v1));cursor:pointer;flex:none;}
.ws-sortlevels{display:flex;flex-direction:column;gap:8px;}
.ws-sortrow{display:grid;grid-template-columns:62px minmax(0,1fr) minmax(0,1fr) 26px;align-items:center;gap:8px;}
.ws-sortrow-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
.ws-sortsel{width:100%;min-width:0;border:1px solid var(--line);border-radius:6px;background:var(--surface);
  color:var(--text);padding:7px 8px;font-size:13px;font-family:inherit;cursor:pointer;}
.ws-sortsel:focus{outline:0;border-color:var(--accent);}
.ws-sortdel{background:none;border:0;color:var(--text-dim);font-size:14px;cursor:pointer;padding:4px;border-radius:6px;}
.ws-sortdel:hover{background:var(--surface-2);color:var(--err,#DC2626);}
.ws-sortdel-sp{display:block;}
.ws-sortadd{margin-top:10px;background:none;border:1px dashed var(--line-2);border-radius:6px;color:var(--text-mute);
  font-family:inherit;font-size:13px;font-weight:500;padding:7px 12px;cursor:pointer;}
.ws-sortadd:hover{border-color:var(--accent);color:var(--text);}
.ws-sortfoot{display:flex;justify-content:flex-end;gap:8px;margin-top:18px;padding-top:13px;border-top:1px solid var(--line);}
@media(max-width:700px){
  .ws-sortrow{grid-template-columns:1fr 26px;grid-template-areas:"lab del" "col col" "dir dir";row-gap:5px;}
  .ws-sortrow-l{grid-area:lab;}
  .ws-sortrow .ws-sortsel:not(.dir){grid-area:col;}
  .ws-sortrow .ws-sortsel.dir{grid-area:dir;}
  .ws-sortdel,.ws-sortdel-sp{grid-area:del;}
  .ws-sortsel{font-size:16px;}
}
.ws-filteropt{display:flex;align-items:center;gap:8px;padding:5px 7px;border-radius:5px;font-size:13px;cursor:pointer;}
.ws-filteropt:hover{background:var(--surface-2);}
/* The drawing layer floats over the grid; only the shapes themselves take
   pointer events, so the cells underneath stay clickable. */
.ws-canvas{position:relative;width:max-content;min-width:100%;}
/* z-index 4: above every cell, BELOW the column letters and the row numbers.
   At 8 it was above everything, so a text box or a chart parked near the
   top-left of a sheet was drawn over the header band and over the row numbers
   — which is what hid the row numbers behind the three legend boxes on Jay's
   C2.1 tab. It stays above the frozen panes on purpose (see the stacking note
   above .ws-tbl td.fz). v1.4.10.165 */
.ws-objlayer{position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;z-index:4;}
.ws-obj{position:absolute;pointer-events:auto;cursor:move;}
.ws-obj.on{outline:2px dashed var(--brand-blue);outline-offset:2px;}
.ws-obj-shape{width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;
  padding:6px;box-sizing:border-box;overflow:hidden;background:var(--surface);}
.ws-obj-text{width:100%;height:100%;padding:6px 8px;box-sizing:border-box;overflow:hidden;background:var(--surface);
  border:1px dashed var(--line-2);border-radius:6px;}
.ws-obj svg{display:block;width:100%;height:100%;background:var(--surface);border-radius:6px;}
.ws-chart-empty{font-size:12px;color:var(--text-dim);border:1px dashed var(--line-2);}
.ws-ch-title{font-size:12px;font-weight:600;fill:var(--text);}
.ws-ch-lbl{font-size:11px;fill:var(--text-mute);}
.ws-ch-ax{stroke:var(--line);stroke-width:1;}
.ws-obj-grip{position:absolute;right:-5px;bottom:-5px;width:12px;height:12px;border-radius:3px;
  background:var(--brand-blue);cursor:nwse-resize;}
.ws-obj-tools{position:absolute;right:0;top:-26px;display:flex;gap:3px;}
.ws-obj-tools button{width:24px;height:22px;border:1px solid var(--line);background:var(--surface);border-radius:6px;
  font-size:11px;cursor:pointer;color:var(--text-mute);}
.ws-obj-tools button:hover{color:var(--text);background:var(--surface-2);}
.ws-obj-cols{display:grid;grid-template-columns:repeat(8,24px);gap:5px;margin-top:4px;}
.ws-obj-cols button{width:24px;height:24px;border-radius:6px;border:2px solid transparent;box-shadow:0 0 0 1px var(--line-2) inset;cursor:pointer;padding:0;}
.ws-obj-cols button.on{border-color:var(--text);}
.ws-obj-cols button.none{background:linear-gradient(135deg,var(--surface) 45%,#DC2626 46%,#DC2626 54%,var(--surface) 55%);}
/* Function browser */
.ws-fnlist{max-height:330px;overflow-y:auto;margin-top:10px;border:1px solid var(--line-2);border-radius:6px;padding:5px;}
.ws-fn-cat{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);
  padding:8px 8px 3px;}
.ws-fn{display:block;width:100%;text-align:left;border:0;background:transparent;border-radius:6px;padding:6px 8px;cursor:pointer;}
.ws-fn:hover{background:var(--surface-2);}
.ws-fn-name{font-weight:600;font-size:12px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--brand-blue);}
.ws-fn-sig{display:block;font-size:12px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--text-mute);margin-top:1px;}
.ws-fn-desc{display:block;font-size:12px;color:var(--text-dim);margin-top:1px;}

@media (max-width:700px){
  .ws-toolbar{gap:2px;padding:7px 8px;overflow-x:auto;flex-wrap:nowrap;}
  .ws-tbtn{min-width:40px;height:40px;font-size:14px;}
  .ws-tsel{height:40px;font-size:16px;}
  .ws-fbar{flex-wrap:wrap;padding:7px 8px;}
  .ws-fref{min-width:62px;}
  .ws-fin{height:40px;font-size:16px;flex:1 1 100%;order:3;}
  .ws-fval{flex:1 1 100%;order:4;max-width:none;text-align:right;}
  .ws-vp{min-height:150px;-webkit-overflow-scrolling:touch;}
  .ws-panel{max-height:calc(100vh - 130px);max-height:calc(100dvh - 130px);min-height:340px;}
  .ws-title-row{padding:11px 12px 8px;}
  .ws-h1{font-size:18px;}
  .ws-tab.add,.ws-tab.del{min-width:40px;}
  .ws-peer-lbl{display:none;}
  .ws-status{min-width:0;}
  .ws-dlmenu{min-width:190px;}
}
/* v1.4.10.158 on a phone: the menu bar scrolls horizontally like the toolbar,
   menus become nearly full-width sheets, and every menu row is thumb-sized. */
@media (max-width:700px){
  .ws-mbar{padding:5px 8px;}
  .ws-m{padding:9px 11px;font-size:13px;min-height:40px;}
  .ws-mm{min-width:min(84vw,320px);max-height:64vh;}
  .ws-mm button{padding:11px 12px;font-size:13px;min-height:44px;}
  .ws-pop{min-width:min(84vw,300px);}
  .ws-colgrid{grid-template-columns:repeat(7,28px);}
  .ws-colgrid button{width:28px;height:28px;}
  .ws-bdgrid{grid-template-columns:repeat(4,44px);}
  .ws-bdgrid button{width:44px;height:40px;}
  .ws-obj-tools button{width:34px;height:30px;}
  .ws-fn{padding:9px 10px;}
  .wk-side-ico{width:38px;height:38px;}
  .wk-sortsel{height:38px;font-size:16px;}
  .wk-newbtn{min-height:44px;}
  .wk-prevnext{grid-template-columns:1fr;}
  .ws-filteropt{min-height:40px;}
}

/* ════════ Site Wiki — the contents splash (v1.4.10.159) ════════
   The landing page of every site wiki: a breakdown of the whole menu. All of
   it is derived from the tree, so nothing here is styled per-page — a category
   passes its own colour down through the --hc custom property and everything
   below picks it up. */
.wk-homerow{display:flex;align-items:center;gap:7px;width:100%;text-align:left;cursor:pointer;
  border:1px solid var(--line-2);background:var(--surface-2);color:var(--text);
  border-radius:6px;padding:7px 9px;font-size:13px;font-weight:500;min-height:34px;}
.wk-homerow:hover{background:var(--surface-3);border-color:var(--accent);}
.wk-homerow.on{background:var(--accent-glow);border-color:var(--accent);color:var(--accent-deep);font-weight:600;}
.wk-homerow svg{width:14px;height:14px;flex:0 0 auto;}

.wk-home{padding:0;overflow:hidden;}
.wk-home-hero{display:flex;align-items:flex-start;gap:18px;flex-wrap:wrap;justify-content:space-between;
  padding:22px 26px 18px;background:linear-gradient(180deg,var(--surface-2),var(--surface));
  border-bottom:1px solid var(--line);}
.wk-home-hero-main{min-width:0;flex:1 1 320px;}
.wk-home-eyebrow{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;color:var(--text-mute);margin-bottom:6px;}
.wk-home-eyebrow svg{width:14px;height:14px;}
.wk-home-h1{margin:0 0 6px;font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.2;}
.wk-home-sub{margin:0;font-size:13px;color:var(--text-mute);line-height:1.55;max-width:56ch;}
.wk-home-stats{display:flex;gap:8px;flex-wrap:wrap;}
.wk-home-stat{border:1px solid var(--line-2);background:var(--surface);border-radius:7px;
  padding:9px 14px;min-width:82px;text-align:center;}
.wk-home-stat b{display:block;font-size:20px;font-weight:600;line-height:1.1;letter-spacing:-.02em;}
.wk-home-stat span{display:block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin-top:2px;}

.wk-home-bar{display:flex;align-items:center;gap:12px;padding:12px 26px;border-bottom:1px solid var(--line);flex-wrap:wrap;}
.wk-home-search{flex:1 1 240px;max-width:420px;}
.wk-home-updated{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-dim);white-space:nowrap;}
.wk-home-updated svg{width:13px;height:13px;}
.wk-home-none{padding:26px;font-size:13px;color:var(--text-mute);}

.wk-home-sec{padding:16px 26px 4px;}
.wk-home-sec + .wk-home-sec{border-top:1px solid var(--line);padding-top:16px;}
.wk-home-sec-h{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:600;text-transform:uppercase;
  letter-spacing:.06em;color:var(--text-mute);margin-bottom:10px;}
.wk-home-sec-h .cn{background:var(--surface-3);border-radius:99px;padding:1px 7px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: badge look (tracked 0) */
.wk-home-chips{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:12px;}
.wk-home-chip{display:inline-flex;align-items:center;gap:6px;cursor:pointer;max-width:100%;
  border:1px solid var(--line-2);background:var(--surface-2);color:var(--text);border-radius:99px;
  padding:6px 12px;font-size:12px;font-weight:500;min-height:32px;}
.wk-home-chip:hover{border-color:var(--accent);background:var(--surface);}
.wk-home-chip[style*="--hc"]{border-left:3px solid var(--hc);}
.wk-home-chip-ico{display:inline-flex;color:var(--text-dim);}
.wk-home-chip-ico svg{width:13px;height:13px;}
.wk-home-chip.pin .wk-home-chip-ico{color:var(--accent);}

.wk-home-cats{display:grid;grid-template-columns:repeat(auto-fill,minmax(310px,1fr));gap:12px;margin-bottom:14px;}
.wk-hc{border:1px solid var(--line);border-radius:7px;background:var(--surface);overflow:hidden;
  display:flex;flex-direction:column;min-width:0;}
.wk-hc.tinted{border-top:3px solid var(--hc);}
.wk-hc-head{display:flex;align-items:center;gap:8px;width:100%;text-align:left;cursor:pointer;
  border:0;border-bottom:1px solid var(--line);background:var(--surface-2);padding:10px 12px;min-height:42px;}
.wk-hc-head:hover{background:var(--surface-3);}
.wk-hc-ico{display:inline-flex;flex:0 0 auto;color:var(--text-dim);}
.wk-hc.tinted .wk-hc-ico{color:var(--hc);}
.wk-hc-ico svg{width:15px;height:15px;}
.wk-hc-title{font-size:15px;font-weight:600;letter-spacing:-.012em;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
.wk-hc-n{margin-left:auto;flex:0 0 auto;background:var(--surface-3);border-radius:99px;padding:1px 8px;
  font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-mute);}   /* v1.4.10.473: badge look */
.wk-hc-items{display:flex;flex-direction:column;padding:5px;}
.wk-hc-items.flat{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:4px;padding:0 0 12px;}
.wk-hc-items.flat > *{min-width:0;}
.wk-hc-blank{padding:10px;font-size:12px;color:var(--text-dim);}
.wk-hc-foot{border-top:1px solid var(--line);padding:6px;margin-top:auto;}
.wk-hc-add{display:flex;align-items:center;gap:6px;width:100%;text-align:left;cursor:pointer;
  border:1px dashed var(--line-2);background:var(--surface-2);color:var(--text-mute);border-radius:6px;
  padding:7px 9px;font-size:13px;font-weight:500;min-height:34px;}
.wk-hc-add:hover{border-color:var(--accent);color:var(--accent-deep);}
/* The card head is a button, so the colour control is a SIBLING of it (a button
   inside a button is invalid HTML and Chromium drops it). The row carries the
   background and divider the head used to own — these rules sit after the
   .wk-hc-head block on purpose so they win with no !important. v1.4.10.161 */
.wk-hc-headrow{display:flex;align-items:stretch;border-bottom:1px solid var(--line);background:var(--surface-2);}
.wk-hc-headrow .wk-hc-head{flex:1;min-width:0;border-bottom:0;background:transparent;}
.wk-hc-col{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  width:40px;min-height:40px;border:0;border-left:1px solid var(--line);background:transparent;cursor:pointer;}
.wk-hc-col:hover{background:var(--surface-3);}
.wk-hc-col .wk-dot{width:15px;height:15px;margin:0;border:1px solid var(--line);}
.wk-hc-add svg{width:13px;height:13px;}

/* min-width:0 is load-bearing, not tidiness: a row carries a nowrap excerpt, and
   a grid/flex item defaults to min-width:auto — so in the flat grids the track
   grew to the widest excerpt instead of ellipsising it, pushing rows 660px wide
   inside a 390px phone where .wk-home's overflow:hidden then CLIPPED them. */
.wk-hi{display:flex;align-items:flex-start;gap:9px;width:100%;min-width:0;text-align:left;cursor:pointer;
  border:0;background:none;border-radius:6px;padding:8px 9px;min-height:38px;color:var(--text);}
.wk-hi:hover{background:var(--surface-2);}
.wk-hi.sub{padding-left:28px;}
.wk-hi-ico{flex:0 0 auto;display:inline-flex;color:var(--text-dim);margin-top:2px;}
.wk-hi-ico svg{width:14px;height:14px;}
.wk-hi-main{min-width:0;display:flex;flex-direction:column;gap:1px;flex:1;}
.wk-hi-title{font-size:13px;font-weight:600;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wk-hi-pin{font-size:10px;}
.wk-hi-meta{font-size:11px;color:var(--text-dim);}
.wk-hi-ex{font-size:12px;color:var(--text-mute);line-height:1.45;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wk-hi-when{flex:0 0 auto;font-size:11px;color:var(--text-dim);white-space:nowrap;margin-top:2px;}
.wk-hi-path{font-size:11px;color:var(--text-dim);padding:0 9px 6px 32px;margin-top:-4px;}
.wk-hi-more{display:block;width:100%;min-width:0;text-align:left;cursor:pointer;border:0;background:none;
  color:var(--accent);font-size:13px;font-weight:500;padding:7px 9px;border-radius:6px;min-height:34px;}
.wk-hi-more:hover{background:var(--surface-2);text-decoration:underline;}
.wk-hi-more.sub{padding-left:28px;}

@media (max-width:700px){
  .wk-home-hero{padding:16px 14px 14px;gap:12px;}
  .wk-home-h1{font-size:18px;}
  .wk-home-stats{gap:6px;}
  .wk-home-stat{flex:1 1 68px;min-width:68px;padding:8px 10px;}
  .wk-home-stat b{font-size:20px;}
  .wk-home-bar{padding:10px 14px;}
  .wk-home-search{max-width:none;}
  .wk-home-sec{padding:14px 14px 4px;}
  .wk-home-cats{grid-template-columns:1fr;}
  .wk-hc-items.flat{grid-template-columns:1fr;}
  .wk-home-chip{min-height:40px;}
  .wk-hi{min-height:44px;}
  .wk-hi-when{display:none;}
  .wk-homerow{min-height:40px;font-size:13px;}
}

/* ── Register row thumbnail (v1.4.10.169) ────────────────────────────────────
   A picture of the kit beside every asset in the table and grouped views. The
   source is the asset's own photo where it has one, otherwise the picture on
   its catalogue model — which on a real imported estate is the only art there
   is. Fixed box with object-fit:contain so a wide rack unit and a tall stand
   both sit square and nothing is cropped or stretched. */
/* ── Register row marks (v1.4.10.181) ────────────────────────────────────────
   Two at-a-glance flags beside the asset tag: MONITORED (this asset feeds
   live status — Ody or a cloud SSO link) and INCOMPLETE (a compulsory field
   is still missing; the tooltip names which). */
/* Data-health section split (v1.4.10.184): the optional-coverage divider. */
.dh-sec{margin:14px 0 8px;padding-top:12px;border-top:1px solid var(--line);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.dh-sec span{display:block;font-weight:400;text-transform:none;letter-spacing:0;color:var(--text-dim);margin-top:2px;}
.am-marks{display:inline-flex;align-items:center;gap:4px;margin-left:7px;vertical-align:middle;}
.am-mark{display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;border-radius:50%;flex:none;}
.am-mark svg{width:11px;height:11px;}
.am-mark.mon{background:var(--accent-glow);color:var(--brand-blue);}
.am-mark.mon.ody-live{background:#DCFCE7;color:#15803D;}
.am-mark.mon.ody-wait{background:#FEF3C7;color:#B45309;position:relative;}
.am-mark.mon.ody-wait .ody-wait-dot{position:absolute;right:-2px;top:-2px;width:7px;height:7px;border-radius:50%;background:#D97706;border:1.5px solid #fff;}
.am-mark.inc{background:#FEF3C7;color:#92400E;border:1px solid #D97706;font-size:11px;font-weight:700;line-height:1;}
.acard-tag .am-marks{margin-left:6px;}
.a-thumb-cell{width:52px;padding-right:0;}
.a-thumb{width:40px;height:30px;border-radius:6px;border:1px solid var(--line);background:#fff;
  display:flex;align-items:center;justify-content:center;overflow:hidden;box-sizing:border-box;}
.a-thumb img{width:100%;height:100%;object-fit:contain;padding:2px;box-sizing:border-box;display:block;}
.a-thumb.none{background:var(--surface-2);}
/* v1.4.10.328: the glyph sits UNDER a lazily loaded picture and shows only
   while it is arriving or if it fails, so a row never draws a broken image. */
.a-thumb{position:relative;overflow:hidden;}
.a-thumb.has>svg{position:absolute;inset:0;margin:auto;width:16px;height:16px;opacity:.25;}
.a-thumb.has img{position:relative;z-index:1;background:#fff;}
.acard-media[data-thumb]{position:relative;overflow:hidden;}
.acard-media[data-thumb]>img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;display:block;z-index:0;background:#fff;}
.acard-media[data-thumb] .acard-statusdot{z-index:1;}
.acard-media.has>svg{opacity:.2;}
.a-thumb.none svg{width:16px;height:16px;opacity:.35;}
/* Still hydrating: the blob is on its way, so pulse rather than sitting as a
   dead grey box that reads as "no picture". */
.a-thumb.none.wait{animation:a-thumb-pulse 1.4s ease-in-out infinite;}
@keyframes a-thumb-pulse{0%,100%{opacity:1;}50%{opacity:.55;}}
@media (max-width:700px){ .a-thumb-cell{width:40px;} .a-thumb{width:32px;height:26px;} }

/* ══════════════════════════════════════════════════════════════════════════
   ASSET REGISTER ON A PHONE  (v1.4.10.172)
   The register is a 10–11 column table. Measured at 390 px it was 1,173 px
   wide, so on a phone you saw the thumbnail, the tag and the equipment name
   and had to drag sideways to find out which site or room the thing was in —
   the one fact you are usually standing in front of the kit trying to check.
   Below 760 px the same rows become one stacked card each. No markup is
   duplicated: the cells are simply reordered with flex `order`, so the sort
   headers, row selection, the QR button and the row menu all keep working,
   and desktop is untouched.
   NOTE ON SPECIFICITY: `.dt tbody td{padding:13px 18px}` is (0,1,2) and beat a
   plain `.asset-dt td` (0,1,1), which quietly added 26 px of height to every
   cell and made the card 374 px tall. Every rule below is qualified enough to
   win outright rather than relying on source order.
   ══════════════════════════════════════════════════════════════════════════ */
@media (max-width:760px){
  /* Beat the generic `table.dt{min-width:500px}` mobile floor — there is no
     longer a table to scroll, so nothing should force a minimum width. */
  table.dt.asset-dt{ min-width:0; width:100%; display:block; }
  table.dt.asset-dt thead{ display:none; }
  table.dt.asset-dt tbody{ display:block; }
  table.dt.asset-dt tbody tr{
    display:flex; flex-wrap:wrap; align-items:center; gap:6px 8px;
    padding:10px 12px; margin:0 0 8px; border:1px solid var(--line);
    border-radius:7px; background:var(--surface); box-shadow:var(--shadow-sm);
  }
  table.dt.asset-dt tbody tr:last-child{ margin-bottom:0; }
  table.dt.asset-dt tbody tr:hover{ background:var(--surface); }
  table.dt.asset-dt tbody tr.sel{ border-color:var(--brand-blue); background:var(--accent-glow); }
  table.dt.asset-dt tbody td{ display:block; border:0; padding:0; vertical-align:middle; }
  /* Line 1 — pick · picture · tag ……………………… QR + row menu */
  table.dt.asset-dt tbody td.ar-chk{ order:1; flex:none; }
  table.dt.asset-dt tbody td.a-thumb-cell{ order:2; flex:none; width:auto; padding-right:0; }
  /* basis 0 so the tag takes only what is left and never forces the row
     actions onto a line of their own */
  table.dt.asset-dt tbody td.ar-tag{ order:3; flex:1 1 0; min-width:0; overflow:hidden; }
  table.dt.asset-dt tbody td.ar-act{ order:4; flex:none; margin-left:auto; text-align:right; white-space:nowrap; }
  /* Line 2 — what it is, and WHERE it is (the point of the whole block) */
  table.dt.asset-dt tbody td.ar-equip{ order:5; flex:1 1 100%; min-width:0; }
  table.dt.asset-dt tbody td.ar-equip .device-meta{ white-space:normal; line-height:1.4; }
  /* Line 3 — state · condition · warranty … value */
  table.dt.asset-dt tbody td.ar-life{ order:6; flex:none; }
  table.dt.asset-dt tbody td.ar-cond{ order:7; flex:none; }
  table.dt.asset-dt tbody td.ar-warr{ order:8; flex:none; }
  table.dt.asset-dt tbody td.ar-value{ order:9; flex:none; margin-left:auto; }
  /* Line 4 — the two thin details, labelled, and gone entirely when blank
     (a column of dashes is worth less than the space it costs on a phone) */
  table.dt.asset-dt tbody td.ar-serial{ order:10; flex:1 1 100%; font-size:12px; }
  table.dt.asset-dt tbody td.ar-assigned{ order:11; flex:1 1 100%; font-size:12px; }
  table.dt.asset-dt tbody td.ar-serial::before{ content:"S/N "; color:var(--text-dim); }
  table.dt.asset-dt tbody td.ar-assigned::before{ content:"Assigned to "; color:var(--text-dim); }
  table.dt.asset-dt tbody td[data-empty="1"]{ display:none; }
  /* Nothing left to scroll: let the cards use the full width instead. */
  .ag-site:has(table.dt.asset-dt){ overflow-x:visible; }
  /* v1.4.10.329: at 360px the tag ("#AST111205") no longer fits beside the
     tick, the picture and the row actions — ellipsise it instead of letting
     the cell slice it (the marks stay visible beside it). */
  table.dt.asset-dt tbody td.ar-tag{ display:flex; align-items:center; gap:5px; }
  table.dt.asset-dt tbody td.ar-tag .mono-tag{ flex:0 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  table.dt.asset-dt tbody td.ar-tag .am-marks{ flex:none; margin-left:0; }
  .panel-body.flush:has(table.dt.asset-dt){ overflow-x:visible; padding:10px; }
  .panel-body.flush table.dt.asset-dt{ min-width:0; }
}

/* v1.4.10.177 — SUPPORT LIST AS CARDS ON PHONES. The 7-column tickets table
   measured 950px wide inside a sideways scroller at 390px — the same disease
   the register had before v172, cured the same way: the SAME cells reflow
   into a stacked card with flex order. Every selector is written
   table.dt.tkx-table … so it outguns .dt tbody td (the v172 specificity
   lesson) instead of relying on source order. */
@media(max-width:760px){
  table.dt.tkx-table thead{display:none;}
  table.dt.tkx-table, table.dt.tkx-table tbody{display:block;width:100%;min-width:0;}
  /* .panel-body.flush .dt sets min-width:680px (0-3-0) for the desktop
     scroller — outrank it (0-3-1), don't tie with it. */
  .panel-body.flush table.dt.tkx-table{min-width:0;}
  table.dt.tkx-table tbody tr{display:flex;flex-wrap:wrap;align-items:center;gap:3px 10px;padding:12px 12px;border-bottom:1px solid var(--line);cursor:pointer;}
  table.dt.tkx-table tbody td{display:block;border:0;background:none;padding:0;}
  /* ══ v1.4.10.275 — THE CARD WAS SHOWING NEITHER SUBJECT NOR REFERENCE ══════
     Jay, on an iPhone: "missing lots of data per ticket". Measured at 390x664
     on BOTH engines: td.tk-subj rendered 0px wide and 62px TALL, td.tk-loc
     0x31 — sixteen zero-width cells across the eight rows on screen. Every
     card printed an assignee, a status pill, two SLA badges and a timestamp,
     and NOT ONE printed the ticket's subject, its reference or its room. The
     93px those two cells reserved were blank.

     CAUSE: `.tkx-table td.tk-subj{max-width:0;width:40%}` (v203) and
     `td.tk-loc{max-width:0;width:13%}` (v236) are the DESKTOP table-ellipsis
     trick — max-width:0 is inert on a real `<td>` in table layout and merely
     stops the auto algorithm handing the cell more room. The moment this
     block turns those cells into flex items it stops being inert and becomes
     a literal clamp: a flex item with max-width:0 is 0px wide, `flex:1 1 100%`
     or not, and the content inside (.tkx-subj / td.tk-loc, both overflow:hidden)
     is clipped to nothing. Neither rule was ever reset here, so the card has
     been blank since v203 shipped the first max-width:0.

     NOT AN iOS BUG, though that is where it was seen: Chromium at the same
     viewport is identically broken. Safari differs only in that it does not
     paint the overflow, so on the iPhone the row is unambiguously empty while
     Chrome leaks a little text outside the 0px box. Fixed for every phone.

     THE RULE THIS LEAVES BEHIND: any cell carrying max-width:0 for a desktop
     table MUST restore max-width in the card block that reflows it. Grep
     `max-width:0` before adding another. */
  table.dt.tkx-table tbody td.tk-subj{flex:1 1 100%;order:1;max-width:100%;width:auto;min-width:0;}
  /* The subject is one line on the desktop table because a list is scanned.
     The card IS where it is read, and the v203 note already promised it two
     lines here — it just never had a box to be read in. */
  table.dt.tkx-table tbody td.tk-subj .tkx-subjwrap{max-width:calc(100% - 12px);}
  table.dt.tkx-table tbody td.tk-subj .tkx-subj{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
    white-space:normal;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
  /* Location gets its own line: ICC room names run to 48 characters and would
     otherwise take the whole chip line with them. One line, ellipsised, with
     the full text still on the cell's title. */
  table.dt.tkx-table tbody td.tk-loc{order:2;flex:1 1 100%;max-width:100%;width:auto;font-size:12px;color:var(--text-mute);}
  table.dt.tkx-table tbody td.tk-asg{order:3;font-size:12px;}
  table.dt.tkx-table tbody td.tk-pri{order:4;}
  table.dt.tkx-table tbody td.tk-status{order:5;}
  table.dt.tkx-table tbody td.tk-sla{order:6;flex:1 1 100%;white-space:normal!important;margin-top:2px;}
  table.dt.tkx-table tbody td.tk-upd{order:7;flex:1 1 100%;font-size:11px;color:var(--text-dim);}
}

/* v1.4.10.177 — the dashboard's Active-issues table gets the same phone card
   treatment as the Support list (it is on the LANDING page). */
@media(max-width:760px){
  table.dt.dash-issues thead{display:none;}
  table.dt.dash-issues, table.dt.dash-issues tbody{display:block;width:100%;min-width:0;}
  .panel-body.flush table.dt.dash-issues{min-width:0;}
  table.dt.dash-issues tbody tr{display:flex;flex-wrap:wrap;align-items:center;gap:3px 10px;padding:12px 12px;border-bottom:1px solid var(--line);cursor:pointer;}
  table.dt.dash-issues tbody td{display:block;border:0;background:none;padding:0;}
  table.dt.dash-issues tbody td.di-subj{flex:1 1 100%;order:1;font-weight:600;}
  table.dt.dash-issues tbody td.di-ref{order:2;font-size:12px;}
  table.dt.dash-issues tbody td.di-loc{order:3;font-size:12px;color:var(--text-mute);}
  table.dt.dash-issues tbody td.di-pri{order:4;}
  table.dt.dash-issues tbody td.di-status{order:5;}
  table.dt.dash-issues tbody td.di-sla{order:6;flex:1 1 100%;white-space:normal!important;margin-top:2px;}
  table.dt.dash-issues tbody td[colspan]{flex:1 1 100%;}
}

/* ═══════════════ Live documents (v1.4.10.187 — js/15-docs.js) ═══════════════
   The Word-shaped sibling of the spreadsheet: a page of contenteditable
   BLOCKS. The reading surface aims for document typography (measured line
   length, generous leading) rather than app chrome. */
.wd-panel{padding:0;}
.wd-titlebar{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding:18px 26px 4px;}
/* Save state, presence, download, full screen and the page menu sit in the
   document's own title bar (v1.4.10.190) so they are still there — and still
   telling you whether your typing has saved — when it fills the screen. */
.wd-title-txt{min-width:0;flex:1 1 320px;}
.wd-sub{margin-top:4px;color:var(--text-mute);font-size:12px;}
.wd-title-acts{display:flex;align-items:center;gap:6px;margin-left:auto;flex:none;align-self:center;}
.wd-title{margin:0;font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.25;}
.wd-src{font-size:12px;color:var(--text-dim);}
.wd-status{font-size:12px;color:var(--text-mute);min-width:64px;text-align:right;}
.wd-status.ok{color:var(--ok,#16A34A);}
.wd-status.err{color:var(--err,#DC2626);}
.wd-peers{display:inline-flex;gap:4px;align-items:center;}
.wd-peer{width:22px;height:22px;border-radius:50%;background:var(--accent,var(--bc-blue-v1));
  color:#fff;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;display:inline-flex;align-items:center;
  justify-content:center;border:2px solid var(--panel,#fff);}   /* v1.4.10.473: 10px initials take the badge look */
.wd-peer.more{background:var(--text-dim);}

.wd-toolbar{display:flex;align-items:center;gap:2px;flex-wrap:wrap;
  padding:8px 22px;border-bottom:1px solid var(--line);position:sticky;top:0;
  background:var(--panel);z-index:5;}
.wd-tb{border:0;background:none;color:var(--text);border-radius:6px;
  padding:0 9px;font-size:12px;font-weight:500;cursor:pointer;line-height:1;
  height:30px;min-width:30px;display:inline-flex;align-items:center;justify-content:center;}   /* v1.4.10.473: one height, the spreadsheet toolbar's 30px (they ran 22 to 28px beside a 31px select) */
.wd-tb:hover{background:var(--hover,rgba(0,0,0,.06));}
.wd-tb-danger:hover{background:rgba(220,38,38,.12);color:var(--err,#DC2626);}
.wd-tb-sel{border:1px solid var(--line);background:var(--panel);color:var(--text);
  border-radius:6px;padding:0 6px;font-size:13px;margin-right:4px;height:30px;}
.wd-tb-gap{width:1px;height:18px;background:var(--line);margin:0 6px;}

.wd-blocks{padding:14px 26px 48px;max-width:860px;}
.wd-blkrow{position:relative;border-radius:6px;}
.wd-blkrow.focused{background:var(--hover,rgba(var(--bc-accent-rgb),.05));
  outline:1px solid var(--accent-soft,rgba(var(--bc-accent-rgb),.25));}
.wd-blk{outline:none;min-height:1.4em;font-size:14px;line-height:1.65;
  padding:1px 8px;border-radius:6px;caret-color:var(--accent,var(--bc-blue-v1));}
.wd-blk p{margin:0 0 .55em;}
.wd-blk h1{font-size:24px;margin:.7em 0 .35em;line-height:1.25;}
.wd-blk h2{font-size:20px;margin:.65em 0 .3em;line-height:1.3;}
.wd-blk h3{font-size:18px;margin:.6em 0 .3em;}
.wd-blk h4{font-size:15px;margin:.55em 0 .25em;}
.wd-blk ul,.wd-blk ol{margin:.25em 0 .6em;padding-left:1.6em;}
.wd-blk li{margin:.15em 0;}
.wd-blk table{border-collapse:collapse;margin:.4em 0 .8em;width:100%;}
.wd-blk td,.wd-blk th{border:1px solid var(--line);padding:6px 9px;
  font-size:13px;vertical-align:top;}
.wd-blk img{max-width:100%;height:auto;border-radius:6px;}
.wd-blk a{color:var(--accent,var(--bc-blue-v1));}
.wd-blk blockquote{border-left:3px solid var(--line);margin:.4em 0 .7em;
  padding:2px 0 2px 12px;color:var(--text-mute);}
.wd-blkwho{position:absolute;top:-8px;right:6px;font-size:11px;font-weight:600;
  background:var(--accent,var(--bc-blue-v1));color:#fff;border-radius:6px;
  padding:1px 7px;display:none;pointer-events:none;}
.wd-blkwho.on{display:inline-block;}

@media (max-width:760px){
  .wd-titlebar{padding:14px 14px 2px;}
  .wd-toolbar{padding:6px 10px;overflow-x:auto;flex-wrap:nowrap;}
  .wd-blocks{padding:10px 14px 40px;}
  .wd-blk{font-size:16px;}   /* 16px stops iOS zooming the focused editable */
}
@media print{
  .wd-toolbar,.wd-blkwho,.wk-head{display:none!important;}
  .wd-blocks{max-width:none;padding:0;}
}

/* ═══════════ Full-screen surfaces (v1.4.10.190 — AV_FULL in js/01-core.js) ═══
   Jay: "excel and word need to be able to expand full screen in wiki."

   `inset:0` rather than any flavour of 100vh: a fixed box pinned to all four
   edges is measured against the visual viewport, so it needs no dvh dance and
   cannot be cut off by a phone's sliding URL bar — the exact failure the login
   card hit in v1.4.10.129.

   z-index 40 is deliberate and load-bearing: ABOVE the app shell and the wiki
   panels, BELOW .modal-back (50), so Sort…, Move…, Delete… and every other
   dialog still opens over the expanded surface. Menus (.ws-mm/.wk-menu, 60-70)
   are descendants of the panel, so they stack inside it and stay reachable. */
body.av-full{overflow:hidden;}
body.av-full .wk-head{display:none;}        /* its actions live in the panel */
.ws-panel.is-full,.wd-panel.is-full{
  position:fixed;inset:0;z-index:40;margin:0;border:0;border-radius:0;
  max-height:none;max-width:none;width:auto;height:auto;
  background:var(--surface);box-shadow:none;
  padding-bottom:env(safe-area-inset-bottom,0px);}
.ws-panel.is-full{min-height:0;}
/* The document is a bounded column when expanded — title bar and toolbar stay
   put, the page itself scrolls, and the measure stays centred and readable
   instead of stretching to a 27" monitor. */
.wd-panel.is-full{display:flex;flex-direction:column;}
.wd-panel.is-full .wd-titlebar,.wd-panel.is-full .wd-toolbar{flex:none;}
.wd-panel.is-full .wd-blocks{flex:1 1 auto;overflow-y:auto;overscroll-behavior:contain;
  width:100%;margin:0 auto;padding-top:20px;}
.av-fullbtn{white-space:nowrap;}
.av-fullbtn.on{background:var(--accent-glow);border-color:var(--brand-blue);color:var(--brand-blue);}
@media (max-width:700px){
  /* On a phone the label is the first thing to go — the icon still reads. */
  .av-fullbtn-t{display:none;}
  .ws-title-acts,.wd-title-acts{gap:4px;}
}
@media print{
  /* A pinned box would print as one page of whatever happened to be visible. */
  .ws-panel.is-full,.wd-panel.is-full{position:static;inset:auto;height:auto;max-height:none;}
  .wd-panel.is-full .wd-blocks{overflow:visible;}
}

/* ══════════════════════════════════════════════════════════════════════════
   THE WIKI ON A PHONE  (v1.4.10.195)
   Jay: "make sure wiki works fine on iphone (safari) and mobile browsers,
   found some bits not laying out correctly."

   Every number below was measured in WebKit at the REAL iPhone 13 viewport —
   390×664, not the 844 a desktop harness reports. At that height the
   spreadsheet's own chrome (title row 140 + menu bar 109 + toolbar 65 +
   formula bar 86 = 400) plus the grid's 150px floor plus the 51px tab row
   came to 601 inside a 534px panel, and `.ws-panel{overflow:hidden}` clipped
   the last child — so the WORKSHEET TABS and the save status were simply
   gone, and on a four-tab workbook only tab one could ever be reached. That
   is the v1.4.10.157 fault returning at phone widths and it is what most of
   this block is about: cut the chrome, and make the grid the only thing in
   the panel allowed to give way.
   ══════════════════════════════════════════════════════════════════════════ */

/* A table in a wiki page is its own horizontal scroller at every width —
   see wkWrapTables() in js/12-wiki.js for why it is a wrapper and not a
   `display:block` on the table (that splits thead and tbody into separate
   anonymous tables and the columns stop lining up). */
.wk-tblwrap{max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;
  overscroll-behavior-x:contain;margin:10px 0;}
.wk-tblwrap > table{margin:0;min-width:max-content;}

@media (max-width:760px){
  /* 1 · The head cost THREE rows (Pages / trail / actions) because
     `.wk-spacer{flex:1}` forces a wrap in a wrapping flex row. Two rows now,
     with the buttons on the line a thumb actually reaches. */
  .wk-head{gap:6px;row-gap:6px;margin-bottom:10px;}
  .wk-head > .wk-spacer{display:none;}
  .wk-head > .wk-pagesbtn{order:1;margin-right:auto;}
  /* The trail is ONE line that scrolls sideways rather than three wrapped
     ones — a sheet titled "ICC rack elevations — Convention Centre Level 2"
     wrapped the crumb row to 3 lines and then repeated the same title in the
     panel's own h1 immediately below it. */
  .wk-head > .wk-crumbs{order:9;flex:1 1 100%;font-size:12px;flex-wrap:nowrap;
    overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
  .wk-head > .wk-crumbs::-webkit-scrollbar{display:none;}
  .wk-crumb{padding:2px 0;white-space:nowrap;}
  .wk-crumb-sep{flex:0 0 auto;}

  /* 2 · The spreadsheet's vertical budget. */
  .ws-title-row{padding:9px 12px 7px;gap:6px;}
  .ws-h1{font-size:18px;gap:7px;}
  .ws-sub{margin-top:2px;font-size:12px;}
  .ws-title-txt{flex:1 1 100%;}
  .ws-title-acts{flex:1 1 100%;margin-left:0;justify-content:flex-end;
    flex-wrap:wrap;row-gap:6px;}
  /* v1.4.10.473: one peer cut the page menu in half here and three put Download,
     Full screen and the menu out of reach. Squeezed into the buttons' row the
     strip would show half a chip, so on a phone the peers take their own line
     above the buttons (it still scrolls sideways past three or so). */
  .ws-peers:not(:empty){flex:1 1 100%;margin-right:-3px;}
  /* The state is worth 4 words; the sentence explaining collaboration is not
     worth two lines of a 664px screen, and the menu bar says it a second
     time three rows further down. */
  .ws-sub-x,.wd-sub-x{display:none;}
  .ws-mbar-hint,.ws-mbar-sp{display:none;}
  /* v1.4.10.288: ONE row, not two. At 390px the seven menu names wrapped
     ("View" alone on a second line) and cost the grid 45px of a 664px
     screen; the strip now scrolls sideways like the tab bar. The menus
     themselves are position:fixed (avPopFix) so the strip's overflow can't
     clip them. And 36px broke the 40px phone tap floor (v128). */
  .ws-mbar{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
  .ws-mbar::-webkit-scrollbar{display:none;}
  .ws-m{padding:8px 9px;font-size:13px;min-height:40px;}
  /* Full screen on a phone is FOR the grid: the title text, Rename and
     Download step aside (all three live in the File menu), so the top strip
     is one 50px row — peers, the exit button and the page menu. Measured on
     the ICC "AV Ports" sheet: grid 317px → ~400px of the 664px screen. */
  .ws-panel.is-full .ws-title-txt,
  .ws-panel.is-full .ws-title-acts > .btn:not(.av-fullbtn),
  .ws-panel.is-full .ws-dlwrap{display:none;}
  .ws-panel.is-full .ws-title-row{padding:6px 10px;}
  .ws-panel.is-full .ws-title-acts{flex:1 1 100%;flex-wrap:nowrap;}
  /* v1.4.10.473: here the peers share the one row (it is the whole point of
     the row) and give way, scrolling, to the exit button and the page menu. */
  .ws-panel.is-full .ws-peers:not(:empty){flex:0 1 auto;margin-right:3px;}   /* the base 3px back */
  .ws-toolbar{padding:5px 8px;}
  /* v1.4.10.541: 40, the phone tap floor (v128). This 38 came after the 40 of the 700px block above and so won at
     390px: every toolbar button measured 38px wide. The title row's Full screen button was 38 wide the same way. */
  .ws-tbtn{min-width:40px;height:40px;}
  .ws-m{min-width:40px;}
  .ws-title-acts > .btn,.ws-title-acts .av-fullbtn{min-width:40px;min-height:40px;}
  /* One row rather than three: the reference and the formula share a line and
     the selection summary stands down (the grid itself shows the selection). */
  .ws-fbar{flex-wrap:nowrap;gap:6px;padding:5px 8px;}
  .ws-fref{min-width:0;font-size:12px;padding-right:6px;}
  .ws-fin{flex:1 1 auto;order:0;height:36px;}
  .ws-fval{display:none;}
  /* THE FIX that keeps the tab bar on screen: the grid is the only child of a
     clipping panel that may be squeezed, so it must be able to reach zero.
     Every other child is flex:none and therefore always laid out. */
  .ws-vp{min-height:0;}
  /* The worksheet tabs are how you move around a workbook — at 13px in a
     strip that squeezed them they could not be read, let alone hit. Sized
     like the rest of the phone chrome: 15px, 40px tall. */
  .ws-tabs-row{padding:6px 8px;gap:8px;}
  .ws-tabs{gap:5px;scroll-padding-inline:20px;}
  .ws-tab{padding:0 13px;font-size:13px;min-height:40px;display:inline-flex;align-items:center;
    max-width:min(190px,58vw);}
  .ws-tab.on{box-shadow:inset 0 3px 0 var(--brand-blue);}
  .ws-tab.add,.ws-tab.del{min-width:40px;padding:0 10px;justify-content:center;font-size:16px;}
  .ws-panel{max-height:calc(100dvh - 108px);}

  /* 3 · The document. Its toolbar buttons measured 23px tall — the app's own
     phone standard is 40px and the sheet's toolbar already meets it. */
  .wd-titlebar{padding:12px 14px 2px;gap:8px;}
  .wd-title{font-size:18px;}
  .wd-sub{margin-top:2px;font-size:12px;}
  .wd-title-txt{flex:1 1 100%;}
  .wd-title-acts{flex:1 1 100%;margin-left:0;justify-content:flex-end;align-self:flex-start;
    flex-wrap:wrap;row-gap:6px;}
  /* v1.4.10.473: the sheet's fault again. One unwrapped row held the save state, up to seven initials, Word, Full
     screen and the page menu, so five people in the document cut the menu in half on the panel's clipped edge and
     seven put Full screen and the menu out of reach. As on the sheet, the peers take their own line above the buttons
     once anyone is here (order:-1: in the markup they sit after the save state). */
  .wd-peers:not(:empty){order:-1;flex:1 1 100%;}
  .wd-toolbar{gap:2px;padding:5px 8px;}
  .wd-tb{min-width:40px;min-height:40px;padding:0 10px;font-size:15px;
    display:inline-flex;align-items:center;justify-content:center;}
  .wd-tb-gap{height:22px;margin:0 4px;}
  .wd-blocks{padding-top:12px;}

  /* 4 · The tree. The disclosure caret was a 15×10 box — no thumb hits that,
     so a category could not be opened from the drawer without luck. */
  .wk-side .wk-caret{min-height:32px;padding:8px 5px;display:inline-flex;align-items:center;}
  .wk-side .wk-caret-sp{width:25px;flex:0 0 25px;}
  .wk-side .wk-row{min-height:40px;padding:7px 8px;font-size:13px;}
  .wk-side .wk-row.wk-cat{font-size:11px;}   /* v1.4.10.473: a category row stays the uppercase label, 11px (13px uppercase on a phone) */
  .wk-side-head{padding:10px 10px 8px;gap:6px;}

  /* 5 · The contents splash spent 283px of a 664px screen before the search
     box. The paragraph explaining that the page builds itself is the first
     thing a phone can do without. */
  .wk-home-hero{padding:14px 14px 12px;gap:10px;}
  .wk-home-sub{display:none;}
  .wk-home-h1{font-size:18px;}
  .wk-home-stat{padding:7px 9px;}
}

/* v1.4.10.211: the ticket-detail Acknowledge action — amber until pressed so
   an unacknowledged ticket is visible from the action bar itself. */
.tkd-ackbtn{border-color:#E8A93C;color:#8A5B00;background:#FFF4DC;}
.tkd-ackbtn:hover{background:#FFE9BC;}

/* ── Switch ports & traffic (v1.4.10.206, docs/switch-monitoring-prep.md) ── */
.swp-grid{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:12px;}
.swp{position:relative;width:34px;height:30px;min-height:30px;border-radius:5px;border:1px solid var(--line);font-size:11px;font-weight:700;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--text-mute);background:var(--bg-2);}
.swp.up{background:color-mix(in srgb,var(--ok) 16%,var(--surface));border-color:color-mix(in srgb,var(--ok) 45%,var(--line));color:var(--ok);}
.swp.down{opacity:.55;}
.swp.disabled{background:repeating-linear-gradient(45deg,var(--bg-2),var(--bg-2) 4px,var(--surface) 4px,var(--surface) 8px);}
.swp.uplink{box-shadow:inset 0 0 0 2px color-mix(in srgb,var(--brand-blue) 55%,transparent);}
.swp[aria-pressed="true"]{outline:2px solid var(--brand-blue);outline-offset:1px;}
.swp .swp-poe{position:absolute;right:3px;bottom:3px;width:6px;height:6px;border-radius:50%;background:var(--warn);}
.sw-graph-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px;}
.sw-port-sel{max-width:260px;}
.tsg{width:100%;height:190px;display:block;background:var(--bg-2);border:1px solid var(--line);border-radius:7px;}
.tsg-grid{stroke:var(--line);stroke-width:1;opacity:.6;}
.tsg-yl{font-size:11px;fill:var(--text-dim);}
.tsg-xl{font-size:11px;fill:var(--text-dim);}
.tsg-area.rx{fill:color-mix(in srgb,var(--brand-blue) 18%,transparent);}
.tsg-area.tx{fill:color-mix(in srgb,var(--ok) 16%,transparent);}
.tsg-line{fill:none;stroke-width:1.6;}
.tsg-line.rx{stroke:var(--brand-blue);}
.tsg-line.tx{stroke:var(--ok);}
.tsg-max{fill:none;stroke-width:1;stroke-dasharray:3 3;opacity:.75;}
.tsg-max.rx{stroke:var(--brand-blue);}
.tsg-max.tx{stroke:var(--ok);}
.tsg-legend{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:11px;color:var(--text-mute);margin-top:8px;}
.tsg-key{width:14px;height:4px;border-radius:2px;display:inline-block;}
.tsg-key.rx{background:var(--brand-blue);}
.tsg-key.tx{background:var(--ok);}
/* v1.4.10.474: a switch sample alone between two gaps (a round-capped zero-length path, so it stays round in the stretched
   SVG), and the stretches of the window with no samples */
.tsg-dot{fill:none;stroke-width:5;stroke-linecap:round;vector-effect:non-scaling-stroke;}
.tsg-dot.rx{stroke:var(--brand-blue);}
.tsg-dot.tx{stroke:var(--ok);}
.tsg-dot.max{stroke-width:3;opacity:.75;}
.tsg-gap{fill:var(--line);opacity:.28;}
.tsg-gapl{font-size:10px;fill:var(--text-dim);}
@media(max-width:700px){ .swp{width:31px;} .sw-port-sel{max-width:100%;flex:1 1 100%;} }

/* Switch alerts (v1.4.10.207) — the rule engine's open rows, on the asset
   popup's switch section, the site Monitoring tab and the dashboard block. */
.sw-alert{display:flex;align-items:center;gap:7px;border:1px solid var(--line);border-radius:6px;padding:8px 11px;font-size:12px;margin-bottom:8px;}
.sw-alert b{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;}
.sw-alert.err{border-color:color-mix(in srgb,var(--err) 45%,var(--line));background:color-mix(in srgb,var(--err) 8%,var(--surface));color:var(--err);}
.sw-alert.warn{border-color:color-mix(in srgb,var(--warn) 45%,var(--line));background:color-mix(in srgb,var(--warn) 9%,var(--surface));color:#8a5a00;}

/* ══ THE TICKET EXPORT BUILDER (v1.4.10.217) — /tickets/export ═══════════════
   A two-column page: the choices on the left, a sticky "what you are about to
   download" card on the right. The card is what stops anyone exporting blind.
   PHONE RULE (v1.4.10.203/213/215/216, fourth and fifth outings): every
   control on this page and every panel it opens carries a 40px floor at
   ≤700px, and the floors are written with DOUBLED specificity so a bare
   `.txp-x .btn` cannot tie with — and then lose to — the blanket `.btn.sm`
   rules declared further down this sheet. */
.txp-bar{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:18px;}
.txp-bar-t h2{margin:0;font-size:20px;font-weight:600;letter-spacing:-.024em;}
.txp-bar-s{color:var(--text-dim);font-size:13px;margin-top:2px;}
.txp{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:18px;align-items:start;}
.txp-build{display:flex;flex-direction:column;gap:16px;min-width:0;}
.txp-side{position:sticky;top:14px;}
.txp-panel .panel-body{display:flex;flex-direction:column;gap:12px;}
.txp-lbl{display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);margin-bottom:6px;}
.txp-hint{font-size:12px;color:var(--text-dim);}
.txp-sub{border-top:1px solid var(--line);padding-top:12px;display:flex;flex-direction:column;gap:8px;}
.txp-warn{color:#B45309;font-weight:600;}
/* A neutral explanation next to an option, as against .txp-warn's caution
   (v1.4.10.218). Same slot, deliberately quieter — trimming a footer is a
   sensible default, not something to be careful about. */
.txp-hint{color:#64748B;font-weight:400;}   /* v1.4.10.473: a hint is meta, 12/400 (was 500) */

.txp-segs{display:grid;gap:10px;}
.txp-segs-2{grid-template-columns:repeat(2,minmax(0,1fr));}
.txp-segs-3{grid-template-columns:repeat(3,minmax(0,1fr));}
.txp-seg{display:flex;flex-direction:column;gap:3px;text-align:left;padding:11px 13px;border:1px solid var(--line);
         border-radius:6px;background:var(--surface);cursor:pointer;transition:border-color .12s,background .12s;min-width:0;}
.txp-seg:hover{border-color:var(--brand-blue);}
.txp-seg.on{border-color:var(--brand-blue);background:rgba(var(--bc-accent-rgb),0.07);box-shadow:inset 0 0 0 1px var(--brand-blue);}
.txp-seg-t{font-weight:600;font-size:13px;color:var(--text);}
.txp-seg-s{font-size:12px;color:var(--text-dim);line-height:1.35;}

.txp-chips{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:4px;}
.txp-chip{padding:6px 12px;border-radius:999px;border:1px solid var(--line);background:var(--surface);
          font-size:12px;font-weight:500;color:var(--text-dim);cursor:pointer;}
.txp-chip.on{border-color:var(--brand-blue);background:var(--brand-blue);color:#fff;}
.txp-quicks{display:flex;flex-wrap:wrap;gap:7px;}
.txp-quick{padding:5px 11px;border-radius:6px;border:1px dashed var(--line);background:transparent;
           font-size:12px;color:var(--brand-blue);font-weight:500;cursor:pointer;}
.txp-quick:hover{border-style:solid;background:rgba(var(--bc-accent-rgb),0.06);}
.txp-row{display:grid;gap:12px;}
.txp-dates{grid-template-columns:repeat(2,minmax(0,1fr));}
.txp-row3{grid-template-columns:repeat(3,minmax(0,1fr));}
.txp-row .ex-sel,.txp-row input.ex-sel{width:100%;max-width:none;}   /* v1.4.10.473: .ex-sel's 170px cap left the fields short of their cells (the text search 170 of 314 on a phone) */

.txp-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;}
.txp-fgroup-h{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--brand-blue);margin-bottom:6px;}
.txp-fchk{display:flex;align-items:center;gap:8px;padding:5px 7px;border-radius:6px;font-size:13px;cursor:pointer;color:var(--text);}
.txp-fchk:hover{background:var(--surface-2,rgba(0,0,0,0.03));}
.txp-fchk.on{color:var(--text);font-weight:400;}
.txp-fchk input{width:15px;height:15px;flex:0 0 auto;}

.txp-preview .panel-body{display:flex;flex-direction:column;gap:10px;}
.txp-count{text-align:center;padding:10px 0 4px;}
.txp-count-n{font-size:30px;font-weight:700;letter-spacing:-.03em;line-height:1;color:var(--brand-blue);}
.txp-count.none .txp-count-n{color:var(--text-dim);}
.txp-count-l{font-size:12px;color:var(--text-dim);margin-top:4px;}
.txp-count-wait{display:flex;align-items:center;justify-content:center;gap:10px;color:var(--text-dim);font-size:13px;padding:26px 0;}
.txp-span{text-align:center;font-size:12px;color:var(--text-dim);}
.txp-mix{display:flex;flex-wrap:wrap;gap:6px 12px;justify-content:center;font-size:12px;color:var(--text);}
.txp-mix.dim{color:var(--text-dim);}
.txp-over{background:#FEF3C7;border:1px solid #FCD34D;color:#92400E;border-radius:6px;padding:9px 11px;font-size:12px;line-height:1.45;}
.txp-sample{border-top:1px solid var(--line);padding-top:10px;}
.txp-sample-r{display:flex;gap:8px;font-size:12px;padding:3px 0;min-width:0;}
.txp-sample-r b{flex:0 0 auto;font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.txp-sample-r span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-dim);}
.txp-fmts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;}
.txp-fmt{display:flex;flex-direction:column;gap:2px;padding:9px 6px;border:1px solid var(--line);border-radius:6px;
         background:var(--surface);cursor:pointer;text-align:center;min-width:0;}
.txp-fmt.on{border-color:var(--brand-blue);background:rgba(var(--bc-accent-rgb),0.07);box-shadow:inset 0 0 0 1px var(--brand-blue);}
.txp-fmt-t{font-weight:600;font-size:13px;color:var(--text);}
.txp-fmt-s{font-size:12px;color:var(--text-dim);line-height:1.3;}   /* v1.4.10.473: an option's sub-line is 12, as in .txp-seg-s beside it (was 11) */
.txp-go{width:100%;justify-content:center;margin-top:4px;}
.txp-go[disabled]{opacity:0.5;cursor:not-allowed;}
.txp-done{font-size:12px;color:var(--ok,#16A34A);text-align:center;}
.txp-err{font-size:12px;color:var(--err,#DC2626);text-align:center;line-height:1.45;}

@media (max-width:1080px){
  .txp{grid-template-columns:minmax(0,1fr);}
  .txp-side{position:static;}
}
@media (max-width:760px){ .txp-bar-t h2{font-size:18px;} }   /* v1.4.10.473: the page-title look is 18 on a phone */
@media (max-width:700px){
  .txp-segs-2,.txp-segs-3,.txp-dates,.txp-row3{grid-template-columns:minmax(0,1fr);}
  .txp-bar .btn.sm,.txp-bar .btn{min-height:40px;}
  .txp-panel .btn.xs,.txp-panel .btn.sm,.txp-panel .btn{min-height:40px;}
  .txp-chip,.txp-quick,.txp-seg,.txp-fmt,.txp-fchk{min-height:40px;}
  .txp .ex-sel,.txp input.ex-sel,.txp select.ex-sel{min-height:40px;font-size:16px;}
  .txp-preview .btn,.txp-preview .btn.sm{min-height:44px;}
  .txp-fields{grid-template-columns:minmax(0,1fr);}
}

/* ── Click-to-change asset status (v1.4.10.225) ──────────────────────────────
   The hero pill becomes a button. It must still LOOK like the pill it replaced
   — the header is the first thing anyone sees and a bordered form control in
   the middle of it reads as a mistake — so the affordance is a caret and a hover
   lift, nothing more. A read-only account gets the plain <span> and none of
   this applies to it. */
.ah-statuspill.as-set{cursor:pointer;font:inherit;font-size:11px;font-weight:600;letter-spacing:0;
  appearance:none;-webkit-appearance:none;transition:background .12s ease,transform .12s ease,box-shadow .12s ease;}
.ah-statuspill.as-set:hover{background:rgba(255,255,255,.32);transform:translateY(-1px);box-shadow:0 3px 10px rgba(0,0,0,.18);}
.ah-statuspill.as-set:active{transform:translateY(0);}
.ah-statuspill.as-set:focus-visible{outline:2px solid #fff;outline-offset:2px;}
.ah-statuspill.as-set svg:last-child{width:11px;height:11px;opacity:.8;margin-left:1px;}

/* The picker. position:fixed from the start because avPopFix() measures and
   places it — the asset header lives inside the modal's own scroller, and an
   absolutely-positioned panel gets clipped by it (the v1.4.10.160 lesson). */
.as-statusmenu{position:fixed;z-index:60;display:none;min-width:210px;max-width:280px;padding:5px;
  background:var(--surface,#fff);border:1px solid var(--border,#E2E8F0);border-radius:7px;
  box-shadow:0 12px 34px rgba(15,23,42,.18);max-height:min(60vh,380px);overflow:auto;}
.as-statusmenu.open{display:block;}
.as-sm-head{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-mute,#64748B);padding:7px 10px 5px;}
.as-sm-row{display:flex;align-items:center;gap:9px;width:100%;padding:9px 10px;border:0;border-radius:6px;
  background:none;text-align:left;cursor:pointer;font:inherit;font-size:13px;font-weight:500;color:var(--text,#0F172A);min-height:40px;}
.as-sm-row:hover{background:var(--surface-2,#F1F5F9);}
.as-sm-row.on{font-weight:600;}
.as-sm-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.as-sm-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;background:var(--text-dim,#94A3B8);}
.as-sm-dot.ok{background:var(--ok,#22C55E);} .as-sm-dot.warn{background:var(--warn,#F59E0B);}
.as-sm-dot.err{background:var(--err,#EF4444);} .as-sm-dot.muted{background:var(--text-dim,#94A3B8);}
.as-sm-dot.info{background:var(--brand-blue,var(--bc-blue-v1));}
.as-sm-scope{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--text-mute,#64748B);background:var(--surface-2,#F1F5F9);padding:2px 6px;border-radius:5px;}
.as-sm-tick svg{width:14px;height:14px;stroke:var(--brand-blue,var(--bc-blue-v1));}
.as-sm-manage{display:flex;align-items:center;gap:8px;width:100%;padding:9px 10px;margin-top:4px;
  border:0;border-top:1px solid var(--border,#E2E8F0);border-radius:0 0 6px 6px;background:none;
  cursor:pointer;font:inherit;font-size:13px;font-weight:500;color:var(--text-mute,#64748B);min-height:40px;}
.as-sm-manage:hover{background:var(--surface-2,#F1F5F9);color:var(--text,#0F172A);}
.as-sm-manage svg{width:13px;height:13px;}
/* A phone gets the same panel with thumb-sized rows (the global 40px floor).
   THE PILL ITSELF NEEDED THE SAME TREATMENT and nearly shipped without it: as a
   <span> it was a 21px-tall label nobody tapped, and turning it into a button
   made it a 21px-tall TARGET — half the floor v1.4.10.128 set for exactly this.
   Measured at 390x664, not assumed. Only the interactive `.as-set` variant is
   raised; the read-only pill is still a label and stays as it was. */
@media (max-width:700px){
  .as-statusmenu{min-width:min(280px,calc(100vw - 32px));max-width:calc(100vw - 32px);}
  .as-sm-row,.as-sm-manage{min-height:44px;font-size:13px;}
  .ah-statuspill.as-set{min-height:40px;padding:6px 14px;font-size:12px;}
  .ah-statuspill.as-set svg{width:14px;height:14px;}
  .ah-statuspill.as-set svg:last-child{width:12px;height:12px;}
}

/* ══════════════════════════════════════════════════════════════════════════
   PHONE TAP TARGETS (v1.4.10.233)

   MEASURED at 390x664 before writing any of this, because the outstanding note
   ("global phone tap-target floor") did not say which controls or by how much:

       .ra-btn        34 x 30      row actions — the worst, and the most common
       .btn.xs        30           notification and rostering actions
       .rost-tab      29           rostering tabs
       .rost-nav-btn  30 x 30      week back / forward
       .da-chip       27           dashboard alert chips
       .set-tab       33           settings tabs
       .btn.sm        36           everywhere
       .seg-btn       36           segmented toggles

   The floor is 40px, set in v1.4.10.128 and re-learned five times since — most
   recently in v225, where the asset status pill became a BUTTON and shipped as
   a 21px target because nothing on the desktop battery could see it.

   Only HEIGHT and hit area change. No font sizes, no colours, no layout
   rewrites: a row-action button that is 40px tall instead of 34px makes its
   table row 6px taller and nothing else moves. Applied at <=700px only, so
   nothing on a desktop shifts by a pixel.
   ══════════════════════════════════════════════════════════════════════════ */
@media (max-width:700px){
  /* Icon-only buttons need width as well as height — 30x34 is a target you
     miss with a thumb even when you can see it perfectly. */
  .ra-btn{min-height:40px;min-width:40px;padding:8px;}
  .row-actions{gap:6px;}
  /* Text buttons: height only, so labels and layout are untouched. */
  .btn.sm{min-height:40px;}
  .btn.xs{min-height:40px;padding-top:6px;padding-bottom:6px;}
  /* An EXISTING phone rule already set a floor here — at 36px, four pixels
     short of the standard, at a higher specificity (#content .seg .seg-btn)
     than a bare class can beat. Somebody had reached for this before and
     stopped just under the line. Matched, not fought. */
  .seg-btn{min-height:40px;}
  #content .seg .seg-btn{min-height:40px;}
  /* Tab strips are scrolled and tapped constantly on a phone. */
  .set-tab,.rost-tab{min-height:40px;display:inline-flex;align-items:center;}
  .rost-nav-btn,.rost-today-btn{min-height:40px;min-width:40px;}
  /* Dashboard alert chips are links into a filtered view, not decoration. */
  .da-chip{min-height:40px;display:inline-flex;align-items:center;}
  /* Anything else that carries a click handler and sits in a table cell. */
  .dt td .btn,.dt td button{min-height:40px;}
  /* Second pass, from re-sweeping after the first: the register's row
     checkboxes (200 of them on one screen), the header avatar, and the
     rostering "add shift" affordance were all still under the line. A
     checkbox you have to aim at is the most annoying control on a phone. */
  .ar-chk{min-height:40px;min-width:40px;}
  .vq-cbc{min-width:40px;min-height:40px;}   /* v1.4.10.511: the validation queue's row checkboxes, as the register's */
  .avatar{min-height:40px;min-width:40px;}
  .rost-add{min-height:40px;min-width:40px;}
  /* v1.4.10.511: the register's filter chip × (a 12px icon on the floor's 40px height, as wide as the icon) and the
     Clear all button beside the pickers */
  .fchip{min-height:40px;}
  .fchip button{min-width:40px;min-height:40px;justify-content:center;align-items:center;margin-right:-11px;}
  .atb-clear{min-height:40px;display:inline-flex;align-items:center;justify-content:center;}
  /* Third pass — the battery's selector is broader than my hand probe was, and
     found four more. Named individually rather than with a blanket `button`
     rule, because a blanket rule would also inflate buttons inside modals and
     toolbars that are already fine and would change desktop-derived layouts
     nobody asked me to touch.
       .ahc-toggle    25px  the register's column-header Expand
       .view-toggle   30px  grouped / flat view switch
       .tkx-toggle    34px  tickets List / Board switch
       .dh-chip       22px  the "N records need attention" chip
       .row-check     16px  the register's per-row checkbox (!)
       .bb-actions    31px  bulk-bar Delete and friends
       .ua-sw         21px  the user active/inactive SWITCH */
  .ahc-toggle,.ah-collapse{min-height:40px;}
  .view-toggle button,.tkx-toggle button{min-height:40px;}
  .dh-chip{min-height:40px;display:inline-flex;align-items:center;}
  .bb-actions .btn,.bb-actions button{min-height:40px;}
  input.row-check,.check input[type=checkbox]{min-height:24px;min-width:24px;}
  /* The switch keeps its 38x21 LOOK — inflating the track would make it a
     different control. It gets its hit area from padding on the box instead,
     which is what a thumb actually needs. */
  .ua-sw{min-height:24px;box-sizing:content-box;padding:10px 0;background-clip:content-box;}
  /* SECOND existing phone rule found stopping short of the line:
     `.tkx-toolbar .tkx-toggle button` set min-height 34px, at a specificity a
     bare selector cannot beat — exactly the same shape as the 36px one on
     .seg-btn. Two separate earlier attempts at this floor both landed under
     it. Matched here rather than fought. */
  .tkx-toolbar .tkx-toggle button,.tkx-toggle button{min-height:40px;}
  /* "Show all columns" is a button styled as a text link (19px). It is how you
     get the register's full column set on the one screen where columns are
     scarcest, so it is a real target. */
  .acol-note button{min-height:40px;display:inline-flex;align-items:center;}
  /* The register's row checkbox keeps its SIZE and gains its hit area from
     padding — same treatment as the switch above. A 40px-square checkbox would
     look absurd next to 12px row text; a 40px-square TARGET is what a thumb
     needs. Two hundred of these are on screen at once. */
  /* The register's row checkbox. A 40px-SQUARE checkbox looks absurd beside
     12px row text, and padding tricks do not enlarge an appearance:none input's
     hit box reliably. So: the control goes to 24px — bigger than the 16px
     desktop box and in line with what phones draw natively — and its CELL
     (.ar-chk, sized above) gives it a 40px tap zone with clear space around it,
     which is what stops a mis-tap selecting the wrong row.
     t/v233.js asserts BOTH halves of that: the box >= 24 and the cell >= 40. */
  input.row-check,.check input[type=checkbox],.pend-cb,.pendnr-cb{width:24px;height:24px;min-height:24px;min-width:24px;}   /* v1.4.10.511: + the queue's boxes */
  /* The "Select all" LABEL is the tap target for its own checkbox, so it needs
     the cell rule too — the battery measures the box AND whatever contains it. */
  label.check{min-height:40px;}
  /* Bulk-bar dismiss (26px). It is the only way out of selection mode. */
  .bb-close{min-height:40px;min-width:40px;}
}

/* ── INLINE TICKET PHOTOS (v1.4.10.241) ──────────────────────────────────────
   The photos attached to a ticket, painted in the conversation itself rather
   than hidden behind a file name in the sidebar.

   SIZED TO THE WINDOW, NOT TO THE PICTURE. auto-fill with a minimum track and
   1fr means the grid decides its own column count from the width it is given —
   one column on a phone, two or three as the modal widens — with no breakpoint
   list to keep in step with the modal's own. The height cap is what keeps a
   portrait phone photo (3:4, and most fault photos are) from taking the whole
   screen and pushing the first message below the fold; object-fit:cover keeps
   the crop honest and the full frame is one tap away.

   A picture whose file is missing (a database restored without av_files/)
   removes its own cell via .tkp-gone rather than leaving a broken-image icon
   sitting in the middle of the thread. */
.tkt-photos{margin:0 0 14px;}
.tkp-head{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:600;color:var(--text-mute);
          text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px;}
.tkp-head b{color:var(--text);font-size:11px;font-weight:600;letter-spacing:.06em;}
.tkp-head span{text-transform:none;letter-spacing:0;font-weight:400;}
.tkp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:10px;}
.tkp-cell{margin:0;border:1px solid var(--line);border-radius:6px;overflow:hidden;
          background:var(--surface-2);cursor:zoom-in;transition:border-color .12s,box-shadow .12s;}
.tkp-cell:hover{border-color:var(--brand-blue);box-shadow:var(--shadow-sm);}
.tkp-cell img{display:block;width:100%;height:auto;max-height:320px;object-fit:cover;background:var(--surface-2);}
.tkp-pending{height:120px;display:flex;align-items:center;justify-content:center;color:var(--text-dim);}
.tkp-cell figcaption{padding:6px 9px;font-size:11px;color:var(--text-dim);
                     white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.tkp-cell.tkp-gone{display:none;}
/* The sidebar row shows the picture it is a row for. */
.att-ico-img{overflow:hidden;padding:0;background:var(--surface-2);}
.att-thumb{width:100%;height:100%;object-fit:cover;display:block;}
.att-row .att-dl{margin-left:0;}
.att-row .att-dl:hover{color:var(--brand-blue);}
@media(max-width:700px){
  /* One picture at a time on a phone, and taller — the fault photo IS the
     report, so it gets the room. The 40px floor (v128, re-learned six times)
     applies to the new download control: declared here, after the blanket
     .att-del rule above, so it wins on ordering rather than on !important. */
  .tkp-grid{grid-template-columns:1fr;gap:8px;}
  .tkp-cell img{max-height:min(58vh,420px);object-fit:contain;background:var(--surface-3,var(--surface-2));}
  .att-row .att-del,.att-row .att-dl{width:40px;height:40px;display:flex;align-items:center;justify-content:center;}
}

/* The quiet-locations roll-up (v1.4.10.242) — one line standing in for the
   rooms with nothing to report, so the estate tree leads with what needs
   attention instead of burying it under fifty-one healthy headers. */
.est-quiet{cursor:pointer;}
.est-quiet .est-loc-head{opacity:.75;}
.est-quiet:hover .est-loc-head{opacity:1;}
.est-quiet .est-loc-ico{color:var(--ok);}

/* ── Recent activity (v1.4.10.244, rebuilt v1.4.10.245) ────────────────────
   A row here is a SENTENCE — "AV-0142 · QM55R · Moved · Location Green Room →
   Theatre A · Jay, 2 hours ago" — not a table row. Tables were the wrong
   shape: the asset is the subject, the change is the verb, and half the
   columns would have been empty for half the verbs. It also means the layout
   does not need a horizontal scroller on a phone, which is where this is read.

   v245 adds the three things that make it scannable rather than merely
   correct: a TIMELINE RAIL down each day group so the eye has a spine to
   follow; VERB TONES so a deletion and a photo upload do not look identical;
   and BEFORE → AFTER chips so the change itself — not the field name — is
   what the eye lands on. The old value is struck through, the new one is not. */
.aac-panel{margin-bottom:16px;}
.aac-filters{display:flex;gap:12px;align-items:center;flex-wrap:wrap;}
.aac-facets{display:contents;}          /* the two facet selects sit in the same flex row */
.aac-f-site{min-width:190px;flex:0 1 220px;}
.aac-f-loc{min-width:180px;flex:0 1 220px;}
.aac-f-period{min-width:150px;flex:0 1 170px;}
.aac-f-act{min-width:160px;flex:0 1 190px;}
.aac-f-who{min-width:160px;flex:0 1 200px;}
.aac-f-search{flex:1;min-width:200px;}

/* The one-line read above the feed. */
.aac-sumbar{padding:11px 16px;border-bottom:1px solid var(--border);
  font-size:12px;color:var(--text-mute);display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.aac-sumbar:empty{display:none;}
.aac-sum-n{font-weight:700;color:var(--text);}
.aac-chipx{border:1px solid var(--line-2);background:var(--surface);color:var(--text-mute);
  border-radius:999px;padding:3px 10px;font-size:12px;font-weight:500;cursor:pointer;line-height:1.4;}
.aac-chipx:hover{background:var(--surface-2);color:var(--text);}

.aac-list{display:flex;flex-direction:column;}
.aac-list.aac-dim{opacity:.55;transition:opacity .12s;}
.aac-day{position:sticky;top:0;z-index:2;background:var(--surface);
  font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;
  padding:14px 2px 7px;border-bottom:1px solid var(--border);}

/* THE RAIL. Drawn on the group, not on each row, so it is one continuous line
   per day and stops cleanly at the last row instead of trailing into the next
   day heading. 13px puts it through the centre of the 28px icon (8px pad + 14). */
.aac-group{position:relative;padding-top:2px;}
.aac-group::before{content:'';position:absolute;left:21px;top:16px;bottom:16px;width:2px;
  background:var(--line);border-radius:2px;}

.aac-row{position:relative;display:flex;gap:12px;align-items:flex-start;padding:11px 8px;
  border-radius:6px;cursor:pointer;transition:background .12s;}
.aac-row:hover{background:var(--surface-2);}
.aac-row:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;}
/* A row with nothing to open must not pretend it is a button. */
.aac-gone{cursor:default;}
.aac-gone:hover{background:transparent;}
.aac-gone .aac-tag{text-decoration:line-through;color:var(--text-dim);}

/* The icon sits ON the rail, so it needs an opaque backdrop to break the line. */
.aac-ico{position:relative;z-index:1;width:28px;height:28px;flex:0 0 28px;border-radius:6px;
  display:flex;align-items:center;justify-content:center;margin-top:1px;
  box-shadow:0 0 0 3px var(--surface);}
.aac-row:hover .aac-ico{box-shadow:0 0 0 3px var(--surface-2);}
.aac-ico svg{width:15px;height:15px;}

/* Verb tones. Six families, not twenty-three colours: what matters at a glance
   is whether something arrived, left, changed hands or was merely edited. */
.aac-t-new  {background:rgba(22,163,74,0.11);  color:var(--ok);}
.aac-t-ok   {background:rgba(22,163,74,0.11);  color:var(--ok);}
.aac-t-gone {background:rgba(220,38,38,0.10);  color:var(--err);}
.aac-t-move {background:rgba(var(--bc-purple-rgb),0.11); color:var(--info);}
.aac-t-hand {background:rgba(217,119,6,0.12);  color:var(--warn);}
.aac-t-file {background:var(--surface-3);      color:var(--text-mute);}
.aac-t-edit {background:var(--accent-glow);    color:var(--accent);}

.aac-main{min-width:0;flex:1;}
.aac-line{font-size:13px;line-height:1.55;display:flex;align-items:baseline;gap:7px;flex-wrap:wrap;}
.aac-tag{font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.aac-name{color:var(--text-mute);font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:38ch;}
/* The verb as a pill: it is the only part of the line with a fixed vocabulary,
   so it is the part worth making constant in shape. Tone comes from the same
   family as the icon, at low weight so a feed of them is not a fruit salad. */
.aac-verb{font-size:11px;font-weight:600;letter-spacing:0;border-radius:999px;
  padding:2px 9px;white-space:nowrap;}
.aac-badge{font-size:11px;font-weight:600;letter-spacing:0;border-radius:999px;
  padding:2px 8px;background:var(--surface-3);color:var(--text-dim);white-space:nowrap;}

/* BEFORE → AFTER. */
.aac-changes{display:flex;flex-wrap:wrap;gap:5px 8px;margin-top:5px;}
.aac-chg{display:inline-flex;align-items:baseline;gap:5px;font-size:12px;line-height:1.5;
  background:var(--surface-2);border:1px solid var(--border);border-radius:5px;padding:2px 8px;
  max-width:100%;min-width:0;}
.aac-chg-plain{color:var(--text-mute);}
.aac-fld{color:var(--text-dim);font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:600;}
.aac-from{color:var(--text-dim);text-decoration:line-through;text-decoration-thickness:1px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:22ch;}
.aac-arw{color:var(--text-dim);}
.aac-to{color:var(--text);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:26ch;}
.aac-rest{display:contents;}
/* `display:contents` OVERRIDES the [hidden] attribute's display:none, so the
   "+N more" chips were laid out from the start and the control expanded
   nothing. Restated explicitly — an attribute is not a match for a declared
   display value. Caught by t/v245.js pairing the click with a CHIP COUNT
   rather than trusting the button to have done something. */
.aac-rest[hidden]{display:none;}
.aac-more{border:1px dashed var(--line-2);background:transparent;color:var(--text-mute);
  border-radius:5px;padding:2px 9px;font-size:12px;font-weight:500;cursor:pointer;line-height:1.5;}   /* v1.4.10.473: quiet chip 12/500 like the change chips beside it (was 11) */
.aac-more:hover{background:var(--surface-2);color:var(--text);border-style:solid;}

.aac-meta{font-size:12px;color:var(--text-dim);margin-top:4px;}   /* v1.4.10.473: meta line 12/400 (was 11) */
.aac-who{color:var(--text-mute);font-weight:600;}

.aac-foot{display:flex;align-items:center;gap:8px;padding:10px 16px;border-top:1px solid var(--border);}
.aac-foot:empty{display:none;}
.aac-count{font-size:12px;color:var(--text-dim);}

/* Loading. The first paint used to be one line of text, which reads as a
   broken page for the second or two it is up; a skeleton reads as a page that
   is arriving. Never shown once data exists — the list dims instead. */
.aac-skel{display:flex;flex-direction:column;gap:10px;padding:14px 2px;}
.aac-skel-row{height:44px;border-radius:6px;background:linear-gradient(90deg,
  var(--surface-2) 0%, var(--surface-3) 50%, var(--surface-2) 100%);
  background-size:200% 100%;animation:aacShimmer 1.3s ease-in-out infinite;}
@keyframes aacShimmer{0%{background-position:200% 0;}100%{background-position:-200% 0;}}
@media (prefers-reduced-motion: reduce){
  .aac-skel-row{animation:none;background:var(--surface-2);}
}

@media(max-width:700px){
  /* The 40px phone tap floor (v128, re-learned six times). An activity row is
     a tap target — it opens the asset — and so are both pager buttons, the
     expand control and the clear chip. */
  .aac-row{padding:12px 6px;min-height:40px;}
  .aac-foot .btn{min-height:40px;min-width:40px;}
  .aac-more,.aac-chipx{min-height:40px;padding-left:12px;padding-right:12px;}
  /* MEASURED at 390: the shared .asb-field select / .atb-search input rule
     lays out at THIRTY-NINE pixels — one short of the v128 floor, on every
     filter bar in the app, not just this one. Raised here for this screen
     rather than globally, because changing the shared rule moves the register
     and site-view bars too and that is a separate call. See the release note:
     the app-wide 39px is reported, not silently fixed under cover of this. */
  .aac-filters select,
  .aac-filters input{min-height:40px;}
  .aac-filters{gap:10px;}
  .aac-filters .asb-field{flex:1 1 100%;min-width:0;}
  /* v1.4.10.473: the search takes the full row like the pickers above it — beside Refresh it was 167px for a
     216px placeholder ("Search assets or changes…" cut) and 45px tall beside the 40px button */
  .aac-f-search{flex:1 1 100%;min-width:0;}
  .aac-refresh{margin-left:auto;}
  .aac-facets{display:contents;}
  /* A phone is 390px wide: a value truncated at 26ch is truncated to nothing
     useful, so the chips wrap to their own line and keep their full text. */
  .aac-chg{width:100%;flex-wrap:wrap;}
  .aac-from,.aac-to{max-width:100%;white-space:normal;}
  .aac-name{max-width:100%;}
  .aac-group::before{left:19px;}
}

/* ============================================================
   1_4_10_248 — THE TOUCH LAYER
   ------------------------------------------------------------
   Every phone rule in this stylesheet before this block is keyed on a WIDTH
   (max-width:600/700/760px). An iPhone in landscape is 844px wide, so at
   844x390 the whole phone treatment switched off: MEASURED, #global-search and
   the three .site-picker selects dropped to 13px — under the 16px threshold,
   so iOS zoomed the page on every tap — and to 35-37px tall. Worse, the
   @supports block above that applies safe-area-inset-left/right was inside
   max-width:600px, so the notch padding was absent in the ONE orientation
   where the notch actually intrudes horizontally.

   So this block is keyed on the DEVICE, not the viewport width: hover:none +
   pointer:coarse is true on a phone in both orientations and on a tablet, and
   false on every desktop, so nothing here can touch desktop density.

   THE FLOORS, and why they differ:
     - 16px font on every text-entry control. Below 16px, iOS Safari zooms the
       page when the field takes focus, and the user then has to pinch back.
     - 40px — the project floor since v1.4.10.128 — on every control: buttons,
       segmented controls, tab strips, fields and the modal close buttons.
       v1.4.10.473: fields and close buttons had a floor of their own (44px), so
       every row that put a picker or a close beside a button stood two heights
       — 44/40 measured in the Automation and Settings heads, the ticket
       composer, the catalogue cards, the wiki tools. One floor, one row height.

   EXEMPTIONS carried forward from t/v233.js unchanged: a bare <a> inside a
   table cell is text sized by its line-height, and .rost-chip/.rost-mini are
   a deliberately dense grid that is already a horizontal scroller.
   ============================================================ */
@media (hover:none) and (pointer:coarse){

  /* ── A. the iOS focus-zoom floor, app-wide and orientation-independent ── */
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
  select:not([multiple]):not([size]), textarea:not([hidden]),
  select#site-picker,select#intg-picker,select#cust-picker,
  #wk-sitepick,#tkt-after-send,#de-asset_id{font-size:16px;}

  /* ── B. the 40px floor on anything you type into or pick from ──
     min-height (not height) so a control that is already taller keeps its
     size, and box-sizing:border-box so the border is inside the 40.
     v1.4.10.473: 40, the buttons' floor (was 44: a field stood 4px taller than
     the button beside it). */
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]):not([type="hidden"]),
  select:not([multiple]):not([size]), textarea:not([hidden]){min-height:40px;box-sizing:border-box;}
  textarea:not([hidden]){min-height:88px;}
  /* SPECIFICITY IS LOAD-BEARING HERE, not decoration. A bare `select` is
     (0,0,1) and loses to any single-class rule — .site-picker{min-height:38px},
     .ex-sel, .wb-size all beat it, which is exactly how eight selects survived
     the first cut of this block MEASURED at 40-41px. The :not() pairs above
     carry the argument's own specificity, so the floor lands at (0,2,1) and
     outranks a class without needing !important. Anything targeted by an ID
     still wins and has to be named explicitly — hence the line below. */
  select#de-asset_id,select#site-picker,select#intg-picker,select#cust-picker,
  #wk-sitepick,#tkt-after-send{min-height:40px;}   /* v1.4.10.473: 40 (was 44) */

  /* A bare input inside a wrapper that draws the visual box: the wrapper is
     what the eye reads as the control, so it takes the floor too and the
     input stretches to fill it. MEASURED at 20px before this
     (.sd-room-search > input, padding 1px 2px inside a 34px wrapper). */
  .sd-room-search,.search-box,.input-wrap,.atb-search,.asb-inrow{min-height:40px;}   /* v1.4.10.473: 40 (was 44) */
  .sd-room-search input,.search-box input,.input-wrap input,
  .atb-search input,.asb-inrow input{align-self:stretch;}
  /* v1.4.10.473: the room filter and the tasks search are the wrappers that draw the box (their input is borderless),
     and the input took the field floor above for itself, so the box stood 40 + padding + border (the room filter 54,
     then 42 with the phone's padding:0; the tasks search 45). The input gives up its own floor and its padding and
     fills the box, which alone carries the 40. In .search-box, .input-wrap, .atb-search and .asb-inrow the input (or
     select) draws the box itself and keeps the floor; the wrapper measures the same height as it. The :not() chain is
     the field floor's own, so this outranks it. */
  .tk-search{min-height:40px;}
  .sd-room-search{padding-top:0;padding-bottom:0;}
  .sd-room-search input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]):not([type="hidden"]){min-height:0;}
  .tk-search input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]):not([type="hidden"]){min-height:0;align-self:stretch;padding-top:0;padding-bottom:0;}
  /* v1.4.10.473: a toolbar search box (.atb-search, where the input draws the box) is 40 like the register's and the
     devices' search: its 9px padding around the 16px touch text made it 45 (Settings' catalogue search, measured) */
  .atb-search input{height:40px;}

  /* Explicit 40px floors set earlier for individual filter bars match it, so a
     control is the same height on every screen (v1.4.10.473: 40, was raised to 44). */
  .tkx-select,.tkd-ctl > select,.tkt-astpick input,
  .txp .ex-sel,.txp input.ex-sel,.txp select.ex-sel,
  .aac-filters input,.aac-filters select{min-height:40px;}

  /* ── C. the way OUT of a form. MEASURED at 30-32px on all fourteen editors:
     .modal-head, .site-ed-head, .tkt-head, .ah-head, .user-ed-head,
     .dv-fix-hero-actions and .mmc-actions each style their own .close. ── */
  .close,.modal-head .close,.site-ed-head .close,.tkt-head .close,
  .ah-head .close,.user-ed-head .close,.dv-fix-hero-actions .close,
  .mmc-actions .close{min-width:40px;min-height:40px;}   /* v1.4.10.473: 40 like the buttons beside it (was 44) */

  /* The sign-in screen is the first thing a phone sees and no battery before
     t/v248.js ever measured it: the reveal-password button was 30px. */
  .input-wrap .pass-toggle{width:44px;height:44px;}
  #login .forgot-link,#login .login-links a{display:inline-flex;align-items:center;min-height:40px;}

  /* ── D. the 40px floor on the dense controls, measured class by class ── */
  .chip-pick,.ra-seg-btn,.mt-vbtn,.mtcal-navbtn,.adt-edit,
  .am-ranges button,.isec-name,.mt-jump,.wk-hc-add,.wk-hi-more,
  .ue-tab,.mp-tab,.adt-tab,.dv-tab,.wk-side-ico{
    min-height:40px;box-sizing:border-box;}
  .mtcal-navbtn,.wk-side-ico{min-width:40px;}
  /* The wiki tree's disclosure caret ROTATES 90° when open, and a rotated
     box's on-screen height is its WIDTH — so a min-height floor alone is
     defeated the moment the control is used (MEASURED on the 16 Aug 2026
     production wiki: computed min-height honoured at 32px, bounding box
     15.5px portrait / 10px landscape on every open caret). Only a SQUARE
     survives rotation. Written with the .wk-side pair so it outranks the
     earlier .wk-side .wk-caret{min-height:32px} at equal specificity. */
  .wk-side .wk-caret,.wk-caret{min-width:40px;min-height:40px;box-sizing:border-box;
    display:inline-flex;align-items:center;justify-content:center;}
  .wk-side .wk-caret-sp,.wk-caret-sp{width:40px;flex:0 0 40px;}

  /* The general floor. In PORTRAIT this rule changes nothing — the app already
     measured 0 buttons under 40px at 390 before it was added, which is what
     makes it safe. It earns its place in LANDSCAPE, where the width-keyed
     phone rules switch off and the same 65 button classes come back at desktop
     density (MEASURED: 19px on assets and tickets, 24px on every .seg-btn).
     A finger is the same size in both orientations. */
  button,.btn,[role="button"],.seg-btn,.tab{min-height:40px;box-sizing:border-box;}
  /* v1.4.10.473: an icon-only button is a tap target in both axes: the floor above made it 40 tall but left it as wide as
     its icon (MEASURED 32x40, the consumable's Used-by-assets +; 39x49, the room editor's add buttons). CSS cannot
     tell an icon-only .btn from an icon-and-words one (text is not an element), and a plain min-width:40px on both
     drops a flex item's own minimum (its content): "Print month" / "Schedule work" in the maintenance head squeezed to
     64px and spilt their words. So the floor is max(40px, the content's own minimum) where the browser can say so
     (calc-size), and a plain 40px only on the .xs icon buttons and the editors' add buttons elsewhere. */
  .btn:has(> svg:only-child){justify-content:center;}
  .btn.xs:has(> svg:only-child),.combo-add-btn{min-width:40px;}
  .btn:has(> svg:only-child),.btn.xs:has(> svg:only-child),.combo-add-btn{min-width:calc-size(min-content, max(40px, size));}
  /* Carried-forward exemptions — see the header. A dense chip grid that is
     already a horizontal scroller, and text sized by its own line-height. */
  .rost-chip,.rost-mini,.rost-chip *,td a:not(.btn),.dt a:not(.btn){min-height:0;}
  /* Sort controls live in a <th>, not a <button>, so the rule above cannot
     reach them — MEASURED at 35px in landscape. The topbar avatar is in
     t/v233.js's scope and came back at 34px there for the same reason. */
  .wk-homerow{min-height:40px;}
  .avatar{min-width:40px;min-height:40px;}
  /* MEASURED, and the reason the first attempt at these two did nothing:
     min-height is set and IGNORED on display:table-cell and on a non-replaced
     inline box. The sort controls are <th> (35px, padding 11px, computed
     min-height:40px, honoured by nothing) and .ah-cat-link is an inline
     <span> at 26px. Padding is what moves a cell; a flex display is what lets
     the span take a height at all. */
  .dt thead th.th-sort,.dt thead th.tkx-th,
  thead .th-sort,thead .tkx-th{padding-top:14px;padding-bottom:14px;}
  .ah-cat-link{display:inline-flex;align-items:center;min-height:40px;}
  /* .isec-name is a text-styled button carrying a client's name — it keeps its
     type scale and gains the tap zone, rather than being restyled. */
  .isec-name{display:inline-flex;align-items:center;text-align:left;}
  .am-ranges button{padding-left:14px;padding-right:14px;}
}

/* ── E. the notch, in BOTH orientations. Same rules as the max-width:600px
   block above, re-gated on the device so landscape gets them too — that is
   where safe-area-inset-left/right is non-zero on a notched iPhone. max()
   keeps every existing padding as the floor. ── */
@supports(padding:max(0px)){
  @media (hover:none) and (pointer:coarse){
    .topbrand-inner{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right));}
    .topnav{padding-left:max(4px,env(safe-area-inset-left));padding-right:max(4px,env(safe-area-inset-right));}
    .content{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right));
      padding-bottom:max(40px,calc(40px + env(safe-area-inset-bottom)));}
    .page-hero-host:not(:empty){padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right));}   /* v1.4.10.473: the content's gutter */
    .af-inner{padding-bottom:max(14px,calc(14px + env(safe-area-inset-bottom)));}
    .modal-back{padding-bottom:max(28px,calc(28px + env(safe-area-inset-bottom)));}
  }
}

/* ── F. The topbar search on a phone in LANDSCAPE. MEASURED at 844x390:
   #search-wrap lays out at 111px while #global-search inside it is a 160px
   inline-block, so the right 49px of the field — including the clear control
   inside its 52px right padding — is clipped with no way to scroll to it.
   In portrait the field is hidden and the question does not arise, so this is
   scoped to the width where it appears rather than applied globally.
   The topbar has the room: brand 135 + spacer 8 + search 111 + 3x120 site
   pickers + bell 32 + user 90 = 736 of 844. ── */
@media (hover:none) and (pointer:coarse) and (min-width:701px){
  #search-wrap{flex:1 1 180px;min-width:150px;}
  #global-search{width:100%;min-width:0;box-sizing:border-box;}
  /* A round icon button is a tap target in both axes — the bell measured
     32px wide against the 40px floor its height already met. */
  .icon-btn{min-width:40px;}
}

/* ══════════════════ STOCKTAKE SCAN SESSION (v1.4.10.252) ══════════════════
   The .stk view lives inside #modal-inner (via showModalWide + a .stk root
   node) — the :has() selectors size the shell without adding another modal
   variant class for closeModal() to know about. On a coarse-pointer device
   it takes the whole screen: a stocktake is a two-thumbed, standing-up job.
   Buttons and inputs inherit the v248 44px touch floors; everything added
   here keeps its tap targets at or above them. */
.modal:has(> .stk){max-width:860px;width:min(96vw,860px);padding:0;}
.stk .modal-head{margin:0;padding:14px 18px 10px;}
.stk .modal-body{padding:0 18px 14px;}
.stk-head{margin-bottom:12px;}
.stk-title{font-weight:600;font-size:16px;letter-spacing:-.012em;}
.stk-sub{font-size:12px;color:var(--text-dim);margin-top:2px;}
.stk-progress{height:6px;border-radius:4px;background:var(--line);overflow:hidden;margin:10px 0 8px;}
.stk-progress span{display:block;height:100%;background:var(--brand-blue);border-radius:4px;transition:width .25s ease;}
.stk-chips{display:flex;flex-wrap:wrap;gap:6px;}
.stk-cam-wrap{margin-bottom:14px;}
.stk-cam{position:relative;border-radius:7px;overflow:hidden;background:#000;aspect-ratio:4/3;max-height:340px;margin-bottom:10px;}
.stk-cam video{width:100%;height:100%;object-fit:cover;display:block;}
.stk-reticle{position:absolute;inset:0;margin:auto;width:min(58%,220px);aspect-ratio:1;border:2px solid rgba(255,255,255,.85);border-radius:8px;box-shadow:0 0 0 2000px rgba(0,0,0,.18);pointer-events:none;}
.stk-flash{position:absolute;inset:0;opacity:0;pointer-events:none;transition:opacity .12s ease;}
.stk-flash.ok{background:rgba(22,163,74,.45);opacity:1;}
.stk-flash.warn{background:rgba(217,119,6,.45);opacity:1;}
.stk-flash.err{background:rgba(220,38,38,.5);opacity:1;}
.stk-cam-note{position:absolute;left:0;right:0;bottom:0;padding:6px 10px;font-size:11px;color:#fff;background:linear-gradient(transparent,rgba(0,0,0,.55));text-align:center;}
.stk-controls{display:flex;gap:10px;flex-wrap:wrap;align-items:center;}
.stk-cam-btn{flex:0 0 auto;}
.stk-manual{flex:1;display:flex;gap:8px;min-width:220px;}
.stk-manual input{flex:1;min-width:0;}
.stk-cols{display:grid;grid-template-columns:1fr 1fr;gap:16px;}
.stk-list{max-height:340px;overflow:auto;border:1px solid var(--line);border-radius:6px;padding:8px;}
.stk-room-h{position:sticky;top:-8px;z-index:1;background:var(--surface,#fff);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);padding:8px 4px 4px;display:flex;justify-content:space-between;}
.stk-room-h span{color:var(--text-dim);font-weight:600;}
.stk-row{align-items:center;}
.stk-row-main{flex:1;min-width:0;}
.stk-row-tag{font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.stk-row-sub{font-size:11px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.stk-foot{display:flex;gap:8px;align-items:center;padding:12px 18px;border-top:1px solid var(--line);margin:0 -18px;}
.stk-confirm{flex:1;font-size:13px;}
.stk-confirm-btns{display:flex;gap:8px;justify-content:flex-end;margin-top:10px;}
@media (max-width:700px){
  .stk-cols{grid-template-columns:1fr;}
  .stk-list{max-height:300px;}
}
/* The phone treatment keys on the DEVICE, not the viewport width (the v248
   rule) — an iPhone held sideways is 844px wide and still a phone. */
@media (hover:none) and (pointer:coarse){
  .modal-back:has(.stk){padding:0;}
  .modal:has(> .stk){width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border-radius:0;display:flex;flex-direction:column;margin:0;}
  .stk{display:flex;flex-direction:column;min-height:0;flex:1;}
  .stk .modal-body{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding-bottom:max(14px,env(safe-area-inset-bottom));}
  .stk .modal-head{padding-top:max(14px,env(safe-area-inset-top));}
  .stk-cam{max-height:44vh;}
}


/* ══════════════════════════════════════════════════════════════════════════
   v1.4.10.268 — SEARCHABLE SELECTS · WARRANTY LOCK · ATTENTION BAND · PAGER
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Searchable select (avSelAttach) ──
   The native <select> stays in the DOM as the value's only home, so it is
   pulled out of the layout rather than display:none'd — a display:none field
   cannot be scrolled to, and the required-field validator does exactly that
   (aeValidateRequired → el.scrollIntoView) when Manufacturer or Model is the
   thing still missing. */
.avsel{position:relative;display:block;flex:1;min-width:0;}
.avsel-native{position:absolute;left:0;bottom:0;width:1px;height:1px;opacity:0;padding:0;margin:0;border:0;pointer-events:none;}
.avsel-btn{display:flex;align-items:center;gap:8px;width:100%;min-height:38px;padding:9px 11px;
  background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--text);
  font-family:inherit;font-size:13px;text-align:left;cursor:pointer;transition:border-color .12s,box-shadow .12s;}
/* v1.4.10.473: inside a form the picker is padded like the .field select it stands in for (11px 14px) — it stood 40px
   beside 44-45px fields in the same row (the maintenance editor's Client · Site · Room row measured 45/40/40) */
.field .avsel-btn{padding:11px 14px;}
/* v1.4.10.473: on a phone the picker reads at the 16px every field gets there — the ≤700px and touch iOS-zoom guards
   reach native inputs and selects only, so it stood 13px / 44px under 16px / 49px selects in the same form */
@media (max-width:700px),(hover:none) and (pointer:coarse){ .avsel-btn{font-size:16px;} }
.avsel-btn:hover{border-color:var(--text-dim);}
.avsel-btn:focus-visible{outline:none;border-color:var(--brand-blue,var(--bc-blue-v1));box-shadow:0 0 0 3px rgba(var(--bc-accent-rgb),.16);}
.avsel-btn.avsel-blank .avsel-lab{color:var(--text-mute);}
.avsel-lab{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.avsel-car{flex:0 0 auto;display:inline-flex;color:var(--text-mute);}
.avsel-car svg{width:14px;height:14px;}
/* The red required-field mark lands on the hidden native select, so carry it
   across to the control the operator can actually see. */
.avsel-native.ae-req-bad ~ .avsel-btn{border-color:var(--err)!important;background:rgba(220,38,38,.045);}
/* 260, not 240 (v1.4.10.270): the query row has to fit an icon, a padded
   input and the longest placeholder we ship at the 16px font phones force.
   max-width also yields to the viewport so the panel can never be placed
   partly off-screen on a narrow phone. */
.avsel-pop{display:none;position:absolute;z-index:80;top:calc(100% + 5px);left:0;min-width:260px;max-width:min(380px,calc(100vw - 24px));
  background:var(--surface);border:1px solid var(--line);border-radius:7px;
  box-shadow:0 16px 40px rgba(15,23,42,.18);overflow:hidden;}
.avsel-pop.open{display:flex;flex-direction:column;}
.avsel-q{display:flex;align-items:center;gap:6px;padding:9px 11px;border-bottom:1px solid var(--line);background:var(--bg);flex:0 0 auto;}
.avsel-q svg{width:14px;height:14px;color:var(--text-mute);flex:0 0 auto;}
/* ── v1.4.10.270: THE FIRST LETTER OF THE PLACEHOLDER WAS BEING SLICED ──────
   Every avSel picker lives inside a `.field`, and `.field input` (line ~129)
   sets border-radius:10px while `.field input:focus` paints
   box-shadow:0 0 0 3px. The override below used to say `padding:2px 0` and
   `border:0` — it removed the BORDER but inherited the RADIUS and the FOCUS
   RING, so the moment the box focused (which is immediately: avSelOpen()
   focuses it) a 10px-radius ring was drawn hard against a box with ZERO
   horizontal padding. The rounded corner then cut through the "S" of
   "Search manufacturers…". Nothing was overflowing, so no width or
   scrollWidth test could ever have seen it — the glyph was simply under the
   corner.

   The cure is to give the box its own padded, rounded surface and let the
   ring wrap THAT, which is also why the ring is re-declared here rather than
   suppressed: a search field with no focus indication is a different bug.
   Scoped `.avsel-pop .avsel-q input` (0,3,1) so it wins on SPECIFICITY and
   not on source order — the v269 lesson about a phone rule that silently lost
   to a rule 3,300 lines below it.

   text-overflow:ellipsis is the belt to that brace: a picker squeezed
   narrower than its placeholder (a long one, a large font, browser zoom) now
   truncates cleanly instead of cutting mid-word. */
.avsel-q input{flex:1;min-width:0;background:transparent;outline:none;font-family:inherit;font-size:13px;color:var(--text);}
.avsel-pop .avsel-q input{padding:7px 9px;border:1px solid transparent;border-radius:6px;text-overflow:ellipsis;}
.avsel-pop .avsel-q input:focus{outline:none;border-color:var(--brand-blue,var(--bc-blue-v1));background:var(--surface);box-shadow:0 0 0 3px var(--accent-glow);}
.avsel-note{padding:8px 11px;font-size:12px;line-height:1.45;color:var(--text-mute);background:var(--bg);border-bottom:1px solid var(--line);flex:0 0 auto;}
.avsel-note b{color:var(--text);}
.avsel-link{background:none;border:0;padding:0;font-family:inherit;font-size:inherit;font-weight:600;
  color:var(--brand-blue,var(--bc-blue-v1));cursor:pointer;text-decoration:underline;text-underline-offset:2px;}
.avsel-list{overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;max-height:290px;padding:5px;}
.avsel-row{display:flex;flex-direction:column;align-items:flex-start;gap:1px;width:100%;padding:7px 9px;
  background:none;border:0;border-radius:6px;font-family:inherit;text-align:left;cursor:pointer;color:var(--text);}
.avsel-row:hover,.avsel-row.cur{background:var(--surface-2);}
.avsel-row.sel{background:rgba(var(--bc-accent-rgb),.09);}
.avsel-row.sel .avsel-rl{font-weight:600;}
.avsel-row.blank .avsel-rl{color:var(--text-mute);font-style:italic;}
.avsel-rl{font-size:13px;line-height:1.3;}
.avsel-rs{font-size:11px;color:var(--text-mute);line-height:1.3;}
.avsel-empty,.avsel-more{padding:12px 10px;font-size:12px;color:var(--text-mute);text-align:center;}

/* ── Warranty pair: the derived box is locked, and looks it ── */
input.ae-wlock{background:var(--surface-2)!important;color:var(--text-mute)!important;
  border-style:dashed!important;cursor:not-allowed;opacity:.85;}
.ae-wlock-f > label{color:var(--text-mute);}

/* ── "N records need attention" band above the register ── */
.dh-attnbar{border:1px solid rgba(217,119,6,.4);background:rgba(217,119,6,.07);border-radius:7px;
  padding:12px 14px;margin-bottom:14px;display:flex;flex-direction:column;gap:10px;}
.dh-abhead{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;color:var(--text);}
.dh-abhead svg{width:15px;height:15px;color:var(--warn);flex:0 0 auto;}
.dh-absub{font-size:12px;color:var(--text-mute);font-weight:400;}
.dh-abchips{display:flex;flex-wrap:wrap;gap:7px;}
.dh-abchip{display:inline-flex;align-items:center;gap:6px;background:var(--surface);border:1px solid var(--line);
  border-radius:8px;padding:5px 11px;font-family:inherit;font-size:12px;font-weight:500;color:var(--text);cursor:pointer;}
.dh-abchip span{font-weight:700;font-variant-numeric:tabular-nums;color:var(--text-mute);}
.dh-abchip:hover{border-color:var(--warn);}
.dh-abchip.on{background:var(--warn);border-color:var(--warn);color:var(--on-warn);}
.dh-abchip.on span{color:var(--on-warn);}
.dh-abacts{display:flex;flex-wrap:wrap;gap:8px;}
.dh-chip.on{background:var(--warn);border-color:var(--warn);color:#1b1300;}

/* ── Register pager ── */
.asset-pager{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;
  margin:16px 0 4px;padding:11px 14px;border:1px solid var(--line);border-radius:7px;
  background:var(--surface);color:var(--text-mute);font-size:12px;}
.asset-pager b{color:var(--text);font-variant-numeric:tabular-nums;}
.apg-nav{display:flex;align-items:center;gap:4px;flex-wrap:wrap;}
.apg-b{min-width:34px;min-height:32px;padding:0 9px;background:var(--bg);border:1px solid var(--line);
  border-radius:6px;font-family:inherit;font-size:12px;font-weight:500;color:var(--text);cursor:pointer;font-variant-numeric:tabular-nums;}
.apg-b:hover:not(:disabled){border-color:var(--brand-blue,var(--bc-blue-v1));color:var(--brand-blue,var(--bc-blue-v1));}
.apg-b.on{background:var(--brand-blue,var(--bc-blue-v1));border-color:var(--brand-blue,var(--bc-blue-v1));color:#fff;font-weight:600;cursor:default;}
.apg-b:disabled{opacity:.42;cursor:not-allowed;}
.apg-gap{padding:0 3px;color:var(--text-mute);}
.apg-size{display:inline-flex;align-items:center;gap:7px;white-space:nowrap;font-weight:500;}
.apg-size select{padding:6px 9px;border:1px solid var(--line);border-radius:6px;background:var(--bg);
  color:var(--text);font-family:inherit;font-size:13px;}

@media(max-width:760px){
  /* The 40px thumb floor (v128) — every one of these is a tap target. */
  .avsel-btn{min-height:40px;}
  .avsel-row{min-height:40px;justify-content:center;}
  .avsel-list{max-height:52vh;}
  .apg-b{min-height:40px;min-width:40px;}
  .dh-abchip{min-height:40px;}
  .asset-pager{justify-content:center;gap:10px;}
  .apg-nav{justify-content:center;width:100%;}
  .apg-note{width:100%;text-align:center;}
  .apg-size{width:100%;justify-content:center;}
}

/* ══ v1.4.10.272 — YOUR OWN WORK, ALERT SOUNDS, THE IN-SERVICE LABEL ═══════ */

/* A pinned ticket (assigned to you and still open). A left keel in the brand
   accent plus a faint wash: enough to find at a glance down a 20-row table,
   not so much that it fights the priority bar that already lives in that cell.
   The keel is an inset shadow rather than a border so the row height does not
   change — a bordered row is 2px taller than its neighbours and the table
   ripples as tickets are assigned and closed. */
.tkx-table tr.tkx-mine > td { background: var(--accent-glow, rgba(var(--bc-accent-rgb),.07)); }
.tkx-table tr.tkx-mine > td:first-child { box-shadow: inset 3px 0 0 0 var(--brand-blue, var(--bc-blue-v1)); }
.tkx-table tr.tkx-mine:hover > td { background: var(--accent-glow, rgba(var(--bc-accent-rgb),.12)); }
.pill.tkx-mineflag {
  background: var(--brand-blue, var(--bc-blue-v1)); color: #fff; border: 1px solid var(--brand-blue, var(--bc-blue-v1));
  font-size: 11px; padding: 1px 6px; letter-spacing: 0;
}
.tkx-card.tkx-mine { box-shadow: 0 0 0 1px var(--brand-blue, var(--bc-blue-v1)), 0 1px 3px rgba(11,14,20,.08); }
.tkc-mine {
  color: var(--brand-blue, var(--bc-blue-v1)); font-weight: 600;
}
.tkc-mine::after { content: '·'; margin: 0 6px; color: var(--text-dim); font-weight: 400; }

/* The alert-sound toggle beside the bell. Muted reads as muted at a glance —
   a toggle whose two states look alike is a toggle nobody trusts. */
.snd-btn { position: relative; }
.snd-btn.snd-off { color: var(--text-dim); opacity: .75; }
.snd-btn .snd-warn {
  position: absolute; top: 4px; right: 4px; width: 7px; height: 7px; border-radius: 50%;
  background: var(--warn, #D97706); box-shadow: 0 0 0 2px var(--surface-1, #fff);
}
.notif-deaf {
  display: flex; gap: 10px; align-items: flex-start; margin-bottom: 10px;
  padding: 10px 12px; border-radius: 6px; font-size: 12px; line-height: 1.45;
  background: rgba(217,119,6,.08); border: 1px solid rgba(217,119,6,.28); color: var(--text-2, #334155);
}
.notif-deaf svg { flex: 0 0 auto; color: var(--warn, #D97706); margin-top: 1px; }

/* The in-service label. The screen version of the printed sticker: the same
   two-column shape as the asset label (.qr-label), with the banner that is the
   entire point of it — somebody holding the box has to know at a glance that
   the item is out of service and that the code is how it comes back. */
.tkt-qrbanner {
  display: inline-block; align-self: flex-start; background: #B91C1C; color: #fff;
  font-weight: 700; letter-spacing: .14em; font-size: 14px; padding: 4px 11px; border-radius: 6px;
  margin-bottom: 2px;
}
.tkt-qrscan { font-weight: 700; color: var(--text-1, #0B0E14); margin-top: 4px; }
.tkt-svc .tkt-svc-qr { display: flex; justify-content: center; }
.tkt-svc .tkt-svc-qr svg { display: block; }
@media (max-width: 700px){
  /* The 40px thumb floor (v1.4.10.128) applies to the new header control too. */
  .snd-btn { min-width: 40px; min-height: 40px; }
}

/* ══ Multi-IP input + chips (v1.4.10.279) ═══════════════════════════════════ */
.avip { display: flex; flex-direction: column; gap: 6px; }
.avip-row { display: flex; align-items: center; gap: 6px; }
.avip-row .avip-in { flex: 1; min-width: 0; }
.avip-del {
  flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: 6px; border: 1px solid var(--border);
  background: var(--surface); color: var(--text-mute); cursor: pointer;
}
.avip-del:hover { color: var(--err); border-color: var(--err); }
.avip-del svg { width: 14px; height: 14px; }
.avip-add {
  align-self: flex-start; border: 1px dashed var(--border); background: transparent;
  color: var(--brand-blue); font-size: 12px; font-weight: 500; border-radius: 6px;
  padding: 5px 10px; cursor: pointer;
}
.avip-add:hover { border-color: var(--brand-blue); background: var(--accent-glow); }
/* Display chips: one tidy tag per address wherever a single string used to sit. */
.avip-chips { display: inline-flex; flex-wrap: wrap; gap: 4px; vertical-align: middle; }
.avip-chip {
  display: inline-block; padding: 1px 7px; border-radius: 6px; font-size: 12px;
  font-family: var(--font-mono);font-variant-numeric:tabular-nums; letter-spacing: -0.01em;
  background: var(--surface-2, rgba(120,130,150,0.10)); border: 1px solid var(--border);
  color: var(--text); white-space: nowrap;
}
@media (max-width: 700px){
  /* The 40px thumb floor (v1.4.10.128). */
  .avip-del, .avip-add { min-width: 40px; min-height: 40px; }
}

/* ══ Per-asset activity timeline (v1.4.10.279) ══════════════════════════════
   The pane reuses the register feed's .aac-* system; the row is NOT a link
   here (the asset is already open), and an aggregated run wears its count on
   the icon. Day headings stay sticky inside the modal's own scroll. */
.alog-tl .alog-tlrow { cursor: default; }
.alog-tl .alog-tlrow:hover { background: transparent; }
.alog-tl .alog-tlrow:hover .aac-ico { box-shadow: 0 0 0 3px var(--surface); }
.alog-tl .aac-day { top: -17px; }   /* the .panel-body's 16px pad — flush, not floating mid-pane */
.alog-agg-n {
  position: absolute; top: -5px; right: -6px; min-width: 15px; height: 15px;
  border-radius: 999px; background: var(--brand-blue); color: #fff;
  font-size: 10px; font-weight: 700; line-height: 15px; text-align: center;
  letter-spacing: .04em; text-transform: uppercase;   /* v1.4.10.473: the badge look (was untracked) */
  padding: 0 3px; box-shadow: 0 0 0 2px var(--surface);
}

/* ══════════ SITE STATISTICS (1.4.10.283) ══════════ */
.ss-rangebar{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:-6px 0 16px;font-size:12px;}
.ss-rangelab{color:var(--text-mute);font-weight:600;text-transform:uppercase;font-size:11px;letter-spacing:.06em;margin-right:4px;}
.ss-custom{display:inline-flex;align-items:center;gap:6px;margin-left:10px;color:var(--text-mute);}
.ss-custom input{font:inherit;font-size:13px;padding:5px 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);min-width:130px;}
/* v1.4.10.473: a search box in a range bar (Communications, the sign-in log) has room for its placeholder (155px for 207px of text;
   118px on a phone): 280px, and on a narrow screen its button drops under it so the box takes the line. */
.ss-custom:has(> input[type=search]){flex-wrap:wrap;max-width:100%;}
.ss-custom > input[type=search]{flex:1 1 280px;width:280px;min-width:0;}
.ss-rangenow{margin-left:auto;color:var(--text-dim);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;}
.ss-kpis{grid-template-columns:repeat(6,1fr);}
.ss-panel{margin-bottom:18px;}
.ss-delta{font-size:12px;font-weight:700;padding:2px 7px;border-radius:6px;font-family:var(--font-body);}
.ss-delta.up{background:rgba(22,163,74,.12);color:var(--ok);} .ss-delta.down{background:rgba(220,38,38,.11);color:var(--err);} .ss-delta.flat{color:var(--text-dim);}
.ss-sub{font-size:12px;color:var(--text-dim);line-height:1.45;word-break:break-word;}
.ss-dt tbody tr.static{cursor:default;} .ss-dt tbody tr.static:hover{background:transparent;}
.ss-dt td.num,.ss-dt th.num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums;}
.ss-dt tbody td{padding:9px 14px;font-size:13px;} .ss-dt thead th{padding:9px 14px;}
.ss-cell-bar{position:relative;display:block;min-width:90px;} .ss-cell-bar span{position:relative;z-index:1;}
.ss-cell-bar i{position:absolute;right:0;top:-4px;bottom:-4px;background:var(--accent-glow);border-radius:4px;z-index:0;}
.ss-funnel{display:flex;flex-direction:column;gap:10px;}
.ss-flab{display:flex;align-items:baseline;gap:8px;font-size:12px;margin-bottom:4px;} .ss-flab b{margin-left:auto;font-family:var(--font-display);} .ss-flab em{font-style:normal;color:var(--text-dim);font-size:12px;min-width:44px;text-align:right;}
.ss-ftrack{height:10px;background:var(--surface-3);border-radius:6px;overflow:hidden;} .ss-ftrack i{display:block;height:100%;border-radius:6px;transition:width .3s;}
.ss-heat{display:flex;flex-direction:column;gap:3px;font-size:11px;}
.ss-heat-row{display:grid;grid-template-columns:34px repeat(24,1fr);gap:3px;align-items:center;} .ss-heat-row span{color:var(--text-dim);}
.ss-heat-row i{display:block;height:16px;border-radius:3px;background:var(--brand-blue);}
.ss-heat-head i{background:transparent!important;color:var(--text-dim);font-style:normal;text-align:center;height:auto;opacity:1!important;}
.ss-grid-tight{gap:14px;} .ss-grid-tight .ins-donut-row{align-items:center;}
.ss-foot{color:var(--text-dim);font-size:12px;margin:6px 0 18px;text-align:center;} .ss-foot a{color:var(--brand-blue);}
.ss-tip{font-size:13px;line-height:1.6;color:var(--text-mute);} .ss-tip code,.ss-sub code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;background:var(--surface-2);padding:1px 5px;border-radius:4px;}
.ss-g.ok{color:var(--ok);font-weight:600;} .ss-g.warn{color:var(--warn);font-weight:600;} .ss-g.err{color:var(--err);font-weight:600;}
.ss-pager{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--text-mute);margin:0 0 12px;}
.ss-livebig{display:flex;align-items:center;gap:18px;padding:18px 22px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);margin-bottom:18px;font-size:14px;}
.ss-livenum{font-family:var(--font-display);font-size:30px;font-weight:700;letter-spacing:-.03em;color:var(--brand-blue);line-height:1;}
.ss-facts{display:grid;grid-template-columns:1fr 1fr;gap:8px 18px;margin-bottom:16px;} .ss-fact{display:flex;flex-direction:column;gap:2px;font-size:12px;} .ss-fact>span{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;} .ss-fact b{font-weight:500;overflow-wrap:anywhere;}   /* v1.4.10.473: a value breaks inside its column (an address in <...> widened the column past the panel on a phone) */ .ss-fact .ss-ua{font-size:11px;color:var(--text-dim);font-family:var(--font-mono);font-variant-numeric:tabular-nums;word-break:break-all;} .ss-fact:last-child{grid-column:1/-1;}
.ss-h4{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:16px 0 8px;}
.ss-timeline{display:flex;flex-direction:column;gap:10px;}
.ss-hit{border:1px solid var(--line);border-radius:6px;padding:10px 12px;background:var(--surface);}
.ss-hit-head{display:flex;align-items:center;gap:8px;font-size:13px;flex-wrap:wrap;} .ss-hit-n{display:inline-flex;width:20px;height:20px;border-radius:50%;background:var(--brand-blue);color:#fff;font-size:11px;font-weight:700;align-items:center;justify-content:center;}
.ss-hit-meta{font-size:12px;color:var(--text-dim);margin:4px 0 6px 28px;}
.ss-evs{margin-left:28px;display:flex;flex-direction:column;gap:3px;}
.ss-ev{display:flex;gap:8px;font-size:12px;align-items:baseline;} .ss-ev-t{color:var(--text-dim);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;min-width:52px;} .ss-ev-i{width:18px;text-align:center;}
.ss-ev-convert{color:var(--ok);font-weight:600;} .ss-ev-error,.ss-ev-rage,.ss-ev-not_found{color:var(--err);} .ss-ev-section,.ss-ev-section_time{color:var(--text-dim);}
.ss-inline{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.modal-body .field .ss-inline:has(> input):has(> .btn){align-items:stretch;}   /* v1.4.10.473: Site Statistics settings > Add note: the button takes the fields' height (44 vs 32px) */
@media (max-width:1100px){ .ss-kpis{grid-template-columns:repeat(3,1fr);} }
@media (max-width:760px){ .ss-kpis{grid-template-columns:repeat(2,1fr);} .ss-rangenow{display:none;} .ss-facts{grid-template-columns:1fr;} .ss-heat-row{grid-template-columns:28px repeat(24,1fr);gap:2px;} .ss-heat-row i{height:10px;} .ss-custom{margin-left:0;} }

/* ══════════ COMMUNICATIONS (1.4.10.284) ══════════ */
.cm-cnt{display:inline-block;min-width:18px;padding:0 5px;border-radius:6px;background:rgba(0,0,0,.08);font-size:11px;font-weight:600;text-align:center;margin-left:3px;}   /* v1.4.10.473: 11/600, the size of the .xs button it sits in (was 10/700, and "3 new" is not an uppercase badge) */
.btn.primary .cm-cnt{background:rgba(255,255,255,.25);}
.cm-list{display:flex;flex-direction:column;gap:8px;margin-bottom:16px;}
.cm-row{display:flex;gap:14px;align-items:flex-start;padding:14px 16px;border:1px solid var(--line);border-radius:7px;background:var(--surface);cursor:pointer;transition:border-color .15s,box-shadow .15s;}
.cm-row:hover{border-color:var(--brand-blue);box-shadow:var(--shadow-sm,0 2px 8px rgba(0,0,0,.06));}
.cm-row.unread{border-left:4px solid var(--brand-blue);} .cm-row-top b{font-weight:600;} .cm-row.unread .cm-row-top b{font-weight:700;}
.cm-row.st-closed,.cm-row.st-spam{opacity:.7;}
.cm-row-av{width:38px;height:38px;border-radius:50%;background:linear-gradient(135deg,var(--brand-blue),var(--brand-purple));color:#fff;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:14px;flex-shrink:0;}
.cm-row-main{flex:1;min-width:0;}
.cm-row-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;}   /* v1.4.10.473: a list row's title line is body 13 (was 14, the reading size) */ .cm-co{color:var(--text-mute);font-weight:500;} .cm-ref{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;color:var(--text-dim);}
.cm-row-snip{font-size:13px;color:var(--text-mute);margin:4px 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.cm-row-meta{display:flex;flex-wrap:wrap;gap:4px 12px;font-size:12px;color:var(--text-dim);} .cm-tk{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.cm-row-when{text-align:right;font-size:12px;color:var(--text-mute);white-space:nowrap;display:flex;flex-direction:column;gap:2px;} .cm-row-when span{font-size:11px;color:var(--text-dim);}
.cm-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:14px;}
.cm-head-title h2{font-size:20px;font-weight:600;letter-spacing:-.024em;margin:0;font-family:var(--font-display);} .cm-head-sub{font-size:12px;color:var(--text-mute);margin-top:2px;}
.cm-head-ctl{display:flex;gap:8px;align-items:stretch;flex-wrap:wrap;margin-left:auto;}   /* v1.4.10.473: stretch: the status / owner / priority pickers (33px) and the buttons (32px, the bin 28px) share one height */
.cm-facts{grid-template-columns:repeat(4,1fr);} .cm-facts .ss-fact:last-child{grid-column:auto;}
.cm-notes{margin-top:12px;} .cm-notes label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;display:block;margin-bottom:4px;}
.cm-notes textarea{width:100%;font:inherit;font-size:13px;padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);resize:vertical;}
.cm-conv{display:flex;flex-direction:column;gap:12px;margin-bottom:18px;}
.cm-msg{border:1px solid var(--line);border-radius:7px;background:var(--surface);overflow:hidden;max-width:920px;}
.cm-msg.in{border-left:4px solid var(--brand-blue);} .cm-msg.out{border-left:4px solid var(--ok);margin-left:40px;} .cm-msg.out.failed{border-left-color:var(--err);} .cm-msg.note{border-left:4px solid var(--warn);background:rgba(245,158,11,.05);}
.cm-msg-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:10px 14px;border-bottom:1px solid var(--line);font-size:13px;} .cm-msg-head > span{color:var(--text-dim);font-size:12px;}   /* v1.4.10.473: direct children only, so the 'failed' pill inside keeps the pill's 11px (it drew at 12) */ .cm-msg-head .cm-addr{color:var(--text-mute);overflow-wrap:anywhere;min-width:0;}   /* v1.4.10.473: a long address breaks inside the card (a 62-character one ran 72px out of the message on a phone) */ .cm-msg-head .btn{margin-left:auto;}
.cm-msg-body{padding:14px 16px;font-size:14px;line-height:1.6;} .cm-pre{white-space:pre-wrap;} .cm-out-text{white-space:pre-wrap;color:var(--text-mute);}
.cm-msg-body p{margin:0 0 10px;} .cm-msg-body p:last-child{margin-bottom:0;}
/* v1.4.10.445: Sales vs AVDesk Support — the kind tag on every row and thread, and the kind switch over the inbox */
.cm-kind{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;letter-spacing:0;line-height:1;padding:4px 8px;border-radius:999px;margin-right:6px;white-space:nowrap;max-width:260px;overflow:hidden;text-overflow:ellipsis;}   /* v1.4.10.473: a pill does not track (was +.02em) */
.cm-kind.sales{background:color-mix(in srgb, var(--brand-blue) 12%, transparent);color:var(--brand-blue);}
.cm-kind.sup{background:color-mix(in srgb, var(--brand-purple) 14%, transparent);color:var(--brand-purple);}
.cm-head-kind{margin-bottom:4px;}
.cm-kinds{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;}
.cm-kbtn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--surface);color:var(--text);font:inherit;font-size:13px;font-weight:500;padding:7px 12px;border-radius:8px;cursor:pointer;}
.cm-kbtn.on{border-color:var(--brand-blue);box-shadow:0 0 0 1px var(--brand-blue) inset;} .cm-kbtn.support.on{border-color:var(--brand-purple);box-shadow:0 0 0 1px var(--brand-purple) inset;}
.cm-kbtn .cm-cnt.unread{background:var(--ok);color:#fff;}
.cm-kinds-note{flex-basis:100%;font-size:12px;color:var(--text-dim);}
.cm-msg.out.receipt{border-left-color:var(--line);opacity:.8;}
/* v1.4.10.445: AVDesk Support — the integrator's page (js/28-support.js) */
.sup-intro{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:18px 20px;margin-bottom:14px;border:1px solid var(--line);border-radius:12px;background:linear-gradient(120deg,color-mix(in srgb, var(--brand-blue) 7%, var(--surface)),color-mix(in srgb, var(--brand-purple) 7%, var(--surface)));}
.sup-intro-ico{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;background:var(--surface);color:var(--brand-purple);flex-shrink:0;box-shadow:0 1px 3px rgba(15,23,42,.08);}
/* v1.4.10.473: the intro card's title is a card title, 15/600 -.01em (was 16) */
.sup-intro-txt{flex:1;min-width:220px;} .sup-intro-txt h3{margin:0 0 4px;font-size:15px;font-weight:600;letter-spacing:-.01em;} .sup-intro-txt p{margin:0;font-size:13px;line-height:1.55;color:var(--text-mute);}
.sup-list{display:flex;flex-direction:column;gap:8px;}
.sup-row{display:flex;align-items:center;gap:14px;width:100%;text-align:left;font:inherit;color:inherit;padding:14px 16px;border:1px solid var(--line);border-radius:10px;background:var(--surface);cursor:pointer;transition:border-color .15s,box-shadow .15s;}
.sup-row:hover,.sup-row:focus-visible{border-color:var(--brand-blue);box-shadow:0 2px 10px rgba(15,23,42,.06);outline:none;}
.sup-row.unread{border-left:4px solid var(--ok);}
.sup-row-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px;}
/* v1.4.10.473: a ticket's subject in a list is 13/600 -.01em, as on Support tickets (was 14/600) */
.sup-row-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;} .sup-row-top b{font-size:13px;font-weight:600;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;}
.sup-row-meta{display:flex;flex-wrap:wrap;gap:4px 12px;font-size:12px;color:var(--text-dim);}
.sup-row-side{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex-shrink:0;} .sup-row-when{font-size:12px;color:var(--text-dim);white-space:nowrap;}
.sup-head{margin-bottom:12px;}
.sup-form .panel-body{display:flex;flex-direction:column;gap:18px;}
/* v1.4.10.473: field labels 12/500 and fields 13/400, as in every other form (were 13/600 labels over 14px fields) */
.sup-field{display:flex;flex-direction:column;gap:7px;} .sup-field>label{font-size:12px;font-weight:500;} .sup-field>label em{font-style:normal;font-weight:400;font-size:12px;color:var(--text-dim);margin-left:6px;}
.sup-field input[type=text],.sup-field textarea,.sup-reply textarea{width:100%;box-sizing:border-box;font:inherit;font-size:13px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--text);resize:vertical;}
.sup-field input.bad,.sup-field textarea.bad{border-color:var(--err);}
.sup-ferr{font-size:12px;color:var(--err);}
.sup-picks{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px;} .sup-picks.four{grid-template-columns:repeat(4,minmax(0,1fr));}
.sup-pick{display:flex;flex-direction:column;gap:3px;padding:10px 12px;border:1px solid var(--line);border-radius:9px;cursor:pointer;background:var(--surface);position:relative;}
.sup-pick input{position:absolute;opacity:0;pointer-events:none;}
.sup-pick b{font-size:13px;font-weight:600;} .sup-pick span{font-size:12px;color:var(--text-dim);line-height:1.4;}
.sup-pick.on{border-color:var(--brand-blue);box-shadow:0 0 0 1px var(--brand-blue) inset;background:color-mix(in srgb, var(--brand-blue) 6%, var(--surface));}
.sup-pick.urgent.on{border-color:var(--err);box-shadow:0 0 0 1px var(--err) inset;background:color-mix(in srgb, var(--err) 6%, var(--surface));}
.sup-pick:focus-within{outline:2px solid var(--brand-blue);outline-offset:1px;}
/* v1.4.10.450: .sup-note, .sup-thead h2 and .sup-thead-sub snapped onto the type scale (body 13, page title 20, meta 12) so fonts.py passes */
.sup-note{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-mute);padding:10px 12px;border-radius:8px;background:var(--surface-2);}
.sup-actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex-wrap:wrap;} .sup-hint{flex:1;font-size:12px;color:var(--text-dim);min-width:200px;}
.sup-thead-top{display:flex;align-items:flex-start;gap:14px;flex-wrap:wrap;} .sup-thead-top>div:first-child{flex:1;min-width:220px;}
.sup-thead h2{margin:4px 0;font-size:20px;font-weight:600;letter-spacing:-.024em;}   /* v1.4.10.473: the page-title look, -.024em (was -.02em); 18 on a phone below */
.sup-thead-ref{font-size:12px;color:var(--text-dim);} .sup-thead-sub{font-size:12px;color:var(--text-mute);}
.sup-thead-ctl{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.sup-conv{display:flex;flex-direction:column;gap:10px;margin:14px 0;}
.sup-msg{max-width:780px;border:1px solid var(--line);border-radius:12px;background:var(--surface);overflow:hidden;}
.sup-msg.mine{margin-left:auto;border-color:color-mix(in srgb, var(--brand-blue) 30%, var(--line));background:color-mix(in srgb, var(--brand-blue) 5%, var(--surface));}
.sup-msg.avd{margin-right:auto;border-left:4px solid var(--brand-purple);}
.sup-msg-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 14px;font-size:13px;border-bottom:1px solid var(--line);} .sup-msg-head > span:last-child{font-size:12px;color:var(--text-dim);margin-left:auto;}   /* v1.4.10.491: the time only (every span took margin-left:auto, so an AVDesk Staff badge floated mid-row) */
/* v1.4.10.491: AVDesk Support's list in parts (what needs you, what is with AVDesk) and its search */
.sup-group-h{display:flex;align-items:center;gap:8px;margin:14px 2px 8px;font-size:12px;font-weight:600;color:var(--text-mute);}
.sup-group-h:first-child{margin-top:4px;}
.sup-group-h svg{width:14px;height:14px;}
.sup-group-h small{font-weight:400;color:var(--text-dim);}
.sup-group-h.you{color:var(--warn,#B45309);}
.sup-q{position:relative;min-width:200px;}
.sup-q svg{position:absolute;left:9px;top:50%;transform:translateY(-50%);width:13px;height:13px;color:var(--text-mute);pointer-events:none;}
.sup-q input{width:220px;padding:6px 10px 6px 28px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font:inherit;font-size:13px;}
.sup-q input:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
@media (max-width:720px){ .sup-q,.sup-q input{width:100%;} .sup-q{flex:1 1 100%;order:9;} }
.sup-msg-body{padding:12px 14px;font-size:14px;line-height:1.6;overflow-wrap:anywhere;} .sup-msg-body p{margin:0 0 8px;}
.sup-reply label{display:block;font-size:12px;font-weight:500;margin-bottom:7px;}   /* v1.4.10.473: a field label, 12/500 (was 13/600) */ .sup-reply .sup-actions{margin-top:10px;}
@media (max-width:760px){ .sup-thead h2{font-size:18px;} }   /* v1.4.10.473: a title of this rank is 18 on a phone */
@media (max-width:720px){ .sup-picks.four{grid-template-columns:repeat(2,minmax(0,1fr));} .sup-row{flex-direction:column;align-items:stretch;} .sup-row-side{flex-direction:row;align-items:center;justify-content:space-between;} .sup-msg{max-width:none;} }
.cm-compose{max-width:920px;}
.cm-fields{display:grid;grid-template-columns:1fr 1fr;gap:10px 14px;margin-bottom:10px;} .cm-field.full{grid-column:1/-1;}
.cm-field label{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;margin-bottom:4px;}
.cm-field input{width:100%;font:inherit;font-size:13px;padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);}
.cm-toolbar{display:flex;flex-wrap:wrap;gap:3px;align-items:center;padding:6px 8px;border:1px solid var(--line);border-bottom:0;border-radius:6px 6px 0 0;background:var(--surface-2);}
.cm-tb{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:28px;padding:0 8px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--text);font:inherit;font-size:12px;font-weight:500;cursor:pointer;}
.cm-tb:hover{background:var(--surface);border-color:var(--line);} .cm-tb.active{background:var(--brand-blue);color:#fff;}
.cm-sep{width:1px;height:20px;background:var(--line);margin:0 4px;}
.cm-editor{min-height:220px;max-height:60vh;overflow:auto;padding:14px 16px;border:1px solid var(--line);border-radius:0 0 6px 6px;background:#fff;color:#1F2937;font-family:var(--font-body);font-size:15px;line-height:1.65;outline:none;}
.cm-editor:focus{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.cm-editor-sm{min-height:90px;border-radius:6px;} .cm-editor h2{font-size:20px;font-weight:700;margin:0 0 10px;} .cm-editor h3{font-size:16px;font-weight:700;margin:0 0 8px;} .cm-editor p{margin:0 0 12px;} .cm-editor blockquote{border-left:3px solid #CBD5E1;margin:0 0 12px;padding:4px 14px;color:#64748B;} .cm-editor a{color:var(--bc-blue-v1);} .cm-editor ul,.cm-editor ol{margin:0 0 12px;padding-left:24px;}
.cm-source{width:100%;min-height:220px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:13px;padding:12px;border:1px solid var(--line);border-radius:0 0 6px 6px;background:var(--surface);color:var(--text);}
.cm-compose-foot{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:10px;}
.cm-frame{width:100%;height:min(75vh,760px);border:0;background:#EEF2F8;}
.cm-tpl{display:grid;grid-template-columns:260px 1fr;gap:16px;padding:12px 14px;border:1px solid var(--line);border-radius:6px;margin-bottom:8px;cursor:pointer;background:var(--surface);} .cm-tpl:hover{border-color:var(--brand-blue);} .cm-tpl-prev{font-size:12px;color:var(--text-mute);line-height:1.5;}
.cm-key{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;background:var(--surface-2);padding:4px 8px;border-radius:6px;word-break:break-all;}
@media (max-width:900px){ .cm-facts{grid-template-columns:repeat(2,minmax(0,1fr));} .cm-fields{grid-template-columns:1fr;} .cm-msg.out{margin-left:0;} .cm-tpl{grid-template-columns:1fr;} .cm-row-when{display:none;} .cm-head-ctl{margin-left:0;} }
@media (max-width:760px){ .cm-facts{grid-template-columns:minmax(0,1fr);} }   /* v1.4.10.473: one column on a phone like every .ss-facts grid (the 900px rule above came later and kept two 1fr columns there, which an address widened 12-104px past the panel) */
/* v1.4.10.473: the touch floor for the labels the button rule cannot reach: the composer's colour pickers (28px in a row of
   40px buttons), its Wrap / Signature ticks (20px), and the lock editor's field ticks (20px) */
@media (hover:none) and (pointer:coarse){ label.cm-tb,.cm-compose-foot .chk,#lk-fields > label{min-height:40px;box-sizing:border-box;} }

/* ══════════ SITE STATISTICS charts (1.4.10.284) ══════════ */
.ssc-wrap{position:relative;width:100%;} .ssc{width:100%;display:block;overflow:visible;}
/* v1.4.10.445: the plot stretches, the axes are text — so labels stay 11px in a half-width panel or on a phone */
.ssc-box{display:grid;grid-template-columns:auto minmax(0,1fr);column-gap:8px;padding-bottom:22px;} .ssc-box.r{grid-template-columns:auto minmax(0,1fr) auto;}
.ssc-y{position:relative;height:var(--ssc-h,200px);min-width:18px;} .ssc-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap;line-height:1;}
.ssc-y.r span{right:auto;left:0;} .ssc-yw{display:block;visibility:hidden;height:0;overflow:hidden;font-size:11px;font-style:normal;font-variant-numeric:tabular-nums;white-space:nowrap;}
.ssc-plot{position:relative;min-width:0;container-type:inline-size;}
@container (max-width:560px){ .ssc-x span.o{display:none;} }
@container (max-width:300px){ .ssc-x span.h{display:none;} } .ssc-x{position:absolute;left:0;right:0;top:100%;height:22px;} .ssc-x span{position:absolute;top:7px;font-size:11px;color:var(--text-dim);white-space:nowrap;line-height:1;}
.ssc-dot,.ssc-hdot{position:absolute;width:6px;height:6px;margin:-4px 0 0 -4px;border-radius:50%;background:var(--surface,#fff);border:1.6px solid;pointer-events:none;}
.ssc-hdot{width:9px;height:9px;margin:-6.5px 0 0 -6.5px;border:2px solid #fff;box-shadow:0 1px 3px rgba(0,0,0,.25);}
.ssc-mark-l{stroke:var(--warn);stroke-width:1.2;stroke-dasharray:3 3;opacity:.8;} .ssc-mark-b{position:absolute;top:2px;transform:translateX(-50%);width:15px;height:15px;border-radius:50%;background:var(--warn);color:#fff;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;line-height:15px;text-align:center;cursor:help;}   /* v1.4.10.473: the chart's note pin is a badge, .04em */
.ssc-grid{stroke:var(--line);stroke-width:1;} .ssc-ax{fill:var(--text-dim);font-size:11px;font-family:var(--font-body);}
.ssc-cross{stroke:var(--text-dim);stroke-width:1;stroke-dasharray:3 3;pointer-events:none;}
.ssc-tip{position:absolute;z-index:5;pointer-events:none;background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:8px 12px;box-shadow:0 8px 24px rgba(0,0,0,.14);font-size:12px;min-width:150px;}
.ssc-tip-h{font-weight:600;margin-bottom:4px;color:var(--text);} .ssc-tip-r{display:flex;align-items:center;gap:6px;white-space:nowrap;} .ssc-tip-r i{width:9px;height:9px;border-radius:50%;flex-shrink:0;} .ssc-tip-r span{color:var(--text-mute);} .ssc-tip-r b{margin-left:auto;font-family:var(--font-display);} .ssc-tip-r em{font-style:normal;color:var(--text-dim);font-size:11px;}
.ssc-legend{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:8px;font-size:12px;}
.ssc-leg{display:inline-flex;align-items:center;gap:6px;border:0;background:transparent;color:var(--text-mute);font:inherit;font-size:12px;cursor:pointer;padding:2px 0;} .ssc-leg i{width:10px;height:10px;border-radius:3px;display:inline-block;} .ssc-leg i.dash{width:16px;height:0;border-top:2px dashed var(--text-dim);border-radius:0;} .ssc-leg b{font-family:var(--font-display);color:var(--text);} .ssc-leg.off{opacity:.4;text-decoration:line-through;} .ssc-leg.static{cursor:default;}
.ssc-donut-row{display:flex;gap:18px;align-items:center;} .ssc-donut{width:150px;height:150px;flex-shrink:0;} .ssc-arc{transition:opacity .15s;cursor:pointer;} .ssc-donut:hover .ssc-arc{opacity:.55;} .ssc-arc:hover{opacity:1!important;}
.ssc-dc{font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.02em;fill:var(--text);} .ssc-ds{font-size:11px;font-weight:400;fill:var(--text-dim);}
.ssc-dlegend{flex:1;display:flex;flex-direction:column;gap:5px;min-width:0;} .ssc-dleg{display:grid;grid-template-columns:10px 1fr auto 44px;gap:8px;align-items:center;font-size:12px;cursor:default;} .ssc-dleg i{width:10px;height:10px;border-radius:3px;} .ssc-dleg span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text-mute);} .ssc-dleg b{font-family:var(--font-display);} .ssc-dleg em{font-style:normal;color:var(--text-dim);text-align:right;font-size:12px;}
.ssc-hbars{display:flex;flex-direction:column;gap:7px;} .ssc-hb{display:grid;grid-template-columns:minmax(120px,1.1fr) 2fr 56px auto;gap:10px;align-items:center;font-size:12px;} .ssc-hb[onclick]{cursor:pointer;} .ssc-hb-l{min-width:0;display:flex;flex-direction:column;} .ssc-hb-l span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .ssc-hb-l em{font-style:normal;font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ssc-hb-t{height:12px;background:var(--surface-3);border-radius:6px;overflow:hidden;} .ssc-hb-t i{display:block;height:100%;border-radius:6px;transition:width .3s;} .ssc-hb b{text-align:right;font-family:var(--font-display);font-variant-numeric:tabular-nums;} .ssc-hb em{font-style:normal;color:var(--text-dim);font-size:12px;min-width:44px;text-align:right;}
.ss-grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;}
@media (max-width:900px){ .ss-grid-3{grid-template-columns:1fr;} .ssc-donut-row{flex-direction:column;align-items:stretch;} .ssc-hb{grid-template-columns:1fr 1.4fr 48px auto;} }

/* ══════════ SITE STATISTICS v285 additions — sortable tables, export menu, annotations, page drill-down ══════════ */
.ss-dt th.ss-sort{cursor:pointer;user-select:none;white-space:nowrap;} .ss-dt th.ss-sort i{font-style:normal;font-size:10px;margin-left:5px;opacity:.45;} .ss-dt th.ss-sort.active{color:var(--brand-blue);} .ss-dt th.ss-sort.active i{opacity:1;} .ss-dt th.ss-sort:hover{color:var(--brand-blue);}
.ss-more{display:flex;justify-content:center;padding:8px 0 2px;}
.ss-menu{position:relative;display:inline-block;} .ss-menu-pop[hidden]{display:none;} .ss-menu-pop{position:absolute;right:0;top:calc(100% + 4px);z-index:40;background:var(--surface,#fff);border:1px solid var(--line,#E2E8F0);border-radius:6px;box-shadow:0 10px 30px rgba(15,23,42,.14);padding:6px;min-width:190px;display:flex;flex-direction:column;} .ss-menu-pop button{background:none;border:0;text-align:left;padding:8px 10px;border-radius:5px;font:inherit;font-size:13px;font-weight:500;color:var(--text);cursor:pointer;} .ss-menu-pop button:hover{background:var(--surface-3);}
.ss-gran{gap:4px;}
.ss-drop{color:var(--err);font-size:11px;margin-left:6px;}
.ss-sorth{cursor:pointer;color:var(--text-mute);} .ss-sorth.active{color:var(--brand-blue);font-weight:600;} .ss-sorth:hover{color:var(--brand-blue);}
.ss-anno{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;padding:6px 0;border-bottom:1px solid var(--line,#E2E8F0);font-size:12px;} .ss-anno code{font-size:12px;}
.ssc-mark line{stroke:var(--warn);stroke-width:1.2;stroke-dasharray:3 3;opacity:.8;} .ssc-mark circle{fill:var(--warn);} .ssc-mark text{fill:#fff;font-size:10px;font-weight:700;} .ssc-tip-m{color:var(--warn);font-size:12px;margin:2px 0 4px;}
.ss-vitrow{flex-wrap:wrap;gap:8px;} .ss-vitrow .ss-g{padding:4px 9px;border-radius:6px;font-size:12px;font-weight:600;}
.ss-utm .cm-field input{width:100%;}
.ss-hit-head b a{color:inherit;text-decoration:none;border-bottom:1px dashed var(--text-dim);} .ss-hit-head b a:hover{color:var(--brand-blue);}
@media print{ .ins-tabs,.ss-rangebar .btn,.ss-custom,.ss-foot a,.nav,header.topbar,#sidebar{display:none!important;} .panel.ss-panel{break-inside:avoid;box-shadow:none;border:1px solid #ddd;} }

/* ══════════════════════════════════════════════════════════════════════════
   v1.4.10.287 — REGISTER LOCATION FILTER (searchable) · CALENDAR PLAN CHIPS
   ══════════════════════════════════════════════════════════════════════════ */
/* The Location filter is an avSel picker sitting in the asset toolbar, so it
   takes the toolbar's compact select look rather than the editor's 38px field. */
.atb-sel.atb-loc{min-width:180px;max-width:260px;}
.atb-sel.atb-loc::after{display:none;}
.atb-sel.atb-loc .avsel-btn{min-height:0;padding:8px 11px;font-size:13px;font-weight:400;background:var(--bg);border-radius:6px;}
.atb-sel.atb-loc .avsel-native.on ~ .avsel-btn{border-color:var(--brand-blue);color:var(--brand-blue);background:var(--accent-glow);}
.atb-sel.atb-loc .avsel-pop{min-width:320px;}
/* v1.4.10.288: the min-height:0 above overrides the phone's 40px floor rule
   (same specificity, later in the file) — the Location picker measured 33px
   on a phone the release after it shipped. The floor is re-stated here, at
   the higher specificity, and the pop-up cannot be wider than the phone. */
@media(max-width:760px){
  .atb-sel.atb-loc .avsel-btn{min-height:40px;}
  .atb-sel.atb-loc{max-width:100%;}
  .atb-sel.atb-loc .avsel-pop{min-width:0;}
}
.mtcal-leg i.plan{background-image:repeating-linear-gradient(45deg,var(--bc-blue-v1) 0 3px,#93C5FD 3px 6px);}
.mtcal-chip.plan{border-style:dashed;}

/* ═══════════ SPREADSHEET v1.4.10.289 — context menu + Excel colour picker ═══════════ */
.ws-ctx{position:fixed;left:0;top:0;z-index:1200;min-width:232px;max-height:min(80vh,560px);overflow-y:auto;}
.ws-mm button.danger{color:var(--danger,#DC2626);}
.ws-mm button.danger:hover{background:var(--danger-soft,#FEE2E2);}
.ws-pop-col{width:262px;}
.ws-colsec{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);margin:7px 0 4px;}
.ws-colsec:first-of-type{margin-top:2px;}
.ws-colgrid{display:grid;grid-template-columns:repeat(10,20px);gap:4px;min-height:20px;align-items:center;}
.ws-colgrid button.ws-colsw,.ws-colgrid button{width:20px;height:20px;padding:0;border-radius:4px;border:1px solid var(--line-2);display:block;}
.ws-colgrid-theme button:nth-child(-n+10){margin-bottom:3px;}
.ws-colgrid button:hover{transform:scale(1.18);position:relative;z-index:1;box-shadow:0 0 0 2px var(--brand-blue);}
.ws-colnone{grid-column:1/-1;font-size:11px;color:var(--text-dim);}
.ws-colcustom{display:flex;align-items:center;gap:6px;}
.ws-colcustom input[type=color]{width:34px;height:28px;padding:0;border:1px solid var(--line-2);border-radius:6px;background:transparent;cursor:pointer;flex:none;}
.ws-colpv{width:22px;height:22px;border-radius:5px;border:1px solid var(--line-2);flex:none;}
.ws-colcustom .ws-colhex{flex:1;min-width:0;width:auto;display:block;font:inherit;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:13px;padding:5px 7px;   /* v1.4.10.473: a hex code is set in the code face, as the wiki's own hex box (.wk-hexin) */border:1px solid var(--line);border-radius:5px;
  background:var(--surface);color:var(--text);text-transform:uppercase;font-variant-numeric:tabular-nums;}
.ws-colcustom .ws-coluse{width:auto;display:inline-block;flex:none;padding:6px 10px;border:1px solid var(--brand-blue);color:#fff;background:var(--brand-blue);
  border-radius:5px;font-size:12px;font-weight:600;}
.ws-colcustom .ws-coluse:hover{background:var(--brand-blue);filter:brightness(1.08);}
@media (max-width:700px){
  .ws-pop-col{width:min(92vw,300px);}
  .ws-colgrid{grid-template-columns:repeat(10,1fr);}
  .ws-colgrid button,.ws-colgrid button.ws-colsw{width:100%;height:26px;}
  .ws-colcustom .ws-colhex{font-size:16px;}
  .ws-ctx{min-width:250px;}
  .ws-ctx button{padding:10px 12px;font-size:13px;}
}

/* ═══════════ SCHEDULED TICKET FOLLOW-UPS (v1.4.10.290) ═══════════ */
/* The calendar chip. Solid amber-brown left edge so a follow-up is
   distinguishable from a dashed PLAN chip at a glance, without inventing a
   fourth chip shape — the estate already reads dashed = "not a real job yet". */
.mtcal-chip.followup{border-style:solid;border-left-width:3px;border-left-color:#B45309;}
.mtcal-leg i.followup{background:#B45309;}

/* The ticket sidebar card. */
.fu-card .fu-when{font-size:15px;font-weight:600;color:var(--text);letter-spacing:-.01em;margin:1px 0 3px;}   /* v1.4.10.473: the card-title look, 15/600 -.01em (was 15/700 tracked in px) */
.fu-card .fu-next{display:block;font-size:12px;color:var(--text-mute);margin:0 0 9px;line-height:1.5;}
.fu-card .fu-next.warn{color:#B45309;}
.fu-card .fu-note{margin:8px 0 2px;padding:8px 10px;background:var(--surface-3);border-left:3px solid #B45309;
  border-radius:0 5px 5px 0;font-size:12px;line-height:1.55;color:var(--text-mute);white-space:pre-wrap;}
.fu-card .fu-acts{display:flex;gap:6px;margin-top:10px;flex-wrap:wrap;}

/* The scheduler modal. */
.fu-modal .fu-lb{display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-mute);margin:14px 0 6px;}
.fu-modal .fu-lb:first-of-type{margin-top:0;}
.fu-modal .fu-dt{width:100%;}
.fu-modal .fu-note-in{width:100%;padding:9px 11px;border:1px solid var(--line);border-radius:6px;
  background:var(--surface);color:var(--text);font:inherit;font-size:13px;line-height:1.5;resize:vertical;}
.fu-modal .fu-note-in:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.fu-modal .fu-everyone{margin-bottom:8px;}
.fu-modal .fu-chk{display:flex;align-items:center;gap:9px;padding:9px 11px;border:1px solid var(--line);
  border-radius:6px;background:var(--surface-2);cursor:pointer;font-size:13px;}
.fu-modal .fu-chk input{width:16px;height:16px;margin:0;flex:none;}
.fu-modal .fu-people{max-height:236px;overflow-y:auto;border:1px solid var(--line);border-radius:6px;}
/* "Everyone" wins, so the individual list is dimmed and inert rather than
   removed — a list that vanishes makes people re-open the modal to check it
   is still there. */
.fu-modal .fu-people.off{opacity:.4;pointer-events:none;}
.fu-modal .fu-person{display:flex;align-items:center;gap:9px;padding:8px 11px;cursor:pointer;font-size:13px;
  border-bottom:1px solid var(--line);}
.fu-modal .fu-person:last-child{border-bottom:0;}
.fu-modal .fu-person:hover{background:var(--surface-2);}
.fu-modal .fu-person.muted{cursor:not-allowed;color:var(--text-dim);}
.fu-modal .fu-person input{width:16px;height:16px;margin:0;flex:none;}
.fu-modal .fu-pn{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fu-modal .fu-err{color:var(--err,#DC2626);font-size:12px;margin-top:10px;min-height:1px;}

/* The 40px phone tap floor (v128, re-learned six times — t/v233.js). */
@media (max-width:700px){
  .fu-modal .fu-dt,.fu-modal .fu-chk,.fu-modal .fu-person{min-height:40px;}
  .fu-modal .fu-person input,.fu-modal .fu-chk input{width:20px;height:20px;}
  .fu-card .fu-acts .btn{min-height:40px;}
  .fu-modal .fu-people{max-height:min(44vh,280px);}
}

/* ════════════════════════════════════════════════════════════════════════════
   v1.4.10.291 — CLEARING NOTIFICATIONS
   ════════════════════════════════════════════════════════════════════════════
   The bell panel's action row used to be a right-aligned flex with no wrap and
   no scroll; adding a fourth button pushed it past a phone's width. It wraps
   now, and the button labels collapse to icons under 430px so four controls
   still fit on one line on the smallest screen we support. */
.notif-acts{display:flex;justify-content:flex-end;align-items:center;gap:8px;
  margin-bottom:8px;flex-wrap:wrap;}
.notif-acts .btn{min-height:34px;}

/* The per-row ✕. It sits inside a row that is itself a click target, so the
   handler stops propagation — without that, clearing one would also navigate
   to whatever the notification is about. */
.notif-item{position:relative;align-items:flex-start;}
.notif-x{flex:0 0 auto;background:none;border:0;cursor:pointer;color:var(--text-dim);
  border-radius:6px;width:30px;height:30px;display:inline-flex;align-items:center;
  justify-content:center;padding:0;margin-left:2px;transition:background .13s,color .13s;}
.notif-x:hover{background:var(--surface-3);color:var(--text);}
.notif-x svg{width:14px;height:14px;}

/* The undo strip. A clear is bulk, silent and sticky, so the way back has to be
   on screen at the moment it happens — not buried in a settings page. */
.notif-cleared-note{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  background:var(--accent-glow,rgba(var(--bc-accent-rgb),.10));border:1px solid var(--line);
  border-radius:6px;padding:9px 12px;margin-bottom:9px;font-size:12px;
  color:var(--text-dim);line-height:1.45;}
.notif-cleared-note span{flex:1;min-width:0;}
.notif-cleared-note b{color:var(--text);}

@media (max-width:700px){
  .notif-acts .btn{min-height:40px;}
  .notif-x{width:40px;height:40px;}
  .notif-cleared-note .btn{min-height:40px;}
  /* v1.4.10.473: the ref pill drops under the text and the clear button stays top-right. Side by side they left the
     title and body 134px of a 326px row, so one long notification stood 309px tall */
  .notif-item{display:grid;grid-template-columns:8px minmax(0,1fr) auto;column-gap:10px;row-gap:6px;}
  .notif-item > .notif-dotc{grid-column:1;grid-row:1;}
  .notif-item > div:not(.notif-dotc){grid-column:2;grid-row:1;}
  .notif-item > .pill{grid-column:2;grid-row:2;justify-self:start;}
  .notif-item > .notif-x{grid-column:3;grid-row:1;}
}
@media (max-width:430px){
  /* Icon-only under 430px: four labelled buttons cannot fit, and a row that
     silently scrolls sideways hides the destructive one (v203's lesson runs
     the other way here — this bar is four items, not ten). */
  .notif-acts .nfa-t{display:none;}
  .notif-acts .btn{padding-left:11px;padding-right:11px;min-width:40px;justify-content:center;}   /* v1.4.10.473: an icon-only button is a 40px square — borderless "Clear all" measured 36 wide */
}

/* ════════════════════════════════════════════════════════════════════════════
   v1.4.10.291 — THE 30-DAY TREND SPARKLINES ON AN iPHONE
   ════════════════════════════════════════════════════════════════════════════
   MEASURED at 390x664 on the dashboard's "Trends · N days" panel:
       .dtr-tile   clientWidth 154   scrollWidth 164     → 10px of overflow
       its <svg>   width 150 (a HARD attribute)          → paints 9px past the
                                                           tile's right edge and
                                                           15px past its padding
   and .dtr-tile carries overflow-x:visible, so none of that is clipped: the
   sparkline is drawn straight over the tile border and its neighbour. That is
   the "graphs go over the areas" report, reproduced exactly.

   THE CHAIN, and why every link is released rather than one number shaved:
   sparkSVG() emitted width="150" height="38" as attributes. v204's phone rule
   already frees the tile (min-width:0, flex-basis 50%), which lands the tile at
   154px of content box — narrower than the 150px SVG plus its 14px padding.
   The SVG now scales through its viewBox (width:100% with the attribute kept
   for a non-CSS context), the tile clips as a backstop, and the flex row that
   holds the tiles gets min-width:0 too, because a grid/flex item defaults to
   min-width:auto and WebKit takes an SVG's intrinsic width from its viewBox —
   the same fault v269 fixed for the hero gauge.

   `.ins-chart` gets the same guard. It is emitted with width="100%" already, so
   it behaves in Chromium, but its viewBox is 680 wide and nothing capped it, so
   in a min-width:auto column WebKit can still floor the track at 680px. */
.dtr-spark{display:block;width:100%;height:auto;max-width:100%;overflow:hidden;}
.dtr-tile{min-width:0;overflow:hidden;}
.dtr-row{display:flex;gap:12px;flex-wrap:wrap;min-width:0;}
.dtr-row > *{min-width:0;}
/* overflow stays VISIBLE here — insArea/insColumns draw their left-hand axis
   labels at x = pl-2 and their x labels at y = H-8, and clipping them would
   trade one defect for another. Containment comes from max-width plus the
   min-width:0 releases below, not from a clip. */
.ins-chart{display:block;overflow:visible;width:100%;max-width:100%;}
.ins-spark{max-width:100%;}
.ins-donut{max-width:100%;}
.ins-donut svg{max-width:100%;height:auto;}

/* A grid or flex item defaults to min-width:auto, and WebKit derives an SVG's
   intrinsic width from its viewBox — so an .ins-chart with viewBox 0 0 680 210
   can set a 680px floor on the column that holds it and push the page sideways
   on an iPhone while looking fine in Chromium. Released at every level that can
   hold a chart, the v1.4.10.269 treatment. */
.ins-grid-2 > *, .ins-grid-2 > * > .panel-body, .panel-body{min-width:0;}
.panel-body > .ins-chart, .panel-body > svg{max-width:100%;}

/* ════════════════════════════════════════════════════════════════════════════
   v1.4.10.291 — THE SUPPORT TICKET, RESTRUCTURED
   ════════════════════════════════════════════════════════════════════════════
   MEASURED at 390x664 on ICCSYD-0050 before the change:
       .tkd-body       scrollHeight 3018px
       .tkd-side-rest  height 1734px, starting 1479px down
                       → 57% of the whole modal was reference cards
                         (follow-up, in-service, SLA, asset, attachments,
                          links, related) sitting BELOW the conversation and
                          below the composer, shown under both tabs
       .tkd-actionbar  clientWidth 340, scrollWidth 1037
                       → three screens of horizontally-scrolling actions
       .cmp-foot       clientWidth 322, scrollWidth 495

   v203 was right that the sidebar must not sit after the composer, and moved
   the TRIAGE half up. It left the other half where it was. The remaining half
   is reference material, and reference material has a tab: it belongs to
   Details. The markup order does not change (so nothing is duplicated and every
   repaint-by-id still works) — the body simply says which tab is live.

   Desktop is untouched: above 920px .tkd-side is a real column again and both
   halves stack in it exactly as before. */

/* The ⋯ overflow menu. display:contents on a desktop = the bar is the same
   single row it has always been. */
.tkd-ab-more{display:contents;}
.tkd-actionbar #tkd-more-btn{display:none;}

@media (max-width:920px){
  /* Reference cards belong to the Details tab. */
  .tkd-body.tkd-t-conv .tkd-side-rest{display:none;}
  .tkd-body.tkd-t-detail .tkd-side-rest{display:block;}
  /* …and the triage card belongs under the header on BOTH tabs, which is the
     v203 decision and is deliberately left alone. */
}

@media (max-width:760px){
  /* ONE ROW, FIVE CONTROLS, NO SCROLL — and the labels are what pay for it.
     MEASURED after the first cut of this change: dropping the four secondary
     buttons into the ⋯ menu took the bar's scrollWidth from 1,037px to 340px,
     but letting it WRAP put it on three lines and grew the header from 180px
     to 280px — 42% of a 664px screen before a word of the ticket. Worse than
     what it replaced.
     So the bar stays a single 48px row and the five survivors are shrunk to
     fit: the buttons go icon-only (every one already carries an aria-label and
     a title, so nothing is lost to a screen reader or a long-press), and the
     two selects drop their "STATUS"/"PRIORITY" caps and share the remaining
     width. Their aria-labels were already on the <select> itself.
     Measured budget at 390px: 44 + 44 + flex + flex + 44 + 28 of gaps ≤ 340. */
  .tkd-actionbar{position:relative;flex-wrap:nowrap;overflow-x:visible;align-items:stretch;}
  .tkd-actionbar > .btn.sm > .tkd-ab-t,
  .tkd-actionbar > .tkd-ackdone > .tkd-ab-t{display:none;}
  .tkd-actionbar > .btn.sm,
  .tkd-actionbar > .tkd-ackdone{flex:0 0 auto;padding-left:12px;padding-right:12px;}
  .tkd-actionbar > .tkd-ctl{flex:1 1 0;min-width:0;}
  .tkd-actionbar > .tkd-ctl > span{display:none;}
  .tkd-actionbar > .tkd-ctl > select{width:100%;max-width:none;min-width:0;text-overflow:ellipsis;padding-left:7px;padding-right:4px;}
  /* v1.4.10.375: the two selects no longer split the space evenly — "P3" had 110px to itself while the
     status beside it was cut to "In Prog". Priority takes what its longest option needs, status the rest. */
  .tkd-actionbar > .tkd-ctl.tkd-ctl-pri{flex:0 0 62px;}
  .tkd-actionbar > .tkd-ctl.tkd-ctl-pri-w{flex-basis:92px;}
  .tkd-actionbar #tkd-more-btn{display:inline-flex;}
  .tkd-actionbar .tkd-ab-more{
    display:none; position:absolute; right:0; top:calc(100% + 6px); z-index:40;
    flex-direction:column; align-items:stretch; gap:4px; min-width:196px;
    padding:6px; border:1px solid var(--line); border-radius:7px;
    background:var(--surface,#fff); box-shadow:var(--shadow-md,0 18px 40px -18px rgba(16,24,40,.35));
  }
  .tkd-actionbar.more-open .tkd-ab-more{display:flex;}
  .tkd-actionbar .tkd-ab-more .btn{justify-content:flex-start;width:100%;min-height:44px;}
  /* The delete's margin-left:auto and its order:9 were both for the scrolling
     row; inside the menu it is simply last, and last is where it belongs. */
  .tkd-actionbar .tkd-ab-more .tkd-del{margin-left:0;order:0;}
  .tkd-actionbar .tkd-ab-more .tkd-ab-t{display:inline;}
  /* Provenance is one line with an ellipsis rather than a wrapped paragraph —
     it was measured clipped at 40px anyway, so the wrap bought nothing and the
     extra line cost 18px of a 664px screen. */
  .tkd-head .tkd-opened{display:block;max-width:100%;white-space:nowrap;
    overflow:hidden;text-overflow:ellipsis;}
  /* The composer footer is DELIBERATELY LEFT AS IT IS. It measures 495px in a
     322px box, which is one swipe — and v203 made it a scrolling row on
     purpose because letting it wrap put Attach, Photo, the after-send select
     and Send on four separate lines. The action bar was a different case: 1,037
     in 340 is three screens, which no swipe recovers. Do not "fix" this one
     without re-measuring the wrap first. */
}

/* The 40px phone tap floor (v128 — run t/v233.js every release). */
@media (max-width:700px){
  .tkd-actionbar #tkd-more-btn{min-height:40px;min-width:44px;}
  .tkd-actionbar .tkd-ab-more .btn{min-height:44px;}
}

/* ════════════════════════════════════════════════════════════════════════════
   v1.4.10.292 — FOLLOW-UPS ON THE DASHBOARD, THE REBUILT FOLLOW-UP CARD,
   THE DATE-TIME PICKER, and SITE TASKS
   ════════════════════════════════════════════════════════════════════════════ */

/* ── Dashboard: the "follow-ups due" band, directly under the hero ── */
.dash-fu{background:linear-gradient(135deg,#FFF7ED 0%,#FFFBEB 100%);border:1px solid #FDBA74;border-left:5px solid #B45309;
  border-radius:var(--radius);padding:16px 18px 14px;margin-bottom:18px;box-shadow:0 6px 18px -12px rgba(180,83,9,.45);}
.dash-fu.has-over{background:linear-gradient(135deg,#FEF2F2 0%,#FFF7ED 100%);border-color:#FCA5A5;border-left-color:#DC2626;}
.dash-fu-head{display:flex;align-items:flex-start;gap:14px;margin-bottom:12px;}
.dash-fu-head h3{margin:0 0 3px;font-size:16px;font-weight:600;letter-spacing:-.012em;}
.dash-fu-head>div:nth-child(2){flex:1;min-width:0;}
.dash-fu-sub{font-size:12px;color:var(--text-mute);line-height:1.5;}
.dash-fu-ico{width:40px;height:40px;border-radius:7px;background:#B45309;color:#fff;display:grid;place-items:center;flex:none;box-shadow:0 4px 10px -4px rgba(180,83,9,.6);}
.dash-fu.has-over .dash-fu-ico{background:#DC2626;}
.dash-fu-list{display:grid;gap:8px;grid-template-columns:minmax(0,1fr);}
.dash-fu-list>*{min-width:0;}
.dfu-card{display:flex;align-items:center;gap:14px;background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:10px 12px;cursor:pointer;transition:transform .12s,box-shadow .12s;}
.dfu-card:hover{transform:translateY(-1px);box-shadow:var(--shadow);}
.dfu-card.over{border-color:#FCA5A5;}
.dfu-when{display:flex;align-items:center;gap:7px;min-width:132px;font-weight:700;font-size:13px;color:#B45309;flex:none;}
.dfu-card.over .dfu-when{color:#DC2626;}
.dfu-main{flex:1;min-width:0;}
.dfu-ttl{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dfu-ttl b{color:var(--brand-blue);margin-right:4px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;}   /* v1.4.10.473: the ticket ref in the code face, 12/600 as at the top of the ticket (was Poppins 13/700) */
.dmt-main .ttl b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;}   /* v1.4.10.473: the same ref in Your follow-ups */
.dfu-sub{font-size:12px;color:var(--text-mute);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dfu-note{margin-top:6px;font-size:12px;color:var(--text-mute);border-left:3px solid #FDBA74;padding-left:8px;white-space:pre-wrap;}
.dfu-acts{display:flex;align-items:center;gap:8px;flex:none;}
/* v1.4.10.473: the cards share one set of columns, so every title starts at the same x (the date column was at least
   132px and as wide as its own text: the titles started at 208 / 214 / 223px down one list) */
@media (min-width:761px){
  .dash-fu-list{grid-template-columns:minmax(132px,max-content) minmax(0,1fr) auto;column-gap:14px;}
  .dash-fu-list > .dfu-card{display:grid;grid-column:1/-1;grid-template-columns:subgrid;}
}
@media (max-width:760px){
  .dash-fu{padding:14px;}
  .dash-fu-head{flex-wrap:wrap;} .dash-fu-head .btn{width:100%;justify-content:center;min-height:40px;}
  .dfu-card{flex-wrap:wrap;} .dfu-when{min-width:0;width:100%;} .dfu-main{width:100%;flex:none;}
  .dfu-acts{width:100%;justify-content:flex-end;} .dfu-acts .btn{min-height:40px;}
}

/* ── The rebuilt follow-up card (ticket sidebar) ── */
.fu-card.due,.fu-card.over{border-color:#FDBA74;}
.fu-card .fu-top{display:flex;gap:14px;align-items:flex-start;}
.fu-card .fu-date{flex:none;width:62px;border-radius:7px;background:var(--surface-3);border:1px solid var(--line);text-align:center;padding:6px 4px 7px;display:flex;flex-direction:column;line-height:1.05;}
.fu-card .fu-date .fu-dow{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#B45309;}
.fu-card .fu-date .fu-day{font-size:24px;font-weight:700;letter-spacing:-.03em;color:var(--text);margin:2px 0 1px;}   /* v1.4.10.473: a secondary KPI figure tracks -.03em (was -.02em) */
.fu-card .fu-date .fu-mon{font-size:11px;font-weight:600;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;}
.fu-card .fu-date.over,.fu-card .fu-date.due{background:#FEF2F2;border-color:#FCA5A5;} .fu-card .fu-date.over .fu-dow,.fu-card .fu-date.due .fu-dow{color:#DC2626;}
.fu-card .fu-facts{flex:1;min-width:0;}
.fu-card .fu-time{font-size:15px;font-weight:600;letter-spacing:-.01em;}   /* v1.4.10.473: the card-title look, 15/600 -.01em (was 15/700 tracked in px) */
.fu-card .fu-chip{display:inline-block;margin:4px 0 6px;font-size:11px;font-weight:600;padding:2px 8px;border-radius:999px;background:#FFF7ED;color:#B45309;border:1px solid #FDBA74;}
.fu-card .fu-chip.soon{background:#EFF6FF;color:var(--bc-blue-v1-deep);border-color:#BFDBFE;}
.fu-card .fu-chip.due,.fu-card .fu-chip.over{background:#FEF2F2;color:#DC2626;border-color:#FCA5A5;}
.fu-card .fu-next{display:block;font-size:12px;color:var(--text-mute);line-height:1.5;}
.fu-card .fu-next .warn{color:#B45309;}
.fu-card .fu-people-row{display:flex;align-items:center;gap:8px;margin-top:11px;flex-wrap:wrap;}
.fu-avs{display:inline-flex;} .fu-avs .fu-av+.fu-av{margin-left:-6px;}
.fu-av{width:26px;height:26px;border-radius:50%;display:inline-grid;place-items:center;color:#fff;font-size:11px;font-weight:600;border:2px solid var(--surface);flex:none;}
.fu-av.sm{width:24px;height:24px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;border-width:0;}   /* v1.4.10.473: 10px initials take the badge look, 10/700 uppercase .04em (were 10/600) */
.fu-av.all{background:#B45309;} .fu-av.more{background:var(--text-dim);}
.fu-who{font-size:12px;font-weight:600;} .fu-who.muted{color:var(--text-mute);font-weight:500;}
.fu-card .fu-meta{font-size:11px;color:var(--text-dim);margin-top:8px;}
.fu-card .fu-empty{display:flex;gap:10px;align-items:flex-start;font-size:12px;color:var(--text-mute);line-height:1.5;padding:2px 0 8px;}
.fu-card .fu-empty svg{flex:none;color:#B45309;margin-top:2px;}

/* ── The scheduler modal: two columns on a desk ── */
/* v1.4.10.473: the ticket's subject under the modal title is a sub-heading, 13/600 (was 14/600), and its site / room
   tail the caption it is classed as, 11/400 (it inherited 600). The people column is minmax(0,1fr): a long name and
   title in it set the bare 1fr track to its full width and the scheduler scrolled sideways on a phone (507px in 326) */
.fu-modal .fu-lead{font-size:13px;font-weight:600;margin:0 0 14px;line-height:1.4;} .fu-modal .fu-lead .device-meta{font-weight:400;}
.fu-modal .fu-cols{display:grid;grid-template-columns:minmax(300px,340px) minmax(0,1fr);gap:22px;align-items:start;}
.fu-modal .fu-chk span{display:flex;flex-direction:column;line-height:1.3;} .fu-modal .fu-chk small{font-weight:400;color:var(--text-mute);font-size:12px;}
.fu-modal .fu-person.on{background:var(--accent-glow);}
.fu-modal .fu-fine{font-size:12px;color:var(--text-mute);line-height:1.55;margin:16px 0 0;padding-top:12px;border-top:1px dashed var(--line);}
@media (max-width:820px){ .fu-modal .fu-cols{grid-template-columns:minmax(0,1fr);gap:14px;} }

/* ── THE DATE-TIME PICKER (avDt) ── */
.avdt{border:1px solid var(--line);border-radius:7px;background:var(--surface);padding:10px;}
.avdt-quick{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px;}
.avdt-q{border:1px solid var(--line);background:var(--surface-2);color:var(--text);border-radius:999px;padding:5px 11px;font:inherit;font-size:12px;font-weight:500;cursor:pointer;}
.avdt-q:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
.avdt-q.on{background:var(--brand-blue);border-color:var(--brand-blue);color:#fff;}
.avdt-cal{border-top:1px solid var(--line);padding-top:8px;}
.avdt-nav{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;}
.avdt-mon{font-weight:600;font-size:13px;}
.avdt-nb{border:0;background:transparent;color:var(--text-mute);width:32px;height:32px;border-radius:6px;display:grid;place-items:center;cursor:pointer;}
.avdt-nb:hover{background:var(--surface-2);color:var(--text);}
.avdt-dow{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);margin-bottom:3px;}
.avdt-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;}
.avdt-d{border:0;background:transparent;color:var(--text);font:inherit;font-size:13px;height:34px;border-radius:6px;cursor:pointer;position:relative;}
.avdt-d:hover{background:var(--surface-2);}
.avdt-d.we{color:var(--text-mute);} .avdt-d.past{color:var(--text-dim);} .avdt-d.out{color:var(--text-dim);opacity:.45;}
.avdt-d.today{box-shadow:inset 0 0 0 1.5px var(--brand-blue);font-weight:700;}
.avdt-d.sel{background:var(--brand-blue);color:#fff;font-weight:700;box-shadow:none;}
.avdt-times{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:10px;padding-top:10px;border-top:1px solid var(--line);}
.avdt-t{border:1px solid var(--line);background:var(--surface-2);color:var(--text);border-radius:6px;padding:5px 9px;font:inherit;font-size:12px;font-weight:500;cursor:pointer;}   /* v1.4.10.473: a time chip reads like the quick-date chips above it, 12/500 (was 600) */
.avdt-t:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
.avdt-t.on{background:var(--brand-blue);border-color:var(--brand-blue);color:#fff;}
.avdt-tin{margin-left:auto;border:1px solid var(--line);border-radius:6px;padding:4px 8px;font:inherit;font-size:13px;background:var(--surface);color:var(--text);min-width:96px;}
.avdt-allday{display:flex;align-items:center;gap:8px;margin-top:10px;font-size:13px;cursor:pointer;} .avdt-allday input{margin:0;}
.avdt-sum{display:flex;align-items:center;gap:8px;margin-top:10px;padding:8px 10px;border-radius:6px;background:var(--surface-2);font-size:12px;font-weight:600;color:var(--text-mute);}
.avdt-sum.ok{color:var(--text);background:var(--accent-glow);} .avdt-sum.past{color:#B45309;background:#FFF7ED;}
.avdt-sum svg{flex:none;} .avdt-sum span{flex:1;min-width:0;}
.avdt-clear{border:0;background:transparent;color:var(--brand-blue);font:inherit;font-size:11px;font-weight:500;cursor:pointer;}
@media (max-width:700px){ .avdt-d{height:40px;} .avdt-q,.avdt-t{min-height:40px;} .avdt-tin{min-height:40px;font-size:16px;} }

/* ── SITE TASKS (v1.4.10.292) ─────────────────────────────────────────── */
.tk-page{display:flex;flex-direction:column;gap:14px;}
/* stat rail — six tiles, every one a filter */
.tk-rail{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;}
.tk-tile{display:flex;flex-direction:column;align-items:flex-start;gap:2px;text-align:left;background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:12px 14px 11px;cursor:pointer;font:inherit;color:var(--text);position:relative;transition:transform .12s,box-shadow .12s,border-color .12s;}
.tk-tile:hover{transform:translateY(-1px);box-shadow:var(--shadow);}
.tk-tile.on{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.tk-tile-ico{position:absolute;top:10px;right:12px;color:var(--text-dim);}
.tk-tile.blue .tk-tile-ico{color:var(--brand-blue);} .tk-tile.ok .tk-tile-ico{color:var(--ok);} .tk-tile.warn .tk-tile-ico{color:var(--warn);} .tk-tile.err .tk-tile-ico{color:var(--err);} .tk-tile.purple .tk-tile-ico{color:var(--brand-purple);}
.tk-tile-v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.05;}
.tk-tile.err .tk-tile-v{color:var(--err);} .tk-tile.warn .tk-tile-v{color:#B45309;}
.tk-tile-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;}   /* v1.4.10.473: a stat tile's label is the KPI label look, 11/600 uppercase .06em (was 12/600) */
.tk-tile-s{font-size:11px;color:var(--text-mute);}
/* toolbar */
.tk-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.tk-tabs{display:inline-flex;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:3px;gap:2px;}
.tk-tab{border:0;background:transparent;color:var(--text-mute);font:inherit;font-size:13px;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;gap:7px;}
.tk-tab.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);}
.tk-site{min-width:180px;max-width:280px;} .tk-listpick{max-width:200px;}
.tk-search{flex:1;min-width:180px;display:flex;align-items:center;gap:8px;background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:0 12px;color:var(--text-dim);}
.tk-search input{flex:1;border:0;background:transparent;font:inherit;font-size:13px;padding:9px 0;color:var(--text);outline:none;min-width:0;}
.tk-tb-right{display:flex;align-items:center;gap:8px;margin-left:auto;}
.tk-viewtog{display:inline-flex;border:1px solid var(--line);border-radius:6px;overflow:hidden;}
.tk-viewtog button{border:0;background:var(--surface);color:var(--text-mute);font:inherit;font-size:12px;font-weight:600;padding:7px 11px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;}
.tk-viewtog button.on{background:var(--brand-blue);color:#fff;}
/* the board */
.tk-panel .panel-body{padding:0;}
.tk-quick{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--line);color:var(--brand-blue);background:var(--surface-2);border-radius:var(--radius) var(--radius) 0 0;}
.tk-quick.muted{color:var(--text-dim);}
.tk-quick input{flex:1;border:0;background:transparent;font:inherit;font-size:13px;color:var(--text);outline:none;min-width:0;}
.tk-group-head{display:flex;align-items:center;gap:8px;padding:12px 16px 6px;cursor:pointer;user-select:none;}
.tk-group-head h4{margin:0;font-size:13px;font-weight:600;}
.tk-caret{color:var(--text-dim);display:inline-grid;transition:transform .15s;transform:rotate(90deg);} .tk-caret.closed{transform:none;}
.tk-dot{width:10px;height:10px;border-radius:50%;display:inline-block;flex:none;} .tk-dot.big{width:18px;height:18px;cursor:pointer;}
.tk-count{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-mute);background:var(--surface-3);border-radius:999px;padding:1px 8px;}   /* v1.4.10.473: a count badge is the badge look, 10/700 uppercase .04em (10px with no case, and .06em inside an uppercase label) */
.tk-mini{border:0;background:transparent;color:var(--text-dim);width:26px;height:26px;border-radius:5px;display:inline-grid;place-items:center;cursor:pointer;} .tk-mini:hover{background:var(--surface-3);color:var(--text);} .tk-mini.danger:hover{color:var(--err);}
.tk-rows{min-height:6px;}
.tk-row{display:flex;align-items:center;gap:12px;padding:10px 16px;border-top:1px solid var(--line);cursor:pointer;position:relative;transition:background .12s;}
.tk-row:hover{background:var(--surface-2);}
.tk-row.dragging{opacity:.4;} .tk-row.drop-before{box-shadow:inset 0 2px 0 var(--brand-blue);}
.tk-row.prio-urgent::before{content:"";position:absolute;left:0;top:8px;bottom:8px;width:3px;border-radius:0 3px 3px 0;background:#DC2626;}
.tk-row.prio-high::before{content:"";position:absolute;left:0;top:8px;bottom:8px;width:3px;border-radius:0 3px 3px 0;background:#D97706;}
.tk-main{flex:1;min-width:0;}
.tk-title{font-size:13px;font-weight:600;line-height:1.35;}
.tk-row.done .tk-title,.tk-card.done .tk-title{text-decoration:line-through;color:var(--text-mute);font-weight:500;}
.tk-row.done{opacity:.85;}
.tk-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:4px;}
.tk-chip{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;color:var(--text-mute);background:var(--surface-3);border-radius:6px;padding:2px 7px;line-height:1.4;} .tk-chip svg{width:11px;height:11px;}
.tk-chip.due.today{background:#FFF7ED;color:#B45309;} .tk-chip.due.over{background:#FEF2F2;color:#DC2626;}
.tk-chip.items.full{background:#ECFDF5;color:#047857;} .tk-chip.tkt{color:var(--brand-blue);background:#EFF6FF;cursor:pointer;} .tk-chip.site{color:var(--brand-purple);background:#F5F3FF;}
/* v1.4.10.435: the list a task is on, where the rows are not grouped by list */
.tk-chip.list{color:var(--text);background:var(--surface-2,#F1F5F9);} .tk-chip.list .tk-dot{width:8px;height:8px;margin-right:2px;}
.tk-doneby{font-size:11px;color:var(--text-mute);}
.tk-prio{display:inline-grid;place-items:center;width:22px;height:22px;border-radius:6px;color:var(--pc,#64748B);background:color-mix(in srgb,var(--pc,#64748B) 12%,transparent);flex:none;} .tk-prio svg{width:12px;height:12px;}
.tk-av{width:28px;height:28px;border-radius:50%;display:inline-grid;place-items:center;color:#fff;font-size:11px;font-weight:600;flex:none;}
.tk-av.sm{width:24px;height:24px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;} .tk-av.none{background:var(--surface-3);color:var(--text-dim);border:1px dashed var(--line);}
.tk-check{width:24px;height:24px;border-radius:50%;border:2px solid var(--line);background:var(--surface);color:transparent;display:inline-grid;place-items:center;cursor:pointer;flex:none;transition:all .15s;padding:0;}
.tk-check svg{width:13px;height:13px;} .tk-check:hover{border-color:var(--ok);color:var(--ok);}
.tk-check.on{background:var(--ok);border-color:var(--ok);color:#fff;} .tk-check:disabled{cursor:default;opacity:.7;}
.tk-check.big{width:32px;height:32px;} .tk-check.big svg{width:17px;height:17px;} .tk-check.sm{width:20px;height:20px;} .tk-check.sm svg{width:11px;height:11px;}
.tk-row.ticking .tk-check{animation:tk-pop .35s ease;} @keyframes tk-pop{0%{transform:scale(1)}50%{transform:scale(1.3)}100%{transform:scale(1)}}
.tk-empty-list{padding:10px 16px 12px;font-size:12px;color:var(--text-dim);}
.tk-empty{padding:44px 20px;} .tk-done-group{border-top:1px solid var(--line);margin-top:6px;background:var(--surface-2);border-radius:0 0 var(--radius) var(--radius);}
.tk-skel{height:44px;border-radius:6px;background:linear-gradient(90deg,var(--surface-2),var(--surface-3),var(--surface-2));background-size:200% 100%;animation:tk-sh 1.2s infinite;margin:6px 0;} @keyframes tk-sh{0%{background-position:200% 0}100%{background-position:-200% 0}}
/* board */
.tk-board{display:flex;gap:12px;overflow-x:auto;padding-bottom:8px;align-items:flex-start;}
.tk-col{flex:0 0 290px;background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:10px;min-height:120px;}
.tk-col-head{display:flex;align-items:center;gap:8px;padding:2px 4px 10px;} .tk-col-head h4{margin:0;font-size:13px;flex:1;}
.tk-col-body{display:flex;flex-direction:column;gap:8px;}
.tk-card{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:10px 12px;cursor:pointer;box-shadow:var(--shadow-sm);} .tk-card:hover{border-color:var(--brand-blue);}
.tk-card-top{display:flex;align-items:flex-start;gap:8px;} .tk-card-top .tk-title{flex:1;font-size:13px;} .tk-card .tk-chips{margin-top:8px;}
.tk-col-add{background:transparent;border:1px dashed var(--line);display:grid;place-items:center;} .tk-addlist{border:0;background:transparent;color:var(--brand-blue);font:inherit;font-size:13px;font-weight:500;cursor:pointer;display:inline-flex;gap:6px;align-items:center;padding:20px;}
/* new-task form */
.tk-form .tk-title-in{width:100%;border:0;border-bottom:2px solid var(--line);background:transparent;font:inherit;font-size:16px;font-weight:600;letter-spacing:-.012em;padding:6px 2px 10px;color:var(--text);outline:none;margin-bottom:10px;}   /* v1.4.10.473: the modal-title look (16/600 -.012em) — a borderless title line drawn at the page-title 20/600 out-shouted the modal's own "New task" heading; 16 is also the phone field size */
.tk-form .tk-title-in:focus{border-color:var(--brand-blue);}
.tk-form .fu-note-in{margin-bottom:6px;} .tk-cols{margin-top:6px;}
.tk-form-2{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
.tk-prio-pick{display:flex;gap:4px;flex-wrap:wrap;}
.tk-pp{border:1px solid var(--line);background:var(--surface);color:var(--text-mute);border-radius:6px;padding:6px 9px;font:inherit;font-size:12px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:5px;}
.tk-pp svg{width:12px;height:12px;color:var(--pc);} .tk-pp.on{border-color:var(--pc);background:color-mix(in srgb,var(--pc) 12%,transparent);color:var(--text);}
.tk-prio-pick.sm .tk-pp span{display:none;} .tk-prio-pick.sm .tk-pp{padding:6px 8px;}
/* drawer */
body.tk-drawer-open{overflow:hidden;}
.tk-drawer{position:fixed;inset:0;z-index:1300;}
.tk-drawer-scrim{position:absolute;inset:0;background:rgba(15,23,42,.35);backdrop-filter:blur(2px);}
.tk-drawer-panel{position:absolute;top:0;right:0;bottom:0;width:min(560px,100%);background:var(--surface);box-shadow:-16px 0 40px -20px rgba(15,23,42,.5);display:flex;flex-direction:column;animation:tk-slide .22s ease;}
@keyframes tk-slide{from{transform:translateX(30px);opacity:0}to{transform:none;opacity:1}}
.tk-dr-head{display:flex;align-items:flex-start;gap:12px;padding:18px 18px 12px;border-bottom:1px solid var(--line);}
.tk-dr-title{flex:1;font-size:16px;font-weight:600;line-height:1.3;letter-spacing:-.012em;outline:none;border-radius:6px;padding:2px 4px;margin:-2px -4px;}
.tk-dr-title[contenteditable]:focus{background:var(--surface-2);box-shadow:0 0 0 2px var(--accent-glow);}
.tk-drawer-panel.done .tk-dr-title{text-decoration:line-through;color:var(--text-mute);}
.tk-dr-acts{display:flex;align-items:center;gap:6px;} .tk-dr-acts .close{position:static;}
.tk-dr-body{flex:1;overflow-y:auto;padding:14px 18px 30px;}
.tk-dr-banner{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 12px;border-radius:6px;background:#ECFDF5;color:#047857;font-size:13px;margin-bottom:12px;}
.tk-dr-banner.cancelled{background:var(--surface-3);color:var(--text-mute);}
.tk-dr-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px;margin-bottom:6px;}
.tk-dr-f label,.tk-dr-sec>label{display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin-bottom:5px;}
.tk-dr-v{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;min-height:30px;}
.tk-inline-sel,.tk-inline-in{width:100%;} .tk-inline-in{border:1px solid var(--line);border-radius:6px;padding:6px 9px;font:inherit;font-size:13px;background:var(--surface);color:var(--text);}
.tk-due-btn{border:1px solid var(--line);background:var(--surface);border-radius:6px;padding:6px 10px;font:inherit;font-size:13px;font-weight:400;cursor:pointer;width:100%;justify-content:flex-start;text-align:left;color:var(--text);flex-wrap:wrap;}
.tk-due-btn small{font-size:11px;font-weight:500;color:var(--text-mute);}   /* v1.4.10.473: 11px (a <small> was 10.83px, off the scale) */ .tk-due-btn.today{border-color:#FDBA74;color:#B45309;} .tk-due-btn.over{border-color:#FCA5A5;color:#DC2626;}
.tk-due-btn:disabled{cursor:default;}
.tk-link{border:0;background:transparent;color:var(--brand-blue);font:inherit;font-size:12px;font-weight:500;cursor:pointer;padding:3px 0;display:inline-flex;align-items:center;gap:5px;}
.tk-dr-sec{margin-top:16px;padding-top:14px;border-top:1px solid var(--line);}
.tk-desc{font-size:14px;line-height:1.6;min-height:40px;border-radius:6px;padding:8px 10px;border:1px solid transparent;white-space:pre-wrap;}
.tk-desc[contenteditable]{border-color:var(--line);} .tk-desc[contenteditable]:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.tk-desc[contenteditable]:empty::before{content:attr(data-ph);color:var(--text-dim);}
.tk-desc.ro{padding:0;}
.tk-prog{height:6px;border-radius:3px;background:var(--surface-3);overflow:hidden;margin-bottom:8px;} .tk-prog div{height:100%;background:var(--ok);border-radius:3px;transition:width .3s;}
.tk-items{display:flex;flex-direction:column;}
.tk-item{display:flex;align-items:center;gap:9px;padding:6px 4px;border-radius:6px;} .tk-item:hover{background:var(--surface-2);}
.tk-item-t{flex:1;font-size:13px;outline:none;border-radius:4px;padding:1px 3px;} .tk-item.done .tk-item-t{text-decoration:line-through;color:var(--text-mute);}
.tk-item-by{font-size:11px;} .tk-item .tk-mini{opacity:0;} .tk-item:hover .tk-mini{opacity:1;}
.tk-item-add{display:flex;align-items:center;gap:8px;color:var(--brand-blue);padding:6px 4px;} .tk-item-add input{flex:1;border:0;background:transparent;font:inherit;font-size:13px;color:var(--text);outline:none;padding:4px 0;border-bottom:1px dashed var(--line);}
.tk-comment-box{display:flex;gap:8px;align-items:flex-start;margin-bottom:12px;} .tk-comment-box textarea{flex:1;border:1px solid var(--line);border-radius:6px;padding:8px 10px;font:inherit;font-size:13px;resize:vertical;background:var(--surface);color:var(--text);}
.tk-evs{display:flex;flex-direction:column;gap:8px;}
.tk-ev{display:flex;gap:9px;align-items:flex-start;font-size:12px;color:var(--text-mute);line-height:1.5;}
.tk-ev-body{flex:1;display:flex;justify-content:space-between;gap:10px;min-width:0;} .tk-ev-body>span:first-child{min-width:0;}
.tk-ev b{color:var(--text);font-weight:600;}
.tk-ev-dot{width:8px;height:8px;border-radius:50%;background:var(--text-dim);margin-top:6px;flex:none;}
.tk-ev-dot.done,.tk-ev-dot.item_done{background:var(--ok);} .tk-ev-dot.assigned{background:var(--brand-blue);} .tk-ev-dot.created{background:var(--brand-purple);} .tk-ev-dot.deleted,.tk-ev-dot.cancelled{background:var(--err);} .tk-ev-dot.due_changed{background:#D97706;}
.tk-ev-when{font-size:11px;color:var(--text-dim);white-space:nowrap;flex:none;}
.tk-ev.comment{background:var(--surface-2);border-radius:6px;padding:9px 11px;color:var(--text);} .tk-ev.comment .tk-ev-body{flex-direction:column;gap:3px;} .tk-ev-head{display:flex;justify-content:space-between;gap:8px;} .tk-ev-text{white-space:pre-wrap;font-size:14px;line-height:1.55;}
.tk-dr-foot{margin-top:16px;}
.tk-menu{position:fixed;z-index:1400;background:var(--surface);border:1px solid var(--line);border-radius:6px;box-shadow:var(--shadow);padding:4px;display:flex;flex-direction:column;min-width:200px;}
.tk-menu button{border:0;background:transparent;text-align:left;font:inherit;font-size:13px;font-weight:500;padding:8px 10px;border-radius:5px;cursor:pointer;color:var(--text);display:flex;gap:7px;align-items:center;} .tk-menu button:hover{background:var(--surface-2);} .tk-menu button.danger{color:var(--err);}
/* lists editor */
.tk-lists-ed{display:flex;flex-direction:column;gap:6px;position:relative;}
.tk-list-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid var(--line);border-radius:6px;} .tk-list-row input{flex:1;border:0;background:transparent;font:inherit;font-size:13px;font-weight:400;color:var(--text);outline:none;min-width:0;min-height:26px;}   /* v1.4.10.473: min-height, as tall as the row's buttons */
.tk-pal{position:absolute;z-index:5;background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:6px;gap:5px;box-shadow:var(--shadow);flex-wrap:wrap;width:150px;} .tk-pal button{width:22px;height:22px;border-radius:50%;border:2px solid var(--surface);cursor:pointer;} .tk-pal button.none{width:auto;border-radius:6px;font:inherit;font-size:11px;font-weight:500;background:var(--surface-3);color:var(--text-mute);padding:0 6px;}
/* history */
.tk-hist-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:14px 16px 10px;}
.tk-seg{display:inline-flex;border:1px solid var(--line);border-radius:6px;overflow:hidden;} .tk-seg button{border:0;background:var(--surface);color:var(--text-mute);font:inherit;font-size:12px;font-weight:600;padding:6px 10px;cursor:pointer;} .tk-seg button.on{background:var(--brand-blue);color:#fff;}
.tk-hist-wrap{overflow-x:auto;}
.tk-hist tr{cursor:pointer;} .tk-hist tr.deleted td{opacity:.6;} .tk-hist td.over{color:var(--err);}
.tk-hist .th-title>div:first-child{font-weight:600;}
.tk-feed-row{display:flex;align-items:center;gap:10px;padding:8px 6px;border-radius:6px;cursor:pointer;font-size:13px;} .tk-feed-row:hover{background:var(--surface-2);} .tk-feed-row>div{flex:1;min-width:0;} .tk-feed-k{color:var(--brand-blue);font-weight:600;}
/* responsive */
@media (max-width:1100px){ .tk-rail{grid-template-columns:repeat(3,1fr);} }
@media (max-width:760px){
  .tk-rail{grid-template-columns:repeat(2,1fr);gap:8px;} .tk-tile{padding:10px 12px;} .tk-tile-v{font-size:20px;}
  .tk-toolbar{gap:8px;} .tk-site{min-width:0;flex:1;max-width:none;} .tk-search{min-width:100%;order:5;} .tk-tb-right{width:100%;justify-content:flex-end;flex-wrap:wrap;}
  .tk-hide-sm{display:none;} .tk-listpick{max-width:46%;}
  .tk-row{padding:12px 12px;gap:10px;} .tk-check{width:28px;height:28px;} .tk-quick{padding:10px 12px;} .tk-quick .device-meta{display:none;}
  .tk-dr-grid{grid-template-columns:1fr;} .tk-form-2{grid-template-columns:1fr;} .tk-drawer-panel{width:100%;}
  .tk-tile,.tk-tab,.tk-viewtog button,.tk-seg button,.tk-pp,.tk-mini{min-height:40px;}
  .tk-col{flex-basis:84vw;}
}

/* ── v1.4.10.293: the rebuilt New task, the ticket picker, "everyone" ── */
#modal-inner.modal-wide.tk-wide{max-width:1040px;}
.tk-new .tk-new-grid{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(300px,410px);gap:26px;align-items:start;}   /* v1.4.10.473: the side column 410px (was 360), so the ticket and asset pickers show their whole placeholder */
.tk-new .tk-new-site{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:var(--brand-purple);background:#F5F3FF;border-radius:999px;padding:4px 11px;margin-bottom:10px;}
.tk-new .tk-title-in{padding:8px 2px 12px;}   /* v1.4.10.473: the size is the base rule's 16px (was 20 here) */
.tk-new .tk-desc-in{min-height:170px;font-size:13px;line-height:1.55;resize:vertical;}
.tk-new .fu-lb{margin-top:12px;}
.tk-new-items{border:1px solid var(--line);border-radius:6px;padding:4px 6px;min-height:44px;}
.tk-new-items .tk-item{padding:5px 4px;} .tk-new-items-empty{padding:9px 6px;font-size:12px;}
.tk-new .tk-item-add{padding:8px 4px 0;}
.tk-new .avdt{padding:8px;} .tk-new .avdt-d{height:32px;font-size:13px;}
.tk-new .tk-new-side{background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:6px 16px 16px;}
.tk-new .tk-new-side .fu-lb:first-child{margin-top:10px;}
.tk-side-sel{width:100%;min-height:38px;}
.tk-tp-list{max-width:100%;} .tk-tp-row{min-width:0;} .tk-tp-row>*{min-width:0;} .tk-tp-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tk-av.all{background:var(--brand-purple);} .tk-av.all svg{width:14px;height:14px;}
/* ticket picker */
.tk-tp{position:relative;}
.tk-tp-box{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:6px;padding:0 10px;background:var(--surface);color:var(--text-dim);}
.tk-tp-box input{flex:1;border:0;background:transparent;font:inherit;font-size:13px;padding:8px 0;color:var(--text);outline:none;min-width:0;}
.tk-tp-list{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:30;background:var(--surface);border:1px solid var(--line);border-radius:6px;box-shadow:var(--shadow);max-height:260px;overflow-y:auto;padding:4px;}
.tk-tp-row{display:grid;grid-template-columns:auto 1fr;gap:2px 10px;width:100%;text-align:left;border:0;background:transparent;font:inherit;padding:7px 9px;border-radius:6px;cursor:pointer;color:var(--text);}
.tk-tp-row:hover{background:var(--surface-2);} .tk-tp-row.closed{opacity:.6;}
.tk-tp-ref{font-size:12px;font-weight:700;color:var(--brand-blue);grid-row:1/3;align-self:start;padding-top:1px;}
.tk-tp-ttl{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tk-tp-meta{font-size:11px;color:var(--text-mute);}
.tk-tp-sel{display:flex;align-items:center;gap:8px;border:1px solid #BFDBFE;background:#EFF6FF;border-radius:6px;padding:6px 8px 6px 10px;color:var(--brand-blue);font-size:13px;}
.tk-tp-sel.closed{border-color:var(--line);background:var(--surface-2);color:var(--text-mute);}
.tk-tp-sel b{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}   /* v1.4.10.473: a long tag gives way (the picked asset pushed its two buttons 8px out of the Where card) */
.tk-tp-sel .tk-tp-sub{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);font-weight:500;}
.tk-dr-f-wide{grid-column:1/-1;}
@media (max-width:900px){ .tk-new .tk-new-grid{grid-template-columns:minmax(0,1fr);gap:16px;} /* v1.4.10.473: the title's 18px went (the 16px base; the ≤900 field rule's !important already beat it) */ .tk-new .tk-desc-in{min-height:110px;} .tk-new .avdt-d{height:40px;} .tk-tp-box input{font-size:16px;min-height:40px;} }

/* ── Tasks v1.4.10.294: status chips, attachments, drop zones, settings ── */
.tk-chip.status{background:color-mix(in srgb, var(--sc) 12%, transparent);color:var(--sc);} .tk-chip.status i{width:7px;height:7px;border-radius:50%;background:var(--sc);display:inline-block;}
.tk-chip.status.lg{font-size:11px;padding:4px 10px;} .tk-chip.status.lg i{width:9px;height:9px;}
.tk-board.by-status .tk-col-head h4{text-transform:none;}
.tk-drop{display:flex;align-items:center;justify-content:center;gap:10px;padding:18px 14px;border:2px dashed var(--line);border-radius:7px;color:var(--text-mute);font-size:13px;cursor:pointer;transition:border-color .15s,background .15s;background:var(--surface-2);}
.tk-drop svg{width:20px;height:20px;flex-shrink:0;} .tk-drop b{color:var(--brand,var(--bc-blue-v1));} .tk-drop:hover,.tk-drop.over{border-color:var(--brand,var(--bc-blue-v1));background:#EFF6FF;color:var(--text);}
.tk-drop.sm{padding:12px;font-size:12px;margin-top:8px;} .tk-drop.busy{opacity:.6;pointer-events:none;}
.tk-new-files{display:flex;flex-direction:column;gap:6px;margin-top:8px;}
.tk-file-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);}
.tk-file-row.queued{border-style:dashed;} .tk-file-ico{width:36px;height:36px;border-radius:6px;background:var(--surface-3);display:inline-flex;align-items:center;justify-content:center;color:var(--text-mute);flex-shrink:0;}
.tk-file-thumb{width:36px;height:36px;border-radius:6px;object-fit:cover;flex-shrink:0;}
.tk-file-main{flex:1;min-width:0;} .tk-file-name{font-size:13px;font-weight:600;color:var(--text);text-decoration:none;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .tk-file-name:hover{text-decoration:underline;}
.tk-att-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px;margin-bottom:8px;}
.tk-att-img{position:relative;display:block;aspect-ratio:1;border-radius:6px;overflow:hidden;border:1px solid var(--line);background:var(--surface-3);}
.tk-att-img img{width:100%;height:100%;object-fit:cover;display:block;}
.tk-att-del{position:absolute;top:4px;right:4px;width:24px;height:24px;border-radius:50%;border:0;background:rgba(15,23,42,.65);color:#fff;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .15s;} .tk-att-del svg{width:12px;height:12px;}
.tk-att-img:hover .tk-att-del,.tk-att-img:focus-within .tk-att-del{opacity:1;} @media (hover:none){ .tk-att-del{opacity:1;} }
.tk-att-rows{display:flex;flex-direction:column;gap:6px;}
.tk-drawer-dropveil{display:none;position:absolute;inset:0;z-index:5;background:rgba(239,246,255,.92);border:3px dashed var(--brand,var(--bc-blue-v1));border-radius:0;align-items:center;justify-content:center;flex-direction:column;gap:8px;color:var(--brand,var(--bc-blue-v1));font-size:15px;pointer-events:none;} .tk-drawer-dropveil svg{width:34px;height:34px;}
.tkv-body.dropping .tk-drawer-dropveil{display:flex;}   /* v1.4.10.429: the v300 rebuild made .tkd-body.tkv-body the drop target — the old
   .tk-drawer-panel hook matched nothing, so the "Drop to attach" veil never showed (the drop itself worked, invisibly) */
.tk-settings-tabs{margin-bottom:12px;} .tk-settings-tabs button svg{width:13px;height:13px;margin-right:5px;vertical-align:-2px;}
.tk-settings .tkn-row.off .tkn-name,.tk-settings .tkn-row.off .tkn-mail{opacity:.55;}
.tk-st-row .tk-mini.on{color:#D97706;} .tk-st-row .tk-mini:disabled{opacity:.3;cursor:default;}
.tk-status-sel{max-width:100%;}

/* ── Support ▸ Assignment card as a fact sheet (v1.4.10.294) ── */
.tkt-props-btn{padding:3px 8px;font-size:11px;} .tkt-props-btn svg{width:12px;height:12px;}
.tkt-fact{display:inline-flex;flex-direction:column;align-items:flex-end;gap:1px;text-align:right;min-width:0;font-size:12px;color:var(--text);}
.tkt-fact b{font-weight:600;} .tkt-fact .device-meta{font-size:11px;font-weight:400;} .tkt-fact.who{flex-direction:row;align-items:center;gap:7px;font-weight:600;}
.tkt-fact.link{background:none;border:0;padding:0;cursor:pointer;font:inherit;color:var(--text);} .tkt-fact.link:hover b{color:var(--brand,var(--bc-blue-v1));text-decoration:underline;}
.tkt-props-view .ex-row{align-items:flex-start;}

/* ── Session resume splash (v1.4.10.294): html.av-resume is set inline before
   first paint when a kept token exists; init() clears it. ── */
#av-resume{display:none;position:fixed;inset:0;z-index:9990;background:radial-gradient(140% 120% at 50% -10%, #EEF3FF 0%, #F6F8FC 48%, #F3F0FB 100%);align-items:center;justify-content:center;flex-direction:column;gap:14px;color:var(--text-mute);font-size:13px;}
html.av-resume #login{display:none !important;} html.av-resume #av-resume{display:flex;}
#av-resume .avr-mark{width:44px;height:44px;border-radius:14px;background:linear-gradient(135deg,var(--bc-blue-v1),var(--bc-purple-v1));position:relative;box-shadow:0 10px 24px -10px rgba(var(--bc-accent-rgb),.55);}
#av-resume .avr-mark span{position:absolute;inset:0;border-radius:14px;border:2px solid rgba(255,255,255,.55);border-top-color:#fff;animation:avrSpin .9s linear infinite;}
@keyframes avrSpin{to{transform:rotate(360deg);}}
@media (prefers-reduced-motion:reduce){ #av-resume .avr-mark span{animation:none;} }

/* ── v1.4.10.295 ─────────────────────────────────────────────────────────────
   Tasks: many people on a task (the WHO picker + avatar stacks), checklist
   items handed to a person, the Add button on both checklist inputs; the
   ticket picker's list host. Support: the ticket detail HERO. */
.tk-avs{display:inline-flex;align-items:center;flex:none;}
.tk-avs .tk-av{margin-left:-8px;box-shadow:0 0 0 2px var(--surface);} .tk-avs .tk-av:first-child{margin-left:0;}
.tk-av.more{background:var(--surface-3);color:var(--text-mute);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;border:1px solid var(--line);}   /* v1.4.10.473: the +N and the small initials take the badge look, 10/700 uppercase .04em (were 10/600) */
.tk-who{position:relative;}
.tk-who-chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:32px;}
.tk-who-chip{display:inline-flex;align-items:center;gap:6px;padding:3px 4px 3px 4px;border:1px solid var(--line);border-radius:999px;background:var(--surface);font-size:12px;font-weight:500;color:var(--text);max-width:100%;}
.tk-who-chip>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tk-who-chip .tk-mini{width:22px;height:22px;opacity:.7;} .tk-who-chip .tk-mini:hover{opacity:1;background:var(--surface-3);}
.tk-who-chip.all{border-color:#DDD6FE;background:#F5F3FF;color:var(--brand-purple);padding-left:9px;} .tk-who-chip.all svg{width:14px;height:14px;}
.tk-who-none{display:inline-flex;align-items:center;gap:6px;color:var(--text-mute);font-size:12px;padding:3px 6px 3px 2px;} .tk-who-none svg{width:15px;height:15px;opacity:.6;}
.tk-who-add{display:inline-flex;align-items:center;gap:4px;border:1px dashed var(--line);background:transparent;color:var(--brand-blue);font:inherit;font-size:12px;font-weight:500;padding:4px 10px 4px 7px;border-radius:999px;cursor:pointer;min-height:30px;}
.tk-who-add svg{width:14px;height:14px;} .tk-who-add:hover,.tk-who-add.on{background:var(--accent-glow);border-color:#BFDBFE;border-style:solid;}
.tk-who-menu{position:absolute;left:0;top:calc(100% + 6px);z-index:40;width:min(340px,100%);min-width:240px;background:var(--surface);border:1px solid var(--line);border-radius:7px;box-shadow:var(--shadow);padding:6px;max-height:340px;overflow-y:auto;}
.tk-who-search{display:flex;align-items:center;gap:8px;padding:2px 8px;border:1px solid var(--line);border-radius:6px;color:var(--text-dim);margin-bottom:4px;background:var(--surface-2);}
.tk-who-search svg{width:14px;height:14px;flex:none;} .tk-who-search input{flex:1;border:0;background:transparent;font:inherit;font-size:13px;padding:7px 0;color:var(--text);outline:none;min-width:0;}
.tk-who-opt{display:flex;align-items:center;gap:9px;width:100%;text-align:left;border:0;background:transparent;font:inherit;font-size:13px;color:var(--text);padding:7px 8px;border-radius:6px;cursor:pointer;min-height:38px;}
.tk-who-opt:hover{background:var(--surface-2);} .tk-who-opt .tk-who-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;} .tk-who-opt .tk-who-nm i{font-style:normal;color:var(--text-mute);font-weight:500;}
.tk-who-tick{width:18px;height:18px;border-radius:5px;border:1.5px solid var(--line);display:inline-grid;place-items:center;color:#fff;flex:none;} .tk-who-tick svg{width:11px;height:11px;opacity:0;}
.tk-who-opt.on .tk-who-tick{background:var(--brand-blue);border-color:var(--brand-blue);} .tk-who-opt.on .tk-who-tick svg{opacity:1;}
.tk-who-opt.everyone{border-bottom:1px solid var(--line);border-radius:6px 6px 0 0;margin-bottom:3px;} .tk-who-opt.everyone.on .tk-who-tick{background:var(--brand-purple);border-color:var(--brand-purple);}
.tk-who-foot{display:flex;justify-content:flex-end;padding:6px 4px 2px;position:sticky;bottom:-6px;background:var(--surface);}
.tk-dr-who .tk-link{margin-top:4px;}
.tk-item{align-items:flex-start;}
.tk-item-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;padding-top:2px;}
.tk-item-for,.tk-item-done{font-size:11px;color:var(--text-mute);display:inline-flex;align-items:center;gap:4px;}
.tk-item-for{display:block;}   /* v1.4.10.473: "for <names>" reads as one line of text; as a flex row a long name list stood in a column beside a lone "for" */
.tk-item-for b{color:var(--text);font-weight:600;}
.tk-item-done{color:#0F766E;} .tk-item-done svg{width:11px;height:11px;}
.tk-item.mine{background:linear-gradient(90deg,var(--accent-glow),transparent 60%);} .tk-item.mine .tk-item-for b{color:var(--brand-blue);}
.tk-item-who{border:0;background:transparent;padding:0;border-radius:999px;display:inline-flex;align-items:center;gap:5px;cursor:pointer;flex:none;opacity:.55;min-height:24px;}
.tk-item-who.set,.tk-item:hover .tk-item-who{opacity:1;} .tk-item-who:hover .tk-av{box-shadow:0 0 0 2px var(--accent-glow);}
.tk-item-who-nm{font-size:12px;font-weight:600;color:var(--text-mute);max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tk-item .tk-check[disabled]{opacity:.45;cursor:not-allowed;}
.tk-item-add .tk-item-add-ico{display:inline-grid;place-items:center;} .tk-item-add .tk-item-add-ico svg{width:16px;height:16px;}
.tk-item-add input{min-width:0;}   /* v1.4.10.363: or its placeholder sets the row's width and the popup overflows a phone */
.tk-item-add .btn.xs{flex:none;} .tk-item-add input:placeholder-shown ~ .btn.xs{opacity:.55;}
.tk-item-hint{padding:2px 6px 0;font-size:12px;}
.tk-menu-head{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);padding:6px 10px 4px;}
.tk-item-who-menu{max-height:360px;overflow-y:auto;min-width:240px;} .tk-item-who-menu button.on{background:var(--accent-glow);color:var(--brand-blue);}
.tk-tp-listhost{position:static;}
@media (max-width:760px){
  .tk-who-add,.tk-item-who,.tk-who-chip{min-height:40px;} .tk-who-chip .tk-mini{width:32px;height:32px;}
  .tk-who-menu{position:fixed;left:12px;right:12px;top:auto;bottom:12px;width:auto;max-height:60dvh;}
  .tk-item-add .btn.xs{min-height:40px;}
}

/* ── the ticket detail hero (v1.4.10.295) ── */
.tkd-head.tkd-hero{padding:0;background:var(--surface-2);overflow:hidden;}
.tkd-hero .tkd-hero-top{position:relative;isolation:isolate;padding:18px 22px 14px;color:#fff;
  background:linear-gradient(115deg, color-mix(in srgb, var(--tkd-p,var(--bc-blue-v1)) 70%, #0B1B3A) 0%, color-mix(in srgb, var(--tkd-p,var(--bc-blue-v1)) 55%, #1E3A8A) 42%, #4C2AB8 78%, #6D33E0 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14);}
.tkd-hero .tkd-hero-top::before{content:"";position:absolute;inset:0;z-index:-1;background-image:radial-gradient(rgba(255,255,255,.16) 1px, transparent 1.4px);background-size:22px 22px;opacity:.5;
  -webkit-mask-image:linear-gradient(95deg,#000,transparent 70%);mask-image:linear-gradient(95deg,#000,transparent 70%);}
.tkd-hero .tkd-hero-top::after{content:"";position:absolute;z-index:-1;right:-80px;top:-120px;width:300px;height:300px;background:radial-gradient(circle at center, rgba(167,139,250,.5), rgba(167,139,250,0) 64%);}
.tkd-hero .tkd-pstripe{display:none;}
.tkd-hero .tkd-pchip{box-shadow:0 8px 18px -8px rgba(0,0,0,.55), inset 0 1px 0 rgba(255,255,255,.28);border:1px solid rgba(255,255,255,.22);}
.tkd-hero .tkd-ref{color:rgba(255,255,255,.82);}
.tkd-hero .tkd-statepill{background:rgba(255,255,255,.14);color:#fff;border:1px solid rgba(255,255,255,.24);display:inline-flex;align-items:center;gap:6px;}
.tkd-hero .tkd-st::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--sc,#fff);box-shadow:0 0 8px var(--sc,#fff);flex:none;}
.tkd-hero .tkd-statepill.err{background:rgba(251,113,133,.28);border-color:rgba(251,113,133,.5);} .tkd-hero .tkd-statepill.muted{background:rgba(255,255,255,.10);}
.tkd-hero .tkd-statepill.blue{background:rgba(255,255,255,.14);color:#fff;}
.tkd-hero h3{color:#fff;text-shadow:0 1px 0 rgba(0,0,0,.18);}
.tkd-hero .tkd-subjrow h3.editable:hover{background:rgba(255,255,255,.12);box-shadow:inset 0 0 0 1px rgba(255,255,255,.25);}
.tkd-hero .tkd-subj-edit{color:rgba(255,255,255,.7);} .tkd-hero .tkd-subj-edit:hover{color:#fff;background:rgba(255,255,255,.14);}
.tkd-hero .tkd-subj-input{background:rgba(255,255,255,.96);color:var(--text);}
.tkd-hero .tkd-sub{color:rgba(255,255,255,.80);} .tkd-hero .tkd-sub a{color:#fff;text-decoration:underline;text-decoration-color:rgba(255,255,255,.45);text-underline-offset:2px;}
.tkd-hero .tkd-loc-sep,.tkd-hero .tkd-sub-sep{color:rgba(255,255,255,.55);} .tkd-hero .tkd-opened b{color:#fff;}
.tkd-hero .tkd-row1 .close{color:#fff;background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.22);} .tkd-hero .tkd-row1 .close:hover{background:rgba(255,255,255,.26);}
.tkd-hero-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px;}
.tkd-hero-chips .ph-chip{padding:6px 11px;border-radius:6px;} .tkd-hero-chips .ph-chip .ph-cv{font-size:15px;display:inline-flex;align-items:center;gap:6px;}
.tkd-hc-av{width:20px;height:20px;border-radius:50%;display:inline-grid;place-items:center;font-size:10px;font-weight:700;color:#fff;font-family:var(--font-body);}   /* v1.4.10.473: 10px initials take the badge weight, 700 (was 600) */
.tkd-hero .tkd-actionbar{margin:0;padding:10px 22px 12px;background:var(--surface-2);border-top:1px solid var(--line);}
@media(max-width:760px){
  .tkd-hero .tkd-hero-top{padding:12px 14px 10px;}
  .tkd-hero-chips{display:none;}   /* the phone head budget (v203: ≤34% of 664px) — the facts live in the cards below */
  .tkd-hero .tkd-actionbar{padding:8px 14px 10px;}
}

/* ═══════════════════════════════════════════════════════════════════════════
   v1.4.10.297 — maintenance WHO picker + searchable Where, task Where card,
   profile pictures on the ticket Assignment card / hero chip.
   ═══════════════════════════════════════════════════════════════════════ */
/* Profile pictures in avatar slots that used to be initials-only. The
   caller's class (.tkd-hc-av, .tkx-avatar, .tk-av) keeps its size; the image
   fills the circle. */
.u-av.has-pic{background:var(--surface-3);overflow:hidden;padding:0;}
.u-av.has-pic img,.tk-av.pic img{width:100%;height:100%;object-fit:cover;display:block;border-radius:50%;}
.tk-av.pic{background:var(--surface-3);overflow:hidden;}
.tkd-hc-av.u-av{width:20px;height:20px;}
.tkt-fact.who .u-av{flex:none;}
/* v1.4.10.473: the edit-mode assignee spans its row and the select takes what the avatar leaves. The (1,2,0)
   #tkd-props-card .ex-row .ex-sel{width:100%;flex:0 0 auto} beat .tkt-asg-edit .ex-sel, so the select was the row's full
   width AFTER the 26px avatar: it ran 34px past the row and the card's overflow cut its end and arrow */
.tkt-asg-edit{display:inline-flex;align-items:center;gap:8px;min-width:0;width:100%;}
.tkt-asg-edit .u-av{flex:none;} #tkd-props-card .tkt-asg-edit .ex-sel{min-width:0;width:auto;flex:1 1 0;}
/* v1.4.10.473: the client's plain name sits centred on its avatar (#tkd-props-card .ex-v's flex-start set it 4px high) and
   breaks inside its half of the card rather than overrunning it */
#tkd-props-card .tkt-asg-edit > .ex-v{align-self:center;min-width:0;overflow-wrap:anywhere;}
/* Maintenance — who is on the job (job view hero) */
.mtv-who{display:inline-flex;align-items:center;gap:6px;}
.mtv-who .u-av{flex:none;} .mtv-who.all{color:var(--brand-purple);font-weight:600;} .mtv-who.all svg{width:13px;height:13px;}
.mtv-avs{display:inline-flex;align-items:center;} .mtv-avs .u-av{margin-left:-6px;border:2px solid var(--surface);} .mtv-avs .u-av:first-child{margin-left:0;}
.mtv-av-more{display:inline-grid;place-items:center;width:20px;height:20px;border-radius:50%;background:var(--surface-3);color:var(--text-mute);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;margin-left:-6px;border:2px solid var(--surface);}
/* Maintenance editor — the WHO picker in step 5 */
.me-who .tk-who{position:relative;}
.me-who.me-who-nosite .tk-who-add{opacity:.55;pointer-events:none;}
.me-who .tk-who-menu{max-height:320px;overflow-y:auto;}
.me-astroom svg{width:13px;height:13px;vertical-align:-2px;margin-right:3px;}
/* Tasks — where a task is */
.tk-chip.where{color:#0F766E;background:#F0FDFA;gap:5px;} .tk-chip.where b{font-weight:700;} .tk-chip.where span{font-weight:600;}
.tk-where-v{display:flex;flex-wrap:wrap;gap:6px 14px;align-items:center;}
.tk-where-room{display:inline-flex;align-items:center;gap:5px;} .tk-where-room svg{width:13px;height:13px;color:var(--text-mute);}
.tk-where-v .tk-link small{font-size:11px;color:var(--text-mute);font-weight:400;margin-left:4px;}
.tk-where-edit .fu-lb:first-child{margin-top:0;}
.tk-where-edit .tk-tp{position:relative;}
.tk-ap-sel{border-color:#99F6E4;background:#F0FDFA;color:#0F766E;} .tk-ap-sel svg{width:14px;height:14px;flex:none;}
.tk-ap-row .tk-tp-ref{color:#0F766E;font-weight:700;}
.tk-side-sel.tk-room-sel{width:100%;}
.tk-form .avsel{display:block;width:100%;}
@media (max-width:700px){ .tk-where-v{gap:6px 10px;} }

/* ══════════════════════════════════════════════════════════════════════════
   v1.4.10.298 — the TASK VIEW as a ticket-shaped modal, the maintenance job
   HERO, the two-column maintenance editor, checklist edit mode, the New task
   side cards, the dashboard "Your work" lanes.
   ══════════════════════════════════════════════════════════════════════════ */
/* The task / job view lives INSIDE a wrapper (#tk-drawer.tk-view) in the
   modal-tkt shell, so the ticket's `#modal-inner.modal-tkt > …` flex rules
   are restated for the wrapper. */
#modal-inner.modal-tkt > .tk-view{display:flex;flex-direction:column;flex:1;min-height:0;}
.tk-view > .tkd-head{flex-shrink:0;}
.tk-view > .tkd-body{flex:1;min-height:0;position:relative;}
.tk-view .tkd-body.tkv-body{grid-template-columns:1fr 340px;}
@media (min-width:921px){ .tk-view:not(.mtv-view) .tkd-body.tkv-body{grid-template-columns:minmax(0,1fr) 420px;} }   /* v1.4.10.473: the task's side rail as wide as its pickers need (at 340px the ticket search had 224px for a 301px placeholder); the maintenance job view keeps 340 */
.tk-view .tkd-side{padding:16px;}
.tkv-main{padding:18px 22px 22px;}
.tkv-hero .tkv-pchip{font-size:0;} .tkv-hero .tkv-pchip svg,.mtv-pchip svg{width:22px;height:22px;color:#fff;}
.tkv-hero .tk-dr-title,.tkd-hero .mtv-title{color:#fff;font-size:20px;font-weight:600;line-height:1.3;letter-spacing:-.024em;margin:4px 0 0;padding:2px 6px;margin-left:-6px;border-radius:5px;outline:none;text-shadow:0 1px 0 rgba(0,0,0,.18);}
.tkv-hero .tk-dr-title[contenteditable]:hover{background:rgba(255,255,255,.10);}
.tkv-hero .tk-dr-title[contenteditable]:focus{background:rgba(255,255,255,.96);color:var(--text);text-shadow:none;box-shadow:0 0 0 3px rgba(255,255,255,.35);}
.tk-view.done .tk-dr-title{text-decoration:line-through;opacity:.8;}
.tkd-hero .tkd-cr-asset a,.tkd-hero .tkd-cr-site a{cursor:pointer;}
.tkd-hero .tkv-list{padding-left:7px;} .tkd-hero .tkv-list i{width:8px;height:8px;border-radius:50%;display:inline-block;}
.tkd-hero .tkd-refrow .tkv-list{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;} .tkd-hero .tkd-refrow .tkv-list i{margin-right:6px;vertical-align:0;}   /* v1.4.10.473: a long list name ends in an ellipsis inside the hero (on a phone it ran 276px past the head and was cut) */
.tkd-hero-chips .tk-avs{display:inline-flex;} .tkd-hero-chips .tk-av{width:20px;height:20px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;border:1.5px solid rgba(255,255,255,.7);} .tkd-hero-chips .tk-avs .tk-av+.tk-av{margin-left:-6px;}   /* v1.4.10.473: a 20px avatar's 10px initials take the badge look, 10/700 uppercase .04em, like the ticket hero's (were 10/600) */
.tkd-hero-chips .tk-av.pic img{width:100%;height:100%;object-fit:cover;border-radius:50%;}
.tkd-hero-chips .tk-av.all{background:rgba(255,255,255,.22);}
.tkd-hero .mtv-avs.hero{display:inline-flex;} .tkd-hero .mtv-avs.hero .u-av{border:1.5px solid rgba(255,255,255,.7);} .tkd-hero .mtv-avs.hero .u-av+.u-av{margin-left:-6px;}
.tkv-actionbar .tkd-ctl select{min-width:0;}
.tkv-actionbar .tkd-ctl > select.tk-status-sel{max-width:300px;}   /* v1.4.10.473: a site's own status names run longer than the ticket's; 170px cut "Waiting on client approval" short, 260px "In progress — waiting on vendor parts" */
@media (hover:hover){ .tk-item > .tk-check.sm{width:24px;height:24px;} .tk-item > .tk-check.sm svg{width:13px;height:13px;} .tk-item > .tk-mini{width:24px;height:24px;} }   /* v1.4.10.473: a checklist row's tick, avatar and edit/remove buttons all 24px (were 20/24/26) */
.tkd-actionbar .tkv-link{margin-left:auto;}
/* the main column sections */
.tkv-sec{margin-top:18px;padding-top:16px;border-top:1px solid var(--line);} .tkv-sec.first{margin-top:0;padding-top:0;border-top:0;}
.tkv-sec>label{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin-bottom:8px;}
.tkv-sec>label svg{width:14px;height:14px;opacity:.7;}
.tkv-empty{padding:6px 2px;}
.tk-view .tk-dr-banner{margin-bottom:14px;}
.tk-view .tk-dr-foot{margin-top:18px;padding-top:12px;border-top:1px solid var(--line);}
/* side rail cards */
.tkv-card .sbx-head .sx-ico{background:var(--accent-glow);color:var(--brand-blue);} .tkv-card .sbx-head .sx-ico svg{width:13px;height:13px;}
.tkv-card .sbx-head h5{display:flex;align-items:center;gap:7px;}
.tkv-card .sbx-body{padding:10px 14px 12px;}
.tkv-fact{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 0;border-bottom:1px solid var(--line);font-size:12px;min-height:34px;}
.tkv-fact:last-child{border-bottom:0;}
.tkv-fk{font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:600;color:var(--text-mute);flex:0 0 auto;}
.tkv-fv{min-width:0;flex:1;display:flex;justify-content:flex-end;align-items:center;gap:6px;font-weight:600;text-align:right;}
.tkv-fv .ex-sel,.tkv-fv .tk-inline-sel{max-width:100%;font-size:13px;}
.tkv-fv .tk-due-btn{margin:0;} .tkv-fv .tk-prio-pick{justify-content:flex-end;}
.tkv-card .tk-who-chips{min-height:0;}
.tkv-card .tk-where .tk-where-row{display:grid;grid-template-columns:minmax(0,1fr);align-items:center;gap:5px;padding:6px 0;border-bottom:1px solid var(--line);}   /* v1.4.10.473: label above its control, as in New task (beside it, the asset search had 232px for a 305px placeholder) */
.tkv-card .tk-where .tk-where-row:last-of-type{border-bottom:0;}
.tk-where-k{display:inline-flex;align-items:center;gap:5px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:600;color:var(--text-mute);} .tk-where-k svg{width:12px;height:12px;}
.tk-where-c{min-width:0;} .tk-where-c .ex-sel{width:100%;}
.tk-where-hint{margin-top:6px;font-size:12px;}
.tk-where-v{display:flex;flex-direction:column;gap:6px;padding:6px 0 0;} .tk-where-room{display:inline-flex;align-items:center;gap:6px;font-weight:600;font-size:13px;} .tk-where-room svg{width:13px;height:13px;color:var(--text-mute);}
.tkv-astbtn{display:flex;align-items:center;gap:10px;width:100%;border:1px solid var(--line);background:var(--surface);border-radius:6px;padding:9px 10px;font:inherit;text-align:left;cursor:pointer;color:var(--text);}
.tkv-astbtn:hover{border-color:var(--brand-blue);background:var(--accent-glow);}
.tkv-ast-ico{width:34px;height:34px;border-radius:6px;background:var(--surface-3);display:inline-flex;align-items:center;justify-content:center;color:var(--text-mute);flex:none;}
.tkv-ast-m{flex:1;min-width:0;display:flex;flex-direction:column;} .tkv-ast-m b{font-size:13px;} .tkv-ast-m .device-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* the tk-menu (more / item people) must clear the modal */
.tk-menu{z-index:1200;}
.tk-item-who-menu button{display:flex;align-items:center;gap:8px;} .tk-item-who-menu button .tk-who-tick{margin-right:2px;} .tk-item-who-menu button.on .tk-who-tick{background:var(--brand-blue);border-color:var(--brand-blue);} .tk-item-who-menu button.on .tk-who-tick svg{opacity:1;}
.tk-item-who-menu .tk-menu-head{display:flex;justify-content:space-between;gap:8px;align-items:baseline;}
/* checklist rows */
.tk-item .tk-item-who{display:inline-flex;align-items:center;border:0;background:transparent;padding:0;cursor:pointer;border-radius:999px;} .tk-item .tk-item-who .tk-avs{display:inline-flex;} .tk-item .tk-item-who .tk-avs .tk-av+.tk-av{margin-left:-6px;}
.tk-item .tk-item-edit{opacity:0;} .tk-item:hover .tk-item-edit{opacity:1;}
.tk-item-editing{background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:10px;align-items:flex-start;}
.tk-item-editing:hover{background:var(--surface-2);}
.tk-item-form{display:flex;flex-direction:column;gap:6px;flex:1;min-width:0;}
.tk-item-in{width:100%;border:1px solid var(--line);border-radius:6px;padding:7px 9px;font:inherit;font-size:13px;background:var(--surface);color:var(--text);}
.tk-item-in:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.tk-item-lb{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin-top:4px;}
.tk-item-form-acts{display:flex;gap:6px;margin-top:4px;}
/* New task side rail cards */
.tkn-card{border:1px solid var(--line);border-radius:7px;background:var(--surface);margin-bottom:10px;overflow:visible;}
.tkn-card-h{display:flex;align-items:center;gap:8px;padding:9px 12px;border-bottom:1px solid var(--line);}
.tkn-card-h .sx-ico{width:22px;height:22px;border-radius:6px;background:var(--accent-glow);color:var(--brand-blue);display:inline-flex;align-items:center;justify-content:center;flex:none;} .tkn-card-h .sx-ico svg{width:12px;height:12px;}
.tkn-card-h h5{margin:0;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;} .tkn-card-h .device-meta{margin-left:auto;font-size:11px;}
.tkn-card-b{padding:10px 12px 12px;} .tkn-card-b .fu-lb:first-child{margin-top:0;}
.tkn-card-b .tk-where .tk-where-row{display:grid;grid-template-columns:minmax(0,1fr);align-items:center;gap:5px;padding:5px 0;}   /* v1.4.10.473: label above its control, as every other field in the form (beside it, the asset search had 192px for a 305px placeholder) */
.tk-new-side{background:transparent;padding:0;}
/* form heads (New task / New maintenance job) */
.modal-head.fe-head{align-items:center;gap:12px;}
.fe-ico{width:38px;height:38px;border-radius:6px;background:linear-gradient(135deg,var(--brand-blue),var(--brand-purple));color:#fff;display:inline-flex;align-items:center;justify-content:center;flex:none;box-shadow:var(--shadow-sm);} .fe-ico svg{width:18px;height:18px;}
.fe-ht{flex:1;min-width:0;} .fe-ht h3{margin:0;} .fe-ht p{margin:2px 0 0;font-size:12px;color:var(--text-mute);line-height:1.4;}
/* the two-column maintenance editor */
#modal-inner.modal-wide.me-wide{max-width:1080px;}
.me-cols{display:grid;grid-template-columns:1fr 340px;gap:16px;align-items:start;}
.me-side{position:sticky;top:0;}
.me-side .me-step{background:var(--surface-2);}
.me-step-n.ico{display:inline-flex;align-items:center;justify-content:center;} .me-step-n.ico svg{width:14px;height:14px;}
.me-notes{margin-top:2px;}
.me-side .grid-2{grid-template-columns:1fr;}
@media(max-width:920px){ .me-cols{grid-template-columns:1fr;} .me-side{position:static;} .tk-view .tkd-body.tkv-body{grid-template-columns:1fr;} }
/* maintenance job view: people card */
.mtv-people{display:flex;flex-direction:column;gap:6px;} .mtv-person{display:flex;align-items:center;gap:9px;font-weight:600;font-size:13px;}
.mtv-who-card .mtv-who.all{display:inline-flex;align-items:center;gap:6px;font-weight:700;color:var(--brand-purple);margin-bottom:4px;}
/* dashboard: Your work */
.dyw .panel-head h3{display:flex;align-items:center;gap:8px;} .dyw .panel-head h3 svg{width:16px;height:16px;color:var(--brand-blue);}
.dyw-pills{display:flex;gap:6px;flex-wrap:wrap;}
.dyw-grid{display:grid;gap:14px;padding:14px 16px 4px;}
.dyw-grid.n2{grid-template-columns:1fr 1fr;} .dyw-grid.n3{grid-template-columns:1.15fr 1.15fr 1fr;}
@media(max-width:1180px){ .dyw-grid.n3{grid-template-columns:1fr 1fr;} .dyw-grid.n3 .dyw-lane.items{grid-column:1/-1;} }
@media(max-width:760px){ .dyw-grid.n2,.dyw-grid.n3{grid-template-columns:1fr;} .dyw-grid.n3 .dyw-lane.items{grid-column:auto;} }
.dyw-lane{border:1px solid var(--line);border-radius:7px;background:var(--surface);overflow:hidden;min-width:0;}
.dyw-lane-h{display:flex;align-items:center;gap:8px;padding:9px 12px;border-bottom:1px solid var(--line);background:var(--surface-2);}
.dyw-lane-h h4{margin:0;font-size:13px;font-weight:600;} .dyw-lane-h .btn{margin-left:auto;}
.dyw-lane-ico{width:22px;height:22px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;background:var(--accent-glow);color:var(--brand-blue);flex:none;} .dyw-lane-ico svg{width:12px;height:12px;}
.dyw-lane.maint .dyw-lane-ico{background:#FEF3C7;color:#B45309;} .dyw-lane.items .dyw-lane-ico{background:#DCFCE7;color:#15803D;}
.dyw-n{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-mute);background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:1px 7px;}
.dyw-lane-b{padding:6px;} .dyw-empty{padding:8px;} .dyw-more{text-align:center;padding:6px;}
.dyw-row{display:flex;align-items:flex-start;gap:10px;padding:9px 10px;border-radius:6px;cursor:pointer;border-left:3px solid transparent;}
.dyw-row:hover{background:var(--surface-2);} .dyw-row+.dyw-row{margin-top:2px;}
.dyw-row.dyw-job,.dyw-row.dyw-task{border-left-color:var(--c,var(--line));}
/* v1.4.10.484: an overdue row is no longer painted red edge to edge (four red rows read as one alarm); its date box says
   Overdue in red, as the maintenance rows' does, and the row keeps the panel's white */
.dyw-row.over:hover{background:var(--surface-2);}
.dyw-main{flex:1;min-width:0;}
.dyw-side{flex:none;display:flex;align-items:center;gap:6px;margin-top:3px;max-width:34%;}
.dyw-side .dyw-tag.all{white-space:nowrap;}
.dyw-when.none{color:var(--text-dim);} .dyw-when.none .d{font-weight:600;}
.dyw-flag{display:inline-flex;align-items:center;vertical-align:-1px;margin-right:5px;color:var(--c,var(--err));} .dyw-flag svg{width:12px;height:12px;}
.dyw-row.dyw-task .dyw-when{margin-top:0;}
.dyw-row.dyw-task .dyw-check{margin-top:9px;}   /* centred on the 42px date box */
.dyw-t{font-weight:600;font-size:13px;line-height:1.35;} .dyw-s{font-size:12px;color:var(--text-mute);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .dyw-s .over{color:var(--err);font-weight:600;}
.dyw-type{display:inline-block;margin-right:6px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--c);background:color-mix(in srgb,var(--c) 14%,transparent);}
.dyw-when{flex:none;width:52px;text-align:center;border-radius:6px;padding:6px 2px;background:var(--surface-2);border:1px solid var(--line);}
.dyw-when .d{font-size:12px;font-weight:700;letter-spacing:-.02em;line-height:1.1;} .dyw-when .t{font-size:11px;margin-top:1px;color:var(--text-mute);} .dyw-when.over .t,.dyw-when.today .t,.dyw-when.busy .t{color:inherit;}   /* v1.4.10.473: the date box of the follow-ups and maintenance lists beside it (day 12/700, time a caption 11): it was a 10px badge over a mono time, 46px wide, and "30 SEPT" did not fit */
.dyw-when.over{background:#FEE2E2;border-color:#FCA5A5;color:#B91C1C;} .dyw-when.today{background:#FEF3C7;border-color:#FCD34D;color:#92400E;} .dyw-when.busy{background:#DBEAFE;border-color:#93C5FD;color:var(--bc-blue-v1-deep);}
.dyw-tags{display:flex;flex-wrap:wrap;gap:5px;align-items:center;margin-top:5px;}
.dyw-tag{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;padding:2px 7px;border-radius:999px;background:var(--surface-2);border:1px solid var(--line);color:var(--text-mute);} .dyw-tag svg{width:11px;height:11px;}
.dyw-tag.over{background:#FEE2E2;border-color:#FCA5A5;color:#B91C1C;} .dyw-tag.today{background:#FEF3C7;border-color:#FCD34D;color:#92400E;} .dyw-tag.busy{background:#DBEAFE;border-color:#93C5FD;color:var(--bc-blue-v1-deep);}
.dyw-tag.all{background:#F5F3FF;border-color:#DDD6FE;color:var(--brand-purple);} .dyw-tag.prio{color:var(--c);border-color:color-mix(in srgb,var(--c) 40%,transparent);background:color-mix(in srgb,var(--c) 10%,transparent);text-transform:capitalize;}
.dyw-avs{display:inline-flex;align-items:center;} .dyw-avs .u-av{border:1.5px solid var(--surface);} .dyw-avs .u-av+.u-av{margin-left:-6px;} .dyw-av-more{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-mute);margin-left:4px;}   /* v1.4.10.473: the lane count and the +N wear the badge look (10, uppercase, .04em), as a 22px avatar's 10px initials do (userAv); 10px is for uppercase badges only */
.dyw-acts{display:flex;flex-direction:column;gap:4px;flex:none;}
.dyw-check{margin-top:1px;} .dyw-row.dyw-task .dyw-check{width:24px;height:24px;}
.dyw-prog{display:flex;align-items:center;gap:8px;margin-top:5px;} .dyw-bar{flex:1;height:5px;border-radius:3px;background:var(--surface-3);overflow:hidden;max-width:180px;} .dyw-bar div{height:100%;background:var(--ok);border-radius:3px;} .dyw-prog span{font-size:11px;font-weight:700;color:var(--text-mute);}
.dyw-other{padding:10px 16px 12px;} .dyw-other .dyw-lane-h{border:1px solid var(--line);border-radius:6px;margin-bottom:6px;}
.dfu-sub .dyw-avs{vertical-align:middle;} .dfu-sub .dyw-avs .u-av{width:22px;height:22px;}   /* v1.4.10.473: 22px like the Your work stacks; at 18px two initials were clipped */
/* follow-up card: profile pictures */
.fu-av.has-pic{overflow:hidden;background:var(--surface-3);} .fu-av.has-pic img{width:100%;height:100%;object-fit:cover;border-radius:50%;}
@media(max-width:760px){
  .tkv-main{padding:14px 14px 18px;}
  .tk-view .tkd-side{padding:12px;}
}
@media(max-width:760px){
  /* the phone head budget (v203: ≤34% of 664px) for the task / job heroes */
  .tkv-hero .tk-dr-title,.tkd-hero .mtv-title{font-size:18px;margin-top:2px;}
  .tkv-hero .tkd-opened,.mtv-hero2 .tkd-opened{display:none;}
  .tkv-hero .tkd-sub,.mtv-hero2 .tkd-sub{margin-top:3px;}
  .tkv-hero .tkd-pchip,.mtv-hero2 .tkd-pchip{width:34px;height:34px;} .tkv-hero .tkv-pchip svg,.mtv-pchip svg{width:17px;height:17px;}
  .tkv-actionbar .tkd-ctl > span{display:none;}
}
/* the task view's main column carries .tk-dr-body for the older batteries — its
   old flex/padding rules must not apply inside the ticket-shaped grid/column */
.tk-view .tkd-main.tk-dr-body{padding:18px 22px 22px;}
@media(max-width:920px){ .tk-view .tkd-main.tk-dr-body{flex:none;overflow:visible;} }
@media(max-width:760px){ .tk-view .tkd-main.tk-dr-body{padding:14px 14px 18px;} }

/* ═══ v1.4.10.299 ═══ */
/* The ticket / task / job hero: the decorative glow (::after, 300px, pinned
   -120px above the head) spilled 180px DOWN over the action bar and, being a
   positioned element painted after the bar, swallowed every click on the
   right-hand third of it — Delete, PDF, the asset link. Jay: "when I click
   the delete button it does nothing". Clip the head and let nothing
   decorative take a pointer. */
.tkd-hero .tkd-hero-top{overflow:hidden;}
.tkd-hero .tkd-hero-top::before,.tkd-hero .tkd-hero-top::after{pointer-events:none;}
/* Maintenance editor v3 — three cards left, two right, one hint per card. */
.me-v3 .site-ed-head{padding:16px 22px;}
.me-v3 .site-ed-head p{margin-top:2px;}
.me-v3 .site-ed-body{padding:16px 22px 12px;max-height:min(72vh,820px);}
.me-v3 .me-card{padding:14px 16px 14px;margin-bottom:12px;}
.me-v3 .me-step-head{align-items:center;margin-bottom:12px;}
.me-v3 .me-step-t{font-size:13px;font-weight:600;}
.me-v3 .field{margin-bottom:12px;}
/* v1.4.10.473: the maintenance editor's fields read like every other editor's — label 12/500 (was 11/600 uppercase,
   the one editor of eight in capitals), its "(optional)" the 11/400 caption every field label's hint is (.field label
   .device-meta; it had been made 12/500, part of the label, here alone), and the job title a field at 13/400 like the
   new ticket's subject (was 15/600). The title box takes the field's own padding too: its 10px 12px left it 42 / 47 on a
   phone beside the 44 / 49 fields under it. */
.me-v3 .field label{font-size:12px;color:var(--text-mute);font-weight:500;margin-bottom:5px;display:block;}
.me-v3 input{text-overflow:ellipsis;}   /* v1.4.10.473: a placeholder wider than a phone's field ("e.g. Quarterly projector lamp & filter service" is 354px of 16px text in a 254px field) ends in an ellipsis instead of being sliced */
.me-inline{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap;}
.me-inline .field{margin-bottom:0;}
.me-inline .field:first-child{flex:1 1 560px;min-width:0;}
.me-type-row{display:flex;flex-wrap:wrap;gap:6px;}
.me-type-pill{appearance:none;display:inline-flex;align-items:center;gap:7px;border:1px solid var(--line);background:var(--surface);color:var(--text);
  font:inherit;font-size:12px;font-weight:500;padding:6px 11px 6px 9px;border-radius:999px;cursor:pointer;min-height:32px;transition:border-color .13s,background .13s,box-shadow .13s;}
.me-type-pill .me-type-dot{width:9px;height:9px;border-radius:50%;background:var(--c);flex:none;}
.me-type-pill:hover{border-color:var(--c);}
.me-type-pill.on{border-color:var(--c);background:color-mix(in srgb,var(--c) 9%,var(--surface));box-shadow:0 0 0 1px var(--c) inset;}
.me-status-seg .seg-btn{min-height:28px;}
.me-where{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;}
.me-where .field{margin-bottom:10px;}
.me-files{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.me-files .dropzone{flex:1;min-width:220px;margin:0;}
.me-v3 .me-notes textarea{min-height:76px;}
.me-v3 .me-side .me-card{background:var(--surface-2);}
.me-v3 .me-durs{margin-top:0;}
.me-mode-seg{display:flex;margin-bottom:10px;} .me-mode-seg .seg-btn{flex:1;text-align:center;}
.me-v3 .me-who .tk-who{margin-top:2px;}
.me-v3 .fs-hint{margin-top:6px;}
@media(max-width:920px){ .me-where{grid-template-columns:1fr;} .me-inline{flex-direction:column;gap:12px;} .me-inline .field:first-child{flex:0 0 auto;} }
.me-astpickbtn b{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:46%;}
.me-astpickbtn{white-space:nowrap;overflow:hidden;} .me-astpickbtn .device-meta{overflow:hidden;text-overflow:ellipsis;}
@media(max-width:700px){ .me-type-pill{min-height:40px;} .me-status-seg .seg-btn{min-height:40px;} .me-v3 .site-ed-body{max-height:none;}
  /* v1.4.10.473: the status switch keeps its four segments on one row across the field ("cancelled" wrapped onto a row of its own) */
  .me-status-seg{display:flex;flex-wrap:nowrap;} .me-status-seg .seg-btn{flex:1 1 auto;justify-content:center;padding-left:6px;padding-right:6px;}
  .me-v3 .site-ed-body{padding-left:14px;padding-right:14px;} .me-v3 .me-card{padding:12px;} }   /* v1.4.10.473: 16px more width for the fields on a phone (22px gutters inside 16px card padding) */
/* Tasks — the list picker's inline "new list" box */
.tk-listsel{min-width:0;} .tk-listsel select{width:100%;}
.tk-listnew[hidden]{display:none;}
.tk-listnew{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px;padding:8px;border:1px dashed var(--line);border-radius:6px;background:var(--surface-2);}
.tk-listnew input{flex:1 1 140px;min-width:0;}
.tk-listnew .device-meta{flex-basis:100%;}
.tk-listnew .device-meta:empty{display:none;}
@media(max-width:700px){ .tk-listnew input,.tk-listnew .btn{min-height:40px;} }
/* Support — tickets the monitor raised are coloured apart from people's tickets */
.tkx-table tr.tkx-auto > td{background:#F0FDFA;}
.tkx-table tr.tkx-auto > td:first-child{box-shadow:inset 3px 0 0 0 #0D9488;}
.tkx-table tr.tkx-auto:hover > td{background:#CCFBF1;}
.tkx-table tr.tkx-auto.tkx-mine > td{background:linear-gradient(90deg,var(--accent-glow,rgba(var(--bc-accent-rgb),.07)),#F0FDFA 40%);}
.pill.tkx-autoflag{background:#CCFBF1;color:#0F766E;border:1px solid #99F6E4;font-size:11px;padding:1px 6px;letter-spacing:0;display:inline-flex;align-items:center;gap:3px;vertical-align:middle;}
.pill.tkx-autoflag svg{width:10px;height:10px;}
.tkx-card.tkx-auto{background:#F0FDFA;border-color:#99F6E4;}
.tkx-card.tkx-auto .tc-ref{color:#0F766E;}
@media(max-width:760px){ .tkx-table tr.tkx-auto > td{background:#F0FDFA;} }

/* ═══ v1.4.10.300 — touch and phone fixes ═══════════════════════════════════
   1. Hover-revealed controls are INVISIBLE on a touch screen — there is no
      hover. The checklist item's edit / remove / who buttons sat at opacity:0
      until the pointer was over the row, so on an iPhone a checklist item
      could not be edited, re-assigned or removed at all. Same pattern on the
      dev-team message actions, the asset photo grid and the site photo tiles.
      Keyed on the device (hover:none), never on width, so desktop density is
      untouched. */
@media (hover:none){
  .tk-item .tk-mini,.tk-item .tk-item-edit,.tk-item-who,
  .dv-msg-bub .dv-msg-acts,.photo-cell .pc-actions,.svx-photo .svx-photo-acts,.ah-thumb.xl .ah-thumb-zoom{opacity:1;}
}
/* 2. The task modal's action bar at phone width: five controls in one
      no-wrap strip left the Status and Priority selects at 95px each, so
      "No status" read as "No stat". The Link button goes — "Copy link" is in
      the ⋯ More menu already — and the two selects share the freed width
      (measured 120px each). Stays ONE row: the v203 phone head budget
      (t/v298 M1, head ≤34% of 664px) leaves no room for a second. */
@media (max-width:520px){
  .tkd-hero .tkv-actionbar > .tkv-link{display:none;}
  .tkd-hero .tkv-actionbar > .tkd-ctl{flex:1 1 0;min-width:0;}
  .tkd-hero .tkv-actionbar > .tkd-ctl > select{width:100%;max-width:none;}
  /* v1.4.10.473: priority takes what its longest word needs (as in the ticket's bar) and status the rest:
     an even split showed 81px of "Waiting on client approval" beside a priority with 40px to spare */
  .tkd-hero .tkv-actionbar > .tkd-ctl.tkd-ctl-pri{flex:0 0 62px;}
  .tkd-hero .tkv-actionbar > .tkd-ctl.tkd-ctl-pri-w{flex-basis:92px;}
}
/* 3. The "＋ New list…" inline box (v299) has display:flex, which beats the
      [hidden] attribute — it showed permanently under the List select in the
      New task form and the task modal. Belt-and-braces alongside the rule at
      its definition. */
.tk-listnew[hidden]{display:none !important;}
/* 4. The round tick buttons (task rows, checklist items, the dashboard lanes,
      the wallboard) were stretched into 20×40 / 24×40 OVALS on a phone — the
      v248 device-keyed `button{min-height:40px}` floor met a 24px circle.
      Sized in BOTH axes here so they stay round and still meet a usable tap
      target. v304: 40px on rows, lanes and the dashboard (the v128 floor —
      t/v233.js caught the 32px circle on a dashboard with due tasks), 36px on
      the small checklist tick; both axes, so they stay round. */
@media (hover:none) and (pointer:coarse){
  .tk-check,.dyw-check,.dyw-row.dyw-task .dyw-check{width:40px;height:40px;min-height:40px;min-width:40px;}
  .tk-check svg{width:18px;height:18px;}
  .tk-check.sm{width:40px;height:40px;min-height:40px;min-width:40px;} .tk-check.sm svg{width:15px;height:15px;}
  .tk-check.big{width:40px;height:40px;min-height:40px;min-width:40px;}   /* v1.4.10.473: 40px, the tap floor, like every other tick (36px sat beside the 40px who / edit / remove buttons on a checklist row) */
}

/* ══ v1.4.10.301 — Ody Pi panel (js/19-ody-pi.js) ══════════════════════════ */
.opi .opi-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;margin-bottom:6px}
.opi .opi-ic{display:inline-flex;width:18px;height:18px;color:var(--brand-blue)}
.opi .opi-p{color:var(--text-mute);font-size:12px;line-height:1.6;margin:4px 0 10px}
.opi .opi-p.muted{font-size:11px}
.opi .opi-grid{margin-bottom:8px}
.opi .opi-kpis{display:flex;gap:6px;flex-wrap:wrap;margin:4px 0 10px}
.opi .opi-kpi{font-size:11px;color:var(--text-mute);border:1px solid var(--line);border-radius:999px;padding:3px 10px}
.opi .opi-kpi b{color:var(--text);font-size:12px}
.opi .opi-kpi.ok b{color:var(--ok)} .opi .opi-kpi.warn b{color:var(--warn)} .opi .opi-kpi.blue b{color:var(--brand-blue)}
.opi .opi-bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px}
.opi .opi-chips{display:flex;gap:4px;flex-wrap:wrap;margin-left:auto}
.opi .opi-chip{font-size:12px;font-weight:500;padding:4px 12px;border-radius:999px;border:1px solid var(--line);background:transparent;color:var(--text-mute);cursor:pointer}
.opi .opi-chip.on{background:var(--brand-blue);color:#fff;border-color:var(--brand-blue)}
.opi .opi-chip span{opacity:.75}
/* v1.4.10.473: the base table look is not scoped to .opi, so the "Wi-Fi seen by the Ody" popup's table (outside .opi) has it
   too: its headers drew as the browser's 14/700 */
.opi-tblwrap{overflow-x:auto;border:1px solid var(--line);border-radius:6px}
.opi-tbl{width:100%;border-collapse:collapse;font-size:13px;min-width:640px}
.opi-tbl th{text-align:left;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);padding:8px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
.opi-tbl td{padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
.opi-tbl tr:last-child td{border-bottom:0}
.opi-tbl code{font-size:12px}
.opi .opi-mac{text-transform:uppercase}
.opi .opi-svcs{max-width:220px}
.opi .opi-svc{display:inline-block;font-size:11px;padding:1px 6px;border-radius:6px;background:var(--surface-3,rgba(0,0,0,.05));margin:0 3px 3px 0}
.opi .opi-svc.muted{opacity:.6}
.opi .opi-acts{white-space:nowrap;text-align:right}
.opi .opi-acts .btn{margin-left:4px}
.opi .opi-empty{color:var(--text-mute);font-size:12px;padding:14px;border:1px dashed var(--line);border-radius:6px;text-align:center}
.opi .opi-cmds{margin-top:12px}
.opi-cmd{font-size:12px;padding:6px 0;border-bottom:1px dashed var(--line)}
.opi-cmd:last-child{border-bottom:0}
.opi-res{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;white-space:pre-wrap;word-break:break-all;background:var(--surface-3,rgba(0,0,0,.05));padding:6px 8px;border-radius:6px;margin-top:4px;color:var(--text)}
.opi-ctl .opi-ctl-sec{border-top:1px solid var(--line);padding:10px 0;display:flex;gap:6px;flex-wrap:wrap;align-items:flex-end}
.opi-ctl .opi-ctl-sec .lbl{width:100%;margin-bottom:2px}
.opi-ctl .opi-ctl-sec .field{margin:0}
.opi-ctl .opi-ctl-sec .field.inline{display:inline-flex;flex-direction:column}
.opi-ctl .opi-ctl-sec .grid-2{width:100%}
.opi-out{margin-top:10px;max-height:260px;overflow:auto}
.opi-setup ol{padding-left:20px;font-size:13px;line-height:1.6}
.opi-setup li{margin-bottom:8px}
@media (max-width:700px){
  .opi .opi-chips{margin-left:0}
  .opi .opi-acts{white-space:normal}
  .opi .opi-acts .btn{margin:0 4px 4px 0}
}

/* ── v1.4.10.303: asset Control tab (MIB-driven), model MIB manager, Ody facts ── */
.ctl-strip{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 14px;}
.ctl-strip .pill code{font-size:11px;}
/* v1.4.10.534: the one line under the strip when the device is offline and every Set / Read / command below is greyed */
.ctl-offline-note{display:flex;gap:10px;align-items:flex-start;margin:-4px 0 14px;padding:12px 14px;border-radius:10px;border:1px solid rgba(220,38,38,.3);background:rgba(220,38,38,.06);font-size:13px;line-height:1.55;color:var(--text);}
.ctl-offline-note .ctl-offline-ico{flex-shrink:0;display:inline-flex;width:16px;height:16px;margin-top:2px;color:var(--err);}
.ctl-offline-note .ctl-offline-ico svg{width:16px;height:16px;}
.ctl-offline-note b{color:var(--err);}
.ctl-panel{margin-bottom:14px;}
.ctl-panel .panel-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:12px 16px;}
.ctl-panel .panel-head h3{font-size:15px;font-weight:600;letter-spacing:-.012em;color:var(--text);margin:0;}   /* v1.4.10.473: a panel title, 15/600 like "Network interfaces" and the feature cards on the same tab (was an 11/600 uppercase label) */
.ctl-panel .panel-head .panel-sub{font-size:12px;color:var(--text-mute);margin-top:3px;}
.ctl-form{margin-bottom:6px;}
.ctl-search{margin:0 0 12px;}
.ctl-search input{width:100%;}
.ctl-tbl td{vertical-align:top;}
.ctl-tbl .ctl-name{min-width:200px;max-width:420px;}
.ctl-oid{font-size:11px;color:var(--text-mute);margin-top:2px;word-break:break-all;}
.ctl-oid code{font-size:11px;}
.ctl-desc{font-size:12px;color:var(--text-dim);margin-top:4px;line-height:1.45;max-width:520px;}
.ctl-input{min-width:200px;}
.ctl-input input,.ctl-input select{width:100%;max-width:260px;}
.ctl-idx{width:64px !important;margin-right:6px;display:inline-block;}
.ctl-acts{white-space:nowrap;text-align:right;}
.ctl-acts .ctl-idx{width:56px !important;}
.ctl-val{font-size:13px;min-width:120px;}
.ctl-mon{display:inline-flex;align-items:center;gap:6px;font-size:12px;cursor:pointer;min-height:40px;}
.ctl-more{padding:10px 16px;text-align:center;}
.ctl-mibs{display:flex;gap:8px;flex-wrap:wrap;}
.ctl-mib{display:inline-flex;gap:6px;align-items:center;padding:6px 10px;border:1px solid var(--line);border-radius:6px;font-size:12px;background:var(--surface-2,rgba(148,163,184,.06));}
.mibm-drop{border:2px dashed var(--line);border-radius:7px;padding:20px;text-align:center;cursor:pointer;transition:border-color .15s,background .15s;font-size:13px;}   /* v1.4.10.473: body 13 (read 14, the page default) */
.mibm-drop.over{border-color:var(--primary,var(--bc-blue-v1));background:rgba(var(--bc-accent-rgb),.06);}
.mibm-drop .device-meta{margin-top:6px;max-width:560px;margin-left:auto;margin-right:auto;}
.mibm-file{border:1px solid var(--line);border-radius:6px;padding:12px 14px;margin-top:10px;}
.mibm-fhead{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;}
.mibm-ftitle{min-width:200px;flex:1;font-size:13px;}   /* v1.4.10.473: a file's name is 13, like the library list's rows (read 14/700) */
.mibm-facts{display:flex;gap:6px;flex-wrap:wrap;}
.mibm-note{font-size:12px;color:var(--warn);margin-top:6px;line-height:1.45;}
.mibm-objs{margin-top:12px;}
.mibm-tools{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:8px;}
.mibm-tools input{flex:1;min-width:200px;}
.mibm-unres td{opacity:.6;}
.opi-factgrp{margin-top:12px;padding-top:10px;border-top:1px solid var(--line);}
.opi-factgrp > .lbl{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:6px;}
@media (max-width:700px){
  /* Phones: each MIB object becomes a stacked card — a 4-column table can't fit 390px. */
  .panel-body.flush table.ctl-tbl,table.ctl-tbl{min-width:0;}   /* the app-wide 680px flush-table floor does not apply to stacked cards */
  .ctl-tbl,.ctl-tbl tbody,.ctl-tbl tr,.ctl-tbl td{display:block;width:100%;box-sizing:border-box;}
  .ctl-tbl thead{display:none;}
  .ctl-tbl tr{border-bottom:1px solid var(--line);padding:6px 0;}
  .ctl-tbl td{padding:4px 12px;border:0;}
  .ctl-tbl .ctl-name{max-width:none;min-width:0;}
  .ctl-desc{max-width:none;}
  .ctl-input{min-width:0;}
  .ctl-input input,.ctl-input select{max-width:none;}
  .ctl-acts{white-space:normal;text-align:left;display:flex;gap:6px;flex-wrap:wrap;align-items:center;}
  .ctl-acts .btn,.mibm-facts .btn{min-height:40px;}
  .ctl-strip .pill{max-width:100%;overflow:hidden;text-overflow:ellipsis;}
  .ctl-panel .panel-head{padding:10px 12px;}
  .mibm-fhead{flex-direction:column;}
}

/* v1.4.10.305 — the site's Ody login, software and update on the Ody panel */
.opi-login,.opi-soft{border:1px solid var(--line);border-radius:6px;padding:10px 12px;margin:10px 0;background:var(--surface-2,rgba(0,0,0,.015));}
.opi-login-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px;font-size:13px;}
.opi-login-grid{display:flex;flex-direction:column;gap:6px;}
.opi-login-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.opi-login-row .lbl{min-width:72px;font-size:11px;font-weight:600;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;}
.opi-cred{font-size:14px;padding:6px 10px;border-radius:6px;background:var(--surface-3,rgba(0,0,0,.05));letter-spacing:.04em;word-break:break-all;}
.opi-cred.masked{letter-spacing:.12em;color:var(--text-mute);}
.opi-login-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-top:8px;}
.opi-cmdline{display:block;font-size:11px;white-space:pre-wrap;word-break:break-all;background:var(--surface-3,rgba(0,0,0,.05));padding:8px 10px;border-radius:6px;margin:4px 0 6px;}
@media (max-width:700px){ .opi-login-row .btn, .opi-login-foot .btn, .opi-soft .btn { min-height:40px; } .opi-login-row .lbl{min-width:100%;} }

/* ── v1.4.10.306 ── ready-to-deploy rows in the Validation queue, the removed-Ody notice, the MIB library ── */
tr.pend-match > td{background:color-mix(in srgb, var(--ok) 8%, transparent);}
tr.pend-match > td:first-child{box-shadow:inset 3px 0 0 var(--ok);}
.pend-match-strap{margin-top:4px;font-size:12px;color:var(--ok);display:flex;align-items:center;gap:4px;flex-wrap:wrap;}
.pend-match-strap svg{width:14px;height:14px;flex:none;}
.pend-match-box{display:flex;gap:10px;align-items:flex-start;margin-top:14px;padding:10px 12px;border:1px solid color-mix(in srgb, var(--ok) 45%, transparent);background:color-mix(in srgb, var(--ok) 8%, transparent);border-radius:6px;font-size:13px;line-height:1.55;}
.pend-match-ico{display:inline-flex;width:18px;height:18px;color:var(--ok);flex:none;margin-top:1px;}
.pend-match-ico svg{width:18px;height:18px;}
.opi-removed{margin:8px 0 10px;padding:10px 12px;border:1px solid color-mix(in srgb, var(--warn) 55%, transparent);background:color-mix(in srgb, var(--warn) 10%, transparent);border-radius:6px;font-size:13px;line-height:1.55;}
.opi-removed code{font-size:12px;}
.btn.ghost.danger{color:var(--err);}
.mibl-tbl td{vertical-align:top;}
.mibl-rule{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;color:var(--text-mute);word-break:break-all;}
.mibm-via{font-size:11px;font-weight:600;padding:1px 6px;border-radius:999px;border:1px solid var(--line);color:var(--text-mute);margin-left:6px;vertical-align:middle;}
.mibm-via.library{border-color:color-mix(in srgb, var(--brand-blue) 50%, transparent);color:var(--brand-blue);}
.mibm-via.shared{border-color:color-mix(in srgb, var(--ok) 50%, transparent);color:var(--ok);}
@media (hover:none) and (pointer:coarse){ #mibl .close, #mibm .close{ min-height:40px; min-width:40px; } }
@media (max-width:700px){ #mibl .close, #mibm .close{ min-height:40px; min-width:40px; } }

/* ── v1.4.10.307: WHAT THIS DEVICE OFFERS — the Control tab's feature cards ── */
.ctl-offer .panel-body{padding:12px 16px 14px;}
.ctl-chips{display:flex;flex-wrap:wrap;gap:8px;}
.ctl-chip{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid var(--border);border-radius:6px;background:var(--surface);cursor:pointer;font:inherit;font-size:12px;font-weight:500;color:var(--text);min-height:40px;text-align:left;transition:border-color .15s,box-shadow .15s;}   /* v1.4.10.473: a chip, 12/500 (it inherited the modal's 14/400); its title span stays 12/600 and its count 11/400 */
.ctl-chip:hover{border-color:var(--accent);box-shadow:0 1px 6px rgba(var(--bc-accent-rgb),.12);}
.ctl-chip.on{border-color:var(--accent);background:rgba(var(--bc-accent-rgb),.06);}
.ctl-chip svg{width:16px;height:16px;flex:none;color:var(--accent);}
.ctl-chip span{font-weight:600;font-size:12px;}
.ctl-chip small{color:var(--text-mute);font-size:11px;font-weight:400;}
.ctl-can{margin-top:12px;font-size:12px;color:var(--text);line-height:1.5;}
.ctl-feature .ctl-fhead{cursor:pointer;align-items:flex-start;flex-wrap:nowrap;}
.ctl-feature .ctl-fhead:hover{background:rgba(var(--bc-accent-rgb),.03);}
.ctl-fico{flex:none;width:34px;height:34px;border-radius:6px;background:rgba(var(--bc-accent-rgb),.09);color:var(--accent);display:flex;align-items:center;justify-content:center;}
.ctl-fico svg{width:18px;height:18px;}
.ctl-ftext{flex:1;min-width:0;}
.ctl-feature .ctl-fhead h3{text-transform:none;letter-spacing:-.012em;font-size:15px;font-weight:600;color:var(--text);display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;}
.ctl-fkind{font-size:11px;font-weight:500;color:var(--text-dim);}
.ctl-fmeta{font-size:12px;color:var(--text-dim);margin-top:4px;}
.ctl-facts{display:flex;gap:6px;flex:none;align-items:center;}
.ctl-feature .panel-body{padding:4px 16px 14px;}
.ctl-canlist{font-size:12px;margin:8px 0 10px;display:flex;flex-wrap:wrap;gap:6px;align-items:center;}
.ctl-sect{margin-top:12px;}
.ctl-sect-t{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:6px;}
.ctl-sect-t .device-meta{text-transform:none;letter-spacing:0;font-weight:500;}
.ctl-sect .ctl-desc{margin-top:2px;}
.ctl-twrap{overflow:auto;max-height:420px;border:1px solid var(--border);border-radius:6px;}
.ctl-grid th{position:sticky;top:0;background:var(--surface);z-index:1;font-size:11px;white-space:nowrap;}
.ctl-grid td{font-size:13px;white-space:nowrap;}
.ctl-tcell{display:flex;gap:6px;align-items:center;}
.ctl-tcell .btn.xs,.sh-set .btn.xs{min-height:32px;box-sizing:border-box;}   /* v1.4.10.473: a settable cell's Set button is as tall as the 32px picker beside it (was 25) */
.ctl-inline{min-width:90px;max-width:160px;padding:4px 6px;font-size:13px;height:32px;}
.ctl-tcols{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px;}
.ctl-col{font-size:12px;padding:3px 8px;border-radius:6px;background:var(--bg);border:1px solid var(--border);}
.ctl-col.w{border-color:var(--accent);color:var(--accent);}
.ctl-col small{color:var(--text-dim);font-size:11px;}
.ctl-alerts{display:flex;flex-wrap:wrap;gap:6px;}
.ctl-alert{font-size:12px;padding:3px 8px;border-radius:6px;background:rgba(245,158,11,.10);border:1px solid rgba(245,158,11,.35);}
.ctl-browse .panel-head h3{cursor:pointer;}
.mibl-seed{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:6px;margin-bottom:10px;font-size:12px;line-height:1.45;}
.mibl-seed.ok{background:rgba(22,163,74,.08);border:1px solid rgba(22,163,74,.3);}
.mibl-seed.bad{background:rgba(220,38,38,.07);border:1px solid rgba(220,38,38,.35);}
/* "Ody found it" — the asset's side of the Validation queue */
.am-found{border:1px solid rgba(22,163,74,.35);background:rgba(22,163,74,.05);}
.am-found-ico{width:36px;height:36px;border-radius:6px;background:rgba(22,163,74,.12);color:var(--ok);display:flex;align-items:center;justify-content:center;flex:none;}
.am-found-ico svg{width:18px;height:18px;}
.am-found-t{font-weight:600;font-size:13px;margin-bottom:2px;}
.am-found-s{font-size:12px;color:var(--text-mute);line-height:1.5;}
.ad-found-pill{margin-left:6px;cursor:default;}
@media (max-width:700px){
  .ctl-feature .ctl-fhead{flex-wrap:wrap;}
  .ctl-facts{width:100%;justify-content:flex-end;}
  .ctl-facts .btn{min-height:40px;}
  .ctl-chip{min-height:44px;}
  .ctl-inline{height:40px;}
  .ctl-tcell .btn.xs,.sh-set .btn.xs{min-height:40px;}   /* v1.4.10.473: the Set button matches the 40px picker beside it */
}

/* ═══════════════════ v1.4.10.309 ═══════════════════════════════════════════
   The ticket PRIORITY FLAG (Jay: "flag a ticket as priority in the ticket,
   then when you list the support tickets it will have a priority badge beside
   it"). One red pill, the same in the list row, the board card and the
   dashboard; the action-bar toggle fills when the flag is up; the hero leads
   with a flag chip. */
.pill.tkx-prioflag{background:#DC2626;color:#fff;border:1px solid #DC2626;font-size:11px;padding:1px 7px;letter-spacing:0;display:inline-flex;align-items:center;gap:3px;vertical-align:middle;font-weight:600;}
.pill.tkx-prioflag svg{width:10px;height:10px;stroke:#fff;fill:#fff;}
.tkx-card.tkx-flagged{box-shadow:0 0 0 1px #DC2626,0 1px 3px rgba(11,14,20,.08);}
.tkx-card.tkx-flagged.tkx-mine{box-shadow:0 0 0 1px var(--brand-blue,var(--bc-blue-v1)),0 0 0 3px rgba(220,38,38,.35);}
.tkd-actionbar .tkd-flagbtn.on{background:#DC2626;color:#fff;border-color:#DC2626;}
.tkd-actionbar .tkd-flagbtn.on svg{fill:#fff;stroke:#fff;}
.tkd-hero-chips .tkd-flagchip{background:rgba(220,38,38,.28);border-color:rgba(251,113,133,.7);}
.tkd-hero-chips .tkd-flagchip .ph-cv{display:inline-flex;align-items:center;gap:5px;}
.tkd-hero-chips .tkd-flagchip svg{width:13px;height:13px;fill:#fff;stroke:#fff;}
.tkx-chip.tkx-chip-flag svg{width:11px;height:11px;}
.tkx-chip.tkx-chip-flag.on{background:#DC2626;color:#fff;border-color:#DC2626;}
.tkx-chip.tkx-chip-flag.on svg{fill:#fff;stroke:#fff;}
.tkx-chip.tkx-chip-flag.on .cn{color:#fff;opacity:.85;}
.dyw-row .tkx-prioflag,.dmt-row .tkx-prioflag,.tk-row .tkx-prioflag{margin-left:4px;}
@media (min-width:761px){ .tkd-refrow .tkd-flagpill{display:none;} }

/* v1.4.10.309 — the task avatars, hardened for WebKit/iOS. Jay: "the user icon
   is overlapping other tasks". Not reproducible in Chromium or WebKit with the
   sandbox's square pictures, so every way a picture can escape its circle is
   closed: the box can never grow past its size, the picture is clipped by mask
   as well as overflow (older WebKit does not clip a child of a border-radius
   parent), and the stack is a flex item that can neither stretch nor shrink.
   inline-flex replaces inline-grid + place-items (Safari < 14.1). */
.tk-av{display:inline-flex;align-items:center;justify-content:center;max-width:28px;max-height:28px;min-width:0;overflow:hidden;box-sizing:border-box;line-height:1;}
.tk-av.sm{max-width:24px;max-height:24px;}
.tk-av.pic,.u-av.has-pic{-webkit-mask-image:-webkit-radial-gradient(#fff,#000);isolation:isolate;}
.tk-av.pic img,.u-av.has-pic img{max-width:100%;max-height:100%;min-width:100%;min-height:100%;}
.tk-avs{flex:0 0 auto;align-self:center;max-height:28px;}
.tk-row > .tk-av,.tk-row > .tk-avs,.tk-row > .tk-prio{align-self:center;flex:0 0 auto;}
.tkd-hero-chips .tk-av,.tkd-hero-chips .tk-avs{max-width:none;max-height:20px;}
.tkd-hero-chips .tk-av{max-width:20px;}
.tk-item .tk-item-who .tk-av,.tk-who-chip .tk-av{max-width:24px;max-height:24px;}
.tk-av.all svg,.tk-av.none svg{flex:none;}

/* v1.4.10.311 — the Ody software history modal (odyPiUpdateHistory). One row per
   attempt: outcome pill, what was tried and why, when it ended. */
.opi-uh-row{display:flex;align-items:flex-start;gap:10px;padding:8px 0;border-bottom:1px solid var(--border);}
.opi-uh-row:last-child{border-bottom:0;}
.opi-uh-mid{flex:1 1 auto;min-width:0;}
.opi-uh-row .pill{flex:0 0 auto;margin-top:2px;}
@media (max-width:760px){
  .opi-uh-row{flex-wrap:wrap;}
  .opi-uh-row > .device-meta{width:100%;}
}
/* v1.4.10.311 — the Ody fleet compliance strip (monOdyComplianceHtml). */
.opi-comp{display:flex;gap:6px;flex-wrap:wrap;align-items:center;}

/* ═══ v1.4.10.313 — the Shure control dashboard ═══════════════════════════
   Jay: "should show everything in neat graphs and show statuses, should be a
   really nice graphical interface." So: a status rail, a bay/channel wall with
   real gauges, sparklines on everything polled, and controls that look like
   controls. Palette is the app's own — --accent / --surface / --bg / --border /
   --text / --text-mute / --text-dim / --ok / --warn. There is no --panel,
   --primary or --wb-* here.
   Tone is one idea in four colours: good / warn / bad / idle. */
.sh-dash{overflow:hidden;}
.sh-dash .sh-tone-good, .sh-dash .good{--sh:var(--ok,#16A34A);}
.sh-dash .warn{--sh:var(--warn,#D97706);}
.sh-dash .bad{--sh:#DC2626;}
.sh-dash .idle{--sh:var(--text-dim,#94A3B8);}

/* Hero ------------------------------------------------------------------- */
.sh-hero{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding:16px 18px;background:linear-gradient(135deg,color-mix(in srgb,var(--accent) 10%,transparent),transparent 65%);
  border-bottom:1px solid var(--border);}
.sh-hero-id{display:flex;align-items:center;gap:13px;min-width:0;}
.sh-hero-ico{width:42px;height:42px;flex:0 0 auto;border-radius:6px;display:grid;place-items:center;
  background:var(--accent);color:#fff;}
.sh-hero-ico svg{width:22px;height:22px;}
.sh-hero-txt{min-width:0;}
.sh-hero-txt h3{margin:0;font-size:16px;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.sh-hero-sub{font-size:12px;color:var(--text-mute);margin-top:2px;}
.sh-hero-sub code{background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:1px 5px;font-size:12px;}
.sh-hero-act{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.sh-fresh{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--text-mute);}
.sh-fresh svg{width:13px;height:13px;}
.sh-fresh.stale{color:var(--warn,#D97706);}
.sh-live{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-mute);cursor:pointer;user-select:none;}
.sh-live input{width:16px;height:16px;accent-color:var(--accent);}

.sh-body{padding:16px 18px 18px;}

/* Status rail ------------------------------------------------------------ */
.sh-rail{display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:10px;margin-bottom:14px;}
.sh-tile{text-align:left;border:1px solid var(--border);border-radius:7px;background:var(--surface);
  padding:11px 13px;cursor:pointer;transition:border-color .12s,box-shadow .12s,transform .12s;
  border-left:3px solid var(--sh,var(--border));}
.sh-tile:hover{transform:translateY(-1px);box-shadow:0 6px 16px rgba(15,23,42,.08);}
.sh-tile.on{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 18%,transparent);}
.sh-tile-h{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:var(--text-mute);
  text-transform:uppercase;letter-spacing:.06em;}
.sh-tile-h svg{width:14px;height:14px;color:var(--sh);}
.sh-tile-b{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.15;margin-top:3px;color:var(--text);}
.sh-tile-s{font-size:12px;color:var(--text-mute);}

/* Tabs ------------------------------------------------------------------- */
.sh-tabs{display:flex;gap:6px;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;
  border-bottom:1px solid var(--border);margin-bottom:14px;}
.sh-tab{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;border:0;background:none;cursor:pointer;
  padding:9px 12px;font-size:13px;font-weight:600;color:var(--text-mute);border-bottom:2px solid transparent;}
.sh-tab svg{width:15px;height:15px;}
.sh-tab.on{color:var(--accent);border-bottom-color:var(--accent);}

/* Panel head ------------------------------------------------------------- */
.sh-phead{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:12px;}
.sh-phead h4{margin:0;font-size:15px;}
.sh-phead p{margin:2px 0 0;font-size:12px;color:var(--text-mute);max-width:70ch;}
.sh-phead-a{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.sh-empty{padding:22px;text-align:center;color:var(--text-mute);border:1px dashed var(--border);border-radius:7px;}

/* Value tiles ------------------------------------------------------------ */
.sh-tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(192px,1fr));gap:11px;margin-bottom:16px;}
.sh-vt{border:1px solid var(--border);border-radius:7px;background:var(--surface);padding:11px 12px;min-width:0;}
.sh-vt-h{display:flex;align-items:center;justify-content:space-between;gap:6px;}
.sh-vt-n{font-size:11px;font-weight:600;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.sh-dot{width:7px;height:7px;border-radius:50%;background:var(--accent);flex:0 0 auto;}
.sh-vt-v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.25;margin:3px 0 5px;color:var(--sh);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.sh-vt-v i{font-size:12px;font-weight:600;font-style:normal;color:var(--text-mute);margin-left:3px;}
.sh-vt-na{font-size:14px;font-weight:500;color:var(--text-dim);}
.sh-vt-l{font-size:12px;color:var(--text-mute);margin-top:3px;}
.sh-vt-c{margin-top:8px;}
.sh-vt-f{display:flex;align-items:center;justify-content:space-between;gap:6px;margin-top:8px;
  padding-top:7px;border-top:1px solid var(--border);}
.sh-vt-f code{font-size:11px;color:var(--text-dim);}
.sh-trend{font-size:11px;font-weight:600;color:var(--text-mute);}
.sh-trend.up{color:var(--ok,#16A34A);} .sh-trend.down{color:var(--warn,#D97706);}

/* Meters, sparklines, gauges --------------------------------------------- */
.sh-meter{height:6px;border-radius:99px;background:var(--bg);overflow:hidden;margin:2px 0 4px;}
.sh-meter > div{height:100%;border-radius:99px;background:var(--sh);transition:width .3s;}
.sh-spark{display:block;width:100%;height:34px;margin-top:2px;overflow:visible;}
.sh-spark-l{fill:none;stroke:var(--sh);stroke-width:1.6;vector-effect:non-scaling-stroke;}
.sh-spark-a{fill:color-mix(in srgb,var(--sh) 16%,transparent);stroke:none;}
.sh-spark-d{fill:none;stroke:var(--sh);stroke-width:4.4;stroke-linecap:round;vector-effect:non-scaling-stroke;}   /* v1.4.10.445: a round-capped zero-length path, so the end dot stays round in the stretched SVG */
.sh-ring{position:relative;width:64px;height:64px;}
.sh-ring svg{transform:rotate(-90deg);}
.sh-ring-bg{fill:none;stroke:var(--bg);stroke-width:6;}
.sh-ring-on{fill:none;stroke:var(--sh);stroke-width:6;stroke-linecap:round;}
.sh-ring-t{position:absolute;inset:0;display:grid;place-content:center;text-align:center;line-height:1.1;}
.sh-ring-t b{font-size:15px;} .sh-ring-t small{font-size:11px;color:var(--text-mute);}
.sh-pill{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;padding:3px 8px;
  border-radius:99px;background:color-mix(in srgb,var(--sh) 14%,transparent);color:var(--sh);
  border:1px solid color-mix(in srgb,var(--sh) 30%,transparent);white-space:nowrap;}

/* The bay / channel wall -------------------------------------------------- */
.sh-wall-h{font-size:11px;font-weight:600;color:var(--text-mute);text-transform:uppercase;letter-spacing:.06em;margin:4px 0 9px;}
.sh-wall{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:11px;}
.sh-bay,.sh-unit{border:1px solid var(--border);border-radius:7px;background:var(--surface);padding:12px;min-width:0;
  border-top:3px solid var(--sh,var(--border));}
.sh-bay.idle,.sh-unit.idle{opacity:.72;}
.sh-bay-h,.sh-unit-h{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:9px;}
.sh-bay-n,.sh-unit-n{font-size:12px;font-weight:700;}
.sh-unit-l{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.sh-bay-m{display:flex;align-items:center;gap:10px;}
.sh-bay-pc{display:flex;align-items:baseline;gap:1px;margin-left:auto;color:var(--sh);}
.sh-bay-pc b{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;}
.sh-bay-pc i{font-size:12px;font-style:normal;font-weight:600;}
.sh-bay-nr{margin-left:auto;font-size:12px;font-weight:600;color:var(--text-dim);}
.sh-batt{display:flex;align-items:center;gap:2px;}
.sh-batt-body{width:52px;height:24px;border:2px solid var(--sh);border-radius:5px;padding:2px;}
.sh-batt-fill{height:100%;border-radius:2px;background:var(--sh);transition:width .3s;}
.sh-batt-cap{width:4px;height:10px;border-radius:0 2px 2px 0;background:var(--sh);}
.sh-bay-rows,.sh-unit-rows{margin-top:8px;display:flex;flex-direction:column;gap:5px;}
.sh-bay-r,.sh-unit-r{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;}
.sh-bay-r span,.sh-unit-r > span:first-child{color:var(--text-mute);}
.sh-bay-r b{font-weight:600;color:var(--sh);}
.sh-unit-v{font-weight:600;color:var(--sh);}
.sh-unit-v i{font-style:normal;font-size:11px;color:var(--text-mute);margin-left:2px;}
.sh-unit-r .sh-meter{flex:0 0 56px;margin:0;}
.sh-bay-fault{display:flex;align-items:center;gap:7px;padding:10px 8px;border-radius:6px;font-size:12px;font-weight:600;
  color:var(--sh);background:color-mix(in srgb,var(--sh) 12%,transparent);}
.sh-bay-fault svg{width:16px;height:16px;flex:0 0 auto;}
.sh-bay-empty{display:flex;flex-direction:column;align-items:center;gap:6px;padding:16px 6px;color:var(--text-dim);font-size:12px;}
.sh-bay-empty svg{width:20px;height:20px;opacity:.5;}
.sh-bay-c,.sh-unit-c{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:9px;
  padding-top:8px;border-top:1px solid var(--border);font-size:12px;color:var(--text-mute);}

/* Controls --------------------------------------------------------------- */
.sh-seg{display:inline-flex;border:1px solid var(--border);border-radius:6px;overflow:hidden;background:var(--bg);}
.sh-segb{border:0;background:none;cursor:pointer;padding:6px 11px;font-size:12px;font-weight:600;
  color:var(--text-mute);min-height:32px;}
.sh-segb:hover{background:var(--surface);}
.sh-segb.on{background:var(--accent);color:#fff;}
.sh-set{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.sh-set .ctl-inline{min-width:0;flex:1 1 84px;}
.sh-set .ctl-inline.num{flex:0 0 78px;}
.sh-range{flex:1 1 90px;accent-color:var(--accent);min-width:70px;}
.sh-locked{color:var(--text-dim);display:inline-flex;}
.sh-locked svg{width:14px;height:14px;}

.sh-foot{margin-top:16px;padding-top:12px;border-top:1px solid var(--border);font-size:12px;color:var(--text-mute);}
.sh-foot a{color:var(--accent);}
.sh-warn{margin-top:7px;color:var(--warn,#D97706);}

/* Phone: one column, and every control keeps the 40px touch floor. */
@media (max-width:760px){
  .sh-hero{padding:13px 14px;}
  .sh-body{padding:13px 14px 16px;}
  .sh-rail{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));}
  .sh-tiles,.sh-wall{grid-template-columns:1fr;}
  .sh-hero-act{width:100%;}
  .sh-hero-act .btn{flex:1 1 auto;}
  /* A narrow viewport is a phone in practice, whatever the pointer reports —
     the touch floor cannot wait for the coarse-pointer query to match. */
  #asset-ctl-root .sh-dash .sh-segb,
  #asset-ctl-root .sh-dash .sh-tab,
  #asset-ctl-root .sh-dash .btn,
  #asset-ctl-root .sh-dash .btn.xs,
  #asset-ctl-root .sh-dash .btn.sm,
  #asset-ctl-root .sh-dash select,
  #asset-ctl-root .sh-dash input:not([type=range]):not([type=checkbox]){min-height:40px;}
  #asset-ctl-root .sh-dash .sh-segb{padding:0 14px;}
}
@media (hover:none) and (pointer:coarse){
  /* Scoped to the dashboard and specific enough to beat .btn.xs — an appended
     rule without this loses on specificity, the same trap as v304's ticks. */
  #asset-ctl-root .sh-dash .sh-segb,
  #asset-ctl-root .sh-dash .sh-tab,
  #asset-ctl-root .sh-dash .btn,
  #asset-ctl-root .sh-dash .btn.xs,
  #asset-ctl-root .sh-dash .btn.sm,
  #asset-ctl-root .sh-dash select,
  #asset-ctl-root .sh-dash input:not([type=range]):not([type=checkbox]){min-height:40px;}
  #asset-ctl-root .sh-dash .sh-segb{padding:0 14px;}
  .sh-live input{width:20px;height:20px;}
}

/* ═══ v1.4.10.312 — Shure command strings on the Control tab ═══════════════
   The Shure cards reuse the MIB feature-card furniture (.ctl-panel /
   .ctl-feature / .ctl-chip / .ctl-tbl / .ctl-grid); only the few pieces that
   are new to them live here. Palette: --accent / --surface / --border /
   --text-mute / --text-dim / --ok / --warn — there is no --panel/--primary. */
.ctl-shure-src{margin-top:8px;font-size:12px;}
.ctl-shure-src a{color:var(--accent);}
.ctl-shure-src code{font-size:12px;padding:1px 4px;border-radius:4px;background:var(--surface);border:1px solid var(--border);}
.ctl-name{font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.ctl-val{white-space:nowrap;}
/* The per-bay / per-channel grid scrolls inside itself so a 10-bay charger
   never pushes the asset page sideways. */
.ctl-feature .ctl-twrap{overflow-x:auto;-webkit-overflow-scrolling:touch;}
.ctl-feature .ctl-twrap table.ctl-tbl{min-width:0;}
@media (max-width:760px){
  .ctl-val{white-space:normal;}
  .ctl-feature .ctl-twrap table.ctl-grid{min-width:520px;}
  .ctl-feature .ctl-twrap .ctl-inline{min-width:96px;}
}
/* Coarse pointers: every control in a Shure row keeps the 40px floor. */
@media (hover:none) and (pointer:coarse){
  .ctl-tcell .btn.xs, .ctl-tcell .ctl-inline,
  .sh-set .btn.xs, .sh-set .ctl-inline{min-height:40px;}   /* v1.4.10.473: the Shure rows too, as the note above says (their Set button stayed 32 beside a 40 field) */
}

/* ============================================================
   v1.4.10.314 — Automation & Compliance (.au-*)
   Tone is one idea in four colours (ok / warn / err / idle) driving the
   --au custom property, exactly as the Shure dashboard does with --sh.
   NOTE the 40px tap floor is repeated in the max-width:760px block as
   well as the coarse-pointer block — Playwright's default context is not
   coarse, and a narrow window is a phone in practice (v313's lesson).
   ============================================================ */
.au-page{--au:var(--text-dim);display:flex;flex-direction:column;gap:16px;}
.au-page .ok{--au:var(--ok);} .au-page .warn{--au:var(--warn);}
.au-page .err{--au:var(--err);} .au-page .idle{--au:var(--text-dim);}
.au-page .blue{--au:var(--brand);}

.au-head{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between;}
.au-head-l,.au-head-r{display:flex;gap:8px;align-items:center;flex-wrap:wrap;}
.au-tabs{display:inline-flex;background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:3px;}
.au-tab{border:0;background:transparent;color:var(--text-mute);font:inherit;font-weight:600;font-size:13px;
  padding:7px 16px;border-radius:999px;cursor:pointer;}
.au-tab.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);}

.au-rail{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;}
.au-tile{background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--au);
  border-radius:var(--radius);padding:12px 14px;display:flex;flex-direction:column;gap:2px;min-width:0;}
.au-tile-v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.1;color:var(--text);font-variant-numeric:tabular-nums;}
.au-tile-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}   /* v1.4.10.473: a KPI label, 11/600 uppercase .06em like every other tile (was 12/600 sentence case) */
.au-tile-s{font-size:11px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

.au-banner{display:flex;gap:10px;align-items:center;padding:11px 14px;border-radius:var(--radius);
  background:rgba(217,119,6,0.08);border:1px solid rgba(217,119,6,0.28);color:var(--text);font-size:13px;}
.au-banner svg{flex-shrink:0;color:var(--warn);}

.au-group{display:flex;flex-direction:column;gap:8px;}
.au-group-h{display:flex;gap:8px;align-items:baseline;font-weight:600;font-size:13px;color:var(--text);}
.au-group-h svg{color:var(--text-mute);align-self:center;}
.au-group-s{font-weight:400;font-size:12px;color:var(--text-dim);}
.au-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:12px;}
.au-grid .au-card{max-width:640px;}

.au-card{background:var(--surface);border:1px solid var(--line);border-top:3px solid var(--au);
  border-radius:var(--radius);padding:14px;display:flex;flex-direction:column;gap:8px;box-shadow:var(--shadow-sm);}
.au-card-h{display:flex;justify-content:space-between;gap:10px;align-items:flex-start;}
.au-card-t{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-width:0;}
.au-name{font-weight:600;font-size:15px;letter-spacing:-.012em;color:var(--text);}
.au-card-d{font-size:12px;color:var(--text-mute);}
.au-state{font-size:12px;font-weight:600;color:var(--au);}
.au-facts{display:flex;flex-wrap:wrap;gap:12px;font-size:12px;color:var(--text-mute);}
.au-facts span{display:inline-flex;gap:5px;align-items:center;}
.au-facts svg{width:13px;height:13px;color:var(--text-dim);}
.au-card-last{font-size:12px;color:var(--text-mute);border-top:1px solid var(--line);padding-top:8px;}
.au-card-last b{color:var(--au);}
.au-card-a{display:flex;flex-wrap:wrap;gap:6px;}
.au-dim{color:var(--text-dim);}
.au-warn{color:var(--warn);}
.au-link{border:0;background:none;padding:0;color:var(--brand);font:inherit;text-decoration:underline;cursor:pointer;}

.au-chip{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;background:var(--surface-2);
  border:1px solid var(--line);font-size:11px;font-weight:600;color:var(--text-mute);}
.au-chip.warn{background:rgba(217,119,6,0.12);border-color:rgba(217,119,6,0.3);color:var(--warn);}
.au-chip.err{background:rgba(220,38,38,0.1);border-color:rgba(220,38,38,0.28);color:var(--err);cursor:pointer;}

.au-sw{position:relative;display:inline-block;width:40px;height:23px;flex-shrink:0;}
.au-sw input{opacity:0;width:0;height:0;}
.au-sw span{position:absolute;inset:0;background:var(--line-2);border-radius:999px;transition:background .15s;cursor:pointer;}
.au-sw span::before{content:"";position:absolute;width:17px;height:17px;left:3px;top:3px;background:#fff;border-radius:50%;transition:transform .15s;}
.au-sw input:checked + span{background:var(--ok);}
.au-sw input:checked + span::before{transform:translateX(17px);}

.au-empty{text-align:center;} .au-empty-t{font-weight:600;font-size:15px;letter-spacing:-.012em;margin-top:6px;}
.au-empty-s{font-size:12px;color:var(--text-mute);margin:4px 0 12px;}
.au-starters{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;}

/* Compliance */
.au-score-panel{display:grid;grid-template-columns:220px 1fr;gap:16px;align-items:center;padding:18px 20px;}   /* v1.4.10.473: padded like a .panel-body (the score sat on the panel's edge) */
.au-score{border-right:1px solid var(--line);padding-right:16px;}
.au-score-v{font-size:30px;font-weight:700;letter-spacing:-.03em;line-height:1;color:var(--au);font-variant-numeric:tabular-nums;}
.au-score-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-top:4px;}   /* v1.4.10.473: KPI label 11/600 uppercase .06em (was 12/600) */
.au-score-s{font-size:12px;color:var(--text-dim);margin-top:2px;}
.au-sevs{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:8px;}
.au-sev{background:var(--surface-2);border:1px solid var(--line);border-radius:7px;padding:10px;
  display:flex;flex-direction:column;gap:2px;cursor:pointer;font:inherit;text-align:left;}
.au-sev-v{font-size:20px;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums;}
.au-sev-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}   /* v1.4.10.473: KPI label 11/600 uppercase .06em (was 11/400) */
.au-sev.critical .au-sev-v{color:var(--err);} .au-sev.high .au-sev-v{color:#EA580C;}
.au-sev.medium .au-sev-v{color:var(--warn);} .au-sev.low .au-sev-v{color:var(--text-mute);}
.au-sev.fixed .au-sev-v{color:var(--ok);} .au-sev.accepted .au-sev-v{color:var(--info);}
.au-sev.on{border-color:var(--brand);box-shadow:0 0 0 2px rgba(var(--bc-accent-rgb),0.15);}
.au-sev.fixed,.au-sev.accepted{cursor:default;}

.au-tablewrap{overflow-x:auto;}
/* v1.4.10.473: the findings and run history tables had no table styling at all (class "tbl" has no rules): headers drew
   as the browser's centred 14/700 and the cells had no padding or rules. Now the .dt look: 11/600 uppercase headers. */
.au-find,.au-runs{width:100%;border-collapse:collapse;font-size:13px;}
.au-find th,.au-runs th{text-align:left;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);padding:11px 14px;border-bottom:1px solid var(--line);background:var(--bg-2);white-space:nowrap;}
.au-find td,.au-runs td{vertical-align:top;font-size:13px;padding:11px 14px;border-bottom:1px solid var(--line);}
.au-find tbody tr:last-child td,.au-runs tbody tr:last-child td{border-bottom:0;}
.au-actual{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;}
.au-pill{display:inline-block;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;}
.au-pill.critical{background:rgba(220,38,38,0.12);color:var(--err);}
.au-pill.high{background:rgba(234,88,12,0.12);color:#EA580C;}
.au-pill.medium{background:rgba(217,119,6,0.12);color:var(--warn);}
.au-pill.low{background:var(--surface-2);color:var(--text-mute);}
.au-pill.ok{background:rgba(22,163,74,0.12);color:var(--ok);}

.au-run-detail{background:var(--surface-2);}
.au-rd-notes{margin:0 0 8px;padding-left:18px;font-size:12px;}
.au-rd-devs{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:10px;}
.au-rd-dev{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:9px 11px;}
.au-rd-name{font-weight:600;font-size:13px;margin-bottom:4px;}   /* v1.4.10.473: a sub-heading, 13/600 (was 12/600) */
.au-rd-dev ul{margin:0;padding-left:16px;font-size:12px;}
.au-rd-dev li.ok{color:var(--ok);} .au-rd-dev li.err{color:var(--err);} .au-rd-dev li.warn{color:var(--warn);}

/* Editor */
.au-ed-body{display:flex;flex-direction:column;gap:14px;}
.au-err{background:rgba(220,38,38,0.08);border:1px solid rgba(220,38,38,0.3);color:var(--err);
  border-radius:6px;padding:9px 12px;font-size:12px;}
.au-kindpick{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px;}
.au-kind{background:var(--surface-2);border:1px solid var(--line);border-radius:7px;padding:10px 12px;
  display:flex;flex-direction:column;gap:3px;cursor:pointer;font:inherit;text-align:left;}
.au-kind.on{border-color:var(--brand);background:var(--surface);box-shadow:0 0 0 2px rgba(var(--bc-accent-rgb),0.15);}
.au-kind-t{font-weight:600;font-size:13px;} .au-kind-s{font-size:12px;color:var(--text-dim);}
.au-row{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;}
.au-row label{display:flex;flex-direction:column;gap:4px;font-size:12px;font-weight:500;color:var(--text-mute);}
.au-row label.au-grow,label.au-grow{flex:1 1 240px;display:flex;flex-direction:column;gap:4px;font-size:12px;font-weight:500;color:var(--text-mute);}
.au-row input,.au-row select,label.au-grow input{padding:8px 10px;border:1px solid var(--line-2);border-radius:6px;
  background:var(--surface);color:var(--text);font:inherit;font-size:13px;font-weight:400;}
.au-checks{gap:16px;}
.au-cb{flex-direction:row !important;align-items:center;gap:7px !important;font-size:13px !important;font-weight:400 !important;color:var(--text) !important;}
.au-days > span{display:flex;flex-wrap:wrap;gap:4px;}
.au-day{border:1px solid var(--line-2);background:var(--surface);border-radius:6px;padding:7px 9px;
  font:inherit;font-size:12px;font-weight:600;color:var(--text-mute);cursor:pointer;}
.au-day.on{background:var(--brand);border-color:var(--brand);color:#fff;}
.au-sub{border:1px solid var(--line);border-radius:7px;padding:12px;display:flex;flex-direction:column;gap:10px;}
.au-sub-h{display:flex;gap:10px;align-items:center;justify-content:space-between;flex-wrap:wrap;
  font-weight:600;font-size:13px;color:var(--text);}
.au-note{font-size:12px;color:var(--text-dim);}
.au-check,.au-act{display:flex;flex-wrap:wrap;gap:8px;align-items:center;background:var(--surface-2);
  border:1px solid var(--line);border-radius:6px;padding:8px 10px;}
.au-check select,.au-check input{padding:7px 9px;border:1px solid var(--line-2);border-radius:6px;
  background:var(--surface);font:inherit;font-size:13px;}
.au-act-n{width:22px;height:22px;border-radius:50%;background:var(--brand);color:#fff;display:inline-flex;
  align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0;}
.au-act-t{display:flex;flex-direction:column;font-size:13px;font-weight:600;flex:1 1 200px;min-width:0;}
.au-act-t .au-dim{font-weight:400;font-size:11px;}
.au-act-b select,.au-act-b input{padding:7px 9px;border:1px solid var(--line-2);border-radius:6px;background:var(--surface);font:inherit;font-size:13px;}
.au-addact{padding:6px 9px;border:1px solid var(--line-2);border-radius:6px;background:var(--surface);font:inherit;font-size:13px;font-weight:400;}   /* v1.4.10.473: a field, 400 (took the 600 of the heading row it sits in) */
.au-sub-h > .au-dim{font-size:12px;font-weight:400;}   /* v1.4.10.473: "142 devices match right now" is a 12/400 meta line, not part of the 13/600 heading */
.au-sample{display:flex;flex-wrap:wrap;gap:5px;}
.au-samp{display:inline-flex;gap:5px;align-items:baseline;padding:3px 8px;border-radius:999px;
  background:var(--surface-2);border:1px solid var(--line);font-size:11px;color:var(--text-mute);}
.au-samp em{font-style:normal;color:var(--text-dim);font-size:11px;}
.au-runres-s{font-size:13px;font-weight:600;margin:0 0 10px;}

@media (max-width:1180px){ .au-rail{grid-template-columns:repeat(3,minmax(0,1fr));} }
@media (max-width:760px){
  .au-rail{grid-template-columns:repeat(2,minmax(0,1fr));}
  .au-grid{grid-template-columns:1fr;} .au-grid .au-card{max-width:none;}
  .au-score-panel{grid-template-columns:1fr;} .au-score-v{font-size:24px;}
  .au-score{border-right:0;border-bottom:1px solid var(--line);padding:0 0 12px;}
  .au-head{flex-direction:column;align-items:stretch;}
  .au-tabs{width:100%;} .au-tab{flex:1;min-height:40px;}
  .au-page .btn,.au-page .btn.btn-sm,.au-day,.au-sev,.au-kind,
  .au-row input,.au-row select,label.au-grow input,.au-check select,.au-check input,
  .au-act-b select,.au-act-b input,.au-addact,.au-site{min-height:40px;}
  .au-sw{width:46px;height:26px;} .au-sw span::before{width:20px;height:20px;}
  .au-sw input:checked + span::before{transform:translateX(20px);}
}
@media (hover:none) and (pointer:coarse){
  .au-page .btn,.au-page .btn.btn-sm,.au-day,.au-sev,.au-kind,
  .au-row input,.au-row select,.au-check select,.au-check input,
  .au-act-b select,.au-act-b input,.au-addact{min-height:40px;}
}

/* v1.4.10.315 — compliance report panel + the 90-day score line. */
.au-report{display:grid;grid-template-columns:1fr 1fr;gap:18px;align-items:start;padding:18px 20px;}   /* v1.4.10.473: padded like a .panel-body (the headings sat on the panel's edge) */
.au-report-h{font-weight:600;font-size:13px;margin-bottom:8px;}
.au-report-s{font-size:12px;color:var(--text-mute);margin-bottom:10px;}
.au-report-a{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
.au-report-e{color:var(--err);font-size:12px;margin-top:8px;}
.au-trend{--tl:var(--brand);}
.au-trend.up{--tl:var(--ok);} .au-trend.down{--tl:var(--err);} .au-trend.level{--tl:var(--text-dim);}
.au-trend svg{width:100%;height:64px;display:block;}
.au-trend-l{fill:none;stroke:var(--tl);stroke-width:1.4;vector-effect:non-scaling-stroke;
  stroke-linejoin:round;stroke-linecap:round;}
.au-trend-a{fill:var(--tl);opacity:0.10;stroke:none;}
/* v1.4.10.474: the score line across days with no snapshot (dashed, faint) and each measured day's dot */
.au-trend-g{fill:none;stroke:var(--tl);stroke-width:1.2;stroke-dasharray:3 3;opacity:.5;vector-effect:non-scaling-stroke;}
.au-trend-d{fill:none;stroke:var(--tl);stroke-width:3.6;stroke-linecap:round;vector-effect:non-scaling-stroke;}
.au-trend-f{display:flex;justify-content:space-between;gap:8px;font-size:11px;
  color:var(--text-mute);margin-top:4px;}
.au-trend-empty{font-size:12px;color:var(--text-dim);padding:18px 0;}
@media (max-width:760px){
  .au-report{grid-template-columns:1fr;}
  .au-report .btn,.au-report .btn.btn-sm,.au-report .ex-sel{min-height:40px;}
}

/* ══════════════════════════════════════════════════════════════════════════
   v1.4.10.316 — THE MIB DASHBOARD ON THE MONITORING TAB (.amib-*)
   Jay: "make the layout perfect in monitoring tab, everything that the mib
   offers to show it should be nicely laid out in the monitoring area."
   Sections fold; a row section is one line per port/sensor with its headline
   values and a sparkline, opening to that row's own charts. Coarse pointers
   get 40px targets, and the row line stacks below 700px so a 48-port switch
   is still readable on a phone in a rack room.
   ══════════════════════════════════════════════════════════════════════════ */
.amib .am-ph{flex-wrap:wrap;gap:6px;}
.amib-acts{display:flex;gap:6px;flex-wrap:wrap;margin-left:auto;}

.amib-state{display:flex;gap:12px;align-items:flex-start;padding:12px 14px;border-radius:6px;
  border:1px solid var(--border);background:var(--bg);margin-bottom:12px;}
.amib-state.off{border-color:var(--line);background:var(--surface-2);}   /* v1.4.10.531: SNMP monitoring off — a quiet note, not a warning */
.amib-state.no_port,.amib-state.no_community{border-color:color-mix(in srgb,var(--warn) 45%,var(--border));
  background:color-mix(in srgb,var(--warn) 8%,var(--surface));}
.amib-state.no_mib{border-color:color-mix(in srgb,var(--accent) 40%,var(--border));
  background:color-mix(in srgb,var(--accent) 6%,var(--surface));}
.amib-state-i{flex:0 0 auto;color:var(--text-mute);display:flex;}
.amib-state-m{flex:1 1 auto;min-width:0;}
.amib-state-m .t{font-size:13px;font-weight:700;color:var(--text);}
.amib-state-m .d{font-size:12px;color:var(--text-mute);margin-top:3px;line-height:1.45;}
.amib-state-a{flex:0 0 auto;}
.amib-note{font-size:12px;color:var(--text-dim);margin:8px 2px 10px;line-height:1.5;}

.amib-sect{border:1px solid var(--border);border-radius:6px;margin-bottom:10px;overflow:hidden;
  background:var(--surface);}
.amib-sect.open{border-color:color-mix(in srgb,var(--accent) 30%,var(--border));}
.amib-sh{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:10px 12px;
  background:none;border:0;cursor:pointer;color:inherit;font:inherit;}
.amib-sh:hover{background:var(--bg);}
.amib-si{flex:0 0 auto;color:var(--text-mute);display:flex;}
.amib-st{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:2px;}
.amib-st b{font-size:13px;font-weight:700;}
.amib-st small{font-size:11px;color:var(--text-dim);}
.amib-rx{flex:0 0 auto;font-size:15px;color:var(--text-dim);width:18px;text-align:center;}
.amib-sb{padding:4px 12px 12px;border-top:1px solid var(--border);}

.amib-facts{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:8px;margin:10px 0;}
.amib-fact{border:1px solid var(--border);border-radius:6px;padding:8px 10px;background:var(--bg);min-width:0;}
.amib-fact .k{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.amib-fact .v{font-size:12px;font-weight:600;margin-top:2px;word-break:break-word;}
.amib-fact .v.ok{color:var(--ok);} .amib-fact .v.warn{color:var(--warn);} .amib-fact .v.err{color:var(--err);}
.amib-none{color:var(--text-dim);font-weight:400;font-style:italic;}

.amib-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;margin:10px 0 4px;}
.amib-card{border:1px solid var(--border);border-radius:6px;padding:9px 10px 6px;background:var(--bg);min-width:0;}
.amib-card-h{display:flex;align-items:baseline;justify-content:space-between;gap:8px;}
.amib-card-t{font-size:12px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.amib-card-v{font-size:12px;font-weight:700;white-space:nowrap;}
.amib-card-v.ok{color:var(--ok);} .amib-card-v.warn{color:var(--warn);} .amib-card-v.err{color:var(--err);}
.amib-card-m{font-size:11px;color:var(--text-dim);margin-top:1px;}
.amib-card-c{margin-top:6px;}
.amib-card-c svg{width:100%;height:auto;display:block;}
.amib-nochart{font-size:12px;color:var(--text-dim);padding:14px 4px;line-height:1.5;}

.amib-rows{margin:8px 0 2px;border:1px solid var(--border);border-radius:6px;overflow:hidden;}
.amib-row + .amib-row{border-top:1px solid var(--border);}
.amib-row.open{background:var(--bg);}
.amib-rowhead{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:8px 10px;
  background:none;border:0;cursor:pointer;color:inherit;font:inherit;min-height:38px;}
.amib-rowhead:hover{background:var(--bg);}
.amib-rl{flex:0 0 auto;min-width:150px;max-width:44%;font-size:12px;display:flex;align-items:center;gap:6px;
  flex-wrap:wrap;overflow:hidden;}
.amib-rl b{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px;}
.amib-rcells{flex:1 1 auto;display:flex;gap:14px;justify-content:flex-end;flex-wrap:wrap;min-width:0;}
.amib-rc{min-width:96px;text-align:right;}
.amib-rc .k{font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.amib-rc .v{font-size:12px;font-weight:700;}
.amib-rc .v.ok{color:var(--ok);} .amib-rc .v.warn{color:var(--warn);} .amib-rc .v.err{color:var(--err);}
.amib-spark{display:block;width:100%;height:22px;margin-top:2px;opacity:.85;}
.amib-rowdetail{padding:2px 10px 12px;border-top:1px dashed var(--border);}
.amib-more{margin:8px 0 2px;}

@media (max-width:700px){
  .amib-grid{grid-template-columns:1fr;}
  .amib-facts{grid-template-columns:1fr 1fr;}
  .amib-rowhead{flex-wrap:wrap;align-items:flex-start;}
  .amib-rl{max-width:100%;min-width:0;flex:1 1 100%;}
  .amib-rcells{justify-content:flex-start;gap:10px;width:100%;}
  .amib-rc{min-width:86px;text-align:left;}
  .amib-state{flex-wrap:wrap;}
  .amib-state-a{width:100%;}
  .amib-state-a .btn{width:100%;min-height:40px;}
}
@media (hover:none) and (pointer:coarse){
  .amib-sh,.amib-rowhead{min-height:44px;}
  .amib-more .btn{min-height:40px;}
}

/* v1.4.10.316 — the Control tab's readings as a scannable grid rather than a
   table of MIB identifiers, and walked-table rows labelled by name. */
.ctl-fgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px;margin:8px 0 4px;}
.ctl-fcell{border:1px solid var(--border);border-radius:6px;padding:8px 10px;background:var(--bg);min-width:0;}
.ctl-fk{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:help;}
.ctl-fv{font-size:12px;margin-top:3px;word-break:break-word;line-height:1.4;}
.ctl-fa{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:6px;}
.ctl-fa .ctl-mon{font-size:11px;color:var(--text-mute);display:flex;align-items:center;gap:5px;}
.ctl-unread{color:var(--text-dim);font-style:italic;}
.ctl-rowlbl{white-space:nowrap;}
.ctl-grid thead th small{font-size:11px;font-weight:inherit;color:var(--text-dim);}   /* v1.4.10.473: a unit in a column header ("dB", "state") is the header's own 11/600 uppercase, told apart by colour (was the browser's "smaller", 9.17px at 400) */
@media (max-width:700px){
  .ctl-fgrid{grid-template-columns:1fr;}
  .ctl-fa .btn{min-height:40px;}
  .ctl-fa input[type=checkbox]{width:20px;height:20px;}
}

/* v1.4.10.316 — "test SNMP now": the community to try sits next to the button,
   because the common case is a switch given a community that is not the site
   default, and proving it and saving it should be one action. */
.amib-test{display:flex;gap:6px;align-items:center;flex-wrap:wrap;}
.amib-test input{min-width:150px;max-width:200px;padding:6px 8px;font-size:13px;
  border:1px solid var(--border);border-radius:6px;background:var(--surface);color:var(--text);}
@media (max-width:700px){
  .amib-test{width:100%;}
  .amib-test input{flex:1 1 100%;max-width:none;min-height:40px;}
  .amib-test .btn{width:100%;min-height:40px;}
}

/* v1.4.10.316 — the learning window, as the operator sees it. Probing, then a
   countdown with the running tally, then what was kept and what was dropped. */
.amib-learn{border:1px solid var(--border);border-radius:6px;padding:11px 13px;margin-bottom:12px;background:var(--bg);}
.amib-learn.probing,.amib-learn.observing{border-color:color-mix(in srgb,var(--accent) 40%,var(--border));
  background:color-mix(in srgb,var(--accent) 6%,var(--surface));}
.amib-learn.done{border-color:color-mix(in srgb,var(--ok) 35%,var(--border));
  background:color-mix(in srgb,var(--ok) 5%,var(--surface));}
.amib-learn-t{font-size:13px;font-weight:600;}
.amib-learn-d{font-size:12px;color:var(--text-mute);margin-top:4px;line-height:1.5;}
.amib-learn-bar{height:6px;border-radius:3px;background:var(--border);overflow:hidden;margin:8px 0 2px;}
.amib-learn-bar span{display:block;height:100%;background:var(--accent);transition:width .6s ease;}

/* v1.4.10.316 — Network ports & traffic as the hero of a switch's Monitoring
   tab: KPIs, a heat-mapped port grid of PHYSICAL ports only, and the busiest
   ports with rx-above / tx-below sparklines. */
.sw-panel .am-ph{flex-wrap:wrap;gap:6px;}
.sw-kpis{margin-bottom:10px;}
.swp.live{box-shadow:inset 0 -2px 0 color-mix(in srgb,var(--accent) 55%,transparent);}
.swp.busy{box-shadow:inset 0 -3px 0 var(--warn);}
.swp.hot{box-shadow:inset 0 -3px 0 var(--err);}
/* v1.4.10.448: a switch that has stopped reporting — its port grid and KPIs are the last known states,
   greyed so a frozen 'up' never reads as live (swRender adds .stale; the grid then carries no heat) */
.swp.stale{background:var(--bg-2);border-color:var(--line);color:var(--text-mute);}
.swp.stale .swp-poe{background:var(--text-mute);}
.sw-kpis.stale .am-kpi .v{color:var(--text-mute);}
.sw-busylist{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:8px;margin:6px 0 12px;}
.sw-busy{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:8px 10px;
  border:1px solid var(--border);border-radius:6px;background:var(--bg);cursor:pointer;color:inherit;font:inherit;
  min-height:44px;}
.sw-busy:hover{border-color:color-mix(in srgb,var(--accent) 45%,var(--border));}
.sw-busy.on{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 7%,var(--surface));}
.sw-busy-n{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:1px;}
.sw-busy-n b{font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.sw-busy-n small{font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.sw-busy-v{flex:0 0 auto;text-align:right;display:flex;flex-direction:column;gap:1px;}
.sw-busy-v b{font-size:12px;}
.sw-busy-v small{font-size:11px;color:var(--text-dim);white-space:nowrap;}
.sw-busy-s{flex:0 0 76px;}
.sw-spark{display:block;width:100%;height:26px;}
@media (max-width:700px){
  .sw-busylist{grid-template-columns:1fr;}
  .sw-busy-s{flex:0 0 60px;}
}

/* v1.4.10.316 — the Ody box's own health report (fleet → click a box). */
.odyh-body{max-height:78vh;overflow:auto;}
.odyh-finds{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;}
.odyh-find{display:flex;gap:9px;align-items:flex-start;padding:8px 10px;border-radius:6px;
  border:1px solid var(--border);background:var(--bg);font-size:12px;}
.odyh-find.err{border-color:color-mix(in srgb,var(--err) 45%,var(--border));background:color-mix(in srgb,var(--err) 6%,var(--surface));}
.odyh-find.warn{border-color:color-mix(in srgb,var(--warn) 45%,var(--border));background:color-mix(in srgb,var(--warn) 6%,var(--surface));}
.odyh-find .dot{margin-top:4px;flex:0 0 auto;}
.odyh-kpis{margin-bottom:14px;}
.odyh-kpis .am-kpi .device-meta{font-size:11px;margin-top:2px;}
.odyh-kpis .am-kpi .v small,.sw-kpis .am-kpi .v small{font-size:12px;font-weight:400;letter-spacing:0;color:var(--text-mute);}   /* v1.4.10.473: the unit after a figure (" in", "of 48") is a 12/400 meta; it took the browser's smaller, 16.67px */
.odyh-charts{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
.odyh-c{min-width:0;border:1px solid var(--border);border-radius:6px;padding:8px 10px;background:var(--bg);}
.odyh-wide{grid-column:1 / -1;}
.odyh-chart{display:block;width:100%;height:auto;margin-top:2px;}
.odyh-nochart{font-size:12px;color:var(--text-dim);padding:16px 4px;}
@media (max-width:760px){
  .odyh-charts{grid-template-columns:1fr;}
  .odyh-body .am-ranges button{min-height:40px;}
}

/* v1.4.10.316 — a graph page, not a text page: the placeholder under an empty
   chart is one muted line, and the fact tiles pack tighter than chart cards. */
.amib-nochart{font-size:12px;color:var(--text-dim);padding:22px 4px;text-align:center;font-style:italic;}
.amib-facts{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px;}
.amib-fact{padding:6px 8px;}
.amib-fact .v{font-size:12px;}

/* v1.4.10.316 — the Ody's own health, inline at the top of its monitoring area
   (site → Monitoring → Ody). Same body as the fleet modal, compact framing. */
.opi-health{margin:0 0 14px;}
.opi-healthcard{border:1px solid var(--border);border-radius:6px;overflow:hidden;background:var(--surface);}
.opi-healthhead{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:10px 13px;
  border-bottom:1px solid var(--border);background:var(--bg);}
.opi-healthhead b{font-size:15px;font-weight:600;letter-spacing:-.012em;}
.opi-healthhead .device-meta{font-size:11px;}
.opi-healthacts{margin-left:auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.opi-healthacts .am-ranges{margin:0;}
.opi-healthbody{padding:12px 13px 14px;}
.opi-healthbody .odyh-finds{margin-bottom:10px;}
.opi-healthbody .am-kpis{margin-bottom:12px;}
@media (max-width:760px){
  .opi-healthacts{margin-left:0;width:100%;}
  .opi-healthacts .btn{min-height:40px;}
}

/* v1.4.10.316 — PRTG-shaped charts for every MIB reading: filled average, a
   lighter maximum line above it, and the Last/Min/Avg/Max legend people read
   before they read the picture. */
.amp-chart{display:block;width:100%;height:auto;margin-top:4px;}
.amp-grid{stroke:var(--border);stroke-width:1;shape-rendering:crispEdges;}
.amp-yl{font-size:11px;fill:var(--text-dim);}
.amp-xl{font-size:11px;fill:var(--text-dim);}
.amp-legend{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:5px;padding-top:5px;
  border-top:1px solid var(--border);}
.amp-key{width:10px;height:10px;border-radius:2px;background:var(--c,var(--accent));flex:0 0 auto;}
.amp-stat{display:flex;align-items:baseline;gap:4px;font-size:11px;white-space:nowrap;}
.amp-stat i{font-style:normal;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;font-size:11px;font-weight:600;}
.amp-stat b{font-weight:700;}
.amib-card{padding:10px 11px 8px;}
.amib-grid{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));}
@media (max-width:700px){
  .amp-legend{gap:8px;}
  .amib-grid{grid-template-columns:1fr;}
}

/* v1.4.10.316 — the AV switch profile: each section says why it matters. */
.amib-blurb{display:block;color:var(--text-mute);font-size:12px;line-height:1.45;margin-top:2px;max-width:70ch;}
@media (max-width:700px){ .amib-blurb{display:none;} }

/* ── v1.4.10.317 — re-linking after a Q-SYS design change ─────────────────── */
.qsy-broken{display:flex;align-items:center;gap:12px;padding:11px 13px;margin:0 0 12px;border-radius:7px;
  border:1px solid var(--warn,#b45309);background:rgba(180,83,9,.08);}
.qsy-broken-main{flex:1;min-width:0;font-size:12px;line-height:1.6;color:var(--text);}
.qsy-broken .btn{flex:none;}
.qsy-ok-note{display:flex;align-items:center;gap:8px;padding:14px;border-radius:7px;font-size:13px;
  border:1px solid var(--ok,#15803d);background:rgba(21,128,61,.07);}
/* The head row carries a bulk action, so it stops being a bare caption. */
.qsy-sys-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.qsy-sys-head .btn{margin-left:auto;text-transform:none;letter-spacing:0;}
.qsy-rb-row{align-items:flex-start;}
.qsy-rb-was{opacity:.8;}
.qsy-rb-actions{display:flex;align-items:flex-start;gap:10px;flex-wrap:wrap;justify-content:flex-end;}
.qsy-rb-target{text-align:right;min-width:0;}
.qsy-rb-why{margin-top:2px;}
.qsy-why.warn{color:var(--warn,#b45309);font-weight:600;}
.qsy-rb-sugs{display:flex;flex-direction:column;gap:8px;}
.qsy-rb-sug{display:flex;align-items:center;gap:10px;justify-content:flex-end;}
.qsy-pick-row{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.qsy-pick-row.is-taken{opacity:.5;cursor:not-allowed;}
.qsy-pick-row.is-taken:hover{background:none;}
@media (max-width:700px){
  .qsy-broken{flex-direction:column;align-items:stretch;}
  .qsy-broken .btn{width:100%;min-height:40px;}   /* v1.4.10.473: 40 here and below, the touch layer's one floor (were 44) */
  .qsy-rb-row{flex-direction:column;}
  .qsy-rb-actions,.qsy-rb-sug{justify-content:flex-start;width:100%;}
  .qsy-rb-target{text-align:left;}
  .qsy-sys-head .btn{margin-left:0;width:100%;min-height:40px;}
  .qsy-rb-actions .btn{min-height:40px;}
}

  /* ══ DEVICE ESTATE: lineage strip + aligned room tables (v1.4.10.320) ═════ */
  .est-lineage{display:inline-flex;align-items:center;gap:6px;flex-shrink:0;max-width:40%;overflow:hidden;}
  .est-lin-item{display:inline-flex;align-items:center;gap:6px;min-width:0;}
  .est-lin-mark{width:22px;height:22px;flex-shrink:0;border-radius:6px;overflow:hidden;
    display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid var(--line);}
  .est-lin-mark img{width:100%;height:100%;object-fit:contain;display:block;}
  .est-lin-mark.ph{background:var(--surface-2);color:var(--text-dim);font-size:11px;font-weight:700;}   /* v1.4.10.473: 11 - 10px is for uppercase badges only */
  .est-lin-name{font-size:12px;color:var(--text-mute);font-weight:500;   /* v1.4.10.473: the quiet-chip look, 12/500 (was 12/600, no such look) */
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:150px;}
  .est-lin-sep{display:inline-flex;color:var(--text-dim);opacity:.55;flex-shrink:0;}
  .est-lin-sep svg{width:12px;height:12px;}

  /* Every room's table agrees on one grid, so the columns line up down the
     whole page instead of each room sizing to its own content. */
  table.est-fixed{table-layout:fixed;width:100%;}
  table.est-fixed col.ec-dev{width:auto;}
  table.est-fixed col.ec-st{width:150px;}
  table.est-fixed col.ec-loc{width:190px;}
  table.est-fixed col.ec-act{width:104px;}
  /* The ellipsis is for TEXT columns. Applied to the actions cell it clipped
     the two buttons and drew a "…" beside them, which reads as a hidden third
     action that does not exist. */
  table.est-fixed td{overflow:hidden;text-overflow:ellipsis;}
  table.est-fixed td.actions-cell{overflow:visible;text-overflow:clip;}
  table.est-fixed td .device-name>div:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

  @media(max-width:700px){
    .est-lineage{display:none;}
    table.est-fixed col.ec-st{width:106px;}
    table.est-fixed col.ec-act{width:84px;}
    table.est-fixed col.ec-loc{width:96px;}
  }

  /* ══ POLISH PASS (v1.4.10.321) ═══════════════════════════════════════════
     Faults found by walking every client surface at 1400 AND 390, which is how
     they were found at all: `.cd-hero` is `overflow:hidden`, so a stat tile
     wider than its track is CLIPPED rather than pushing the document wide —
     a documentElement scrollWidth check reports 0px overflow and the page
     still has "369 DEVICE" and "6 OPEN TICKET" sliced off at the edge. */
  @media(max-width:700px){
    /* Three tracks across 390px gives each tile ~105px; the icon alone is 30px
       and "OPEN TICKETS" cannot fit beside it. Two tracks, tighter chrome. */
    .cd-stats{grid-template-columns:repeat(2,1fr);gap:8px;}
    .cd-stat{padding:8px 10px;gap:8px;}
    .cd-stat .ic{width:26px;height:26px;}
    .cd-stat .ic svg{width:14px;height:14px;}
    .cd-stat .v{font-size:20px;}
    .cd-stat .l{font-size:11px;letter-spacing:.06em;
      overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
    /* The head is one flex row: at 390px the title, the count line and the
       action button were laid over each other. Let it wrap and give the
       sub-line its own row. */
    .cust-panel-head{flex-wrap:wrap;}
    .cust-panel-head h3{flex:0 0 auto;}
    .cest-sub{margin-left:0;order:3;width:100%;}
    .cust-panel-head .btn{margin-left:auto;}
  }
  /* A status pill is a label, not a paragraph — "Global default" was breaking
     across two lines and spilling out of its cell in the SLA table. */
  .cust-panel .data-table .pill{white-space:nowrap;}

  /* ══ DEVICE ROW, REBUILT (v1.4.10.322) ═══════════════════════════════════
     The address and the status detail ride ONE secondary line under the device
     name, so a row is the same height whether or not it has anything to report
     — 30 of 80 rows had an empty Detail cell and the ones that did have a
     message wrapped to 111px. */
  .est-tbl .device-name{display:flex;align-items:center;gap:10px;min-width:0;}
  .est-tbl .dv-id{min-width:0;flex:1;}
  .dv-name{font-weight:600;font-size:13px;line-height:1.25;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .dv-sub{display:flex;align-items:center;gap:6px;margin-top:2px;font-size:12px;
    color:var(--text-dim);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .dv-ip{font-family:var(--font-mono);font-variant-numeric:tabular-nums;flex-shrink:0;}
  .dv-more{opacity:.7;}
  .dv-dot{opacity:.5;flex-shrink:0;}
  .dv-det{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
  .dv-det.err{color:var(--err);}
  .dv-det.warn{color:var(--warn);}
  table.est-fixed td{padding-top:7px;padding-bottom:7px;vertical-align:middle;}
  /* The hidden-device count is a control now, not a sentence in a table row. */
  button.est-loc-more{margin-left:auto;border:1px solid var(--line);background:var(--surface);
    color:var(--text-dim);font-size:11px;font-weight:500;font-family:inherit;
    border-radius:999px;padding:2px 9px;cursor:pointer;flex-shrink:0;}
  button.est-loc-more:hover{border-color:var(--accent-2);color:var(--accent-deep);background:var(--accent-glow);}
  @media(max-width:700px){
    button.est-loc-more{min-height:40px;}
    .dv-sub{font-size:12px;}
  }

  /* The device status filter is five chips; at 390px the last two ("Offline",
     "Not monitored") were sliced off the right-hand edge of the segmented
     control. The counts on those two are exactly what someone opens this page
     for. It wraps at phone width instead of scrolling, because a cut-off chip
     gives no hint that there is more to the right. */
  /* NB this must out-specify `#content .seg{flex-wrap:nowrap;overflow-x:auto}`
     further up, which makes every segmented control a swipeable strip. That is
     right for the asset TAB strip it was written for — tabs are navigation and
     you swipe to the one you want. It is wrong here: these are COUNTS, and the
     whole reason to open this page is to compare them. Measured at 390px: the
     strip scrolls, but 205px of it — "Offline 30" and "Not monitored 171" —
     sat off-screen behind a swipe with no affordance saying so. */
  @media(max-width:700px){
    #content .seg.dev-seg{flex-wrap:wrap;overflow-x:visible;gap:4px;}
    #content .seg.dev-seg .seg-btn{flex:1 1 auto;min-height:40px;white-space:nowrap;}
  }

  /* v1.4.10.322 — beat the generic `table.dt{min-width:500px}` phone floor for
     the estate tree. That floor is why v269 had to make each `.est-loc` a
     horizontal scroller: the row was six columns wide and could not fit 375px.
     The row is three columns now (device+sub-line, status, actions), so it fits
     without a scroller — and a table you have to swipe sideways to read the
     status of is worse than a truncated device name. `.est-loc` keeps its
     overflow-x:auto so nothing is CLIPPED if a name is unusually long. */
  @media(max-width:700px){
    table.dt.est-tbl.est-fixed{min-width:0;}
    /* Dropping the floor alone was NOT enough and measurably worse: with the
       status pill at 106px and the actions cell at 84px, a 298px room left the
       device column ~50px and every name rendered as "P…", "C…", "IO…". The
       row is already tappable and opens the device, where Edit and Delete
       live — so the actions cell goes at phone width and the name gets the
       space back (~190px). */
    table.est-fixed td.actions-cell{display:none;}
    /* The <col> must collapse too. A hidden CELL does not release its COLUMN
       under table-layout:fixed — the 84px actions track was still reserved, so
       the device name was still only getting ~122px and still reading "CXD…". */
    table.est-fixed col.ec-act{width:0;}
    /* 104px was 3px short of the widest pill ("Not monitored"), and because the
       status cell is deliberately overflow:visible the pill grew the table's
       scrollWidth rather than being clipped — a 3px sideways creep the page
       sweep caught. */
    table.est-fixed col.ec-st{width:114px;}
  }

  /* A status pill is a shape, not a sentence: the generic ellipsis rule on
     est-fixed cells was drawing a "…" beside "Online" whenever the pill came
     within a few pixels of its track. */
  table.est-fixed td.dv-stcell{overflow:visible;text-overflow:clip;}

/* ════════════════ v1.4.10.324 — Start scan · As-built · Room QR settings · Add to room ════════════════ */
/* Ody panel: connected, not scanning yet */
.opi-start{display:flex;align-items:center;gap:14px;margin:6px 0 12px;padding:14px 16px;border:1.5px dashed color-mix(in srgb,var(--brand-blue) 55%,var(--line));
  background:color-mix(in srgb,var(--brand-blue) 6%,var(--surface));border-radius:7px;}
.opi-start-ic{flex:none;width:40px;height:40px;border-radius:6px;background:var(--accent-glow);color:var(--brand-blue);display:flex;align-items:center;justify-content:center;}
.opi-start-ic svg{width:20px;height:20px;}
.opi-start-txt{flex:1;min-width:0;font-size:13px;line-height:1.55;}
.opi-start-txt div{color:var(--text-mute);font-size:12px;margin-top:3px;}
.opi-start .btn{flex:none;min-height:40px;padding:0 18px;font-weight:600;}
@media (max-width:700px){ .opi-start{flex-direction:column;align-items:stretch;} .opi-start-ic{display:none;} .opi-start .btn{width:100%;} }

/* Room as-built */
.rab-drop{border:2px dashed var(--line-2,var(--line));border-radius:7px;padding:18px 14px;text-align:center;cursor:pointer;background:var(--surface-2);
  transition:border-color .12s,background .12s;margin-bottom:10px;outline:none;}
.rab-drop:hover,.rab-drop:focus-visible{border-color:var(--brand-blue);}
.rab-drop.on{border-color:var(--brand-blue);background:color-mix(in srgb,var(--brand-blue) 9%,var(--surface));}
.rab-drop-ic{display:inline-flex;width:34px;height:34px;border-radius:6px;align-items:center;justify-content:center;background:var(--accent-glow);color:var(--brand-blue);margin-bottom:6px;}
.rab-drop-ic svg{width:18px;height:18px;}
.rab-drop-t{font-size:13px;}
.rab-drop-t u{color:var(--brand-blue);text-decoration:none;font-weight:600;}
.rab-drop-s{font-size:12px;color:var(--text-mute);margin-top:3px;line-height:1.5;}
.rab-prog{display:grid;gap:4px;margin-bottom:8px;}
.rab-prog:empty{display:none;}
.rab-pline{display:flex;align-items:center;gap:8px;font-size:12px;padding:5px 9px;border:1px solid var(--line);border-radius:6px;background:var(--surface);min-width:0;}
.rab-pdot{width:8px;height:8px;border-radius:50%;background:var(--text-dim);flex:none;}
.rab-pline.run .rab-pdot{background:var(--brand-blue);animation:rabpulse 1s ease-in-out infinite;}
.rab-pline.ok .rab-pdot{background:var(--ok);} .rab-pline.err .rab-pdot{background:var(--err);}
.rab-pline.err .rab-pst{color:var(--err);}
@keyframes rabpulse{50%{opacity:.35;}}
.rab-pname{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;}
.rab-pst{flex:none;color:var(--text-mute);max-width:55%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rab-group{margin-top:8px;}
.rab-ghead{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:0 0 4px;font-weight:600;}
.rab-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-top:1px solid var(--line);}
.rab-group .rab-row:first-of-type{border-top:none;}
.rab-ic{flex:none;width:38px;height:38px;border-radius:6px;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  background:var(--surface-2);color:var(--text-mute);border:1px solid var(--line);}
.rab-ic.pdf{background:#FDECEC;color:#B42318;border-color:#F8C9C5;} .rab-ic.cad{background:#EAF2FF;color:var(--bc-blue-v1-deep);border-color:#C8DAFB;}
.rab-ic.img{background:#EAF7EE;color:#15803D;border-color:#BFE6CB;} .rab-ic.xls{background:#E9F6EF;color:#107C41;border-color:#BFE3CF;}
.rab-ic.doc{background:#EAF0FB;color:#2B579A;border-color:#C9D6EE;} .rab-ic.zip{background:#FFF4E0;color:#9A5B00;border-color:#F4DCAE;}
.rab-main{flex:1;min-width:0;}
.rab-title{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rab-meta{font-size:12px;color:var(--text-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rab-notes{font-size:12px;color:var(--text-mute);margin-top:2px;line-height:1.45;}
.rab-acts{display:flex;gap:4px;flex:none;}
.rab-acts .btn svg{width:14px;height:14px;}
@media (max-width:700px){
  .rab-row{flex-wrap:wrap;} .rab-acts{width:100%;justify-content:flex-end;}
  .rab-actlbl{display:none;} .rab-acts .btn{min-height:40px;min-width:40px;}
}

/* Room QR settings */
.qrs-lead{margin:0 0 12px;font-size:13px;line-height:1.6;color:var(--text-mute);}
.qrs-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;}
.qrs-item{position:relative;display:flex;align-items:flex-start;gap:10px;padding:11px 12px;border:1.5px solid var(--line);border-radius:7px;cursor:pointer;background:var(--surface);transition:border-color .12s,background .12s;}
.qrs-item.on{border-color:color-mix(in srgb,var(--brand-blue) 60%,var(--line));background:color-mix(in srgb,var(--brand-blue) 5%,var(--surface));}
.qrs-ic{flex:none;width:30px;height:30px;border-radius:6px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;font-size:15px;}
.qrs-txt{flex:1;min-width:0;display:block;font-size:13px;line-height:1.35;}
.qrs-txt b{font-weight:600;}   /* v1.4.10.473: each switch's name is a sub-heading, 13/600 (it was the <b> default, 700) */
.qrs-txt span{display:block;font-size:12px;color:var(--text-mute);margin-top:2px;line-height:1.45;}
.qrs-cb{position:absolute;opacity:0;width:1px;height:1px;}
.qrs-sw{flex:none;width:38px;height:22px;border-radius:11px;background:var(--line-2,#CDD7E6);position:relative;transition:background .15s;margin-top:4px;}
.qrs-sw::after{content:"";position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(15,23,42,.3);transition:transform .15s;}
.qrs-cb:checked + .qrs-sw{background:var(--brand-blue);}
.qrs-cb:checked + .qrs-sw::after{transform:translateX(16px);}
.qrs-cb:focus-visible + .qrs-sw{outline:2px solid var(--brand-blue);outline-offset:2px;}
.qrs-note{font-size:12px;color:var(--text-mute);margin:10px 0 0;line-height:1.55;}
.qrs-note:empty{display:none;}
.qrs-site{display:flex;align-items:center;gap:8px;margin-top:12px;padding:10px 12px;border:1px solid var(--line);border-radius:6px;font-size:13px;background:var(--surface-2);cursor:pointer;}
.qrs-site input{width:18px;height:18px;flex:none;}
.qrs-sum{margin:12px 0 0;padding-top:10px;border-top:1px dashed var(--line);}
.qrs-sum-h{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:6px;}
.qrs-sum-h .btn{text-transform:none;letter-spacing:0;}
.qrs-sum-h .btn svg{width:13px;height:13px;}
.qrs-chips{display:flex;flex-wrap:wrap;gap:4px;}
.qrs-chip{font-size:11px;font-weight:600;border-radius:99px;padding:2px 8px;border:1px solid var(--line);}
.qrs-chip.on{color:var(--brand-blue);border-color:color-mix(in srgb,var(--brand-blue) 40%,var(--line));background:var(--accent-glow);}
.qrs-chip.off{color:var(--text-dim);text-decoration:line-through;}
.loc-qr-check-row.off{opacity:.62;}
.loc-qr-check-row.off .loc-qr-check-dot{color:var(--text-dim);}
.lr-go{gap:4px;align-items:center;}
.lr-cog,.sd-room-cog{border:0;background:transparent;color:var(--text-dim);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;border-radius:5px;width:28px;height:28px;padding:0;}
.lr-cog:hover,.sd-room-cog:hover{color:var(--brand-blue);background:var(--accent-glow);}
.lr-cog svg{width:15px;height:15px;}
.sd-locrow{grid-template-columns:minmax(0,1fr) auto auto auto;}
.sd-room-cog{position:absolute;right:8px;bottom:8px;background:rgba(15,23,42,.55);color:#fff;backdrop-filter:blur(3px);}
.sd-room-cog:hover{background:rgba(15,23,42,.8);color:#fff;}
.sd-room-cog svg{width:15px;height:15px;}
@media (max-width:700px){
  .qrs-grid{grid-template-columns:1fr;}
  .lr-cog,.sd-room-cog{width:40px;height:40px;}
  .sd-locrow{grid-template-columns:minmax(0,1fr) auto;}
}

/* "Add to this room" + shared roomy form bits (.lmx) */
.lmx .lmx-step{display:flex;align-items:center;gap:9px;font-size:13px;font-weight:600;margin:16px 0 8px;}
.lmx .lmx-step:first-child{margin-top:2px;}
.lmx-n{width:22px;height:22px;border-radius:50%;background:var(--accent-glow);color:var(--brand-blue);font-size:12px;display:inline-flex;align-items:center;justify-content:center;flex:none;}
.lmx-kinds{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
.lmx-kind{display:flex;align-items:flex-start;gap:12px;text-align:left;border:1.5px solid var(--line);background:var(--surface);border-radius:8px;padding:14px 15px;cursor:pointer;font:inherit;color:var(--text);transition:border-color .12s,background .12s,box-shadow .12s;}
.lmx-kind:hover{border-color:color-mix(in srgb,var(--brand-blue) 50%,var(--line));}
.lmx-kind.on{border-color:var(--brand-blue);background:color-mix(in srgb,var(--brand-blue) 7%,var(--surface));box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-blue) 14%,transparent);}
.lmx-kic{flex:none;width:40px;height:40px;border-radius:6px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;font-size:18px;}
.lmx-kind.on .lmx-kic{background:var(--accent-glow);}
.lmx-kt{display:block;font-size:14px;line-height:1.35;}
.lmx-kt span{display:block;font-size:12px;color:var(--text-mute);font-weight:500;margin-top:3px;line-height:1.5;}
.lmx-seg{display:inline-flex;border:1.5px solid var(--line);border-radius:6px;padding:3px;background:var(--surface-2);gap:3px;margin-bottom:10px;}
.lmx-segb{border:0;background:transparent;border-radius:6px;padding:9px 16px;font:inherit;font-size:12px;font-weight:600;color:var(--text-mute);cursor:pointer;display:inline-flex;align-items:center;gap:7px;min-height:40px;}
.lmx-segb svg{width:15px;height:15px;}
.lmx-segb.on{background:var(--surface);color:var(--brand-blue);box-shadow:0 1px 3px rgba(15,23,42,.12);}
.lmx-drop{border:2px dashed var(--line-2,var(--line));border-radius:8px;padding:22px 16px;text-align:center;cursor:pointer;background:var(--surface-2);outline:none;transition:border-color .12s,background .12s;margin-bottom:12px;}
.lmx-drop:hover,.lmx-drop:focus-visible,.lmx-drop.on{border-color:var(--brand-blue);background:color-mix(in srgb,var(--brand-blue) 7%,var(--surface));}
.lmx-drop.has{border-style:solid;border-color:color-mix(in srgb,var(--ok) 55%,var(--line));background:color-mix(in srgb,var(--ok) 6%,var(--surface));}
.lmx-drop-ic{display:inline-flex;width:38px;height:38px;border-radius:6px;align-items:center;justify-content:center;background:var(--accent-glow);color:var(--brand-blue);margin-bottom:6px;}
.lmx-drop-ic svg{width:19px;height:19px;}
.lmx-drop-t{font-size:13px;word-break:break-word;}
.lmx-drop-t u{color:var(--brand-blue);text-decoration:none;font-weight:600;}
.lmx-drop-s{font-size:12px;color:var(--text-mute);margin-top:4px;}
.lmx-fsz{color:var(--text-mute);font-weight:500;margin-left:4px;}
.lmx-x{margin-left:8px;color:var(--err);font-weight:600;cursor:pointer;font-size:12px;}
.lmx-field{margin-bottom:12px;}
.lmx-field label{display:block;font-size:12px;font-weight:500;color:var(--text-mute);margin-bottom:6px;}
.lmx-in{width:100%;box-sizing:border-box;border:1.5px solid var(--line);border-radius:6px;padding:12px 14px;font:inherit;font-size:13px;background:var(--surface);color:var(--text);min-height:46px;}
.lmx-in:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-blue) 15%,transparent);}
textarea.lmx-in{min-height:84px;resize:vertical;line-height:1.5;}
.lmx-big{font-size:16px;font-weight:600;letter-spacing:-.012em;min-height:50px;}
.lmx-req{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--brand-blue);margin-left:4px;}
.lmx-opt{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin-left:4px;}
.lmx-hint{font-size:12px;color:var(--text-mute);margin-top:5px;min-height:0;}
.lmx-hint.good{color:var(--ok);} .lmx-hint.bad{color:var(--err);}
.lmx-vis{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--text-mute);padding:10px 12px;border-radius:6px;background:var(--surface-2);margin-top:4px;}
.lmx-vis svg{width:15px;height:15px;flex:none;}
.lmx-err{color:var(--err);font-size:13px;min-height:18px;margin-top:8px;}
.lmx-foot{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:14px;padding-top:12px;border-top:1px solid var(--line);flex-wrap:wrap;}
.lmx-foot .btn{min-height:42px;padding:0 18px;}
.lmx-save{font-weight:600;}
@media (max-width:700px){
  .lmx-kinds{grid-template-columns:1fr;}
  .lmx-seg{display:flex;} .lmx-segb{flex:1;justify-content:center;padding:9px 8px;}
  .lmx-foot .btn{flex:1;}
}

/* MIB manager v324: Ody-link lock, three ways to add, check reports, device test, the MIB editor */
.mibm-lock{display:flex;gap:12px;align-items:flex-start;padding:14px 16px;border:1.5px solid color-mix(in srgb,var(--warn) 45%,var(--line));background:color-mix(in srgb,var(--warn) 8%,var(--surface));border-radius:7px;font-size:13px;line-height:1.55;}
.mibm-lock-ic{font-size:20px;flex:none;}
.mibm-lock-how{margin-top:6px;color:var(--text-mute);font-size:12px;}
.mibm-tabs{display:flex;gap:4px;flex-wrap:wrap;border-bottom:1px solid var(--line);margin-bottom:10px;}
.mibm-tab{border:0;background:transparent;font:inherit;font-size:13px;font-weight:600;color:var(--text-mute);padding:9px 12px;border-bottom:2px solid transparent;cursor:pointer;display:inline-flex;align-items:center;gap:6px;min-height:40px;}
.mibm-tab svg{width:14px;height:14px;}
.mibm-tab.on{color:var(--brand-blue);border-bottom-color:var(--brand-blue);}
.mibm-linked{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:12px;color:var(--text-mute);margin-top:8px;}
.mibm-linked svg{width:14px;height:14px;color:var(--ok);}
.mibm-write{display:flex;gap:14px;align-items:center;justify-content:space-between;flex-wrap:wrap;padding:14px 16px;border:1px dashed var(--line);border-radius:7px;background:var(--surface-2);font-size:13px;}
.mibm-write > div{flex:1;min-width:220px;}
.mibm-libq{width:100%;box-sizing:border-box;border:1.5px solid var(--line);border-radius:6px;padding:10px 12px;font:inherit;font-size:13px;margin-bottom:8px;background:var(--surface);color:var(--text);}
.mibm-liblist{max-height:320px;overflow:auto;border:1px solid var(--line);border-radius:6px;}
.mibm-librow{display:flex;align-items:center;gap:10px;padding:8px 12px;border-top:1px solid var(--line);font-size:13px;}
.mibm-librow:first-child{border-top:none;}
.mibm-libmain{flex:1;min-width:0;}
.mibm-libmain .device-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.mibm-test{margin-top:6px;font-size:12px;padding:7px 10px;border-radius:6px;background:var(--surface-2);display:flex;align-items:center;gap:7px;line-height:1.45;}
.mibm-test.ok{background:color-mix(in srgb,var(--ok) 10%,var(--surface));color:var(--ok);}
.mibm-test.err{background:color-mix(in srgb,var(--err) 8%,var(--surface));color:var(--err);}
/* v1.4.10.450: a MIB test the site's Ody has not run yet (still queued) */
.mibm-test.wait{background:color-mix(in srgb,var(--warn) 10%,var(--surface));color:var(--warn);}
.mibm-spin{width:12px;height:12px;border-radius:50%;border:2px solid var(--line);border-top-color:var(--brand-blue);animation:spin .8s linear infinite;flex:none;}
.mibr{margin:8px 0 4px;padding:10px 12px;border:1px solid var(--line);border-radius:6px;background:var(--surface);font-size:12px;}
.mibr.ok{border-color:color-mix(in srgb,var(--ok) 40%,var(--line));}
.mibr.partial{border-color:color-mix(in srgb,var(--warn) 45%,var(--line));}
.mibr.unusable{border-color:color-mix(in srgb,var(--err) 40%,var(--line));}
.mibr-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px;}
.mibr-stats{display:flex;gap:12px;flex-wrap:wrap;color:var(--text-mute);margin:2px 0 4px;}
.mibr-stats b{color:var(--text);}
.mibr-l{margin-top:3px;line-height:1.5;}
.mibr-l.err{color:var(--err);} .mibr-l.warn{color:#8a5a00;}
.mibw-cols{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(0,1fr);gap:14px;}
.mibw-ta{width:100%;box-sizing:border-box;min-height:430px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:13px;line-height:1.5;border:1.5px solid var(--line);border-radius:6px;padding:12px;background:var(--surface-2);color:var(--text);resize:vertical;tab-size:4;white-space:pre;overflow:auto;}
.mibw-ta:focus{outline:none;border-color:var(--brand-blue);}
.mibw-bar{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px;align-items:center;}
.mibw-bar .btn{min-height:40px;}
.mibw-guide{font-size:12px;line-height:1.55;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:12px 14px;align-self:start;}
.mibw-guide ol{margin:6px 0 0;padding-left:18px;}
.mibw-guide li{margin-bottom:6px;}
.mibw-guide code,.mibw-sample code{font-size:12px;}
.mibw-sample{font-size:12px;line-height:1.6;}
@media (max-width:900px){ .mibw-cols{grid-template-columns:1fr;} .mibw-ta{min-height:320px;} }

/* ═════════════════════════════════════════════════════════════════════════
   v1.4.10.327 — BRAND LAYER: Control wears avdesk.com.au (site v1.7.x)
   ─────────────────────────────────────────────────────────────────────────
   Jay: "Match colours and aesthetics as our main client site. Control still
   needs to be white though."

   This block is LAST in the sheet on purpose: it re-declares the tokens the
   whole app already reads (so ~600 var(--brand-blue)/var(--grad)/var(--text)
   uses move with it) and then restyles the shared primitives. Nothing above
   was deleted — remove this block and the v326 look comes back.

   Palette + type are the marketing site's own values, not approximations:
     accent  #1B44C9 (site --accent: actions, links, key marks)
     grad    #2C6BFF → #5B4BFF → #8B44E8 at 112deg (site --brand-grad)
     ink     #0C1B2A / #46596B / #75899B, rules #DEE5EC / #C3CEDA
     paper   #FFFFFF, band #F4F7FA
     type    Inter 400–700 for every word and every code (v1.4.10.543 / v1.4.10.546), Poppins for the wordmark only, JetBrains Mono for source blocks
   The page stays WHITE. Navy (#0A1626) appears only where a photograph sits
   behind text (the site's scrim) — never as a page or chrome colour.
   ═════════════════════════════════════════════════════════════════════════ */
:root{
  --brand-blue:var(--bc-accent);
  --brand-purple:var(--bc-purple);
  --brand-grad:linear-gradient(112deg,var(--bc-grad-a) 0%,var(--bc-grad-b) 52%,var(--bc-purple) 100%);
  --brand-glow:0 6px 18px -8px rgba(var(--bc-grad-a-rgb),.62);
  --grad:var(--brand-grad);
  --accent:var(--bc-accent);
  --accent-2:var(--bc-accent);
  --accent-deep:var(--bc-accent-deep);
  --accent-soft:var(--bc-accent-soft);
  --accent-glow:rgba(var(--bc-accent-rgb),.09);
  --bg:#F4F7FA;
  --bg-2:#FFFFFF;
  --surface:#FFFFFF;
  --surface-2:#F4F7FA;
  --surface-3:#E9EEF4;
  --line:#DEE5EC;
  --line-2:#C3CEDA;
  --text:#0C1B2A;
  --text-mute:#46596B;
  --text-dim:#75899B;
  --info:var(--bc-info);
  --p3:var(--bc-accent);
  --electric:var(--bc-accent);
  --electric-2:var(--bc-grad-a);
  --navy:#F4F7FA;
  --navy-2:#F4F7FA;
  --navy-3:#E9EEF4;
  --cyan:var(--bc-info);
  --card:#FFFFFF;
  --border:#DEE5EC;
  --bg2:#FFFFFF;
  --brand:var(--bc-accent);
  --radius:8px;
  --r-ctl:4px;                       /* buttons, fields, selects, chips   */
  --shadow-sm:0 1px 2px rgba(12,27,42,.05);
  --shadow-md:0 8px 30px rgba(12,27,42,.06);
  --shadow-lg:0 18px 44px rgba(12,27,42,.14);
  --font-display:var(--font-brand);
  --font-body:var(--font-brand);
  --font-mono:var(--font-code);
  --mono:var(--font-code);
  --av-ease:cubic-bezier(.22,.61,.36,1);
  /* the one dark tone, for photo scrims only */
  --av-navy:var(--bc-navy); --av-navy-line:#25384F; --av-led:#3ED27C;
}

/* ═════════════════════════════════════════════════════════════════════════
   v1.4.10.677 — THE BRAND COLOURS, ONCE
   ─────────────────────────────────────────────────────────────────────────
   What was wrong: the brand's colours were tokens in name only. The block
   above sets --accent and its friends, and beside about 1,900 uses of those
   tokens the same colours were typed out 687 more times across this sheet:
   as hex, and as rgba(27,68,201,…) wherever a tint or a shadow needed one,
   which a hex token cannot give. Nothing looked wrong, but changing the
   brand meant finding every one of them, and white labelling (an
   integrator's own colours) needs the brand to change in one place.

   Every one of those literals now reads a --bc-* token, and the tokens above
   (--accent, --brand-blue, --brand-grad, --av-navy and the rest) read them
   too. Each token's value here is the literal it replaced, so the sheet
   computes to exactly what it did before: put the literals back and the two
   files are the same, character for character. A colour with an alpha takes
   the -rgb form: rgba(var(--bc-accent-rgb),.16).

   KEEP IN STEP with BRAND.colors in js/01-core.js (a print window is its own
   document, so it is handed the values). Write a brand colour here once and
   use the token; never type the hex again. Status colours (red, amber,
   green) and colours that are data (a chart series, a leave type, a task
   status) are not brand colours and are not here.
   ═════════════════════════════════════════════════════════════════════════ */
:root{
  /* today's brand (v1.4.10.327, avdesk.com.au) */
  --bc-accent:#1B44C9;        --bc-accent-rgb:27,68,201;          /* actions, links, key marks */
  --bc-accent-deep:#153399;                                       /* the accent, pressed */
  --bc-accent-soft:#EDF1FD;                                       /* the accent as a wash behind text */
  --bc-accent-lite:#8FB0FF;   --bc-accent-lite-rgb:143,176,255;   /* the accent on a dark ground */
  --bc-grad-a:#2C6BFF;        --bc-grad-a-rgb:44,107,255;         /* the gradient's start */
  --bc-grad-b:#5B4BFF;        --bc-grad-b-rgb:91,75,255;          /* its middle */
  --bc-purple:#8B44E8;        --bc-purple-rgb:139,68,232;         /* its end, and the second brand colour */
  --bc-info:#6B45E6;
  --bc-navy:#0A1626;          --bc-navy-rgb:10,22,38;             /* the one dark tone */
  /* the brand before v327, still written into the older rules above the brand layer */
  --bc-blue-v1:#2563EB;       --bc-blue-v1-rgb:37,99,235;
  --bc-blue-v1-deep:#1D4ED8;  --bc-blue-v1-2:#4F7DF0;
  --bc-purple-v1:#7C3AED;     --bc-purple-v1-rgb:124,58,237;
}

/* ── Type: Inter everywhere since v1.4.10.543 (Poppins before it). The default figures and letters,
      no stylistic sets, as TowerDesk draws them. html stays 14px (the whole sheet is
      sized against it). ── */
html,body{font-family:var(--font-body);font-feature-settings:normal;letter-spacing:-.004em;}
h1,h2,h3,h4{font-family:var(--font-display);font-weight:600;letter-spacing:-.012em;}
button,input,select,textarea{font-family:inherit;}
::selection{background:rgba(var(--bc-accent-rgb),.16);color:var(--text);}
.page-title{font-weight:600;letter-spacing:-.024em;}
.panel-head h3{font-weight:600;letter-spacing:-.01em;}   /* v1.4.10.473: -.01em, the panel title's (was -.012em) */
a{color:var(--accent);}

/* ── Header: white bar, the site's 2px gradient edge, the dark wordmark ── */
.topbrand{position:relative;}
.topbrand::before{content:'';position:absolute;left:0;right:0;top:0;height:2px;background:var(--brand-grad);pointer-events:none;z-index:1;}
.topbrand .brand-area{gap:12px;}
.topbrand .logo-mark img.av-wordmark{height:24px;width:auto;display:block;}
.topbrand .brand-text{padding-left:12px;border-left:1px solid var(--line);gap:3px;}
.topbrand .brand-text strong{font-family:var(--font-display);font-size:14px;font-weight:600;letter-spacing:-.012em;color:var(--text);line-height:1;}
.topbrand .brand-text small{font-family:var(--font-body);font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--text-dim);margin-top:0;}   /* v1.4.10.473: the uppercase label look said here too (was mono 10/500, put right only by a rule further down) */
@media(max-width:560px){ .topbrand .brand-text{display:none;} .topbrand .logo-mark img.av-wordmark{height:21px;} }

/* ── Primary nav: quiet links; the current section gets the site's
      underline (in the gradient) instead of a tinted pill ── */
.nav-item,.nav-dd-trigger{border-radius:var(--r-ctl);color:var(--text-mute);font-weight:500;}
.nav-item:hover,.nav-dd-trigger:hover{background:var(--surface-2);color:var(--text);}
.nav-item.active,.nav-dd-trigger.has-active{background:transparent;color:var(--text);font-weight:600;}
.nav-item.active .ico,.nav-dd-trigger.has-active .ico{color:var(--brand-blue);}
.nav-dd.open .nav-dd-trigger{background:var(--surface-2);color:var(--text);}
.topnav .nav-item.active::after,.topnav .nav-dd-trigger.has-active::after{
  content:'';position:absolute;left:12px;right:12px;bottom:-7px;height:2px;background:var(--brand-grad);border-radius:2px 2px 0 0;}
.nav-dd-trigger{position:relative;}
.nav-dd-menu{border-radius:var(--radius);border-color:var(--line);box-shadow:0 18px 44px rgba(12,27,42,.14);}
.nav-dd-item{border-radius:var(--r-ctl);}
.nav-dd-item.active{background:var(--accent-soft);color:var(--brand-blue);}
.nav-item .nav-badge,.nav-dd-item .nav-badge,.nav-dd-trigger .nav-badge{border-radius:3px;}

/* ── Header controls ── */
.search-box input,.site-picker,.icon-btn{border-radius:var(--r-ctl);}
.search-box input{border-color:var(--line-2);background:var(--surface);}
/* The header search used a FIXED 300px input inside a box allowed to shrink:
   when the bar got tight the box shrank and the input did not, so it slid
   under the integrator picker. The box now owns the width (flex-basis) and the
   input fills it; the grow-on-focus is the basis, not the input. */
.topbrand .search-box{flex:0 1 300px;min-width:170px;transition:flex-basis .2s var(--av-ease);}
.topbrand .search-box:focus-within{flex-basis:340px;}
.topbrand .search-box input,.topbrand .search-box input:focus{width:100%;}
.site-picker{border-color:var(--line-2);box-shadow:none;}
.search-box input:focus,.site-picker:focus{border-color:var(--bc-grad-a);box-shadow:0 0 0 3px rgba(var(--bc-grad-a-rgb),.14);outline:none;}
.icon-btn{border-color:var(--line-2);}
.icon-btn:hover{color:var(--brand-blue);border-color:var(--text-dim);background:var(--surface);}
.avatar{background:var(--av-navy);border-radius:var(--r-ctl);font-weight:600;letter-spacing:.02em;}

/* ── Buttons: machined 4px edges; the primary carries the gradient and the
      site's glow and lift ── */
.btn{border-radius:var(--r-ctl);font-weight:500;}
.btn.xs{border-radius:3px;}
.btn.ghost{border-color:var(--line-2);}
.btn.ghost:hover,.btn:hover{border-color:var(--text-dim);}
/* v1.4.10.473: border:1px transparent (was 0) — the primary is as tall as the bordered .btn / .btn.ghost beside it at every size
   (36 vs 38, .sm 30 vs 32); background-origin:border-box keeps the gradient edge to edge with no seam */
.btn.primary{background:var(--brand-grad);border:1px solid transparent;background-origin:border-box;color:#fff;font-weight:600;box-shadow:var(--brand-glow);
  transition:filter .2s var(--av-ease),box-shadow .2s var(--av-ease),transform .2s var(--av-ease);}
.btn.primary:hover{filter:saturate(1.12) brightness(1.06);box-shadow:0 10px 24px -8px rgba(var(--bc-grad-b-rgb),.55);transform:translateY(-1px);}
.btn.primary:active{transform:none;}
.btn.primary:disabled,.btn.primary[disabled]{box-shadow:none;transform:none;filter:grayscale(.3);}
/* v1.4.10.534: a disabled button reads as one everywhere (a greyed Set / Read / command on an offline device drew at full
   colour); hover leaves it alone */
.btn:disabled,.btn[disabled]{opacity:.5;cursor:not-allowed;}
.btn:disabled:hover,.btn[disabled]:hover{border-color:var(--line-2);filter:none;transform:none;}
.btn.primary:disabled:hover,.btn.primary[disabled]:hover{border-color:transparent;filter:grayscale(.3);box-shadow:none;}
.btn.danger,.btn.warn,.btn.ok{border-radius:var(--r-ctl);}
.btn:focus-visible{outline:3px solid rgba(var(--bc-grad-a-rgb),.38);outline-offset:2px;}

/* ── Fields ── */
.field input,.field select,.field textarea,.inp{border-radius:var(--r-ctl);border-color:var(--line-2);}
.field input:focus,.field select:focus,.field textarea:focus,.inp:focus{border-color:var(--bc-grad-a);box-shadow:0 0 0 3px rgba(var(--bc-grad-a-rgb),.14);}
.field label{color:var(--text-mute);font-weight:500;}
.input-wrap:focus-within .input-ico{color:var(--bc-grad-a);}
.check input{accent-color:var(--brand-blue);}

/* ── Surfaces: hairline + a soft lift, 8px corners ── */
.panel,.dash-hero,.dk,.dash-attn,.dash-okline,.akpi,.toast{border-radius:var(--radius);}
.panel{border-color:var(--line);}
.modal{border-radius:10px;border-color:var(--line);}
.pill{border-radius:var(--r-ctl);}
.seg{border-radius:var(--r-ctl);background:var(--surface-2);}
.seg .seg-btn,.seg > button{border-radius:3px;}
.ins-tab{border-radius:var(--r-ctl);}
.ins-tab.active{background:var(--accent-soft);color:var(--brand-blue);}
.empty .empty-ico{border-radius:var(--radius);background:var(--surface-2);border:1px solid var(--line);}

/* Section labels ("LIVE ESTATE") take the site's kicker: a short gradient
   rule, sentence weight, ink-2. */
.dash-sec > span{color:var(--text-mute);letter-spacing:.06em;display:inline-flex;align-items:center;gap:9px;}
.dash-sec > span::before{content:'';width:22px;height:3px;background:var(--brand-grad);flex:none;}

/* Dashboard KPI accents: the blue tile's edge was the old gradient. */
.dk.blue::before{background:var(--brand-grad);}

/* ─────────────────────────────────────────────────────────────────────────
   HEROES & IDENTITY BANDS — the site's navy page hero (.phero / .arrive):
   #0A1626, the brand-blue bloom top-right, a faint drafting grid, a 2px
   gradient edge. The PAGE stays white; only these bands carry colour — Jay:
   "white = not a dark website, the heroes can still be colour to match how
   our site looks".

   The band re-points the app's own tokens for everything inside it
   (--text, --line, --surface…), so a pill, a ghost button, a gauge track or a
   stat chip inside a hero follows without a rule of its own. The asset
   gauge's grey track is var(--surface-3), for example — it becomes a faint
   white arc here with no extra CSS.
   ───────────────────────────────────────────────────────────────────────── */
.page-hero,.det-hero,.asset-hero,.asset-hero.scoped,.dash-hero,.cd-hero,
.ah-head,.site-ed-head,.tkt-head,.user-ed-head,.hgm-hero,.ast-card .ac-banner,.nt-preview .npv-bar{
  --text:#FFFFFF; --text-mute:#C3D0DE; --text-dim:#8FA6C4;
  --line:#25384F; --line-2:#3A5170;
  --surface:#122237; --surface-2:#1B3049; --surface-3:rgba(255,255,255,.12); --bg:#122237; --navy-3:#1B3049;
  --brand-blue:var(--bc-accent-lite); --accent:var(--bc-accent-lite); --accent-glow:rgba(var(--bc-accent-lite-rgb),.14); --accent-soft:rgba(var(--bc-accent-lite-rgb),.14);
  --ok:#3ED27C; --warn:#FFB000; --err:#FF6B5E; --on-warn:#1b1300;
  background:
    var(--brand-grad) top left/100% 2px no-repeat,
    radial-gradient(640px 300px at 94% -24%,rgba(var(--bc-grad-a-rgb),.34),transparent 70%),
    radial-gradient(520px 260px at -4% 125%,rgba(var(--bc-grad-b-rgb),.16),transparent 70%),
    var(--bc-navy);
  color:#fff;
  border-color:#25384F;
}
.page-hero,.det-hero,.asset-hero,.asset-hero.scoped,.dash-hero,.cd-hero{
  border:1px solid #25384F;border-radius:var(--radius);
  box-shadow:0 18px 44px -26px rgba(var(--bc-navy-rgb),.55);
}
.ah-head,.site-ed-head,.tkt-head,.user-ed-head{border-radius:10px 10px 0 0;}
/* grid: the site's drafting lines, white at 4%, fading toward the copy */
.page-hero::before,.det-hero::before,.asset-hero-grid{
  background-image:linear-gradient(rgba(255,255,255,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.045) 1px,transparent 1px);
  background-size:22px 22px;opacity:1;
  -webkit-mask-image:linear-gradient(100deg,transparent 28%,#000 72%);
          mask-image:linear-gradient(100deg,transparent 28%,#000 72%);
}
.asset-hero::before,.page-hero::after,.det-hero::after{display:none;}
.dash-hero::before{background:linear-gradient(rgba(255,255,255,.04) 1px,transparent 1px) 0 0/22px 22px,linear-gradient(90deg,rgba(255,255,255,.04) 1px,transparent 1px) 0 0/22px 22px;
  -webkit-mask-image:linear-gradient(100deg,transparent 35%,#000 80%);mask-image:linear-gradient(100deg,transparent 35%,#000 80%);}
.dash-hero::after{display:none;}
.page-hero .page-title,.det-hero .page-title,.asset-hero h2,.dh-hi{color:#fff;font-weight:600;letter-spacing:-.024em;}
.page-hero .page-sub,.det-hero .page-sub,.asset-hero .ah-lead{color:#C3D0DE;opacity:1;}

/* the eyebrow: the site's mono status line with its live LED */
.ph-eyebrow,.ah-eyebrow{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;letter-spacing:.07em;color:#9FB6D6;
  background:none;border:0;padding:0;border-radius:0;}
.ph-eyebrow .ph-live,.ah-eyebrow .live-dot,.ah-eyebrow .live-dot::after{background:var(--av-led);}
.ph-eyebrow .ph-live{width:7px;height:7px;box-shadow:0 0 0 0 rgba(62,210,124,.55);animation:avLed 2.6s var(--av-ease) infinite;}
@keyframes avLed{70%{box-shadow:0 0 0 7px rgba(62,210,124,0)}100%{box-shadow:0 0 0 0 rgba(62,210,124,0)}}
.ah-orgpill{background:rgba(255,255,255,.08);border:1px solid #3A5170;border-radius:3px;}

/* stat chips: the site's .kit tags — navy-2 on a navy line */
.ph-chip,.dh-chip,.ah-hm{background:#122237;border:1px solid #25384F;border-radius:var(--r-ctl);backdrop-filter:none;}
.ph-chip:hover{background:#1B3049;border-color:#3A5170;}
.ph-chip .ph-cv,.dh-chip .v,.ah-hm .v{color:#fff;font-weight:600;}
.ph-chip .ph-cl,.dh-chip .k,.ah-hm .l{color:#B6C5D6;opacity:1;}
.ah-hm .s{color:#8FA6C4;opacity:1;}
.ph-chip.tone-ok .ph-cdot{background:#3ED27C;box-shadow:none;}
.ph-chip.tone-warn .ph-cdot{background:#FFB000;box-shadow:none;}
.ph-chip.tone-err .ph-cdot{background:#E4574C;box-shadow:none;}
.ph-chip.tone-info .ph-cdot{background:#8B7BFF;box-shadow:none;}
.dh-fac-tr{background:rgba(255,255,255,.10);}
.ins-gauge-lab{fill:var(--text-mute);}

/* the page icon: the gradient tile; the ring a fine white rule */
.ph-art .ph-ring{border-color:rgba(255,255,255,.22);}
.ph-art .ph-ring.r2{border-color:rgba(255,255,255,.10);}
.ph-art .ph-medal,.ah-brandmark{border-radius:var(--radius);color:#fff;background:var(--brand-grad);border:0;box-shadow:0 8px 22px -8px rgba(var(--bc-grad-a-rgb),.7);}

/* buttons on navy: the site's ghost-on-dark and gradient primary */
.det-hero .btn.ghost,.cd-hero .btn.ghost,.page-hero .btn.ghost,.ah-head .btn.ghost,.dash-hero .btn.ghost{
  background:transparent;border-color:rgba(255,255,255,.42);color:#fff;}
.det-hero .btn.ghost:hover,.cd-hero .btn.ghost:hover,.page-hero .btn.ghost:hover,.ah-head .btn.ghost:hover,.dash-hero .btn.ghost:hover{
  background:#fff;border-color:#fff;color:var(--bc-navy);}
.det-hero .btn.primary,.cd-hero .btn.primary,.page-hero .btn.primary{background:var(--brand-grad);background-origin:border-box;color:#fff;border:1px solid transparent;}   /* v1.4.10.473: the transparent 1px edge of every primary (was border:0, 2px shorter than the hero's ghosts) */
.det-hero .btn.primary:hover{background:var(--brand-grad);background-origin:border-box;}
.dh-tag{border-radius:var(--r-ctl);}
.dh-mark{border-radius:var(--radius);}

/* a room photo behind the hero: the site's navy scrim over photography */
.det-hero.has-photo{
  background-image:var(--brand-grad),
    linear-gradient(90deg,rgba(var(--bc-navy-rgb),.94) 0,rgba(var(--bc-navy-rgb),.80) 48%,rgba(var(--bc-navy-rgb),.45) 100%),var(--dh-photo);
  background-size:100% 2px,cover,cover;background-position:top left,center,center;background-repeat:no-repeat;}
.det-hero.has-photo::before{opacity:.4;}

/* the ticket drawer's head: navy, keeping its priority tint as a glow */
.tkd-hero .tkd-hero-top{background:
    var(--brand-grad) top left/100% 2px no-repeat,
    radial-gradient(520px 240px at 100% -30%,color-mix(in srgb,var(--tkd-p,var(--bc-grad-a)) 42%,transparent),transparent 72%),
    var(--bc-navy);}

/* the portfolio hero's collapse control + its collapsed strip */
.asset-hero.collapsed{border-radius:var(--radius);}
.ahc-toggle,.ah-collapse{border-radius:var(--r-ctl);background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.3);}
.ahc-toggle:hover,.ah-collapse:hover{background:#fff;color:var(--bc-navy);}
.ahc-toggle:hover svg,.ah-collapse:hover svg{stroke:var(--bc-navy);}

/* ── Small brand marks, bars and icon tiles that carried the old two-stop
      gradient: they take the site's three-stop one ── */
.conv-item.system .cv-av,#av-resume .avr-mark,.ag-org-ico,.lt-fill,.adt-tab.active::before,
.ae-nav-item.active .ae-nav-num,.cat-track > span,.hs-pending-bar>span,.hx-factor-bar>span,
.fx-deprbar span,.hgm-btn.pri,.mh-badge,.anote-avatar,.cm-row-av,.fe-ico{background:var(--brand-grad);}
#av-resume .avr-mark{border-radius:10px;box-shadow:0 10px 24px -10px rgba(var(--bc-grad-a-rgb),.6);}
.ua-av.r-admin{background:var(--bc-navy);}
.loc-qr-brand{color:var(--brand-blue);}
.cm-editor a{color:var(--brand-blue);}

.mtcal-leg i.plan{background-image:repeating-linear-gradient(45deg,var(--bc-accent) 0 3px,#A9BFF5 3px 6px);}

/* ── Header across every browser width ─────────────────────────────────
   Measured on v326 AND on this build: between ~920px and ~1300px the bar
   carried brand + search + three 168px-minimum pickers + four icon buttons +
   the user chip, which added up wider than the window — at 1024px the name,
   role and avatar were sliced off the right edge by #app (overflow:hidden),
   so no document-overflow check could ever see it. The pickers now shrink
   (112px floor), and the least useful items step out in order as the window
   narrows: the "Control" label, then the name/role text. ≤920px keeps its
   existing avatar-only rules; ≤600px keeps the two-row phone header. */
@media(min-width:601px){
  .topbrand .site-picker{flex:0 1 190px;min-width:112px;max-width:220px;}
  /* v1.4.10.473: with an integrator or client in focus the site picker reads "All sites for this integrator" (166px of
     13px text) — at 190px it had room for 144 */
  .topbrand .intg-picker.scoped ~ #site-picker,.topbrand .cust-picker.scoped ~ #site-picker{flex-basis:220px;}
  .topbrand .search-box{flex:1 1 300px;max-width:340px;min-width:150px;}
}
@media(max-width:1360px){ .topbrand .user-info{display:none;} }
@media(max-width:1180px){
  .topbrand .brand-text{display:none;}
  .topbrand-inner{gap:10px;}
}
/* v1.4.10.473: the 20px gutter stops at the phone header — sitting last, it overrode the phone's 12px (and the notch
   inset), so on a phone the header stood 8px in from the page content below it */
@media(min-width:601px) and (max-width:1180px){ .topbrand-inner{padding-left:20px;padding-right:20px;} }
@media(max-width:920px){ .topbrand .search-box{min-width:120px;} }
/* v1.4.10.473: from 1181px (the "Control" label is back) the search box keeps room for its own placeholder: it shrinks no
   further than "Search everything…" (126px of 13px text) plus its 36px icon and 52px Ctrl K insets. At the 150px floor an
   administrator's box (three pickers) cut it to "Search everyth…" from 1181 to ~1230px and from 1361 to ~1405px (1366
   included). The room comes from the empty spacer, not the pickers: it gives up its 8px floor and the 16px gap after it
   (the brand stood 40px from the search while the bar was full), so no picker is narrower than before at any width. */
/* v1.4.10.504: …and from 921px, not 1181: with three pickers in the bar the box still stood at 209px at 1024 (the format crawl:
   "Search everythin…"). Below 1181 the "Control" label is already gone, so the pickers lose at most a few pixels of their
   190px basis and none of their 112px floor. */
@media(min-width:921px){
  .topbrand .search-box{min-width:218px;}
  .topbrand .tb-spacer{min-width:0;margin-right:-16px;}
}
/* v1.4.10.473: a touch screen draws the header bigger (40px buttons; 16px text in the search and the pickers, the iOS
   zoom guard), so the placeholder needs 154px, and the touch layer's #search-wrap{min-width:150px} (an ID: it outranks
   the rule above) cut it for an administrator, an integrator and a boss on an iPad Pro in landscape (1366: 60-108px
   of room). From 1181px it keeps a 248px box. The room comes from the two items the header already drops for room, one
   step earlier than with a mouse: up to 1560px the name and role text (the avatar still opens My profile; above 1560 an
   administrator's header holds it beside the full search) and, up to 1360px, the "Control" label. No picker is narrower
   than before. */
@media (hover:none) and (pointer:coarse) and (min-width:1181px){ #search-wrap{min-width:248px;} }
@media (hover:none) and (pointer:coarse) and (max-width:1560px){ .topbrand .user-info{display:none;} }
@media (hover:none) and (pointer:coarse) and (max-width:1360px){ .topbrand .brand-text{display:none;} }

/* Two-up form grids (asset editor, site editor, user editor…): a plain 1fr
   track keeps its content's min-content width, so one long select pushed the
   second column past the section at 768px and sliced the "Client" label and
   the building hint. Zero the minimum, same as the app shell (v1.4.10.1xx). */
.fs-grid{grid-template-columns:repeat(2,minmax(0,1fr));}
.fs-grid > *{min-width:0;}
@media (max-width:560px){ .fs-grid{grid-template-columns:minmax(0,1fr);} }

/* Asset window on a phone: the tag row (asset number · status · condition)
   ran under the absolutely-placed close button, hiding the condition chip
   ("2 – Good" sat behind the ×). Clear the button's width. */
@media (max-width:680px), (hover:none) and (pointer:coarse) and (max-width:1100px){ .ah-head.asd-hero .ah-tagrow{padding-right:40px;} }   /* v1.4.10.438: touch screens too */

/* Client/integrator header on a phone: .cd-actions is a nowrap flex row, so
   the fourth button (Delete) was sliced off the right edge by the hero.
   Pre-existing in v326 — it appears on both builds. Let it wrap. */
@media(max-width:760px){ .cd-actions{flex-wrap:wrap;} .cd-actions .btn{flex:0 1 auto;} }

/* iOS/phones: `.af-inner` is a flex row, so its footer links are flex ITEMS
   (computed display block) and the app-wide 40px tap floor never reached them
   — "Copyright & legal" was an 18px-tall target on a phone. Scoped to phones:
   a tap floor on a desktop footer just loosens the density (the v1.2.11
   lesson from the marketing site). */
/* Keyed on the DEVICE like the v1.4.10.25x tap-floor block above (hover:none
   AND pointer:coarse), not on width: a phone held sideways is an 844px-wide
   viewport and still a finger, and this can never touch desktop density. */
@media (hover:none) and (pointer:coarse){
  .af-inner > a.af-link{min-height:40px;display:inline-flex;align-items:center;}
}

/* Same shape elsewhere: a link that is a FLEX ITEM computes to display:block,
   so it is not an inline prose link and the 40px floor should reach it — the
   client head's integrator link (19px tall) and the asset card's make/model
   links (20px). Phones only. */
@media (hover:none) and (pointer:coarse){
  .cd-owner > a,
  .asd-kv-row .v > a{min-height:40px;display:inline-flex;align-items:center;}
}

/* The v128/v246 tap floors were keyed on WIDTH (≤760px / ≤700px), so a phone
   held sideways — an 844px-wide viewport, same finger — dropped straight
   through them: the assets Location picker measured 36px and the ticket's
   subject pencil 22px wide in landscape. Re-stated here on the device, at the
   same or higher specificity so the width-scoped rules above cannot win. */
@media (hover:none) and (pointer:coarse){
  .avsel-btn,.avsel-row,.atb-sel.atb-loc .avsel-btn{min-height:40px;}
  .apg-b{min-height:40px;min-width:40px;}
  .tkd-tabs .tkd-tab,.tkd-composer .cmp-tab,.conv-item .cv-fold,.cmp-draft-x,.cv-acttog{min-height:40px;}
  .tkd-subj-edit,.tkd-head .close{min-width:40px;min-height:40px;justify-content:center;}
}

/* Tablet-sized touch viewports (an iPad in portrait, 768px): the coarse-pointer
   block above deliberately grows the header controls to 40px — three 112px
   pickers, a 150px search, two 40px buttons, the brand and the user chip came
   to 874px in a 768px bar, so the avatar was sliced off the right by #app's
   overflow. Below 860px on a touch device the search gives way (⌘K and the
   nav still reach it, and the phone header already does this at ≤600px). */
@media (hover:none) and (pointer:coarse) and (max-width:860px) and (min-width:601px){
  .topbrand .search-box{display:none;}
  .topbrand .site-picker{flex:1 1 0;min-width:92px;max-width:150px;}
  .topbrand-inner{gap:8px;padding-left:16px;padding-right:16px;}
}


/* ── Scrollbars: thin, rule-coloured ── */
::-webkit-scrollbar-thumb{background:var(--line-2);border-color:var(--bg);}
::-webkit-scrollbar-thumb:hover{background:var(--text-dim);}

/* ── Footer ── */
.app-footer{background:var(--surface);}
.af-link{color:var(--brand-blue);}

@media (prefers-reduced-motion:reduce){
  .ph-eyebrow .ph-live{animation:none;}
  .btn.primary,.btn.primary:hover{transform:none;transition:none;}
}
/* Stragglers that named a face directly. The Comms email editor (.cm-editor)
   keeps its own face on purpose — it previews the sent email, not the app. */
.log-row .pill.blue{font-family:inherit;}   /* v1.4.10.473: only the ticket-ref pill (a code) takes the log's mono; the "resolved" pill is a word and keeps Poppins */
/* ═══ end v1.4.10.327 brand layer ═══ */

/* ── v1.4.10.328: the ticket hero carries the asset's picture ───────────── */
.tkd-hero-pic{flex:none;width:96px;height:72px;padding:0;border:1px solid rgba(255,255,255,.28);border-radius:8px;background:#fff;overflow:hidden;cursor:pointer;box-shadow:0 10px 24px -12px rgba(0,0,0,.6);display:block;}
.tkd-hero-pic img{width:100%;height:100%;object-fit:contain;display:block;padding:3px;box-sizing:border-box;}
.tkd-hero-pic:hover{border-color:rgba(255,255,255,.7);}
@media (max-width:700px){ .tkd-hero-pic{width:64px;height:48px;} }

/* ── v1.4.10.328: dashboard greeting band — role facts ─────────────────── */
.dh-facts{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px;}
.dh-fact{cursor:pointer;border-radius:8px;outline:none;}
.dh-fact:focus-visible{box-shadow:0 0 0 2px rgba(255,255,255,.7);}
.dh-fact .ph-chip{margin:0;}
.dh-today{color:rgba(255,255,255,.72);}
.dh-sub-sep{margin:0 7px;opacity:.55;}
@media (max-width:700px){ .dh-facts{gap:6px;margin-top:12px;} .dh-fact .ph-chip{padding:6px 10px;} .dh-fact .ph-chip .ph-cv{font-size:20px;} }

/* ── v1.4.10.329: Rooms — BUILDING VIEW ─────────────────────────────────────
   Each site is drawn as its buildings: an elevation per building, levels
   stacked top-down, rooms as status tiles on each level. Tones reuse the
   estate vocabulary (--ok / --warn / --err); the drawing itself stays white. */
.rb-body{padding:14px 16px 18px;}
/* v1.4.10.375: 560px, not 420px — at 1440px three 440px buildings left ~300px for a level's rooms, and four
   tiles to a row squeezed every ICC name to "C04-C03_…". Two buildings to a row there; three from ~1880px. */
.rb-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,560px),1fr));gap:18px;align-items:end;}
.rb-grid.one{grid-template-columns:minmax(0,1fr);}
.rb-building{display:flex;flex-direction:column;min-width:0;}
.rb-bhead{display:flex;align-items:center;gap:10px;padding:0 4px 10px;min-width:0;}
.rb-bhead-ico{width:32px;height:32px;border-radius:8px;background:var(--bc-navy);color:#fff;display:flex;align-items:center;justify-content:center;flex:none;}
.rb-bhead-ico svg{width:16px;height:16px;}
.rb-bhead-txt{flex:1;min-width:0;}
.rb-bname{font-weight:600;font-size:15px;letter-spacing:-.012em;color:var(--text);display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.rb-bcode{font-size:11px;}
.rb-bsub{font-size:12px;color:var(--text-dim);margin-top:1px;}
.rb-bhead-act{flex:none;}
.rb-c-bad{color:var(--err);font-weight:700;}
.rb-c-warn{color:#B45309;font-weight:700;}
.rb-elev{border:1.5px solid var(--line-2,var(--line));border-radius:8px 8px 0 0;background:#fff;position:relative;}
.rb-building.unfiled .rb-elev{border-style:dashed;}
.rb-roof{height:10px;background:linear-gradient(180deg,var(--bc-navy),#1B2C42);border-radius:6px 6px 0 0;margin:0 -1.5px;border:1.5px solid var(--bc-navy);border-bottom:0;}
.rb-floor{display:flex;min-height:64px;border-top:1px solid var(--line);border-left:5px solid var(--line-2,var(--line));background:#fff;}
.rb-floor:first-of-type{border-top:0;}
.rb-floor.ok{border-left-color:var(--ok);}
.rb-floor.warn{border-left-color:var(--warn);}
.rb-floor.bad{border-left-color:var(--err);}
.rb-floor.unset{background:repeating-linear-gradient(135deg,#fff 0 10px,#F7F9FC 10px 20px);}
.rb-floor-label{flex:none;width:126px;padding:10px 10px 10px 11px;border-right:1px solid var(--line);background:var(--surface-2,#F4F7FA);display:flex;flex-direction:column;justify-content:center;min-width:0;}
.rb-floor-name{font-weight:600;font-size:13px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rb-floor-sub{font-size:12px;color:var(--text-dim);margin-top:2px;line-height:1.35;}   /* v1.4.10.473: meta line 12 like the building's own (.rb-bsub), so "1 warn" reads one size on both (was 11) */
/* v1.4.10.375: the tiles are a grid that fits as many READABLE tiles (≥112px) as the level has room for,
   instead of a fixed four-to-a-row that shrank to 64px in a narrow building */
.rb-floor-rooms{flex:1;min-width:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:6px;padding:8px;align-content:start;}
.rb-empty{font-size:12px;color:var(--text-dim);padding:8px 4px;display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.rb-room{position:relative;display:flex;flex-direction:column;justify-content:center;gap:2px;min-width:0;width:auto;min-height:46px;padding:6px 8px;text-align:left;
  border:1px solid var(--line-2,var(--line));border-left-width:4px;border-radius:5px;background:#fff;color:var(--text);cursor:pointer;font:inherit;transition:box-shadow .12s,transform .12s;}
.rb-room:hover{box-shadow:0 6px 16px -8px rgba(12,27,42,.4);transform:translateY(-1px);z-index:1;}
.rb-room:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.rb-room.ok{border-left-color:var(--ok);}
.rb-room.warn{border-left-color:var(--warn);background:#FFFBEB;}
.rb-room.bad{border-left-color:var(--err);background:#FEF2F2;}
.rb-room.none{border-left-color:#C3CEDA;}
.rb-room.more,.rb-room.add{border-style:dashed;background:var(--surface-2,#F4F7FA);color:var(--brand-blue);align-items:center;justify-content:center;}
.rb-room.add{flex-direction:row;gap:4px;width:auto;min-width:72px;}
.rb-room.add svg{width:13px;height:13px;}
.rb-room-name{font-weight:600;font-size:12px;line-height:1.25;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word;}
.rb-grid.one .rb-floor-rooms{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));}
.rb-room-meta{display:flex;align-items:center;gap:4px 5px;flex-wrap:wrap;min-width:0;font-size:11px;color:var(--text-dim);line-height:1.2;}
.rb-room-code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;padding:0 4px;border-radius:3px;background:var(--surface-2,#F4F7FA);border:1px solid var(--line);flex:none;max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rb-room-st{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rb-room.bad .rb-room-st{color:var(--err);}
.rb-room.warn .rb-room-st{color:#B45309;}   /* v1.4.10.473: a tile's status line is one look, 11/400 - the tone is its colour, the tile's tint and its badge (was 700 / 600 / 400 by state) */
.rb-room-tix{position:absolute;top:-6px;right:-6px;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--err);color:#fff;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;display:flex;align-items:center;justify-content:center;border:2px solid #fff;}   /* v1.4.10.473: count badge, 10/700 uppercase .04em (was untracked) */
.rb-room.warn .rb-room-tix{background:#D97706;}
.rb-ground{height:14px;background:linear-gradient(180deg,#DEE5EC,#C3CEDA);border-top:2px solid #46596B;margin:0 -1.5px -1.5px;border-radius:0 0 3px 3px;position:relative;}
.rb-ground span{position:absolute;right:8px;top:0;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#46596B;line-height:12px;}
.rm-view-toggle{flex:none;}
.rm-view-toggle button{height:26px;}   /* v1.4.10.473: the Rooms toolbar stands 32, the height of the .btn.sm status chips that open the row (the switch was 36, then 34) */
@media (min-width:701px){ .sd-room-search:has(~ .rm-view-toggle){padding-top:4px;padding-bottom:4px;} }   /* v1.4.10.473: the Rooms page's filter box 32 like the chips beside it (34); the site Rooms toolbar keeps its 34 */
@media (max-width:760px){
  .rb-body{padding:10px;}
  .rb-grid{gap:14px;}
  .rb-floor{flex-direction:column;border-left-width:4px;}
  .rb-floor-label{width:auto;border-right:0;border-bottom:1px solid var(--line);padding:6px 10px;flex-direction:row;align-items:baseline;gap:8px;}
  .rb-floor-sub{margin-top:0;}
  .rb-floor-rooms{padding:6px;gap:5px;}
  .rb-floor-rooms{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));}
  .rb-room{min-height:44px;}
  .rb-bhead{flex-wrap:wrap;}
  .rb-bhead-act{width:100%;padding-left:42px;}
}
@media (max-width:360px){ .rb-floor-rooms{grid-template-columns:minmax(0,1fr);} }

/* ── v1.4.10.329: grouped asset register between phone and desktop ──────────
   Between 761px and ~1100px the grouped view is still a 10-column TABLE (the
   card layout only starts at 760px) inside .ag-org, which is overflow:hidden
   — so at 768px the Lifecycle / warranty / value columns were simply cut off
   with nothing to scroll. The site block scrolls sideways there now. */
@media (min-width:761px) and (max-width:1180px){
  .ag-site:has(> table.dt.asset-dt){ overflow-x:auto; -webkit-overflow-scrolling:touch; }
}
/* v1.4.10.329: on the narrowest phones (≤400px) the tick, the picture and the
   three row actions leave ~80px for the tag on line 1 — "#AST100…". The tag
   takes its own line under them instead, full width, marks beside it. */
@media (max-width:400px){
  table.dt.asset-dt tbody td.ar-tag{ order:4; flex:1 1 100%; }
  table.dt.asset-dt tbody td.ar-act{ order:3; }
}

/* v1.4.10.332: Administration → Security → Data boundaries */
.sec-bounds{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));gap:10px;}
.sec-bound{border:1px solid var(--line);border-radius:8px;padding:10px 12px;background:var(--surface-2,#F4F7FA);display:flex;flex-direction:column;gap:3px;}
.sec-bound b{font-size:13px;font-weight:600;color:var(--text);}
.sec-bound span{font-size:12px;color:var(--text-dim);line-height:1.45;}
.sec-toggle{display:flex;gap:10px;align-items:flex-start;}
.sec-toggle small{display:block;color:var(--text-dim);font-size:12px;margin-top:2px;line-height:1.4;}
.sec-toggle strong{font-size:13px;font-weight:600;}   /* v1.4.10.473: a switch's title 13/600 (it inherited the modal body's 14 at 700) */

/* ── v1.4.10.333 ── the Ody panel's Network card (scan interface, VLANs / routed subnets, uplink, Wi-Fi, DHCP, link health) ── */
.onet{border:1px solid var(--border);border-radius:10px;padding:10px 12px;margin:6px 0 10px;background:var(--surface);}
.onet-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px;}
.onet-head b{font-size:15px;font-weight:600;letter-spacing:-.012em;}
.onet-row{display:flex;gap:12px;align-items:flex-start;margin:6px 0;font-size:13px;}   /* v1.4.10.473: body 13 (the Ody's own address read 14, the page default) */
.onet-row > .lbl{min-width:110px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:600;color:var(--text-mute);padding-top:7px;}
.onet-sel{flex:1;min-width:0;}
.onet-sel select{width:100%;max-width:640px;}
.onet-ifaces{display:flex;flex-wrap:wrap;gap:6px;margin:4px 0 8px 122px;}
.onet-if{display:flex;align-items:center;gap:6px;border:1px solid var(--border);border-radius:8px;padding:4px 8px;font-size:12px;background:var(--surface-2,transparent);}
.onet-if.inuse{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent);}
.onet-if-ic{width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;border-radius:5px;font-size:11px;color:var(--text-mute);background:var(--surface-3,rgba(0,0,0,.05));}
.onet-if-ic svg{width:13px;height:13px;}
.onet-tblwrap{overflow-x:auto;max-width:100%;}
.onet-tbl{width:100%;border-collapse:collapse;font-size:13px;}
.onet-tbl th{text-align:left;font-weight:600;color:var(--text-mute);font-size:11px;text-transform:uppercase;letter-spacing:.06em;padding:4px 8px;border-bottom:1px solid var(--border);}   /* v1.4.10.473: a table header, 11/600 uppercase .06em like every th (was sentence case) */
.onet-tbl td{padding:6px 8px;border-bottom:1px solid var(--border);vertical-align:top;}
.onet-tbl tr.off td{opacity:.55;}
.onet-tbl .opi-acts{white-space:nowrap;text-align:right;}
.onet-grid{margin-top:8px;}
.opi-vlan{display:inline-block;font-size:11px;font-weight:600;letter-spacing:0;padding:1px 5px;border-radius:4px;background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--accent);}
.opi-net{margin-top:2px;}
.opi-mac.muted{color:var(--text-mute);font-style:italic;}
.warn-text{color:var(--warn);}
.pill.xs{font-size:11px;padding:1px 6px;line-height:16px;}
@media (max-width:760px){ .onet-row{flex-direction:column;gap:4px;} .onet-row > .lbl{padding-top:0;} .onet-ifaces{margin-left:0;} .onet .btn.xs, .onet select{min-height:40px;} .onet-tbl{min-width:560px;} .onet-row > div{max-width:100%;} }

/* ══ NIC ROWS — IP + MAC per interface (v1.4.10.334) ══ */
.avnic-head { display: flex; gap: 6px; padding-right: 34px; font-size: 12px; font-weight: 500; color: var(--text-mute); }
.avnic-head span { flex: 1; min-width: 0; }
.avnic-row .avnic-ip, .avnic-row .avnic-mac { flex: 1; min-width: 0; font-family: var(--font-mono);font-variant-numeric:tabular-nums; font-size: 13px; }
.avnic-chip { display: inline-flex; gap: 6px; }
.avnic-chip-mac { color: var(--text-mute); }
.detail-grid .dg-wide { grid-column: 1 / -1; }
.avnic-chips .avip-chip { white-space: normal; }
@media (max-width: 560px){
  .avnic-head { display: none; }
  .avnic-row { flex-wrap: wrap; }
  .avnic-row .avnic-ip { flex: 1 1 100%; }
  .avnic-row .avnic-mac { flex: 1 1 calc(100% - 46px); }
}
/* Review queue: a host Ody found earlier but does not see right now (v334) */
.vq-offline { font-size: 12px; color: var(--text-mute); margin-top: 8px; padding: 8px 12px; border: 1px dashed var(--border); border-radius: 8px; }
.vq-offline b { color: var(--text); }
.vq-seen { font-size: 11px; color: var(--text-mute); }

/* v336: per-address state on the interface chips */
.avip-chip .nic-dot { display:inline-block; width:7px; height:7px; border-radius:50%; background: var(--ok); margin-right:5px; vertical-align:middle; }
.avip-chip.nic-down { border-color: var(--err); }
.avip-chip.nic-down .nic-dot { background: var(--err); }
.avip-chip .nic-down-txt { color: var(--err); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; }

/* ══ Support toolbar — one structured bar (v1.4.10.337) ══ */
.tkx-toolbar.tkx-tb2 { display:block; background: var(--surface); border:1px solid var(--line); border-radius:10px; padding:10px 12px; margin-bottom:14px; }
.tkx-tb2 .tkx-tb-main { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.tkx-tb2 .tkx-search { flex:1 1 260px; min-width:200px; max-width:460px; }
.tkx-tb2 .tkx-search input { padding-right:34px; }
.tkx-tb2 .tks-clear { position:absolute; right:6px; top:50%; transform:translateY(-50%); width:24px; height:24px; border:0; background:transparent; color:var(--text-dim); border-radius:6px; display:flex; align-items:center; justify-content:center; cursor:pointer; }
.tkx-tb2 .tks-clear:hover { background: var(--surface-2); color: var(--text); }
.tkx-tb2 .tks-clear svg { width:14px; height:14px; }
.tkx-tb2 .tkx-tb-selects { display:flex; align-items:center; gap:8px; flex:0 1 auto; min-width:0; }
.tkx-tb2 .tkx-tb-selects .tkx-select { max-width:280px; width:auto; }
.tkx-tb2 .tkx-tb-acts { display:flex; align-items:center; gap:8px; margin-left:auto; flex:0 0 auto; flex-wrap:nowrap; }
.tkx-tb2 .tkx-tb-filters { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-top:8px; padding-top:8px; border-top:1px dashed var(--line); }
.tkx-tb2 .tkx-tb-count { margin-left:auto; font-size:12px; color:var(--text-mute); white-space:nowrap; }
.tkx-tb2 .tkx-tb-count b { color: var(--text); }
.tkx-tb2 .tkx-tb-clear { color: var(--accent); cursor:pointer; font-weight:600; }
.tkx-tb2 .tkx-tb-clear:hover { text-decoration: underline; }
.tkx-tb2 .tkx-ico-btn .ico { display:inline-flex; }
@media (max-width: 1100px){
  .tkx-tb2 .tkx-btn-lbl { display:none; }                /* icons only for Notifications / Export — the title tells */
  .tkx-tb2 .tkx-ico-btn { padding:0 10px; min-height:32px; }   /* v1.4.10.504: 32px like New ticket beside it (with no label and no vertical padding the button was its icon's 16 to 18px, the format crawl) */
}
@media (max-width: 700px){
  .tkx-toolbar.tkx-tb2 { padding:10px; }
  .tkx-tb2 .tkx-tb-main { flex-direction:column; align-items:stretch; gap:8px; }
  .tkx-tb2 .tkx-search { max-width:none; width:100%; flex:1 1 auto; }
  /* v1.4.10.473: one select per line — side by side each had 117px and cut its choice ("Open work (no", "Sort: Status (op") */
  .tkx-tb2 .tkx-tb-selects { display:grid; grid-template-columns:minmax(0,1fr); gap:8px; }
  .tkx-tb2 .tkx-tb-selects .tkx-select { max-width:none; width:100%; min-width:0; min-height:40px; }
  .tkx-tb2 .tkx-tb-acts { margin-left:0; display:grid; grid-template-columns:1fr auto auto auto; gap:8px; overflow:visible; }
  .tkx-tb2 .tkx-tb-acts .tkx-new { grid-column:1; order:0; min-height:40px; justify-content:center; }
  .tkx-tb2 .tkx-tb-acts .tkx-toggle { order:1; }
  .tkx-tb2 .tkx-tb-acts .tkx-ico-btn { order:2; min-width:40px; padding:0 10px; }
  .tkx-tb2 .tkx-tg-lbl { display:none; }
  .tkx-tb2 .tkx-tb-filters { flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; gap:8px; }
  .tkx-tb2 .tkx-tb-filters::-webkit-scrollbar { display:none; }
  .tkx-tb2 .tkx-chipset { flex:0 0 auto; }
  .tkx-tb2 .tkx-tb-count { margin-left:0; flex:0 0 auto; padding-right:4px; }
}

/* v337: the Control tab's network card */
.ctl-net .panel-head { display:flex; align-items:center; justify-content:space-between; gap:10px; }
.ctl-net-wrap { overflow-x:auto; -webkit-overflow-scrolling:touch; }
.ctl-net-tbl { width:100%; border-collapse:collapse; font-size:13px; }
.ctl-net-tbl th { text-align:left; font-size:11px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--text-mute); padding:8px 12px; border-bottom:1px solid var(--line); white-space:nowrap; }
.ctl-net-tbl td { padding:9px 12px; border-bottom:1px solid var(--line); vertical-align:top; }
.ctl-net-tbl tr:last-child td { border-bottom:0; }
.ctl-net-tbl code { font-family:var(--font-mono);font-variant-numeric:tabular-nums; font-size:12px; }
.ctl-net-tbl .pill.xs { font-size:11px; padding:1px 6px; vertical-align:middle; }

/* ══ Tasks rebuild (v1.4.10.338) ══ */
.tk-toolbar.tk-tb2 { display:block; background:var(--surface); border:1px solid var(--line); border-radius:10px; padding:10px 12px; margin-bottom:12px; }
.tk-tb2 .tk-tb-main { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.tk-tb2 .tk-search { flex:1 1 220px; max-width:420px; }
.tk-tb2 .tk-tb-right { flex-wrap:nowrap; }
.tk-tb2 .tk-tb-filters { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:8px; padding-top:8px; border-top:1px dashed var(--line); }
.tk-tb2 .tk-fsel { min-width:0; max-width:200px; font-size:13px; }
.tk-tb2 .tk-fsel.on { border-color:var(--brand-blue); color:var(--brand-blue); font-weight:400; }
.tk-tb2 .tk-group-sel { margin-left:4px; }
.tk-tb2 .tk-tb-count { margin-left:auto; font-size:12px; color:var(--text-mute); white-space:nowrap; }
.tk-tb2 .tk-tb-count b { color:var(--text); }
.tk-tb2 .tk-tb-clear { color:var(--accent); cursor:pointer; font-weight:600; }
.tk-tb2 .btn.on { background:var(--brand-blue); color:#fff; border-color:var(--brand-blue); }
.tk-selbox { width:18px; height:18px; flex:0 0 auto; accent-color: var(--brand-blue); }
.tk-bulkbar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; background:var(--brand-blue-soft, rgba(var(--bc-blue-v1-rgb),.08)); border:1px solid var(--brand-blue); border-radius:10px; padding:8px 12px; margin-bottom:12px; }
.tk-bulk-all { display:flex; align-items:center; gap:8px; font-size:13px; white-space:nowrap; }
.tk-bulk-acts { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.tk-bulk-acts .ex-sel.xs { font-size:13px; padding:5px 26px 5px 8px; min-height:30px; }
.tk-bulk-acts .btn.xs { min-height:33px; }   /* v1.4.10.473: the buttons stand as tall as the selects beside them (27 vs 33px) */
@media (max-width:760px){ .tk-bulk-acts .btn.xs, .tk-bulk-acts .ex-sel.xs { min-height:40px; } }   /* v1.4.10.473: and on a phone both take the 40px tap floor (were 33 / 37) */
.tk-bulk-acts .btn.danger { color:var(--err); }
/* calendar */
.tk-calwrap { padding:0; overflow:hidden; }
.tk-cal-head { display:flex; align-items:center; justify-content:space-between; gap:10px; flex-wrap:wrap; padding:12px 14px; border-bottom:1px solid var(--line); }
.tk-cal-nav { display:flex; align-items:center; gap:6px; }
.tk-cal-nav .btn.xs { min-height:28px; justify-content:center; }   /* v1.4.10.473: the arrow buttons as tall as Today (22 vs 27px) */
.tk-cal-nav h3 { font-size:16px; margin:0 6px; min-width:150px; text-align:center; }
.tk-cal-dow { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); font-size:11px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--text-mute); padding:6px 0; border-bottom:1px solid var(--line); }
.tk-cal-dow span { padding:0 8px; }
.tk-cal-grid { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); }
.tk-cal-cell { min-height:104px; border-right:1px solid var(--line); border-bottom:1px solid var(--line); padding:6px; display:flex; flex-direction:column; gap:4px; background:var(--surface); }
.tk-cal-cell:nth-child(7n) { border-right:0; }
.tk-cal-cell.pad { background:var(--surface-2); }
.tk-cal-cell.today { background:rgba(var(--bc-blue-v1-rgb),.06); }
.tk-cal-cell.today .tk-cal-d > span:first-child { background:var(--brand-blue); color:#fff; border-radius:50%; width:22px; height:22px; display:inline-flex; align-items:center; justify-content:center; }
.tk-cal-d { display:flex; align-items:center; gap:6px; font-size:12px; font-weight:600; color:var(--text-mute); }
.tk-cal-d .tk-mini { margin-left:auto; opacity:0; }
.tk-cal-cell:hover .tk-mini { opacity:1; }
/* v1.4.10.422: no hover on a touch screen, so the day's "+" was invisible on an iPad
   and a phone held sideways (a phone upright has no room for it — see <=700px). */
@media (hover:none){ .tk-cal-d .tk-mini { opacity:1; min-width:40px; min-height:40px; } }
.tk-cal-n { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; background:var(--surface-2); border:1px solid var(--line); border-radius:10px; padding:0 6px; }
.tk-cal-items { display:flex; flex-direction:column; gap:3px; min-width:0; }
.tk-cal-item { font-size:12px; line-height:1.25; padding:3px 6px; border-radius:5px; background:var(--surface-2); border:1px solid var(--line); cursor:pointer; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; display:flex; align-items:center; gap:5px; }
.tk-cal-item:hover { border-color:var(--brand-blue); }
.tk-cal-item .tk-cal-dot { width:6px; height:6px; border-radius:50%; background:var(--bc-blue-v1); flex:0 0 auto; }
.tk-cal-item.prio-urgent .tk-cal-dot { background:#DC2626; } .tk-cal-item.prio-high .tk-cal-dot { background:#D97706; } .tk-cal-item.prio-low .tk-cal-dot { background:#5A6B85; }
.tk-cal-item.over { border-color:rgba(220,38,38,.5); }
.tk-cal-item.done { opacity:.55; text-decoration:line-through; }
.tk-cal-more { font-size:11px; font-weight:500; color:var(--brand-blue); cursor:pointer; padding:0 6px; }
@media (max-width: 900px){
  .tk-cal-cell { min-height:76px; padding:4px; }
  .tk-cal-item { font-size:11px; padding:2px 4px; }
}
@media (max-width: 700px){
  .tk-toolbar.tk-tb2 { padding:10px; }
  .tk-tb2 .tk-tb-main { flex-direction:column; align-items:stretch; }
  .tk-tb2 .tk-tabs { width:100%; } .tk-tb2 .tk-tabs .tk-tab { flex:1; justify-content:center; }
  .tk-tb2 .tk-site, .tk-tb2 .tk-listpick { width:100%; min-height:40px; }
  .tk-tb2 .tk-search { max-width:none; width:100%; order:0; }
  .tk-tb2 .tk-tb-right { margin-left:0; display:grid; grid-template-columns:1fr 1fr; gap:8px; width:100%; }
  .tk-tb2 .tk-tb-right .tk-viewtog { grid-column:1 / -1; display:flex; }
  /* v1.4.10.473: the switch stands 40 beside the 40px Filters / More buttons in its row (its border around 40px
     buttons made it 42); the line is drawn inside the box, as .mt-viewseg does */
  .tk-tb2 .tk-tb-right .tk-viewtog { border:0; outline:1px solid var(--line); outline-offset:-1px; }
  .tk-tb2 .tk-tb-right .tk-viewtog button { flex:1; }
  .tk-tb2 .tk-tb-right .tk-viewtog button { justify-content:center; min-height:40px; padding:0 4px; }
  .tk-tb2 .tk-tb-right .tk-viewtog button span { display:none; }
  .tk-tb2 .tk-tb-right .tk-new { grid-column:1 / -1; justify-content:center; min-height:40px; }   /* v1.4.10.473: 40, the floor it already drew at (the 44 lost to .tk-tb2 .tk-tb-right .btn.sm below) */
  .tk-tb2 .tk-tb-right .btn.sm { min-height:40px; justify-content:center; }
  .tk-tb2 .tk-tb-filters { display:grid; grid-template-columns:1fr 1fr; }
  .tk-tb2 .tk-fsel { max-width:none; width:100%; min-height:40px; }
  .tk-tb2 .tk-tb-count { grid-column:1 / -1; margin-left:0; }
  .tk-cal-dow span { padding:0 2px; font-size:11px; text-align:center; }
  .tk-cal-cell { min-height:58px; padding:3px; }
  .tk-cal-items .tk-cal-item { font-size:0; padding:0; height:6px; border:0; background:transparent; }
  .tk-cal-items .tk-cal-item .tk-cal-dot { width:100%; height:5px; border-radius:3px; }
  .tk-cal-d .tk-mini { display:none; }
  .tk-cal-more { font-size:11px; }
}

/* ══ Estate toolbar (v1.4.10.338) ══ */
.est-tb { background:var(--surface); border:1px solid var(--line); border-radius:10px; padding:10px 12px; margin-bottom:14px; }
.est-tb-main { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.est-search { position:relative; flex:1 1 240px; min-width:200px; max-width:460px; }
.est-search input { width:100%; background:var(--surface); border:1px solid var(--line); border-radius:6px; padding:0 34px 0 34px; height:34px; box-sizing:border-box; font-size:13px; color:var(--text); font-family:inherit; }   /* v1.4.10.473: 34 like every control in the toolbar (the search stood 40 beside 33px pickers and a 30px view switch) */
.est-search input:placeholder-shown { padding-right:12px; }   /* v1.4.10.473: the clear button only exists with a query, so an empty field gives its 34px back to the placeholder (cut at 390) */
.est-search input:focus { outline:none; border-color:var(--accent); box-shadow:0 0 0 3px var(--accent-glow); }
.est-search .tks-ico { position:absolute; left:11px; top:50%; transform:translateY(-50%); color:var(--text-dim); display:flex; pointer-events:none; }
.est-search .tks-clear { position:absolute; right:6px; top:50%; transform:translateY(-50%); width:24px; height:24px; border:0; background:transparent; color:var(--text-dim); border-radius:6px; display:flex; align-items:center; justify-content:center; cursor:pointer; }
.est-search .tks-clear svg { width:14px; height:14px; }
.est-sel { max-width:240px; min-width:0; font-size:13px; min-height:34px; }   /* v1.4.10.473: 34, the toolbar's one height (was 33) */
.est-sel.on { border-color:var(--brand-blue); color:var(--brand-blue); font-weight:400; }
.est-tb-acts { margin-left:auto; display:flex; align-items:center; gap:8px; }
.est-tb-acts .seg { min-height:34px; }   /* v1.4.10.473: the Grouped / List switch stands 34 with the search and pickers beside it (was 30) */
.est-tb-filters { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-top:8px; padding-top:8px; border-top:1px dashed var(--line); }
.est-tb-count { margin-left:auto; font-size:12px; color:var(--text-mute); white-space:nowrap; }
.est-tb-count b { color:var(--text); }
@media (max-width: 700px){
  .est-tb { padding:10px; }
  .est-tb-main { flex-direction:column; align-items:stretch; }
  .est-search { max-width:none; flex:0 0 auto; }   /* v1.4.10.473: in the stacked column its 240px basis became a HEIGHT - a 240px-tall box with the field at the top and the icon floating in the middle */
  .est-search input { height:40px; }   /* v1.4.10.473: 40 like the pickers under it */
  .est-tb-main .est-sel { max-width:none; width:100%; min-height:40px; }
  .est-tb-acts { margin-left:0; }
  .est-tb-acts .seg { display:flex; width:100%; } .est-tb-acts .seg-btn { flex:1; justify-content:center; min-height:40px; }
  .est-tb-filters { flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
  .est-tb-filters::-webkit-scrollbar { display:none; }
  .est-tb-filters .dev-seg { flex:0 0 auto; }
  .est-tb-count { margin-left:0; flex:0 0 auto; }
}

/* ══ Site Wiki restructure (v1.4.10.339) ══ */
.wk-drawer-h { display:none; }
.wk-side-head { gap:8px; }
.wk-side-head .wk-sitepick, .wk-side-head select.ex-sel { width:100% !important; max-width:none !important; min-width:0; }
.wk-strip { display:flex; gap:4px; background:var(--surface-2); border:1px solid var(--line); border-radius:8px; padding:3px; }
.wk-strip-b { flex:1 1 auto; display:inline-flex; align-items:center; justify-content:center; gap:4px; border:0; background:transparent; font:inherit; font-size:12px; font-weight:600; color:var(--text-mute); padding:6px 4px; border-radius:6px; cursor:pointer; min-width:0; white-space:nowrap; }
.wk-strip-b svg { width:13px; height:13px; }
.wk-strip-b svg { width:14px; height:14px; flex:0 0 auto; }
.wk-strip-b span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.wk-strip-b .cn { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; background:var(--surface); border:1px solid var(--line); border-radius:9px; padding:0 5px; color:var(--text-dim); }
.wk-strip-b span:not(.cn) { overflow:visible; }
/* v1.4.10.473: each strip button starts from its own width (flex 1 1 auto, was 1 1 0), so Contents keeps room for its
   count, which ran 4px out of an equal third; the counts take the badge look, 10/700 uppercase .04em */
.wk-strip-b.on { background:var(--surface); color:var(--brand-blue); box-shadow:0 1px 2px rgba(15,23,42,.08); }
.wk-strip-b.on .cn { color:var(--brand-blue); }
.wk-side-tools { padding:6px 10px; border-bottom:1px solid var(--line); background:var(--surface); }
.wk-quick { padding:4px 2px 8px; margin-bottom:6px; border-bottom:1px dashed var(--line); }
.wk-quick-h { font-size:11px; letter-spacing:.06em; text-transform:uppercase; color:var(--text-mute); font-weight:600; padding:4px 10px 6px; }
.wk-quick .wk-row { display:flex; align-items:center; gap:8px; width:100%; }
.wk-side-x { display:none; }
/* reading layout: a centred column, the TOC as a sticky rail on wide screens */
.wk-read { display:grid; grid-template-columns:minmax(0,1fr); gap:16px; align-items:start; }
.wk-read .wk-article { max-width:none; }
.wk-toc-rail { display:none; }
@media (min-width: 1240px){
  .wk-read.has-toc { grid-template-columns:minmax(0,1fr) 240px; }
  .wk-read.has-toc .wk-article > .wk-toc { display:none; }      /* the inline copy hides; the rail shows */
  .wk-toc-rail { display:block; position:sticky; top:136px; }
  .wk-toc-rail .wk-toc { margin:0; max-height:calc(100vh - 170px); overflow-y:auto; }
}
/* v341: the page head scrolls with the page again — Jay: "the contents bar stays
   locked and scrolls down on the site wiki page". No sticky, no shadow. */
.wk-head { position:static; }
.wk-tblwrap { overflow-x:auto; -webkit-overflow-scrolling:touch; margin:10px 0; max-width:100%; }
.wk-tblwrap > table { margin:0; min-width:100%; }
.wk-content pre { overflow-x:auto; -webkit-overflow-scrolling:touch; }
.wk-content { overflow-wrap:anywhere; }
.wk-article { max-width:1040px; }
@media (max-width: 900px){
  .wk-drawer-h { display:flex; align-items:center; justify-content:space-between; font-weight:600; font-size:16px; letter-spacing:-.012em; padding:2px 2px 0; }
  .wk-drawer-h span { display:inline-flex; align-items:center; gap:8px; }
  .wk-side-x { display:inline-flex; width:36px; height:36px; align-items:center; justify-content:center; border:1px solid var(--line); border-radius:8px; background:var(--surface); color:var(--text-mute); cursor:pointer; }
  .wk-side { padding-top:env(safe-area-inset-top); padding-bottom:env(safe-area-inset-bottom); }
  .wk-side-body { -webkit-overflow-scrolling:touch; overscroll-behavior:contain; }
  .wk-side-foot { padding-bottom:calc(10px + env(safe-area-inset-bottom)); }
  body.wk-drawer-open { overflow:hidden; }
  .wk-head .wk-crumbs { flex:1 1 100%; order:5; }
  .wk-strip-b { min-height:40px; }
  .wk-row { min-height:40px; }
}
/* iOS Safari zooms into any field smaller than 16px — the whole app, one rule. */
@supports (-webkit-touch-callout: none){
  @media (max-width: 900px){
    input:not([type=checkbox]):not([type=radio]):not([type=range]), select, textarea { font-size:16px !important; }
  }
}

/* ── Alerts & tickets on the Control tab (v1.4.10.344) ────────────────────
   The Control tab now has two tabs: Control and Alerts & tickets. Rules on
   the MIB readings, their live state, the suggestion cards and the editor. */
.ctl-tabs{display:flex;gap:4px;margin:14px 0 12px;border-bottom:1px solid var(--border);}
.ctl-tab{display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border:0;border-bottom:2px solid transparent;margin-bottom:-1px;background:transparent;color:var(--text-mute);font:inherit;font-size:13px;font-weight:600;cursor:pointer;min-height:44px;}
.ctl-tab svg{width:16px;height:16px;}
.ctl-tab:hover{color:var(--text);}
.ctl-tab.on{color:var(--text);border-bottom-color:var(--accent);}
.ctl-tab-n{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:10px;background:var(--surface-2,var(--surface));border:1px solid var(--border);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-mute);}   /* v1.4.10.473: a count badge, the badge role in full (10/700 uppercase .04em) */
.ctl-tab-n.hot{background:var(--err);border-color:var(--err);color:#fff;}
.ctl-hot{color:var(--err);font-weight:700;}
.ctl-alerts-blurb{color:var(--text-mute);font-size:13px;line-height:1.55;max-width:900px;}
.ctl-alerts-blurb b{color:var(--text);}
.ctl-alerts-empty{display:flex;align-items:center;gap:14px;padding:6px 0;color:var(--text-mute);}
.ctl-alerts-empty .adt-empty-ico{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:10px;background:var(--surface-2,var(--surface));border:1px solid var(--border);flex:0 0 auto;}
.ctl-rules-wrap{overflow-x:auto;}
.panel-body.flush table.ctl-rules{min-width:0;width:100%;}
.ctl-rules th{white-space:nowrap;}
.ctl-rules td{vertical-align:top;padding:10px 12px;}
.ctl-rule.firing td{background:color-mix(in srgb,var(--err) 6%,transparent);}
.ctl-rule.dim .ctl-rule-name,.ctl-rule.dim .ctl-acts{opacity:.55;}
.ctl-rule-name{min-width:220px;}
.ctl-rule-name .device-meta{margin-top:3px;line-height:1.4;}
.ctl-rule-state{min-width:150px;}
.ctl-rule-state .device-meta{margin-top:3px;}
.ctl-rule-tools{white-space:nowrap;text-align:right;}
.ctl-rule-tools .btn{margin-left:4px;}
.ctl-rule-tools .btn.danger{color:var(--err);}
.ctl-tk{display:inline-block;margin-left:6px;font-weight:600;}
.ctl-acts{display:inline-flex;gap:6px;flex-wrap:wrap;}
.ctl-act{display:inline-flex;align-items:center;gap:5px;padding:3px 8px;border-radius:12px;border:1px solid var(--border);font-size:12px;color:var(--text-mute);background:var(--surface);white-space:nowrap;}
.ctl-act svg{width:12px;height:12px;}
.ctl-act.on{color:var(--text);border-color:var(--accent);background:var(--accent-glow,transparent);}
.ctl-switch{position:relative;display:inline-block;width:36px;height:20px;cursor:pointer;}
.ctl-switch input{opacity:0;width:0;height:0;position:absolute;}
.ctl-switch span{position:absolute;inset:0;border-radius:10px;background:var(--border);transition:background .15s;}
.ctl-switch span::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s;}
.ctl-switch input:checked+span{background:var(--ok);}
.ctl-switch input:checked+span::after{transform:translateX(16px);}
.ctl-switch input:focus-visible+span{outline:2px solid var(--accent);outline-offset:2px;}
.ctl-sug-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px;}
.ctl-sug-card{display:flex;flex-direction:column;gap:6px;padding:12px;border:1px solid var(--border);border-radius:8px;background:var(--surface);}
.ctl-sug-t{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.ctl-sug-why{font-size:12px;color:var(--text-mute);line-height:1.45;flex:1;}
.ctl-sug-a{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:4px;}
.ctl-rule-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 18px;}
.ctl-rule-grid .field{margin:0;}
.ctl-rule-item{grid-column:1 / -1;}
.ctl-rule-wide{grid-column:1 / -1;}
.ctl-rule-cond{display:flex;gap:8px;align-items:center;min-width:0;}
.ctl-rule-cond>select{flex:0 1 46%;min-width:0;max-width:100%;}
.ctl-rule-cond #ctlr-thr-wrap{flex:1;display:flex;}
.ctl-rule-cond #ctlr-thr-wrap input,.ctl-rule-cond #ctlr-thr-wrap select{width:100%;}
.ctl-rule-inline{display:flex;align-items:center;gap:8px;}
.ctl-rule-inline input{width:80px;}
.ctl-rule-does{display:flex;flex-direction:column;gap:6px;padding-top:4px;}
.ctl-check{display:inline-flex;align-items:center;gap:8px;cursor:pointer;min-height:28px;}
.ctl-check input{width:16px;height:16px;margin:0;}
#ctl-rule-form .device-meta{margin-top:4px;line-height:1.45;}
#ctl-rule-form #ctlr-item-info{margin-top:6px;}
@media (max-width:700px){
  .ctl-tabs{margin-top:10px;}
  .ctl-tab{flex:1;justify-content:center;padding:10px 8px;}
  .ctl-rule-grid{grid-template-columns:1fr;}
  .ctl-rule-cond{flex-direction:column;align-items:stretch;}
  .ctl-rule-cond>select{flex:none;width:100%;}
  .ctl-rule-grid select,.ctl-rule-grid input{max-width:100%;box-sizing:border-box;}
  .ctl-rules td{padding:10px 8px;}
  .ctl-rule-tools{white-space:normal;text-align:left;}
  .ctl-rule-tools .btn{margin:2px 4px 2px 0;min-height:40px;}
  .ctl-act{min-height:28px;}
  .ctl-sug-grid{grid-template-columns:1fr;}
  .ctl-sug-a .btn{min-height:40px;}
}

/* ═════════════════════════════════════════════════════════════════════════
   v1.4.10.346 — POLISH PASS: custom graphics in every area, one type
   system, the footer where a footer belongs.
   Sits AFTER the v327 brand layer so it inherits its tokens and wins ties.
   ═════════════════════════════════════════════════════════════════════════ */

/* ── Hero art: the per-area illustration (HERO_ART in js/03-pages.js).
      The old medal stays for any page without a drawing. ── */
.ph-art.ph-art-ill{width:204px;height:124px;margin:-10px 6px -10px 0;filter:drop-shadow(0 10px 18px rgba(0,0,0,.35));}
.ph-art.ph-art-ill svg.ha{width:100%;height:100%;display:block;overflow:visible;}
.ph-art.ph-art-ill svg.ha *{vector-effect:non-scaling-stroke;}
.page-hero .ph-row{align-items:center;}
@media(max-width:1180px){ .ph-art.ph-art-ill{width:168px;height:102px;margin:-6px 0;} }
@media(max-width:860px){ .ph-art.ph-art-ill{display:none;} }
@media (prefers-reduced-motion: reduce){ .ph-art.ph-art-ill animate{display:none;} }

/* ── Empty states: every "nothing here yet" block in the app wears the
      brand — a gradient-edged tile behind its icon, a faint drafting grid,
      and the AVDesk mark for the ~60 blocks that carry no icon at all. ── */
.empty{position:relative;padding:44px 20px 40px;}
.empty .empty-ico{position:relative;width:64px;height:64px;border-radius:14px;margin-bottom:14px;
  background:linear-gradient(180deg,#fff,#F4F7FA);border:1px solid var(--line);color:var(--brand-blue);
  box-shadow:0 10px 24px -14px rgba(var(--bc-accent-rgb),.35), inset 0 1px 0 #fff;}
.empty .empty-ico::before{content:'';position:absolute;inset:-1px;border-radius:15px;padding:1px;
  background:var(--brand-grad);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:.55;pointer-events:none;}
.empty .empty-ico::after{content:'';position:absolute;inset:0;border-radius:14px;
  background-image:radial-gradient(rgba(var(--bc-accent-rgb),.18) 1px,transparent 1.3px);background-size:9px 9px;opacity:.6;pointer-events:none;}
.empty .empty-ico svg{position:relative;width:26px;height:26px;z-index:1;}
.empty > div:not(.empty-ico):not(.empty-sub):not(.es-actions):not(.es-d){font-family:var(--font-display);font-weight:600;font-size:15px;letter-spacing:-.01em;color:var(--text);}   /* v1.4.10.473: 15/600 -.01em, the panel title's look (was -.012em) */
/* v1.4.10.473: the tile and its mark weigh (0,1,1) through :where() — at (0,2,2) they beat the compact exemption below,
   so every .empty.sm / .inline / in-a-cell empty state drew a 56px tile (116px tall, not 47) with the mark pinned 44px
   down, over its text. An empty state given its own padding inline (the compact "Loading…" / "No … yet" lines, 8-28px)
   is compact too: the mark is pinned at the default 44px, so over a 24px padding it sat 20px below its tile. */
.empty:where(:not(:has(.empty-ico)):not(:has(svg)):not([style*="padding"]))::before{content:'';display:block;width:56px;height:56px;margin:0 auto 12px;border-radius:14px;
  background:linear-gradient(180deg,#fff,#F4F7FA);border:1px solid var(--line);
  -webkit-mask:none;mask:none;position:relative;}
.empty:where(:not(:has(.empty-ico)):not(:has(svg)):not([style*="padding"]))::after{content:'';position:absolute;left:50%;top:44px;width:56px;height:56px;transform:translateX(-50%);
  background:var(--brand-grad);opacity:.85;
  -webkit-mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M3 8l9-5 9 5-9 5-9-5z'/><path d='M3 12l9 5 9-5'/><path d='M3 16l9 5 9-5'/></svg>") center/24px no-repeat;
  mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M3 8l9-5 9 5-9 5-9-5z'/><path d='M3 12l9 5 9-5'/><path d='M3 16l9 5 9-5'/></svg>") center/24px no-repeat;
  pointer-events:none;}
.empty.inline,.empty.sm,td .empty,li .empty{padding:14px;} 
.empty.inline::before,.empty.inline::after,.empty.sm::before,.empty.sm::after,td .empty::before,td .empty::after,li .empty::before,li .empty::after{display:none;content:none;}   /* v1.4.10.473: li too — its 14px padding left the mark (top:44px) 30px below its tile */
.cl-empty .empty-ico{margin-left:auto;margin-right:auto;}

/* ── The footer sits at the foot of the viewport on a short page instead
      of floating mid-screen over the band colour (Site Statistics, Comms,
      an empty client scope). ── */
.main{display:flex;flex-direction:column;}
.main > .content{flex:1 0 auto;}
.main > .app-footer{margin-top:auto;}
body.chat-popout .main{display:block;}

/* ── Type: the last hardcoded faces. Everything in the app is Poppins or
      JetBrains Mono through the two tokens; nothing asks for Inter,
      Menlo or Consolas by name any more. ── */
.log-row .pill.blue{font-family:inherit;}   /* v1.4.10.473: the ticket ref only; "resolved" is a word (Poppins) */
.ah-tag,.dv-rte code,.dv-rich code,.hgm-pill.tag,.hgm-label i,.stk-row-tag,
.avnic-row .avnic-ip,.avnic-row .avnic-mac,.ctl-net-tbl code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.cm-editor code,.cm-editor pre,.dv-rte pre,.dv-rich pre{font-family:var(--font-source);}   /* v1.4.10.546: a code editor and a pasted block keep a monospace */
.cm-editor{font-family:var(--font-body);}
code,kbd,samp,pre{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.wb-disp,.wb-title{font-family:var(--font-display);}

/* ── Room Health Report picker (v1.4.10.347) ── */
.rr-pick-hero{display:flex;align-items:center;gap:16px;background:var(--av-navy);color:#fff;border-radius:var(--radius);padding:14px 16px;margin:0 0 14px;position:relative;overflow:hidden;}
.rr-pick-hero::before{content:'';position:absolute;inset:0;background-image:radial-gradient(rgba(255,255,255,.12) 1px,transparent 1.4px);background-size:22px 22px;opacity:.5;-webkit-mask-image:linear-gradient(95deg,#000,transparent 70%);mask-image:linear-gradient(95deg,#000,transparent 70%);}
.rr-pick-hero>*{position:relative;}
.rr-pick-art{width:120px;height:74px;flex-shrink:0;} .rr-pick-art svg{width:100%;height:100%;display:block;}
.rr-pick-eyebrow{font-family:var(--font-body);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:rgba(255,255,255,.7);}   /* v1.4.10.473: Poppins - it carries the site's name, and mono is for codes */
.rr-pick-title{font-family:var(--font-display);font-size:16px;font-weight:600;letter-spacing:-.012em;margin:2px 0 4px;}
.rr-pick-sub{font-size:12px;color:rgba(255,255,255,.82);line-height:1.5;}
.rr-pick-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px;}
.rr-pick-item{border:1px solid var(--line);border-radius:6px;padding:8px 10px;font-size:12px;background:var(--surface-2);}
.rr-pick-item b{display:block;font-size:13px;font-weight:600;color:var(--text);} .rr-pick-item span{color:var(--text-mute);font-size:12px;}
@media(max-width:600px){ .rr-pick-art{display:none;} .rr-pick-grid{grid-template-columns:1fr;} }

/* ── Paused Ody monitoring (v1.4.10.350) ── */
.opi-paused{display:flex;align-items:center;gap:14px;margin:10px 0 12px;padding:12px 14px;border-radius:var(--radius);background:linear-gradient(180deg,#F4F0FF,#EDE7FD);border:1px solid #D9CCF6;border-left:4px solid var(--brand-purple);}
.opi-paused-ic{width:36px;height:36px;border-radius:8px;background:var(--brand-purple);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.opi-paused-ic svg{width:18px;height:18px;}
.opi-paused-txt{flex:1;min-width:0;font-size:12px;line-height:1.5;color:var(--text);} .opi-paused-txt>div{color:var(--text-mute);}
.opi-paused-note{margin-top:4px;font-style:italic;color:var(--text);}
.opi-paused .btn{flex-shrink:0;}
@media(max-width:600px){ .opi-paused{flex-wrap:wrap;} .opi-paused .btn{width:100%;justify-content:center;} }

/* ── v1.4.10.354 — the address each MIB file answers on (Control tab → SNMP access) ── */
.ctl-mibaddr{margin-top:14px;padding-top:12px;border-top:1px solid var(--border,rgba(0,0,0,.08));}
.ctl-mibaddr-h{margin-bottom:8px;}
.ctl-mibaddr-list{display:flex;flex-direction:column;gap:6px;}
.ctl-mibaddr-row{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;}
.ctl-mibaddr-name{min-width:0;overflow-wrap:anywhere;}
.ctl-mibaddr-row select{min-width:180px;max-width:100%;}
@media (max-width:700px){.ctl-mibaddr-row select{width:100%;min-height:40px;}}

/* ── v1.4.10.355 — empty states: the icon tile sits on its OWN line, centred above the words.
   .empty-ico was inline-flex (the v1.0 rule), so a block whose message is bare text rather than
   a <div> (tickets "No tickets match these filters.", wiki, tasks, dev team) put the words right
   against the tile's edge. ── */
.empty .empty-ico{display:flex;align-items:center;justify-content:center;margin-left:auto;margin-right:auto;}
.onet-static{display:flex;gap:6px;margin-top:6px;}
.onet-static input{flex:1 1 auto;min-width:0;}
.onet-static select{flex:0 0 auto;width:84px;}
.onet-static-hint{margin-top:4px;}

/* ── v1.4.10.356 — MAPS STAY UNDER THE MENUS ───────────────────────────────
   Jay: "Fleet Map, menu bars won't let you go over it. Menu should still be
   able to go over the top of the map (any maps)." Leaflet paints its panes at
   z-index 200–1000 straight into the page's own stacking order, so the tile
   pane (200, later in the page) covered the nav drop-downs (200), and the
   marker/popup/control layers (600–1000) covered the mobile drawer (120), the
   notifications panel (60) and every modal (50). Each map is now its own
   stacking context: its layers still order among themselves exactly as
   before, but the whole map sits at the level of ordinary page content —
   under every menu, drawer, pop-over and modal. One rule, every map (Fleet map,
   Sites map, site editor pin, room and location maps). */
.leaflet-container{isolation:isolate;z-index:0;}

/* ── v1.4.10.356 — REBOOT ODY (site → Monitoring → Ody) ─────────────────── */
.opi-rb{display:flex;align-items:center;gap:14px;margin:10px 0 12px;padding:12px 14px;border-radius:var(--radius);border:1px solid var(--line);border-left:4px solid var(--brand-blue,var(--bc-accent));background:linear-gradient(180deg,#F3F6FE,#EAF0FD);}
.opi-rb.ok{border-left-color:var(--ok);background:linear-gradient(180deg,#F1FAF4,#E7F6EC);}
.opi-rb.err{border-left-color:var(--err);background:linear-gradient(180deg,#FEF4F3,#FCEBEA);}
.opi-rb.muted{border-left-color:var(--text-dim,#94A3B8);background:var(--surface-2);}
.opi-rb-ic{position:relative;width:36px;height:36px;border-radius:8px;background:var(--brand-blue,var(--bc-accent));color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.opi-rb.ok .opi-rb-ic{background:var(--ok);} .opi-rb.err .opi-rb-ic{background:var(--err);} .opi-rb.muted .opi-rb-ic{background:var(--text-dim,#94A3B8);}
.opi-rb-ic svg{width:18px;height:18px;}
.opi-rb-spin{position:absolute;inset:0;border-radius:8px;box-shadow:0 0 0 0 rgba(var(--bc-purple-rgb),.55);animation:opiRbPulse 1.6s ease-out infinite;pointer-events:none;}
@keyframes opiRbPulse{0%{box-shadow:0 0 0 0 rgba(var(--bc-purple-rgb),.55);}80%,100%{box-shadow:0 0 0 9px rgba(var(--bc-purple-rgb),0);}}
@media (prefers-reduced-motion:reduce){.opi-rb-spin{animation:none;box-shadow:0 0 0 2px var(--brand-purple,var(--bc-purple));}}
.opi-rb-txt{flex:1;min-width:0;font-size:12px;line-height:1.5;color:var(--text);}
.opi-rb-txt>b{margin-right:6px;} .opi-rb-txt>div{color:var(--text-mute);}
.opi-rb-choices{display:flex;flex-direction:column;gap:8px;margin:12px 0;}
.opi-rb-choice{display:flex;gap:10px;align-items:flex-start;padding:11px 12px;border:1px solid var(--line);border-radius:var(--radius);cursor:pointer;background:var(--surface);min-height:40px;}
.opi-rb-choice:has(input:checked){border-color:var(--brand-blue,var(--bc-accent));box-shadow:0 0 0 3px rgba(var(--bc-accent-rgb),.10);}
.opi-rb-choice.off{cursor:not-allowed;opacity:.72;}
.opi-rb-choice input{margin-top:3px;flex-shrink:0;width:16px;height:16px;}
.opi-rb-choice>span{display:flex;flex-direction:column;gap:2px;min-width:0;}
.opi-rb-choice b{font-size:13px;}
.opi-rb-need{display:block;margin-top:4px;color:var(--warn,#B45309);font-weight:600;}
.opi-rb-warn{margin:8px 0;padding:8px 10px;border-radius:6px;background:#FFF7E6;border:1px solid #F5D9A8;font-size:12px;}

/* ── v1.4.10.356 — DUPLICATE SERIALS SHOWN AS SETS ─────────────────────────── */
/* v1.4.10.473: a serial is a code — JetBrains Mono in the register's Serial column, as on the asset's own page (was Poppins);
   the duplicate-serial note under it stays in the body face */
table.dt.asset-dt td.ar-serial{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
table.dt.asset-dt td.ar-serial::before{font-family:var(--font-body);}
.ar-twin{margin-top:2px;font-size:11px;line-height:1.35;color:var(--warn,#B45309);white-space:normal;font-family:var(--font-body);}
.ar-twin a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;}
.dh-dgroup{border:1px solid var(--line);border-radius:6px;margin:8px 0;overflow:hidden;background:var(--surface);}
.dh-dhead{display:flex;align-items:baseline;flex-wrap:wrap;gap:6px;padding:7px 10px;background:var(--surface-2);border-bottom:1px solid var(--line);font-size:12px;}
.dh-dgroup .dh-arow{border-radius:0;}

/* ── v1.4.10.360 — sweep ranges on the Ody Network card ─────────────────────── */
.onet-sel select{appearance:none;-webkit-appearance:none;background:var(--surface) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2375899B' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") no-repeat right 10px center;border:1px solid var(--line);border-radius:var(--r-ctl,6px);padding:8px 30px 8px 11px;font:400 13px/1.3 var(--font-body,inherit);color:var(--text);cursor:pointer;text-overflow:ellipsis;}
.onet-sel select:focus-visible{outline:2px solid var(--accent);outline-offset:1px;}
.onet-sel select:disabled{cursor:default;opacity:.75;}
.onet-own{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-top:8px;padding-top:8px;border-top:1px dashed var(--border);font-size:12px;}
.onet-own-lbl{font-size:11px;color:var(--text-mute);}
.onet-own-what{flex:1 1 220px;min-width:0;}
.onet-own-acts{display:inline-flex;gap:6px;flex-wrap:wrap;}
.onet-own-warn{margin-top:6px;padding:6px 9px;border-radius:6px;font-size:12px;line-height:1.45;color:var(--text);background:color-mix(in srgb, var(--warn) 12%, transparent);border-left:3px solid var(--warn);}
.onet-range{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;white-space:nowrap;}
.onet-tbl td.onet-name b{display:block;line-height:1.3;}
.onet-how{margin-top:3px;display:flex;align-items:center;gap:4px;flex-wrap:wrap;}
.onet-how .opi-vlan{white-space:nowrap;}
.onet-tbl .opi-acts .btn + .btn{margin-left:4px;}
.onet-range-field{grid-column:1/-1;}
.onet-range-field input{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.onet-range-field input.bad{border-color:var(--err);}
.onet-range-hint{margin-top:5px;min-height:16px;font-size:12px;line-height:1.4;color:var(--text-mute);}
.onet-range-hint.ok{color:var(--text);}
.onet-range-hint.warn{color:#B45309;}
.onet-range-hint.err{color:#C2261C;}
.onet-range-help{margin-top:2px;}
.onet-static{flex-wrap:wrap;}
.onet-static .onet-static-hint{flex:1 1 100%;}
@media (max-width:760px){ .onet-own{align-items:flex-start;} .onet-own-acts .btn{min-height:40px;} .onet-range{white-space:normal;word-break:break-word;} }
.onet-tbl .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;}

/* ── v1.4.10.362 — ONE CLOSE BUTTON, EVERY POPUP ──────────────────────────────
   Measured across all 177 popups before this block: close buttons at 28, 30 and
   32 px, 5 / 6 px radii, insets from 16 to 23 px, two painted with the browser's
   own grey button (Automation's .modal-x, the Q-SYS mapper's .modal-close), one
   hero head only half the width of its popup. Now: 34 px, 8 px radius, an 18 px
   glyph dead centre, centred on the head's text block, the same inset on the
   right. Light heads get a quiet ghost; the navy heroes a frosted tile.
   modalNormalise() (js/01-core.js) gives the bare popups a head to put it in. */
.modal-head .close,.modal-head .x,.modal-head .modal-x,.modal-head .modal-close,
.site-ed-head .close,.site-ed-head .modal-close,.user-ed-head .close,.tkt-head .close,
.cust-mh .x,.rost-modal-head .rost-x,.ap-form-head .ap-form-x,.ah-head .close,
.dv-fix-hero-actions .close,.mmc-actions .close,.tkd-row1 .close{
  box-sizing:border-box;width:34px;height:34px;min-width:34px;padding:0;margin:0 0 0 auto;flex:0 0 auto;align-self:center;
  display:inline-flex;align-items:center;justify-content:center;
  border-radius:8px;border:1px solid transparent;background:transparent;color:var(--text-mute);
  font:400 20px/1 var(--font-body,inherit);cursor:pointer;
  transition:background-color .15s ease,border-color .15s ease,color .15s ease;
  -webkit-appearance:none;appearance:none;
}
.modal-head .close svg,.modal-head .x svg,.modal-head .modal-x svg,.modal-head .modal-close svg,
.site-ed-head .close svg,.site-ed-head .modal-close svg,.user-ed-head .close svg,.tkt-head .close svg,
.cust-mh .x svg,.rost-modal-head .rost-x svg,.ap-form-head .ap-form-x svg,.ah-head .close svg,
.dv-fix-hero-actions .close svg,.mmc-actions .close svg,.tkd-row1 .close svg{width:18px;height:18px;flex:none;display:block;stroke:currentColor;}
.modal-head .close:hover,.modal-head .x:hover,.modal-head .modal-x:hover,.modal-head .modal-close:hover,
.cust-mh .x:hover,.rost-modal-head .rost-x:hover,.ap-form-head .ap-form-x:hover,
.dv-fix-hero-actions .close:hover,.mmc-actions .close:hover{background:var(--surface-2,#F4F7FA);border-color:var(--line,#DEE5EC);color:var(--text);}
.modal-head .close:focus-visible,.modal-head .x:focus-visible,.modal-head .modal-x:focus-visible,.cust-mh .x:focus-visible,
.rost-modal-head .rost-x:focus-visible,.site-ed-head .close:focus-visible,.user-ed-head .close:focus-visible,.tkt-head .close:focus-visible,
.ah-head .close:focus-visible,.tkd-row1 .close:focus-visible{outline:2px solid var(--accent,var(--bc-accent));outline-offset:2px;}
/* the navy heroes */
.site-ed-head .close,.site-ed-head .modal-close,.user-ed-head .close,.tkt-head .close,.ah-head .close,.tkd-hero .tkd-row1 .close{
  background:rgba(255,255,255,.10);border-color:rgba(255,255,255,.20);color:#fff;}
.site-ed-head .close:hover,.site-ed-head .modal-close:hover,.user-ed-head .close:hover,.tkt-head .close:hover,.ah-head .close:hover,.tkd-hero .tkd-row1 .close:hover{
  background:rgba(255,255,255,.22);border-color:rgba(255,255,255,.34);color:#fff;}
/* heads that sat the X at the top of a two-line block (align-items:flex-start) */
.site-ed-head,.cust-mh{align-items:center;}
.modal-head{gap:12px;}
.modal-head > h3,.modal-head > h2{min-width:0;flex:1 1 auto;}
/* the asset detail / Register equipment hero: X pinned to the corner, same inset as the others */
.ah-head .close{position:absolute;top:18px;right:18px;margin:0;}
/* anything sitting beside the X in a head (Auto-match, Sounds on…) keeps its gap */
.site-ed-head .modal-close,.site-ed-head .close{margin-left:8px;}
.site-ed-htext + .close,.site-ed-htext + .modal-close{margin-left:auto;}
/* the bare popups modalNormalise() wraps */
.modal-head-auto h3{margin:0;font-size:16px;font-weight:600;letter-spacing:-.012em;}
.modal-body-auto > :first-child{margin-top:0;}
@media (max-width:700px){
  .modal-head .close,.modal-head .x,.modal-head .modal-x,.modal-head .modal-close,
  .site-ed-head .close,.site-ed-head .modal-close,.user-ed-head .close,.tkt-head .close,
  .cust-mh .x,.rost-modal-head .rost-x,.ap-form-head .ap-form-x,.ah-head .close,
  .dv-fix-hero-actions .close,.mmc-actions .close,.tkd-row1 .close{width:40px;height:40px;min-width:40px;min-height:40px;}
  .ah-head .close{top:12px;right:12px;}
}
@media (hover:none) and (pointer:coarse){
  .modal-head .close,.modal-head .x,.modal-head .modal-x,.modal-head .modal-close,
  .site-ed-head .close,.site-ed-head .modal-close,.user-ed-head .close,.tkt-head .close,
  .cust-mh .x,.rost-modal-head .rost-x,.ap-form-head .ap-form-x,.ah-head .close,
  .dv-fix-hero-actions .close,.mmc-actions .close,.tkd-row1 .close{width:40px;height:40px;min-width:40px;min-height:40px;}   /* v1.4.10.473: the touch floor, 40 like the buttons that share a head with it (was 44: Edit 40 beside a 44 X) */
  #modal-inner.modal-asset > .ah-head .close{top:calc(12px + env(safe-area-inset-top));}
}

/* ── v1.4.10.362 — Automation: Ody events, step builder, recipes ───────────────
   The page's buttons had been written as btn-sm / btn-primary / btn-danger — class
   names this stylesheet has never had — so every control on Automation & Compliance
   rendered as a bare browser button. The JS now uses the house .btn sm / primary /
   danger; these rules are only the new pieces. */
.au-rail{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));}
@media (max-width:760px){
  .au-rail{grid-template-columns:repeat(2,minmax(0,1fr));}
  .au-rail > .au-tile:last-child:nth-child(odd){grid-column:1 / -1;}   /* v1.4.10.473: two across on a phone, and the seventh tile spans the row instead of leaving an empty half-cell beside it */
}
.au-kind-t{display:flex;align-items:center;gap:6px;}
.au-kind-t svg{width:15px;height:15px;color:var(--brand-blue,var(--bc-accent));flex:none;}
.au-kindpick{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));}
.modal-head h3 svg{width:18px;height:18px;color:var(--brand-blue,var(--bc-accent));}
.au-sub-h > span:first-child{display:flex;flex-direction:column;gap:2px;min-width:0;}
.au-sub-s{font-weight:400;font-size:12px;line-height:1.45;}
.au-unit{display:flex;align-items:center;gap:6px;}
.au-unit input{width:96px;}
.au-unit em{font-style:normal;font-weight:500;color:var(--text-dim);font-size:12px;white-space:nowrap;}
.au-act{flex-direction:column;align-items:stretch;gap:8px;padding:10px 12px;}
.au-act-top{display:flex;align-items:flex-start;gap:10px;}
.au-act-top .au-act-n{margin-top:1px;}
.au-act-tools{display:inline-flex;gap:4px;margin-left:auto;flex:none;align-items:center;}
.au-act-tools .btn svg{width:14px;height:14px;}
.au-act-b,.au-act-when{display:flex;flex-wrap:wrap;gap:8px 10px;align-items:flex-end;padding-left:32px;}
.au-act-b label,.au-act-when label{display:flex;flex-direction:column;gap:4px;font-size:12px;font-weight:500;color:var(--text-mute);min-width:120px;}
.au-act-b label.au-grow{flex:1 1 260px;}
.au-act-b select,.au-act-b input,.au-act-when select{height:36px;box-sizing:border-box;padding:0 10px;border:1px solid var(--line-2);border-radius:6px;background:var(--surface);color:var(--text);font:inherit;font-size:13px;font-weight:400;}
.au-act-when{padding-bottom:8px;border-bottom:1px dashed var(--line);}
.au-step{border-left:3px solid var(--brand-blue,var(--bc-accent));}
.au-row input,.au-row select{height:38px;box-sizing:border-box;}
.au-sub code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;background:var(--surface-2);border:1px solid var(--line);border-radius:4px;padding:0 4px;}
.au-pill.run{background:rgba(var(--bc-accent-rgb),.10);color:var(--brand-blue,var(--bc-accent));}
.au-head-r .ex-sel,.au-report-a .ex-sel{height:32px;box-sizing:border-box;}   /* v1.4.10.473: the Compliance report row too, one 32 height (the period picker was 33); the .btn.sm height:32 that lifted the 30px primaries (New policy, Download PDF) is gone, a .btn.sm primary now stands 32 like its neighbours on its own; a phone keeps its 40 */
.au-recipes{padding:14px;display:flex;flex-direction:column;gap:10px;}
.au-recipes-h{font-weight:600;font-size:13px;}
.au-recipes-h .au-dim{font-weight:400;font-size:12px;}
.au-recipes-g{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px;}
.au-recipe{display:grid;grid-template-columns:34px 1fr;grid-template-rows:auto auto;column-gap:10px;row-gap:2px;align-items:center;text-align:left;
  padding:11px 12px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);font:inherit;cursor:pointer;min-height:64px;
  transition:border-color .15s ease,box-shadow .15s ease;}
.au-recipe:hover{border-color:var(--brand-blue,var(--bc-accent));box-shadow:0 0 0 3px rgba(var(--bc-accent-rgb),.08);}
.au-recipe-ico{grid-row:1 / span 2;width:34px;height:34px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;background:var(--brand-grad);color:#fff;}
.au-recipe-ico svg{width:17px;height:17px;}
.au-recipe-t{font-weight:600;font-size:13px;color:var(--text);line-height:1.3;}
.au-recipe-s{font-size:12px;color:var(--text-mute);line-height:1.35;}
@media (max-width:760px){
  .au-act-b,.au-act-when{padding-left:0;}
  .au-act-b label,.au-act-when label{min-width:0;flex:1 1 100%;}
  .au-act-b select,.au-act-b input,.au-act-when select,.au-row input,.au-row select,label.au-grow input[type=text]{height:40px;font-size:16px;}   /* v1.4.10.473: 40, the touch layer's one floor and the height of the editor's buttons and day chips (was 44); + the Name / What it is for / asset search boxes, which stood 43 */
  .au-act-tools .btn{min-width:40px;min-height:40px;}
  .au-recipe{min-height:64px;}
}
/* The editor body is a flex column: a label.au-grow's flex-basis of 240px became a
   240px HEIGHT, leaving a blank band under "What it is for" (since v1.4.10.314). */
.au-ed-body > label.au-grow{flex:0 0 auto;}
.au-sub-h .au-addact{flex:0 0 auto;}

/* ── v1.4.10.362 — rows whose boxes did not line up (measured, 1440×900) ────────
   • Assets → Validation queue: "Discover from connectors" wrapped to two lines, so
     the three header buttons stood 48 / 32 / 50 px tall side by side.
   • Devices: the List / Grouped switch put its icon 4.5 px above the label (a
     plain inline button lines an SVG up on the text baseline).
   • Site Statistics: the custom range's Apply button was 27 px beside 32 px dates. */
.panel-head .head-actions{flex-wrap:wrap;justify-content:flex-end;}
.panel-head .head-actions > .btn{white-space:nowrap;}
.seg-btn{display:inline-flex;align-items:center;gap:5px;line-height:1.2;}
.seg-btn > svg{width:14px;height:14px;flex:none;}
.ss-custom input,.ss-custom .btn{height:32px;box-sizing:border-box;}
/* the head's own actions (Ody health's range + Site page) sit before the X, not on it */
.modal-head .head-actions{margin-left:auto;display:flex;gap:6px;align-items:center;flex-wrap:wrap;}
.modal-head .head-actions + .close{margin-left:8px;}
/* Rostering's popups used a smaller head (15 px title, 18 px inset) than every other popup */
.rost-modal-head{padding:18px 22px;gap:12px;}
.rost-modal-head h3{font-size:16px;font-weight:600;letter-spacing:-.012em;}
/* A select sizes itself to its longest option, so on a phone the step builder's
   long option labels ("Only if the step before failed") pushed the editor 29 px
   wider than the screen. Every field in the editor may shrink to its column. */
#au-ed label{min-width:0;max-width:100%;}
#au-ed select,#au-ed input:not([type=checkbox]){max-width:100%;min-width:0;}
.au-act-top{flex-wrap:wrap;}
.au-act-t{min-width:0;}
@media (max-width:760px){
  #au-ed .au-row{flex-direction:column;align-items:stretch;}
  #au-ed .au-row label,#au-ed .au-act-b label,#au-ed .au-act-when label{flex:1 1 auto;width:100%;}
  #au-ed .au-row select,#au-ed .au-row input:not([type=checkbox]),#au-ed .au-act-b select,#au-ed .au-act-b input,#au-ed .au-act-when select{width:100%;}
  #au-ed .au-unit input{width:100%;}
  #au-ed .au-sub-h{flex-direction:column;align-items:stretch;}
  #au-ed .au-addact{width:100%;height:40px;}   /* v1.4.10.473: 40 like the fields above it (was 44) */
  #au-ed .au-kindpick{grid-template-columns:1fr 1fr;}
  #au-ed .au-act-tools{margin-left:32px;}
}
@media (max-width:760px){ #au-ed .au-row > label > select,#au-ed .au-row > label > input{align-self:stretch;width:100%;} }

/* v1.4.10.363 — one height for a row of actions: a primary button, an icon
   button and a bare input measured 36 / 38 / 26 px side by side on the Email
   settings tab. */
.set-actions-row > .btn, .set-actions-row > .inp{height:38px;min-height:38px;box-sizing:border-box;}
.set-actions-row > .inp{padding-top:0;padding-bottom:0;font-size:13px;}
@media (max-width:700px){ .set-actions-row > .btn, .set-actions-row > .inp{height:40px;min-height:40px;} .set-actions-row > .inp{font-size:16px;max-width:none !important;} }

/* v1.4.10.473 — the email template editor: the editor and its live preview side by side, each scrolling inside 70vh.
   On a phone they stack and the modal scrolls them as one page: stacked, each kept its own 465px scroll box inside
   a modal that scrolls too (a scroll trap), and the editor kept its right border. */
.set-tpl-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));min-height:480px;}
.set-tpl-ed{padding:20px 22px;border-right:1px solid var(--border,#e2e8f0);overflow:auto;max-height:70vh;}
.set-tpl-pv{padding:18px 20px;background:var(--surface-2,#f8fafc);overflow:auto;max-height:70vh;}
@media (max-width:760px){ .set-tpl-grid{grid-template-columns:minmax(0,1fr);min-height:0;} .set-tpl-ed{border-right:0;border-bottom:1px solid var(--border,#e2e8f0);overflow:visible;max-height:none;} .set-tpl-pv{overflow:visible;max-height:none;} }

/* v1.4.10.363 — A FORM FIELD MAY SHRINK. Grid and flex children default to
   min-width:auto, so a select whose longest option is long ("Ground Floor ·
   CHW-G-06 · Exhibition Gallery") refused to shrink and squeezed its neighbour:
   the maintenance editor's Client picker was 25 px wide beside Site and Room.
   Every field can now shrink to its track; its control fills it and truncates. */
.field{min-width:0;}
.field > select, .field > input, .field > .avsel{max-width:100%;}

/* v1.4.10.363 — A FOOTER BUTTON KEEPS ITS HEIGHT ON A PHONE. "Save changes",
   "Close & reconcile…" and "Pause monitoring" wrapped onto two lines at 390 px
   and stood 56 px tall beside 40 px neighbours. The label stays on one line and
   the row wraps instead. */
@media (max-width:700px){
  .modal-foot, .site-ed-foot{flex-wrap:wrap;row-gap:8px;}
  .modal-foot > .btn, .site-ed-foot > .btn{white-space:nowrap;}
}

/* v1.4.10.363 — the Dev Team chat Send button sat outside the panel on a phone
   (two attach buttons + the field + Send needed 487 px of a 364 px row, and the
   panel clips). The field shrinks, and Send drops to its own line if it must. */
@media (max-width:700px){
  .dv-chat-compose{flex-wrap:wrap;}
  .dv-compose-field{flex:1 1 160px;}
  .dv-chat-compose > .btn.primary{margin-left:auto;}
}

/* v1.4.10.363 — A VISUALLY-HIDDEN LABEL MUST NOT DRAG THE PAGE SIDEWAYS. .sr-only
   is absolutely positioned, and with no positioned ancestor its containing block
   is the page: inside the Ody panel's horizontally scrolling Networks table it
   landed 410 px out, so a phone scrolled 21 px sideways on the site's Monitoring
   tab (and the clip probe saw it). The helper is app-wide now, and the cells it
   sits in are its containing block, so the scroller clips it. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;}
.onet-tbl th, .onet-tbl td{position:relative;}

/* ═════════════════════════════════════════════════════════════════════════
   ASSET REPORTS (v1.4.10.365) — Financial · Warranty & coverage · Makes &
   models · End of life. js/24-asset-reports.js. The report hero is the site's
   navy band (the same recipe as .page-hero); everything under it stays white.
   Charts are SVG drawn at the card's measured width, so text is always 1:1.
   ═════════════════════════════════════════════════════════════════════════ */
.rxr-rgrid{grid-template-columns:repeat(auto-fill,minmax(330px,1fr));}
.rxr-rcard{cursor:pointer;}
.rxr-rcard-top{display:flex;align-items:center;gap:12px;}
.rxr-pvs{display:flex;gap:8px;flex-wrap:wrap;}
.rxr-pv{flex:1 1 90px;min-width:0;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:8px 10px;display:flex;flex-direction:column;gap:1px;}
.rxr-pv b{font-size:20px;font-weight:600;color:var(--text);letter-spacing:-.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.rxr-pv span{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.rxr-pv.tone-ok b{color:var(--ok);} .rxr-pv.tone-warn b{color:var(--warn);} .rxr-pv.tone-err b{color:var(--err);}

.rxr-view{display:flex;flex-direction:column;gap:18px;min-width:0;}
.rxr-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.rxr-bar-sp{flex:1 1 auto;}
.rxr-sel{height:32px;border:1px solid var(--line-2);border-radius:var(--r-ctl);background:var(--surface);color:var(--text);font:inherit;font-size:13px;padding:0 28px 0 10px;max-width:100%;min-width:0;}

.rxr-hero{position:relative;overflow:hidden;border:1px solid #25384F;border-radius:var(--radius);padding:26px 28px 24px;color:#fff;
  background:var(--brand-grad) top left/100% 2px no-repeat,
    radial-gradient(640px 300px at 94% -24%,rgba(var(--bc-grad-a-rgb),.34),transparent 70%),
    radial-gradient(520px 260px at -4% 125%,rgba(var(--bc-grad-b-rgb),.16),transparent 70%),var(--bc-navy);
  box-shadow:0 18px 44px -26px rgba(var(--bc-navy-rgb),.55);}
.rxr-hero::before{content:'';position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(rgba(255,255,255,.04) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.04) 1px,transparent 1px);
  background-size:32px 32px;-webkit-mask-image:linear-gradient(90deg,transparent,#000 55%);mask-image:linear-gradient(90deg,transparent,#000 55%);}
.rxr-hero > *{position:relative;}
.rxr-hero-top{display:flex;align-items:flex-start;gap:18px;justify-content:space-between;}
.rxr-hero-t{min-width:0;}
.rxr-eyebrow{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#8FA6C4;margin-bottom:6px;}   /* v1.4.10.473: the eyebrow look, 11/600 uppercase .06em like .ah-eyebrow (was 12/500) */
.rxr-hero h2{margin:0;font-size:20px;line-height:1.15;font-weight:600;letter-spacing:-.024em;color:#fff;}
.rxr-hero-sub{margin-top:6px;font-size:13px;color:#C3D0DE;}
.rxr-hero-scope{margin-top:3px;font-size:12px;color:#8FA6C4;}
.rxr-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-top:22px;}
.rxr-kpi{position:relative;background:rgba(255,255,255,.05);border:1px solid #25384F;border-radius:6px;padding:14px 15px 12px;min-width:0;overflow:hidden;}
.rxr-kpi::before{content:'';position:absolute;left:0;right:0;top:0;height:3px;background:var(--bc-accent-lite);}
.rxr-kpi.tone-brand::before{background:var(--brand-grad);} .rxr-kpi.tone-ok::before{background:#3ED27C;}
.rxr-kpi.tone-warn::before{background:#FFB000;} .rxr-kpi.tone-err::before{background:#FF6B5E;}
.rxr-kpi.tone-purple::before{background:#B794F6;} .rxr-kpi.tone-muted::before{background:#5C7392;}
.rxr-kpi .v{font-size:20px;font-weight:600;letter-spacing:-.02em;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.rxr-kpi .l{font-size:12px;font-weight:500;color:#C3D0DE;margin-top:2px;}
/* v1.4.10.473: the asset report viewer's KPI labels take the KPI-label look, 11/600 uppercase .06em like .avv-kpi .l (were 12/500).
   Scoped off Client statistics (.cs-page reuses these tiles): uppercase wrapped a second label in its 6-across row there
   and set the sub-lines at two heights — that page's owner decides its tiles. */
.rxr-view:not(.cs-page) .rxr-kpi .l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;}
/* v1.4.10.473: on a phone (2-across) one label in a row wrapped and its neighbour's didn't, so the sub-lines sat 17px apart
   (Purchase cost / Current value). Every label holds two lines there, so a row's sub-lines start level. */
@media (max-width:1100px){ .rxr-view:not(.cs-page) .rxr-kpi .l{line-height:1.5;min-height:3em;} }
.rxr-kpi .s{font-size:12px;color:#8FA6C4;margin-top:2px;line-height:1.35;}
/* v1.4.10.538: the tile's AVDesk glyph top right (rxrKpiHtml, k.icon), in the tile's tone; the figure keeps clear of it */
.rxr-kpi-ic{position:absolute;right:12px;top:12px;display:inline-flex;font-size:16px;line-height:1;color:var(--bc-accent-lite);}
.rxr-kpi.has-ic .v{padding-right:24px;}
.rxr-kpi.tone-ok .rxr-kpi-ic{color:#3ED27C;} .rxr-kpi.tone-warn .rxr-kpi-ic{color:#FFB000;} .rxr-kpi.tone-err .rxr-kpi-ic{color:#FF6B5E;} .rxr-kpi.tone-purple .rxr-kpi-ic{color:#B794F6;} .rxr-kpi.tone-muted .rxr-kpi-ic{color:#5C7392;}

.rxr-about{position:relative;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--radius);padding:13px 16px 13px 19px;font-size:13px;line-height:1.6;color:var(--text-mute);}
.rxr-about::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;border-radius:var(--radius) 0 0 var(--radius);background:var(--brand-grad);}

.rxr-sec-h{display:flex;flex-direction:column;gap:3px;margin-bottom:12px;}
.rxr-kick{display:block;width:22px;height:3px;background:var(--brand-grad);margin-bottom:6px;}
.rxr-sec-h h3{margin:0;font-size:16px;font-weight:600;letter-spacing:-.012em;color:var(--text);}
.rxr-sec-h p{margin:0;font-size:13px;color:var(--text-mute);line-height:1.5;}
.rxr-sec{display:flex;flex-direction:column;gap:14px;min-width:0;}
.rxr-sec > .rxr-sec-h{margin-bottom:0;}

.rxr-find{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;}
.rxr-find ul{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px 26px;}
.rxr-find li{position:relative;padding-left:18px;font-size:13px;line-height:1.55;color:var(--text);}
.rxr-find li::before{content:'';position:absolute;left:0;top:.52em;width:8px;height:8px;border-radius:2px;background:var(--brand-blue);}
.rxr-find li.tone-ok::before{background:var(--ok);} .rxr-find li.tone-warn::before{background:var(--warn);}
.rxr-find li.tone-err::before{background:var(--err);} .rxr-find li.tone-purple::before{background:var(--brand-purple);}
.rxr-find li.tone-muted::before{background:var(--text-dim);}

.rxr-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;min-width:0;}
.rxr-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px 12px;min-width:0;}
.rxr-card.span2{grid-column:1/-1;}
.rxr-card-h{margin-bottom:10px;min-width:0;}
.rxr-card-h h4{margin:0;font-size:15px;font-weight:600;color:var(--text);letter-spacing:-.012em;}
.rxr-card-h p{margin:2px 0 0;font-size:12px;color:var(--text-dim);line-height:1.4;}
.rxr-chart{width:100%;min-width:0;position:relative;}
.rxr-chart svg.rxr-svg{display:block;width:100%;overflow:visible;font-family:var(--font-body);}
.rxr-chart svg.rxr-svg rect[fill]:hover,.rxr-chart svg.rxr-svg path:hover{filter:brightness(1.08) saturate(1.08);}
.rxr-nodata{display:flex;align-items:center;justify-content:center;height:100%;min-height:90px;padding:16px;text-align:center;font-size:13px;color:var(--text-dim);background:var(--surface-2);border-radius:6px;}

.rxr-tbl{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px 12px;min-width:0;}
.rxr-tbl-h{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:10px;}
.rxr-tbl-h h4{margin:0;font-size:15px;font-weight:600;color:var(--text);}
.rxr-tbl-h span{font-size:12px;color:var(--text-dim);}
.rxr-tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);border-radius:6px;}
.rxr-dt{width:100%;margin:0;font-size:13px;}
.rxr-dt th{white-space:nowrap;background:var(--accent-soft);color:var(--accent-deep);font-size:12px;font-weight:600;}
.rxr-dt td{white-space:nowrap;max-width:320px;overflow:hidden;text-overflow:ellipsis;}
.rxr-dt th.r,.rxr-dt td.r{text-align:right;font-variant-numeric:tabular-nums;}
.rxr-dt td:first-child{font-weight:600;}
.rxr-dt tfoot td{background:var(--surface-2);font-weight:600;border-top:1px solid var(--line-2);}
.rxr-dt tr.rxr-click{cursor:pointer;}
.rxr-dt tr.rxr-click:hover td{background:var(--accent-soft);}
.rxr-dt tr.tone-err td:first-child{box-shadow:inset 3px 0 0 var(--err);color:var(--err);}
.rxr-dt tr.tone-warn td:first-child{box-shadow:inset 3px 0 0 var(--warn);}
.rxr-dt tr.tone-muted td{color:var(--text-mute);}
.rxr-more{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:10px;font-size:12px;color:var(--text-dim);}
.rxr-note{margin-top:8px;font-size:12px;color:var(--text-dim);line-height:1.5;}
.rxr-foot{font-size:12px;color:var(--text-dim);text-align:center;padding:4px 0 8px;}

@media (max-width:1100px){ .rxr-kpis{grid-template-columns:repeat(2,minmax(0,1fr));} }
@media (max-width:900px){ .rxr-grid{grid-template-columns:minmax(0,1fr);} .rxr-find ul{grid-template-columns:minmax(0,1fr);} }
@media (max-width:700px){
  .rxr-hero{padding:18px 16px 16px;}
  .rxr-hero h2{font-size:18px;}
  .rxr-kpis{gap:8px;margin-top:16px;}
  .rxr-kpi{padding:11px 11px 10px;}
  .rxr-kpi .v{font-size:20px;}
  .rxr-bar .btn,.rxr-sel{min-height:40px;}
  .rxr-bar .rxr-sel{flex:1 1 100%;}
  .rxr-bar-sp{display:none;}
  .rxr-card,.rxr-tbl{padding:12px 12px 10px;}
  .rxr-more .btn{min-height:40px;}
}

/* v1.4.10.366 — asset reports: numbered sections, the jump bar, "About this report" */
.rxr-sec{scroll-margin-top:14px;}
.rxr-sec-t{display:flex;align-items:center;gap:10px;min-width:0;}
.rxr-num{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:22px;padding:0 7px;border-radius:6px;background:var(--brand-grad);color:#fff;font-size:12px;font-weight:600;letter-spacing:.02em;font-variant-numeric:tabular-nums;}
.rxr-nav{display:flex;flex-wrap:wrap;gap:8px;}
.rxr-nav-i{display:inline-flex;align-items:center;gap:8px;min-height:34px;padding:0 13px 0 6px;border:1px solid var(--line);border-radius:999px;background:var(--surface);font:inherit;font-size:13px;font-weight:500;color:var(--text);cursor:pointer;transition:border-color .15s,color .15s,box-shadow .15s;}
.rxr-nav-i b{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:22px;padding:0 6px;border-radius:999px;background:var(--brand-grad);color:#fff;font-size:11px;font-weight:600;font-variant-numeric:tabular-nums;}
.rxr-nav-i:hover{border-color:var(--accent);color:var(--accent-deep);box-shadow:0 3px 12px rgba(var(--bc-accent-rgb),.08);}
.rxr-notes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 30px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;}
.rxr-note-i{min-width:0;}
.rxr-note-i b{display:block;font-size:13px;font-weight:600;color:var(--text);margin-bottom:3px;}
.rxr-note-i p{margin:0;font-size:12px;line-height:1.55;color:var(--text-mute);}
@media (max-width:900px){ .rxr-notes{grid-template-columns:minmax(0,1fr);} }
@media (max-width:700px){ .rxr-nav-i{min-height:40px;} }

/* ════════════════════════════════════════════════════════════════════
   v1.4.10.367 — UPDATE OS ON ALL DEVICES
   The Ody software card's Operating system column, the confirm window's
   box-by-box plan, a run's steps and apt output, and the site panel's
   OS-update banner (which rides the .opi-rb reboot banner).
   ════════════════════════════════════════════════════════════════════ */
.ody-os-tblwrap{overflow-x:auto;max-width:100%;}
.ody-os-tblwrap>.dt{min-width:760px;}
.ody-os-st{margin-top:4px;display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;}
.ody-os-st .pill{display:inline-flex;align-items:center;gap:5px;}
.ody-os-spin{width:7px;height:7px;border-radius:50%;background:currentColor;flex-shrink:0;animation:odyOsBlink 1.2s ease-in-out infinite;}
@keyframes odyOsBlink{0%,100%{opacity:.25;}50%{opacity:1;}}
@media (prefers-reduced-motion:reduce){.ody-os-spin{animation:none;}}
.ody-os-acts{margin-top:3px;} .ody-os-acts a{cursor:pointer;}
.ody-os-cmd{margin:6px 0 10px;padding:10px 12px;border-radius:8px;background:var(--surface-2);border:1px solid var(--line);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;color:var(--text);}
.ody-os-sum{margin:12px 0 8px;font-size:13px;color:var(--text);}
.ody-os-list{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;max-height:min(46vh,420px);overflow-y:auto;}
.ody-os-row{display:grid;grid-template-columns:156px minmax(0,1fr);align-items:start;gap:10px;padding:10px 12px;border-top:1px solid var(--line);background:var(--surface);}
.ody-os-row:first-child{border-top:0;}
.ody-os-row>.pill{justify-self:start;margin-top:1px;}
.ody-os-row.skip{background:var(--surface-2);}
.ody-os-mid{flex:1;min-width:0;font-size:12px;line-height:1.5;overflow-wrap:anywhere;}
.ody-os-now{margin:4px 0 10px;font-size:12px;line-height:1.55;color:var(--text);}
.ody-os-now .pill{margin-right:6px;}
.ody-os-steps{list-style:none;margin:6px 0 10px;padding:0;display:flex;flex-direction:column;gap:6px;}
.ody-os-steps li{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text);}
.ody-os-steps li.todo,.ody-os-steps li.skip{color:var(--text-mute);}
.ody-os-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;border:2px solid var(--line);background:var(--surface);}
.ody-os-steps li.ok .ody-os-dot{background:var(--ok);border-color:var(--ok);}
.ody-os-steps li.err .ody-os-dot{background:var(--err);border-color:var(--err);}
.ody-os-steps li.now .ody-os-dot{background:var(--brand-purple);border-color:var(--brand-purple);animation:odyOsBlink 1.2s ease-in-out infinite;}
.ody-os-steps li.skip .ody-os-dot{border-style:dashed;}
.ody-os-log{margin-top:10px;} .ody-os-log summary{cursor:pointer;font-size:12px;color:var(--text-mute);min-height:28px;display:flex;align-items:center;}
.ody-os-log pre{margin:6px 0 0;padding:10px 12px;max-height:260px;overflow:auto;border-radius:8px;background:#0C1B2A;color:#DCE6F2;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;line-height:1.45;white-space:pre-wrap;word-break:break-word;}
.opi-os .btn{flex-shrink:0;}
.opi-os-bar{margin-top:7px;height:6px;border-radius:999px;background:rgba(var(--bc-accent-rgb),.12);overflow:hidden;max-width:360px;}
.opi-os-bar>span{display:block;height:100%;border-radius:999px;background:var(--brand-grad);transition:width .4s ease;}
@media (max-width:600px){ .opi-os{flex-wrap:wrap;} .opi-os .btn{width:100%;justify-content:center;} .ody-os-row{grid-template-columns:minmax(0,1fr);gap:4px;} }
@media (max-width:760px){ .ody-os-acts a{display:inline-flex;align-items:center;min-height:40px;} }

/* v1.4.10.369: a MIB reading with no graph yet is a compact value card, not an empty frame */
.amib-card.nochart{min-height:0;}
.amib-card.nochart .amib-card-m{margin-bottom:0;}

/* ── v1.4.10.373 — this Ody's own settings (site page) + Expected offline (asset Control tab) ── */
.opi-set{border:1px solid var(--line,#E3E8EF);border-radius:12px;padding:12px 14px;margin:12px 0;background:var(--band,#F7F9FC)}
.opi-set-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:6px}
.opi-set-head b{font-size:15px;font-weight:600;letter-spacing:-.012em}   /* v1.4.10.473: card title 15/600 like the Network and Ody health cards beside it (read 14/700) */
.opi-set-head .btn{flex:0 0 auto}
.opi-set-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:4px 20px}
.opi-set-h{font:600 11px/1.3 var(--font);text-transform:uppercase;letter-spacing:.06em;color:var(--mute,#75899B);margin:10px 0 4px}
.opi-set-row{display:flex;justify-content:space-between;gap:10px;padding:5px 0;border-bottom:1px dashed var(--line-2,#EDF1F5);font-size:13px;line-height:1.35}
.opi-set-row .k{color:var(--ink-2,#46596B);min-width:0}
.opi-set-row .v{text-align:right;color:var(--ink,#0C1B2A);min-width:0;overflow-wrap:anywhere}
.opi-set-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 14px}
.opi-set-modal .fld select{width:100%}
@media (max-width:700px){.opi-set-head{flex-direction:column}.opi-set-head .btn{min-height:40px}.opi-set-fields{grid-template-columns:minmax(0,1fr)}}
.aow-now{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:10px;background:#FFF6E5;border:1px solid #F5D58A;margin-bottom:12px;font-size:13px;line-height:1.45}
.aow-now svg{width:18px;height:18px;flex:0 0 auto;margin-top:1px}
.aow-list{display:flex;flex-direction:column;gap:8px}
.aow-row{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:10px 12px;border:1px solid var(--line,#E3E8EF);border-radius:10px;background:#fff}
.aow-row.on{border-color:#F5D58A;background:#FFFBF2}
.aow-row.off{opacity:.62}
.aow-main{min-width:0;flex:1}
.aow-t{font-weight:600;overflow-wrap:anywhere}
.aow-state{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:4px}
.aow-acts{display:flex;gap:6px;flex:0 0 auto}
.aow-edit .aow-lbl{font-size:12px;font-weight:500;color:var(--ink-2,#46596B);margin:8px 0 4px}
.aow-wd,.aow-md{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px}
.aow-chip{position:relative;display:flex;align-items:center;justify-content:center;border:1px solid var(--line,#E3E8EF);border-radius:8px;min-height:34px;cursor:pointer;font-size:12px;font-weight:500;user-select:none;background:#fff}
.aow-chip input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px}
.aow-chip:has(input:checked){background:var(--brand-blue,var(--bc-accent));border-color:var(--brand-blue,var(--bc-accent));color:#fff}
.aow-chip:has(input:focus-visible){outline:2px solid var(--brand-blue,var(--bc-accent));outline-offset:2px}
.aow-chip.wide{grid-column:span 3}
.aow-times{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 12px;margin-top:8px}
.aow-times .aow-hint{grid-column:1/-1;margin:-2px 0 8px}
.aow-times .fld input{width:100%;min-width:0}
@media (max-width:760px){.aow-chip{min-height:40px}.aow-row{flex-direction:column;align-items:stretch}.aow-acts{justify-content:flex-end}.aow-acts .btn{min-height:40px;min-width:40px}}
.aow-form{border:1px solid var(--brand-blue,var(--bc-accent));border-radius:12px;padding:12px 14px;margin:0 0 12px;background:var(--band,#F7F9FC)}
.aow-form-h{font-weight:600;margin-bottom:8px}
.aow-form-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}
@media (max-width:760px){.aow-form-foot .btn{min-height:40px;flex:1}}


/* ══════════════════ v1.4.10.374 — THE BELL'S COUNT ══════════════════
   The count used to wear `.notif-dot`, a class it shared with an 8 px status
   dot (see ~line 569): that rule's width:8px and the badge's min-width:16px
   pinned it at 16 px under border-box, and "99+" (19 px of text) spilled out
   white on white. It has its own class now and grows with its text, sits on
   the button's corner with a ring that separates it from the border, and the
   top bar's icon buttons no longer shrink (they measured 31 x 36 at 1440). */
.topbrand .icon-btn{flex-shrink:0;}
.bell-count{position:absolute;top:-7px;right:-7px;z-index:1;display:inline-flex;align-items:center;justify-content:center;
  box-sizing:border-box;width:auto;min-width:18px;height:18px;padding:0 5px;border-radius:9px;
  background:var(--err,#DC2626);color:#fff;font-family:var(--font-body);
  font-size:10px;font-weight:700;line-height:1;letter-spacing:0;white-space:nowrap;font-variant-numeric:tabular-nums;
  box-shadow:0 0 0 2px var(--surface,#fff);pointer-events:none;}
.bell-count.over{padding:0 4px 0 5px;}
.notif-more{margin:0 0 10px;padding:8px 12px;border-radius:6px;font-size:12px;line-height:1.45;
  background:var(--band,#F7F9FC);border:1px solid var(--line,#E3E8EF);color:var(--text-2,#334155);}

/* ── v1.4.10.374: the top bar between a phone and a laptop (601–880 px) ──
   Measured on v1.4.10.373: 818 px of header in a 768 px window and 886 px in
   700 — the sign-out button sat off the right edge and could not be reached,
   and the sound and bell buttons were squeezed to 30 px to make what room there
   was (they now keep their size). Only a touch tablet already gave up the search
   field here; any narrow window now does: ≤760 px takes the phone's two-row
   header (brand … search · sound · bell · you, then the three pickers), 761–880
   keeps one row with the search behind its magnifier. */
@media (min-width:601px) and (max-width:760px){
  .topbrand{height:auto;}
  .topbrand-inner{flex-wrap:wrap;padding:8px 16px 10px;row-gap:8px;}
  .topbrand .tb-spacer{flex:1 1 auto;min-width:0;}
  .topbrand .site-picker{flex:1 1 30%;max-width:none;min-width:0;order:5;}
}
@media (min-width:601px) and (max-width:880px){
  .topbrand .search-box{display:none;}
  .msearch-btn{display:inline-flex;}
  .topbrand.search-open{height:auto;}
  .topbrand.search-open .topbrand-inner{flex-wrap:wrap;row-gap:8px;padding-bottom:10px;}
  .topbrand.search-open .search-box{display:block;flex:1 1 100%;order:10;min-width:0;max-width:none;}
  .topbrand.search-open .search-box input,.topbrand.search-open .search-box input:focus{width:100%;}
  .topbrand.search-open .msearch-btn{color:var(--brand-blue);border-color:var(--brand-blue);background:var(--accent-glow);}
  .topbrand.search-open .search-results{left:0;right:0;width:auto;max-height:min(440px,55dvh);}
}
@media (min-width:761px) and (max-width:880px){
  .topbrand .site-picker{flex:1 1 0;min-width:92px;max-width:160px;}
  .topbrand-inner{gap:8px;padding-left:16px;padding-right:16px;}
}

/* ══ v1.4.10.377 — SITE → MONITORING REBUILT ═════════════════════════════════
   A status band, the state banners, a section switch, and full-width sections.
   The devices list scrolls inside its own frame (sticky header, both scrollbars
   on screen); a phone gets one card per device and ordinary page scroll.     */
.mon{display:flex;flex-direction:column;gap:14px;min-width:0;}
.mon-bandhost:empty,.mon-banners:empty{display:none;}
.mon-banners{display:flex;flex-direction:column;gap:10px;}
.mon-banners > *{margin:0 !important;}

/* the status band */
.mon-band{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"id acts" "stats stats";
  gap:14px 20px;align-items:center;padding:16px 20px 14px 22px;border:1px solid var(--line);border-radius:12px;background:var(--surface);
  box-shadow:var(--shadow-sm);overflow:hidden;}
.mon-band::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--mon-tone,var(--line));}
.mon-band.st-ok{--mon-tone:var(--ok);} .mon-band.st-warn{--mon-tone:var(--warn);} .mon-band.st-err{--mon-tone:var(--err);}
.mon-band.st-paused{--mon-tone:var(--brand-purple,var(--bc-purple));} .mon-band.st-muted{--mon-tone:var(--text-dim,#94A3B8);grid-template-areas:"id acts";}
.mon-id{grid-area:id;display:flex;align-items:center;gap:14px;min-width:0;}
.mon-box{position:relative;flex:none;width:46px;height:46px;border-radius:11px;background:var(--navy,var(--bc-navy));color:#fff;display:flex;align-items:center;justify-content:center;}
.mon-box.is-muted{background:var(--surface-3,#EEF2F7);color:var(--text-mute);}
.mon-box svg{width:22px;height:22px;}
.mon-led{position:absolute;right:-4px;bottom:-4px;width:14px;height:14px;border-radius:50%;border:3px solid var(--surface,#fff);background:var(--text-dim,#94A3B8);}
.mon-led.ok{background:var(--ok);} .mon-led.warn{background:var(--warn);} .mon-led.err{background:var(--err);} .mon-led.paused{background:var(--brand-purple,var(--bc-purple));}
.mon-idtxt{min-width:0;}
.mon-title{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:15px;font-weight:600;letter-spacing:-.012em;color:var(--text);line-height:1.3;}
.mon-title .help-tip{margin:0;}
.mon-host{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:15px;font-weight:600;letter-spacing:-.01em;overflow-wrap:anywhere;}
.mon-sub{font-size:12px;color:var(--text-mute);margin-top:4px;line-height:1.5;}
.mon-acts{grid-area:acts;display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;align-items:center;margin:0 !important;}
.mon-acts .btn{white-space:nowrap;}
.mon-acts .icon-only{align-self:stretch;aspect-ratio:1;min-width:34px;padding:0;display:inline-flex;align-items:center;justify-content:center;}
.mon-acts .icon-only svg{width:15px;height:15px;}
/* v1.4.10.473: the band's figures are scoped to .mon-band. As bare .mon-stats / .mon-stat they also restyled the Monitoring
   page's "Monitoring source" tiles (js/04 monOdyCard, the v302 tiles above), and those tiles' min-width:120px pushed the
   band's three-across phone grid into overlapping cells */
.mon-band > .mon-stats{grid-area:stats;display:flex;flex-wrap:wrap;align-items:stretch;border-top:1px solid var(--line);padding-top:10px;margin:0 -4px;}
.mon-band .mon-stat{display:inline-flex;align-items:baseline;gap:7px;text-align:left;padding:4px 16px;margin:0;border:0;border-left:1px solid var(--line);border-radius:0;
  background:none;font:inherit;font-size:12px;color:var(--text-mute);cursor:pointer;min-height:32px;}
.mon-band .mon-stat:first-child{border-left:0;}
.mon-stat b{font-size:20px;font-weight:600;letter-spacing:-.02em;color:var(--text);font-variant-numeric:tabular-nums;}
.mon-stat.ok b{color:var(--ok);} .mon-stat.warn b{color:var(--warn);} .mon-stat.err b{color:var(--err);} .mon-stat.blue b{color:var(--brand-blue);}
.mon-stat:hover span{color:var(--text);text-decoration:underline;text-underline-offset:3px;}
.mon-stat:focus-visible,.mon-tab:focus-visible,.opi-sort:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;border-radius:6px;}
.mon-enable{display:flex;align-items:flex-start;gap:10px;max-width:420px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;cursor:pointer;font-size:13px;}
.mon-enable input{margin-top:3px;width:16px;height:16px;flex:none;}
.mon-enable .device-meta{display:block;font-weight:400;margin-top:2px;}

/* the section switch — a segmented control, so it reads as the level below the site's tabs */
.mon-nav{display:flex;gap:2px;align-self:flex-start;max-width:100%;padding:3px;border:1px solid var(--line);border-radius:11px;
  background:var(--surface-2,#F6F8FC);overflow-x:auto;scrollbar-width:none;}
.mon-nav::-webkit-scrollbar{display:none;}
.mon-nav:empty{display:none;}
.mon-tab{display:inline-flex;align-items:center;gap:7px;padding:0 13px;min-height:36px;border:0;border-radius:8px;background:none;font:inherit;
  font-size:12px;font-weight:600;color:var(--text-mute);cursor:pointer;white-space:nowrap;}
.mon-tab svg{width:15px;height:15px;flex:none;}
.mon-tab:hover{color:var(--text);}
.mon-tab.on{background:var(--surface,#fff);color:var(--text);font-weight:600;box-shadow:0 1px 2px rgba(15,23,42,.08),0 0 0 1px var(--line);}
/* v1.4.10.486: the user editor's way from the role just picked to its Permissions tab */
.ue-perm-next{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:12px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2,var(--bg,#f8fafc));}
/* v1.4.10.486: several Odys per site — the switcher strip above the band (one tab per Ody, Add Ody at the end) */
.mon-ody-switch{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 10px;}
.mon-ody-tab{display:inline-flex;align-items:center;gap:7px;padding:0 12px;min-height:36px;border:1px solid var(--line);border-radius:999px;background:var(--surface,#fff);color:var(--text-mute);font:inherit;font-size:12px;font-weight:500;cursor:pointer;}
.mon-ody-tab:hover{color:var(--text);border-color:var(--line-2,var(--line));}
.mon-ody-tab.on{color:var(--text);font-weight:600;border-color:var(--brand-blue);box-shadow:0 0 0 1px var(--brand-blue) inset;}
.mon-ody-tab .dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto;}
.mon-ody-tab .dot.muted{background:#cbd5e1;}
.mon-ody-prim{font-size:10px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-dim);}
.mon-ody-which{font-weight:600;color:var(--brand-blue);margin-right:6px;}
.mon-ody-which::after{content:"\00b7";color:var(--text-dim);margin-left:6px;}
.mon-ody-add{margin-left:auto;}
.vq-ody{color:var(--brand-blue);}
@media (max-width:640px){ .mon-ody-tab{min-height:40px;} .mon-ody-add{margin-left:0;} }
.mon-tab.on svg{color:var(--brand-blue);}
.mon-tab .mon-n{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:1px 7px;   /* v1.4.10.473: a count badge, the badge role in full (10/700 uppercase .04em) */border-radius:999px;background:var(--surface-3,#EEF2F7);color:var(--text-mute);font-variant-numeric:tabular-nums;}
.mon-tab.on .mon-n{background:color-mix(in srgb,var(--brand-blue) 12%,transparent);color:var(--brand-blue);}
.mon-tab .dot{margin:0;}

/* sections */
.mon-view{display:flex;flex-direction:column;gap:14px;min-width:0;}
.mon-view[hidden]{display:none !important;}
.mon-2col{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(440px,100%),1fr));gap:14px;align-items:start;}
.mon-2col:empty,.mon-2col > div:empty{display:none;}
.mon-card{padding:16px 18px;min-width:0;}
.mon-card-h{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:12px;}
.mon-card-h h3{font-size:15px;font-weight:600;margin:0;color:var(--text);}
.mon-card-f{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px;}
.mon-p{font-size:12px;line-height:1.6;color:var(--text-mute);margin:0 0 10px;max-width:78ch;}
.mon-notes{font-size:13px;line-height:1.6;white-space:pre-wrap;color:var(--text);}
.mon-toggle{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;margin:0;font-size:13px;}
.mon-toggle input{margin-top:3px;flex:none;}
.mon-toggle .device-meta{display:block;font-weight:400;margin-top:2px;}
.mon-danger{border-color:color-mix(in srgb,var(--err) 30%,var(--line));}
.mon-danger-row{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:10px 0;border-top:1px solid var(--line);font-size:13px;}   /* v1.4.10.473: body 13 (read 14, the page default) */
.mon-danger-row:first-of-type{border-top:0;padding-top:0;}
.mon-danger-row .btn{flex:none;}
.opi .opi-health{margin:0;}
.opi .opi-grid{margin:0;}
.opi .opi-cmds{margin:0;max-height:520px;overflow:auto;}
.opi .opi-set{margin:0;border-radius:12px;background:var(--surface);padding:16px 18px;box-shadow:var(--shadow-sm);}
.opi .opi-set-grid{grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));gap:4px 28px;}
.opi .opi-login,.opi .opi-soft{max-width:880px;}

/* devices */
.opi .opi-devs{padding:0;overflow:hidden;}
.opi .opi-devbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;padding:12px 14px;border-bottom:1px solid var(--line);}
.opi .opi-search{position:relative;flex:1 1 240px;max-width:380px;min-width:0;margin:0;}
.opi .opi-search input{width:100%;height:36px;padding:0 12px 0 34px;border:1px solid var(--line);border-radius:9px;background:var(--surface);font:inherit;font-size:13px;color:var(--text);}
.opi .opi-search input:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px rgba(var(--bc-accent-rgb),.12);}
.opi .opi-search-ic{position:absolute;left:11px;top:50%;transform:translateY(-50%);width:15px;height:15px;display:flex;color:var(--text-dim);pointer-events:none;}
.opi .opi-search-ic svg{width:15px;height:15px;}
.opi .opi-netwrap:empty{display:none;}
.opi .opi-netsel{height:36px;max-width:260px;padding:0 30px 0 10px;border:1px solid var(--line);border-radius:9px;background:var(--surface);font:inherit;font-size:13px;color:var(--text);}
.opi .opi-devbar .opi-chips{margin-left:auto;}
.opi .opi-chip{min-height:30px;display:inline-flex;align-items:center;gap:4px;}
.opi .opi-tblwrap{overflow:auto;border:0;border-radius:0;max-height:max(420px,calc(100vh - 250px));overscroll-behavior:contain;scrollbar-gutter:stable;}
.opi .opi-tblwrap:focus{outline:none;}
.opi .opi-tbl{min-width:860px;font-size:13px;}
.opi .opi-tbl thead th{position:sticky;top:0;z-index:2;background:var(--surface-2,#F6F8FC);box-shadow:inset 0 -1px 0 var(--line);border-bottom:0;padding:0 12px;height:38px;vertical-align:middle;font-size:11px;letter-spacing:.06em;}
.opi .opi-tbl td{padding:10px 12px;vertical-align:top;}
.opi .opi-tbl tbody tr:hover td{background:color-mix(in srgb,var(--brand-blue) 3%,transparent);}
.opi .opi-tbl tr.is-off td{background:color-mix(in srgb,var(--err) 3%,transparent);}
.opi .opi-tbl .c-addr{width:170px;} .opi .opi-tbl .c-svc{width:190px;} .opi .opi-tbl .c-av{width:200px;} .opi .opi-tbl .c-act{width:1%;white-space:nowrap;text-align:right;}
.opi .opi-sort{display:inline-flex;align-items:center;gap:5px;padding:0;border:0;background:none;font:inherit;font-weight:600;color:inherit;text-transform:inherit;letter-spacing:inherit;cursor:pointer;min-height:28px;}
.opi .opi-sort-ic{opacity:.45;font-size:11px;} .opi .opi-sort.on{color:var(--brand-blue);} .opi .opi-sort.on .opi-sort-ic{opacity:1;}
.opi .opi-addr{display:flex;align-items:center;gap:8px;}
.opi .opi-addr .dot{flex:none;margin:0;}
.opi .opi-ip{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;background:none;padding:0;color:var(--text);}
.opi .opi-net{margin:4px 0 0 16px;line-height:1.5;}
.opi .opi-dname{font-weight:600;color:var(--text);overflow-wrap:anywhere;}
.opi .opi-macline code{font-size:11px;background:none;padding:0;}
.opi .opi-facts{cursor:pointer;}
.opi .opi-svcs{max-width:none;}
.opi .opi-avlink{cursor:pointer;}
.opi .opi-acts{white-space:nowrap;}
.opi .opi-acts .btn{margin-left:6px;}
.opi .opi-acts .btn{height:30px;min-height:30px;display:inline-flex;align-items:center;vertical-align:top;}
.opi .opi-kebab{width:32px;padding:0;justify-content:center;}
.opi .opi-kebab svg{width:15px;height:15px;}
.opi .opi-empty{margin:18px;}
.opi .opi-listfoot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:10px 14px;border-top:1px solid var(--line);font-size:12px;color:var(--text-mute);}
.opi .opi-listfoot:empty{display:none;}
.opi .opi-listfoot-acts{display:inline-flex;gap:6px;}

/* the menu under More and each row's ⋯ */
.mon-pop{position:fixed;z-index:1400;min-width:220px;max-width:min(320px,calc(100vw - 16px));padding:6px;display:flex;flex-direction:column;
  background:var(--surface,#fff);border:1px solid var(--line);border-radius:11px;box-shadow:0 14px 34px rgba(15,23,42,.18);}
.mon-pop button{display:flex;align-items:center;gap:9px;min-height:36px;padding:0 10px;border:0;border-radius:7px;background:none;font:inherit;font-size:13px;font-weight:500;color:var(--text);text-align:left;cursor:pointer;}
.mon-pop button svg{width:15px;height:15px;flex:none;color:var(--text-mute);}
.mon-pop button:hover,.mon-pop button:focus-visible{background:var(--surface-3,#EEF2F7);outline:none;}
.mon-pop button.danger,.mon-pop button.danger svg{color:var(--err);}
.mon-pop button[disabled]{opacity:.5;cursor:not-allowed;background:none;}
.mon-pop hr{border:0;border-top:1px solid var(--line);margin:5px 4px;}
.mon-pop-note{font-size:12px;line-height:1.45;color:var(--text-mute);padding:2px 10px 6px;}

/* the network section, full width */
.opi .onet{margin:0;padding:16px 18px;border-radius:12px;box-shadow:var(--shadow-sm);}
.opi .onet-cols{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);gap:16px 28px;align-items:start;}
.opi .onet-cols > .onet-grid{margin:0;}
.opi .onet-ifaces{margin:6px 0 10px 122px;}
.opi .onet-more{margin-top:16px;padding-top:14px;border-top:1px solid var(--line);}
.opi .onet-more-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px;}
.opi .onet-more-h b{font-size:13px;font-weight:600;}
.opi .onet-more-h .opi-bar{margin:0 0 0 auto;}
@media (max-width:1100px){ .opi .onet-cols{grid-template-columns:minmax(0,1fr);} }

@media (max-width:980px){
  .mon-band{grid-template-columns:minmax(0,1fr);grid-template-areas:"id" "acts" "stats";}
  .mon-band.st-muted{grid-template-areas:"id" "acts";}
  .mon-acts{justify-content:flex-start;}
}
@media (max-width:1000px) and (min-width:701px){
  .opi .opi-tbl{min-width:0;}
  .opi .opi-tbl .c-svc{display:none;}   /* what it answers on is in "what Ody found" */
}
@media (max-width:760px){
  .opi .onet-ifaces{margin-left:0;}
  .mon-danger-row{flex-direction:column;align-items:stretch;}
}
/* phone: one card per device, page scroll, 40 px targets */
@media (max-width:700px){
  .mon-band{padding:14px 14px 12px 18px;}
  .mon-acts .btn{flex:1 1 auto;min-height:40px;justify-content:center;}
  .mon-band > .mon-stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:4px;margin:0;}
  .mon-band .mon-stat{flex-direction:column;align-items:flex-start;gap:0;border-left:0;padding:6px 4px;min-height:44px;min-width:0;}   /* v1.4.10.473: min-width 0, a cell of the grid (the tiles' 120px overlapped the cells) */
  .mon-nav{align-self:stretch;}
  .mon-tab{min-height:40px;}
  .opi .opi-devbar{padding:12px;}
  .opi .opi-search{flex:1 1 100%;max-width:none;}
  .opi .opi-search input,.opi .opi-netsel{height:40px;font-size:16px;}
  .opi .opi-netwrap{display:flex;flex:1 1 100%;}
  .opi .opi-netsel{flex:1 1 100%;width:100%;max-width:none;}
  .opi .opi-devbar .opi-chips{margin-left:0;}
  .opi .opi-chip{min-height:40px;}
  .opi .opi-tblwrap{max-height:none;overflow:visible;}
  .opi .opi-tbl{min-width:0;display:block;}
  .opi .opi-tbl thead{display:none;}
  .opi .opi-tbl tbody{display:block;}
  .opi .opi-tbl tr{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 10px;padding:12px;border-bottom:1px solid var(--line);}
  .opi .opi-tbl td{display:block;padding:0;border:0;width:auto !important;}
  .opi .opi-tbl .c-addr{grid-column:1;grid-row:1;}
  .opi .opi-tbl .c-act{grid-column:2;grid-row:1;text-align:right;}
  .opi .opi-tbl .c-dev,.opi .opi-tbl .c-svc,.opi .opi-tbl .c-av{grid-column:1 / -1;}
  .opi .opi-tbl .c-svc:has(> .device-meta:only-child){display:none;}
  .opi .opi-acts .btn{min-height:40px;}
  .opi .opi-kebab{width:40px;}
  .opi .opi-tbl tbody tr:hover td,.opi .opi-tbl tr.is-off td{background:none;}
  .opi .opi-tbl tr.is-off{background:color-mix(in srgb,var(--err) 4%,transparent);}
  .opi .opi-listfoot .btn{min-height:40px;}
  .mon-pop button{min-height:44px;}
  .mon-card-f .btn,.mon-danger-row .btn{min-height:40px;}
}
/* the site's health card is full width now: four charts to a row where they fit */
.opi .opi-healthcard .odyh-charts{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));gap:12px;}
.opi .opi-healthcard .odyh-charts .odyh-wide{grid-column:1 / -1;}
@media (max-width:700px){ .opi .opi-acts .btn{height:40px;min-height:40px;} }

/* ── Which alerts open tickets (v1.4.10.380) — the asset tab and the site's Monitoring → Settings ── */
.ipol-scope{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.ipol-seg{display:inline-flex;padding:2px;gap:2px;}
.ipol-seg .seg-btn{padding:4px 8px;font-size:12px;min-height:0;}
.ipol-seg .seg-btn.active.ticket{background:var(--accent);color:#fff;}
.ipol-seg .seg-btn.active.notify{background:var(--warn);color:#1b1300;}
.ipol-seg .seg-btn.active.silent{background:var(--text-mute);color:#fff;}
.ipol-seg .seg-btn.active.ignore{background:var(--text-dim);color:#fff;}   /* v1.4.10.512: Ignore notification, quieter than Track only */
.ipol-seg.busy{opacity:.55;pointer-events:none;}
.ipol td{vertical-align:top;}
.ipol .ipol-name b{margin-right:6px;}
.ipol .ipol-name .device-meta{max-width:420px;margin-top:2px;font-size:11px;line-height:1.4;}
.ipol .ipol-ev{white-space:nowrap;}
.ipol .ipol-state{white-space:nowrap;}
.ipol .ipol-src{margin-top:4px;line-height:1.5;}
.ipol .ipol-src .pill{margin-left:2px;}
.ipol-x{margin-left:3px;text-decoration:none;font-weight:700;color:inherit;opacity:.7;}
.ipol-x:hover{opacity:1;}
.ipol .ipol-grp td{background:var(--surface-2);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);padding:6px 16px;}
.ipol .ipol-row.firing td{background:rgba(220,38,38,.04);}
.ipol .ipol-tot td{font-weight:600;}
@media (max-width:700px){
  .ipol-panel .panel-head{flex-wrap:wrap;}
  .ipol .ipol-name .device-meta{max-width:none;}
  .ipol-seg .seg-btn{min-height:40px;padding:6px 10px;}
  .ipol-scope .seg-btn{min-height:40px;}
}

/* ── The asset page's one stat row (v1.4.10.380: eight tiles, 4+4). v1.4.10.513: SIX tiles, every one a filter —
   6 across on a desktop, 3+3 on a tablet, a swipe on a phone (the phone rule is with .akpi-rail above) ── */
.akpi-rail.ast-rail{grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;margin-bottom:14px;}
@media(max-width:1099px){ .akpi-rail.ast-rail{grid-template-columns:repeat(3,minmax(0,1fr));} }
.ipol{table-layout:fixed;min-width:720px;}
/* v1.4.10.512: four choices now, so the row's columns are rebalanced (the evidence and Now columns were 13% and 15% of the
   table and "4 alerts · no tickets" ran into the Open pill) and the choices sit in an even two-by-two grid instead of a flex
   row that dropped the fourth under the other three */
.ipol .ipol-name,.ipol th:nth-child(1){width:34%;}
.ipol .ipol-ev,.ipol th:nth-child(2){width:15%;}
.ipol .ipol-state,.ipol th:nth-child(3){width:17%;}
.ipol .ipol-pol,.ipol th:nth-child(4){width:34%;}
.ipol td{overflow-wrap:anywhere;}
.ipol-seg{white-space:nowrap;}
.ipol .ipol-ev{white-space:normal;line-height:1.45;}
.ipol .ipol-state .pill{white-space:nowrap;}
/* v1.4.10.528: the Now cell wraps — the Open pill and the ticket it opened ran as one line into the choices beside them
   (ICCSYD-0722 over "Track only"); the ticket now sits on its own line under the pill */
.ipol .ipol-state{white-space:normal;}
.ipol .ipol-state .ctl-tk{display:block;margin-top:5px;font-weight:600;overflow-wrap:anywhere;}
.ipol .ipol-pol .ipol-seg{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px;width:100%;max-width:300px;white-space:normal;}
.ipol .ipol-pol .ipol-seg .seg-btn{justify-content:center;text-align:center;min-height:30px;padding:5px 8px;white-space:nowrap;}
.ipol .ipol-pol .ipol-seg.ipol-seg5 .seg-btn:first-child{grid-column:1 / -1;}   /* the site tab's "Each asset decides" / default row above the four */
@media (max-width:700px){ .ipol .ipol-pol .ipol-seg{max-width:none;} .ipol .ipol-pol .ipol-seg .seg-btn{min-height:40px;} }
@media (max-width:700px){ .ipol .ipol-name{min-width:200px;} }

/* ── Automation editor: capabilities + the asset picker (v1.4.10.380) ── */
.au-hidden{background:var(--surface-2);border-radius:6px;padding:6px 10px;margin:4px 0 8px;line-height:1.55;}
.au-hidden b{color:var(--text);}
.au-assets{display:flex;flex-direction:column;gap:6px;margin-bottom:8px;}
.au-asset-hits{display:flex;flex-direction:column;border:1px solid var(--border);border-radius:6px;overflow:hidden;max-height:260px;overflow-y:auto;}
.au-asset-hit{display:flex;gap:8px;align-items:baseline;text-align:left;background:var(--surface);border:0;border-bottom:1px solid var(--border);padding:7px 10px;font:inherit;font-size:12px;cursor:pointer;color:var(--text);}
.au-asset-hit:last-child{border-bottom:0;}
.au-asset-hit:hover{background:var(--surface-2);}
.au-asset-hit b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;}
.au-chips{display:flex;flex-wrap:wrap;gap:6px;}
.au-chips .au-chip{gap:6px;font-size:12px;font-weight:500;padding:3px 6px 3px 10px;}
.au-chips .au-chip b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;}
.au-chips .au-chip button{border:0;background:transparent;color:inherit;font-size:15px;line-height:1;cursor:pointer;padding:0 2px;opacity:.7;}
.au-chips .au-chip button:hover{opacity:1;}
@media (max-width:700px){ .au-asset-hit{min-height:40px;} .au-chips .au-chip button{min-width:32px;min-height:32px;} }
/* the picker's label sits in a flex COLUMN — a 240px flex-basis would become height (the v14003 lesson) */
.au-assets > label.au-grow{flex:0 0 auto;}

/* ── Billing (v1.4.10.383) — a light-surface chip for site / room names. .dh-tag is the DARK hero's
   white chip and vanished on the billing tables, so the billing page uses this one. ── */
/* v1.4.10.473: Poppins — most of these tags are words (site names, "2 Ody", "3 Links", "gift", the integrator's pool, the
   product); the room and space codes carry .mono and keep JetBrains Mono */
.bl-tag{ display:inline-block; font-family:var(--font-body); font-size:12px; font-weight:600; letter-spacing:0;
  color:var(--text, #1F2937); background:var(--surface-2, rgba(120,130,150,.10)); border:1px solid var(--line, rgba(120,130,150,.28));
  border-radius:6px; padding:2px 8px; vertical-align:middle; max-width:220px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
@media (max-width:700px){ .bl-tag{ max-width:140px; } }
.bl-tag.mono{ font-family:var(--font-mono);font-variant-numeric:tabular-nums; }   /* v1.4.10.473: a room / space code */
/* v1.4.10.473: refs and codes in Billing, the set-up wizard, the dashboard's billing card and the client page's tickets
   (INV-…, ORD-…, pack #, ticket refs, serials, BSB / account numbers, Xero tax codes and URIs) carry .mono, and no rule gave
   .mono a face, so they drew in Poppins; JetBrains Mono, as every ref (the face now comes from the base .mono rule). A long one
   (the Xero redirect and webhook URIs) breaks rather than run out of a phone-width panel; break-word leaves a table's ref
   column its full width */
.bl-pane .mono,.bl-wiz .mono,.bl-dash .mono,.cust-panel td.mono,#modal:has(#fx-err) b.mono{ overflow-wrap:break-word; }

/* ── Finance (v1.4.10.387) — the at-a-glance strip under the tabs, and the ledger's month rows ── */
.fin-glance-row{ display:flex; gap:8px; flex-wrap:wrap; margin:0 0 12px; }
.fin-glance{ flex:1; min-width:120px; display:flex; flex-direction:column; align-items:flex-start; gap:2px; padding:8px 12px; border:1px solid var(--line, rgba(120,130,150,.25)); border-radius:12px; background:var(--surface, transparent); cursor:pointer; text-align:left; font:inherit; color:inherit; min-height:44px; }
.fin-glance:hover{ border-color:var(--brand, var(--bc-blue-v1)); }
.fin-glance .fg-l{ font-size:11px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--text-mute); }
.fin-glance .fg-v{ font-size:20px; font-weight:600; letter-spacing:-.02em; line-height:1.15; }
.fin-ledger tr.fin-month-row td{ background:var(--surface-2, rgba(120,130,150,.08)); font-size:12px; padding:6px 12px; }
@media (max-width:700px){ .fin-glance{ min-width:calc(50% - 8px); } }

/* ── v1.4.10.389: Move Ody + the hardware lock ────────────────────────────── */
.opi-mode{display:flex;flex-direction:column;gap:6px;margin:0 0 6px;}
.opi-mode-opt{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line);border-radius:7px;cursor:pointer;font-size:13px;line-height:1.5;}
.opi-mode-opt:has(input:checked){border-color:color-mix(in srgb,var(--brand-blue) 60%,var(--line));background:color-mix(in srgb,var(--brand-blue) 6%,var(--surface));}
.opi-mode-opt input{margin-top:3px;flex:none;width:18px;height:18px;}
.opi-moving,.opi-movein{display:flex;align-items:center;gap:14px;margin:6px 0 12px;padding:12px 14px;border-radius:7px;font-size:13px;line-height:1.55;
  border:1.5px solid color-mix(in srgb,var(--brand-blue) 55%,var(--line));background:color-mix(in srgb,var(--brand-blue) 7%,var(--surface));}
.opi-moving.failed{border-color:color-mix(in srgb,var(--err) 55%,var(--line));background:color-mix(in srgb,var(--err) 7%,var(--surface));}
.opi-moving .opi-start-txt div,.opi-movein .device-meta{margin-top:3px;}
.opi-moving .btn,.opi-movein .btn{flex:none;min-height:40px;}
.opi-hw-alarm{margin-top:6px;padding:6px 8px;border-radius:6px;font-size:12px;line-height:1.45;border:1px solid color-mix(in srgb,var(--err) 50%,transparent);background:color-mix(in srgb,var(--err) 9%,transparent);color:var(--err);}
.opi-hw-alarm .device-meta{color:var(--text-mute);}
.opi-hw-alarm svg{width:13px;height:13px;vertical-align:-2px;margin-right:3px;}
.ody-lock-cell .pill{white-space:nowrap;}
.ody-lock-cell .btn{margin-top:4px;}
@media (max-width:760px){ .opi-moving,.opi-movein{flex-wrap:wrap;} .opi-moving .btn{width:100%;} }

/* ══ CLIENT STATISTICS (v1.4.10.390) — the portfolio and the client report, on the report engine's .rxr-* skin ══ */
.cs-kpis-6{grid-template-columns:repeat(6,minmax(0,1fr));}
.cs-kpis-8{grid-template-columns:repeat(4,minmax(0,1fr));}
.cs-hero-score{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:112px;padding:12px 16px;border-radius:12px;background:rgba(255,255,255,.06);border:1px solid #25384F;text-align:center;}
.cs-hero-score b{font-size:30px;line-height:1;font-weight:700;letter-spacing:-.03em;color:#fff;}
.cs-hero-score span{display:inline-block;margin-top:6px;padding:2px 10px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:0;background:var(--bc-accent-lite);color:var(--bc-navy);}   /* v1.4.10.473: the grade is a status pill, 11/600 like the grade chips in the table (was 12/700 .06em) */
.cs-hero-score.tone-ok span{background:#3ED27C;} .cs-hero-score.tone-warn span{background:#F5B942;} .cs-hero-score.tone-err span{background:#FF7A7A;} .cs-hero-score.tone-muted span{background:#8FA6C4;}
.cs-hero-score i{display:block;margin-top:6px;font-style:normal;font-size:12px;color:#C3D0DE;}
.cs-table-panel{margin:0;}
.cs-table th.cs-th{cursor:pointer;user-select:none;white-space:nowrap;}
.cs-table th.cs-th:hover{color:var(--brand);} .cs-table th.cs-th.on{color:var(--brand);} .cs-table th.cs-th i{font-style:normal;font-size:10px;margin-left:4px;}
.cs-table td.r,.cs-table th.r{text-align:right;white-space:nowrap;}
.cs-table td{vertical-align:middle;}
.cs-cname{display:flex;align-items:center;gap:10px;min-width:180px;} .cs-cname>span:last-child{display:flex;flex-direction:column;min-width:0;} .cs-cname .device-meta{font-size:12px;}
.cs-grade{display:inline-block;min-width:22px;padding:2px 7px;border-radius:6px;font-size:11px;font-weight:600;text-align:center;background:#EEF2F7;color:#46596B;vertical-align:middle;}   /* v1.4.10.473: status pill 11/600, like .cs-tag beside it (was 12/700) */
.cs-grade.tone-ok{background:#DCFCE7;color:#166534;} .cs-grade.tone-warn{background:#FEF3C7;color:#92400E;} .cs-grade.tone-err{background:#FEE2E2;color:#991B1B;}
.cs-score{display:inline-flex;align-items:center;gap:8px;vertical-align:middle;} .cs-score b{font-size:13px;min-width:22px;text-align:right;}
.cs-score i{display:inline-block;width:64px;height:6px;border-radius:999px;background:#EEF2F7;overflow:hidden;} .cs-score i em{display:block;height:100%;border-radius:999px;}
@media (max-width:1300px){ .cs-kpis-6{grid-template-columns:repeat(3,minmax(0,1fr));} }
@media (max-width:1100px){ .cs-kpis-8{grid-template-columns:repeat(2,minmax(0,1fr));} }
@media (max-width:700px){ .cs-kpis-6,.cs-kpis-8{grid-template-columns:repeat(2,minmax(0,1fr));} .cs-hero-score{min-width:88px;padding:10px 12px;} .cs-hero-score b{font-size:24px;} .rxr-hero-top{flex-wrap:wrap;} .cs-score i{width:40px;} }
.cs-table{font-size:13px;} .cs-table td,.cs-table th{padding-left:8px;padding-right:8px;} .cs-cname .cust-u-n{white-space:nowrap;} .cs-cname .device-meta{white-space:nowrap;}
.cs-page .rxr-grid{align-items:start;}

/* ══ ADD-ON PRODUCTS (v1.4.10.392) — Billing ▸ Add-ons: the product cards, the site-first form, the per-site table ══ */
.bl-addon-card{display:flex;gap:14px;align-items:flex-start;padding:14px 16px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:14px;flex-wrap:wrap;}
.bl-addon-pick{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:12px;cursor:pointer;font-size:13px;}   /* v1.4.10.473: an option card is body 13, like .cdi-opt (inherited the page's 14) */
.bl-addon-pick .device-meta,.bl-wiz-check .device-meta{font-size:12px;}   /* v1.4.10.473: the option's description is a meta line, 12/400 — the add-on form's own picks already were (the guided set-up's read 11) */
.bl-addon-pick.on{border-color:var(--brand,var(--bc-blue-v1));box-shadow:0 0 0 1px var(--brand,var(--bc-blue-v1)) inset;}
.bl-addon-pick input{margin-top:3px;}
.bl-addon-table tr.bl-addon-group td{background:var(--surface-2,rgba(120,130,150,.08));font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);padding:6px 10px;}
.bl-addon-table tr.bl-addon-ended td{opacity:.6;}
.bl-addon-cell .bl-tag{margin-right:2px;}
@media (max-width:760px){ .bl-addon-card>div:last-child{text-align:left;min-width:0;width:100%;} }
.bl-addon-ico{flex:0 0 auto;width:52px;height:52px;display:flex;align-items:center;justify-content:center;border-radius:14px;background:var(--surface-2,rgba(120,130,150,.08));}
.bl-tag svg{vertical-align:-3px;}
/* ══ CLIENT SET-UP WIZARD (v1.4.10.393) ══ */
.bl-wiz-steps{display:flex;gap:4px;margin:0 16px;padding:10px 0 0;flex-wrap:wrap;flex-shrink:0;}   /* v1.4.10.473: the strip keeps its height in the set-up popup: as a sideways-scrolling flex child on a phone it shrank to 22px and cut its 40px step chips in half */
.bl-wiz-step{display:flex;align-items:center;gap:6px;padding:6px 10px;border-radius:999px;font-size:13px;font-weight:600;color:var(--text-mute);background:var(--surface-2,rgba(120,130,150,.08));}
.bl-wiz-step .bl-wiz-step-i{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:var(--line,rgba(120,130,150,.35));color:#fff;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: the step number in its 18px disc takes the badge look, 10/700 uppercase .04em, like every small numbered disc (was 11/600) */   /* v1.4.10.482: the disc is .bl-wiz-step-i (the step holds its summary in spans of its own now) */
.bl-wiz-step.on{color:var(--brand,var(--bc-blue-v1));background:color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 12%,transparent);} .bl-wiz-step.on .bl-wiz-step-i{background:var(--brand,var(--bc-blue-v1));}
.bl-wiz-step.done{color:var(--ok,#16A34A);} .bl-wiz-step.done .bl-wiz-step-i{background:var(--ok,#16A34A);}
/* v1.4.10.445: .bl-wiz-log removed (no markup used it since the v394 plan runner) */
.bl-addon-pick.dis{opacity:.5;cursor:default;}
@media (max-width:760px){ .bl-wiz .grid-2{grid-template-columns:1fr;} .bl-wiz-step{padding:5px 8px;} }   /* v1.4.10.473: a step keeps the tab look, 13/600, on a phone too (was 12; the strip scrolls sideways when it must) */
/* ══ CLIENT SET-UP WIZARD v2 (v1.4.10.394) ══ */
.bl-wiz-steps .bl-wiz-step{border:0;font-family:inherit;cursor:pointer;} .bl-wiz-step[disabled]{cursor:default;opacity:.7;}
.bl-wiz-step.bad{color:var(--err,#DC2626);} .bl-wiz-step.bad .bl-wiz-step-i{background:var(--err,#DC2626);}
.bl-wiz-grid{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:18px;align-items:start;}
.bl-wiz-side{position:sticky;top:0;padding:14px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:14px;background:var(--surface-2,rgba(120,130,150,.06));font-size:13px;display:grid;gap:10px;}
.bl-wiz-side-h{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.bl-wiz-side-block{line-height:1.5;} .bl-wiz-side-block svg{margin-right:2px;}
.bl-wiz-side-bill{border-top:1px solid var(--line,rgba(120,130,150,.25));padding-top:10px;} .bl-wiz-side-row{display:flex;justify-content:space-between;gap:8px;} .bl-wiz-side-row b{font-size:15px;}
.bl-wiz-picks{display:grid;gap:8px;margin:10px 0;}
.bl-wiz-check{display:flex;gap:8px;align-items:flex-start;font-size:13px;line-height:1.5;cursor:pointer;} .bl-wiz-check input{margin-top:3px;flex-shrink:0;}
.bl-wiz-more summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--brand,var(--bc-blue-v1));margin:6px 0 8px;}
.bl-wiz-note{padding:8px 12px;border-radius:10px;background:color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 8%,transparent);font-size:13px;line-height:1.5;margin:8px 0;}
.bl-wiz-errs{margin-top:10px;padding:8px 12px;border-radius:10px;background:rgba(220,38,38,.08);color:var(--err,#DC2626);font-size:13px;line-height:1.6;} .bl-wiz-errs div{display:flex;gap:6px;align-items:flex-start;} .bl-wiz-errs svg{flex-shrink:0;margin-top:2px;}
.bl-wiz-nav{display:flex;gap:8px;margin-top:16px;justify-content:space-between;flex-wrap:wrap;}
.bl-wiz-site{padding:12px 14px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:12px;margin-bottom:10px;}
.bl-wiz-site-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;}
.bl-wiz-seg{display:flex;gap:4px;flex-wrap:wrap;} .bl-wiz-seg button{border:1px solid var(--line,rgba(120,130,150,.35));background:transparent;border-radius:999px;padding:5px 11px;font:inherit;font-size:12px;font-weight:600;cursor:pointer;color:inherit;}
.bl-wiz-seg button.on{background:var(--brand,var(--bc-blue-v1));border-color:var(--brand,var(--bc-blue-v1));color:#fff;}
.bl-wiz-lead{font-size:13px;line-height:1.6;margin-bottom:8px;}
.bl-wiz-nudge{margin:10px 0;padding:10px 14px;border-radius:12px;background:linear-gradient(120deg,rgba(var(--bc-blue-v1-rgb),.10),rgba(var(--bc-purple-v1-rgb),.10));border:1px solid rgba(var(--bc-purple-v1-rgb),.25);font-size:13px;line-height:1.6;}
.bl-wiz-two{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:10px;}
.bl-wiz-box{padding:12px 14px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:12px;font-size:13px;} .bl-wiz-box-h{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin-bottom:6px;}
.bl-wiz-review{display:grid;gap:8px;font-size:13px;line-height:1.55;} .bl-wiz-rv-row{display:flex;gap:10px;align-items:flex-start;} .bl-wiz-rv-row>svg{flex-shrink:0;margin-top:3px;}
.bl-wiz-plan{display:grid;gap:6px;font-size:13px;} .bl-wiz-task{display:flex;gap:8px;align-items:flex-start;padding:6px 10px;border-radius:8px;}
.bl-wiz-task.ok{color:var(--ok,#16A34A);} .bl-wiz-task.fail{color:var(--err,#DC2626);background:rgba(220,38,38,.06);} .bl-wiz-task.skip{color:var(--text-mute);} .bl-wiz-task.run{background:var(--surface-2,rgba(120,130,150,.08));}
.bl-wiz-task-i{display:inline-flex;width:18px;justify-content:center;flex-shrink:0;}
.bl-wiz-done-hero{display:flex;gap:14px;align-items:flex-start;padding:14px 16px;border-radius:14px;background:rgba(22,163,74,.08);border:1px solid rgba(22,163,74,.3);} .bl-wiz-done-hero.part{background:rgba(217,119,6,.08);border-color:rgba(217,119,6,.35);}
.bl-wiz-next{display:grid;gap:8px;} .bl-wiz-next-row{display:flex;gap:12px;justify-content:space-between;align-items:center;padding:10px 14px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:12px;font-size:13px;}
.bl-ready{display:flex;gap:3px;align-items:center;margin-top:4px;flex-wrap:wrap;} .bl-ready-dot{display:inline-flex;width:12px;height:12px;border-radius:50%;background:var(--line,rgba(120,130,150,.3));align-items:center;justify-content:center;color:#fff;} .bl-ready-dot.on{background:var(--ok,#16A34A);} .bl-ready .device-meta{margin-left:4px;}
.btn.lg{padding:11px 20px;font-size:13px;}
@media (max-width:900px){ .bl-wiz-grid{grid-template-columns:1fr;} .bl-wiz-side{position:static;} .bl-wiz-two{grid-template-columns:1fr;} .bl-wiz-next-row{flex-direction:column;align-items:flex-start;} }
.field label.bl-wiz-check{display:flex;font-size:13px;color:var(--text);margin:0;}
.field label.bl-wiz-check input[type=checkbox],.bl-wiz .field input[type=checkbox],.bl-wiz .field input[type=radio]{width:auto;padding:0;margin:3px 0 0;flex:0 0 auto;box-shadow:none;}
.bl-wiz .field label{margin-bottom:6px;}
.bl-wiz-rooms{display:flex;gap:6px;align-items:center;flex-wrap:wrap;} .bl-wiz-rooms .bl-step{min-width:34px;}
.bl-wiz-rooms input{width:70px !important;text-align:center;font-weight:400;padding:9px 6px;}
.bl-wiz-hint{font-size:12px;color:var(--text-mute);line-height:1.45;flex:1 1 140px;min-width:120px;}
.bl-wiz-seg button{white-space:nowrap;}
.bl-wiz .grid-2{grid-template-columns:repeat(2,minmax(0,1fr));}
.bl-wiz textarea.bl-wiz-names{width:100%;margin-top:8px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:13px;min-height:110px;}
.bl-wiz-side-block>div{display:flex;justify-content:space-between;gap:8px;flex-wrap:wrap;}
@media (max-width:700px){ .bl-wiz .grid-2{grid-template-columns:1fr;} }   /* v1.4.10.473: the summary's totals stay 15 on a phone (were 14, a second look) */
.bl-wiz-side-block{display:grid;gap:3px;} .bl-wiz-side-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);display:flex;gap:4px;align-items:center;} .bl-wiz-side-v{line-height:1.5;}
.bl-wiz-side-site{display:flex;justify-content:space-between;gap:8px;} .bl-wiz-side-block>div{display:block;}
/* v1.4.10.473: the summary's one column fits the 280px box and a long address breaks: a sign-in email with no break in it
   (priya.raman@harbourcitycouncil.example.gov.au) grew the grid's auto track to 319px and ran everything 54px out of the box */
.bl-wiz-side{grid-template-columns:minmax(0,1fr);} .bl-wiz-side-v{overflow-wrap:anywhere;}
.bl-wiz-box .dt td{padding:8px 6px;} .bl-wiz-box .dt td:last-child{white-space:nowrap;}
.bl-wiz-box .dt td[colspan]{white-space:normal;}   /* v1.4.10.473: a full-width sentence row ("Nothing is charged…") wraps: as the row's last cell it was kept on one line and pushed the Review bill 110px out of its box on a phone */
.bl-wiz-body,.bl-wiz-col,.bl-wiz-main{min-width:0;} .bl-wiz .cust-table-wrap{overflow-x:auto;}   /* v1.4.10.473: .bl-wiz-col (the step title + .bl-wiz-main) is the grid item now and keeps the zero floor */
.bl-wiz .bl-wiz-box .dt,.bl-wiz .bl-wiz-review .dt{min-width:0;width:100%;table-layout:auto;} .bl-wiz .bl-wiz-box .dt td:first-child{word-break:break-word;}

/* ── STORAGE SETTINGS — database size + Ody readings (v1.4.10.396) ─────────── */
.st-knobs{display:flex;flex-wrap:wrap;gap:14px 22px;align-items:flex-start;margin-top:14px;padding-top:12px;border-top:1px solid var(--border)}   /* v1.4.10.473: top-aligned, so the number boxes share one line (bottom-aligned, a knob with a longer note sat 16px higher) */
.st-knob{display:flex;flex-direction:column;gap:4px;min-width:150px;max-width:260px;font-size:12px}
.st-knob span{font-weight:500;color:var(--text)}
.st-knob input[type=number]{width:110px;padding:7px 10px;border:1px solid var(--border);border-radius:8px;background:var(--surface);font:inherit;font-size:13px}
.st-knob em{font-style:normal;color:var(--text-mute);font-size:12px;line-height:1.35}
.st-knobs .btn{margin-top:22px;min-height:36px;box-sizing:border-box}   /* v1.4.10.473: level with the number boxes and their height (below a 12px label + 4px gap; was 32 beside 36) */
.st-dbtable{min-width:0;width:100%}
.st-dbtable td,.st-dbtable th{padding:7px 10px;font-size:13px;white-space:nowrap}
.st-dbtable td:first-child{white-space:normal;word-break:break-all}
.st-share{display:inline-block;width:70px;height:6px;background:var(--surface-2);border-radius:3px;vertical-align:middle;overflow:hidden;margin-right:4px}
.st-share i{display:block;height:100%;background:var(--brand-blue);border-radius:3px}
@media (max-width:700px){.st-knob{min-width:100%;max-width:100%}.st-knobs .btn{margin-top:0}.st-knob input[type=number]{width:100%;font-size:16px}.st-dbtable td:nth-child(3),.st-dbtable th:nth-child(3),.st-dbtable td:nth-child(4),.st-dbtable th:nth-child(4){display:none}}

/* ── v1.4.10.397: unlinked integrator accounts + the integrator delete dialog ── */
.ua-scope.unlinked{color:var(--err);background:rgba(220,38,38,0.10);font-weight:600;}
.ua-scope.unlinked svg{width:11px;height:11px;}
.ua-unlinked-strip{display:flex;gap:10px;align-items:flex-start;margin:0 0 14px;padding:12px 14px;border-radius:12px;border:1px solid rgba(220,38,38,.35);background:rgba(220,38,38,.06);font-size:13px;line-height:1.55;color:var(--text);}
.ua-unlinked-strip>svg{width:16px;height:16px;flex-shrink:0;margin-top:2px;color:var(--err);}
.ua-unlinked-strip a{color:var(--err);font-weight:600;}
.up-unlinked{margin-top:8px;padding:10px 12px;border-radius:10px;border:1px solid rgba(220,38,38,.3);background:rgba(220,38,38,.06);font-size:12px;line-height:1.55;}
.cdi-opt{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line);border-radius:12px;margin-bottom:8px;cursor:pointer;font-size:13px;}
.cdi-opt input[type=radio]{width:auto;padding:0;margin-top:4px;flex-shrink:0;}
.cdi-opt>span{flex:1;min-width:0;}
.cdi-opt select{width:100%;}
.bl-next-table td,.bl-next-table th{font-size:13px;}
.bl-next-table tr.bl-next-client td{background:var(--surface-2,rgba(120,130,150,.06));}
.bl-next-table tr.bl-next-total td{border-top:2px solid var(--line);}
.bl-next{scroll-margin-top:80px;}
/* ── v1.4.10.398: Add contact — site attachment ── */
.cu-sites{display:flex;flex-wrap:wrap;gap:6px 10px;max-height:160px;overflow:auto;padding:8px 10px;border:1px solid var(--line);border-radius:10px;}
.cu-site{display:inline-flex;align-items:center;gap:6px;font-size:13px;padding:4px 8px;border-radius:8px;background:var(--surface-2,rgba(120,130,150,.06));cursor:pointer;}
.cu-site input{width:auto;padding:0;margin:0;}
/* ── v1.4.10.399: GLY inline glyphs sit in running text like a character ── */
svg.gly{display:inline-block;vertical-align:-0.15em;flex-shrink:0;}
button > svg.gly:only-child{vertical-align:middle;}
.cv-marker{display:inline-flex;margin-right:5px;color:var(--text-mute);vertical-align:-0.1em;}
.ss-cc{display:inline-block;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10px;font-weight:700;letter-spacing:.04em;padding:1px 5px;border-radius:5px;background:var(--surface-3,rgba(120,130,150,.14));color:var(--text-dim);vertical-align:1px;margin-right:2px;}

/* ══ v1.4.10.400 — the Integrator Boss, billing access, departures on the bill, Add a client, the next billing run ══ */
.boss-crown{display:inline-flex;color:#D4A017;margin-left:4px;vertical-align:-0.1em;}
.boss-badge{display:inline-flex;align-items:center;gap:4px;margin-left:8px;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:#8A6300;background:rgba(212,160,23,.14);border:1px solid rgba(212,160,23,.4);vertical-align:1px;white-space:nowrap;}
.boss-badge svg.gly{color:#D4A017;}
.boss-badge.big{font-size:10px;padding:2px 10px;margin-left:6px;}
[data-theme="dark"] .boss-badge{color:#F3CD5B;background:rgba(212,160,23,.18);}
.ua-scope.bill-on{color:var(--ok,#16A34A);border-color:rgba(22,163,74,.35);background:rgba(22,163,74,.08);display:inline-flex;align-items:center;gap:4px;}
.ua-scope.bill-off{color:var(--text-mute);}
.team-block{border:1px solid var(--line,rgba(120,130,150,.25));border-radius:7px;padding:6px 14px;margin-bottom:14px;}   /* v1.4.10.473: 7px like the Access / Account blocks and permission cards around it (was 14px) */
.team-row{display:flex;gap:12px;align-items:center;padding:10px 0;border-bottom:1px dashed var(--line,rgba(120,130,150,.25));font-size:13px;}   /* v1.4.10.473: body 13 (it inherited the modal's 14) */
.team-row:last-child{border-bottom:0;}
.team-row>div{flex:1;min-width:0;line-height:1.45;}
.team-ic{width:32px;height:32px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:var(--surface-2,rgba(120,130,150,.1));color:var(--text-mute);font-size:16px;}
.team-ic.boss{background:rgba(212,160,23,.14);color:#D4A017;}
.team-ic.on{background:rgba(22,163,74,.1);color:var(--ok,#16A34A);}
.team-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:13px;font-weight:400;white-space:nowrap;min-height:44px;}
.team-switch input{width:auto;padding:0;margin:0;accent-color:var(--ok,#16A34A);transform:scale(1.25);}
.team-list{display:grid;gap:6px;}
.team-li{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:9px 12px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:12px;cursor:pointer;font-size:13px;min-height:44px;}
.team-li:hover{border-color:var(--brand,var(--bc-blue-v1));}
.team-li.off{opacity:.6;}
.team-li>div{min-width:0;}
/* what a delete leaves on the bill */
.dep-h{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin:14px 0 6px;display:flex;align-items:center;gap:6px;}
.dep-quote{margin-top:8px;padding:12px 14px;border-radius:12px;background:var(--surface-2,rgba(120,130,150,.07));border:1px solid var(--line,rgba(120,130,150,.25));font-size:13px;}
.dep-quote-big{display:flex;justify-content:space-between;align-items:baseline;gap:10px;}
.dep-quote-big b{font-size:20px;font-weight:600;letter-spacing:-.02em;}
.dep-quote-row{display:flex;justify-content:space-between;gap:10px;padding-top:6px;margin-top:6px;border-top:1px dashed var(--line,rgba(120,130,150,.25));}
.dep-lines{margin:6px 0 2px;font-size:12px;}
.dep-lines summary{cursor:pointer;color:var(--text-mute);}
.dep-lines table.dt{min-width:0;margin-top:4px;}
.dep-lines td{font-size:12px;padding:5px 6px;}
.sdel-bill{margin:10px 0 12px;}
.bl-next-dep{font-size:12px;line-height:1.55;margin-top:6px;padding:7px 10px;border-radius:10px;background:rgba(217,119,6,.07);border:1px solid rgba(217,119,6,.25);}
tr.bl-next-credit td{color:var(--ok,#16A34A);}
/* Estate ▸ Add a client */
.nc-page{max-width:1180px;}
.nc-intro{display:flex;gap:14px;align-items:center;padding:14px 16px;margin-bottom:12px;border-radius:14px;border:1px solid var(--line,rgba(120,130,150,.25));background:var(--surface,transparent);}
.nc-intro-ico{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:var(--grad,linear-gradient(135deg,var(--bc-accent),var(--bc-blue-v1)));color:#fff;}
.nc-intro-t{font-weight:600;font-size:15px;letter-spacing:-.012em;}
.nc-intro-s{font-size:13px;color:var(--text-mute);line-height:1.5;margin-top:2px;}
.nc-resumed{margin-bottom:12px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.bl-wiz.bl-wiz-page{margin:0;overflow:clip;}   /* v1.4.10.446: .panel's overflow:hidden made a scroll box, so the phone's sticky Back/Next never stuck; clip keeps the rounded corners without one */
.bl-wiz.bl-wiz-page .bl-wiz-side{top:12px;}
.bl-wiz-side-nomoney{line-height:1.5;}
/* v1.4.10.445: Add a client, tidied — a title + one-line "what this step is for" on every step, help text and
   messages under their own field, calmer spacing, and on a phone one column with Back/Next stuck to the bottom.
   Existing tokens only (--brand, --err, --line, --surface, --text-mute), so dark mode follows. */
.bl-wiz-sh{margin:2px 0 14px;}
.bl-wiz-sh-n{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.bl-wiz-sh h4{margin:2px 0 2px;font-size:16px;font-weight:600;letter-spacing:-.012em;}   /* v1.4.10.450: 16 (section title on the type scale), was off-scale 17 so fonts.py failed */
.bl-wiz-sh p{margin:0;font-size:13px;line-height:1.55;color:var(--text-mute);max-width:62ch;}
.bl-wiz-main>.field,.bl-wiz-main .bl-wiz-site .field,.bl-wiz-more .field{margin-bottom:12px;}
.bl-wiz .grid-2{gap:0 12px;}
.bl-wiz-g3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0 12px;}
.bl-wiz-help{font-size:12px;line-height:1.5;color:var(--text-mute);margin-top:5px;}
.bl-wiz-ferr{display:flex;gap:5px;align-items:flex-start;font-size:12px;line-height:1.45;color:var(--err,#DC2626);margin-top:5px;} .bl-wiz-ferr svg{flex-shrink:0;margin-top:2px;}
.bl-wiz [aria-invalid="true"],.modal [aria-invalid="true"],#modal-inner [aria-invalid="true"],.bl-nc-grid [aria-invalid="true"]{border-color:var(--err,#DC2626) !important;box-shadow:0 0 0 3px color-mix(in srgb,var(--err,#DC2626) 14%,transparent) !important;}
.bl-wiz-sec{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin:12px 0 8px;}
.bl-wiz-picks-2{grid-template-columns:repeat(2,minmax(0,1fr));}
.bl-wiz-more{margin:4px 0 10px;} .bl-wiz-more>summary{list-style-position:outside;} .bl-wiz-more>summary .device-meta{font-weight:400;}
.bl-wiz-site .bl-wiz-more{padding-top:2px;border-top:1px dashed var(--line,rgba(120,130,150,.25));}
.bl-wiz-site{padding:14px 16px;} .bl-wiz-site-head{gap:8px;} .bl-wiz-site-head b{flex:1;min-width:0;overflow-wrap:anywhere;}
.bl-wiz-check-box{margin-top:14px;padding:10px 12px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:12px;}
.bl-wiz-caps{margin-top:0;}
.bl-wiz-side-l svg{width:13px;height:13px;}
.bl-wiz-rv-row{padding:10px 0;border-bottom:1px solid var(--line,rgba(120,130,150,.18));} .bl-wiz-rv-row:last-of-type{border-bottom:0;}
.bl-wiz-rv-row>svg{width:16px;height:16px;}
.bl-wiz-rv-v{flex:1;min-width:0;overflow-wrap:anywhere;} .bl-wiz-rv-site+.bl-wiz-rv-site{margin-top:6px;}
.bl-wiz-rv-edit{flex-shrink:0;align-self:flex-start;}
.bl-wiz-open{flex-shrink:0;align-self:center;}
.bl-wiz-nav .btn.primary svg{vertical-align:-3px;}
@media (max-width:720px){
  .bl-wiz-grid{grid-template-columns:1fr;} .bl-wiz-side{position:static;order:2;}
  .bl-wiz-g3,.bl-wiz-picks-2,.bl-wiz .grid-2{grid-template-columns:1fr;}
  .bl-wiz-page .bl-wiz-nav{position:sticky;bottom:0;z-index:3;margin:16px 0 0;padding:10px 0 calc(10px + env(safe-area-inset-bottom,0px));background:var(--surface,var(--bg,#fff));border-top:1px solid var(--line,rgba(120,130,150,.25));}
  /* v1.4.10.473: Back/Next stays pinned on the steps that hold a table too (Room Packs, Add-ons, Review): the phone rule
     .panel-body:has(table.dt){overflow-x:auto} made the body a scroll box, and the sticky bar stuck to that box, which never
     scrolls, so it sat at the end of the step. The wizard's tables already fit (width 100%, min-width 0) and the panel clips. */
  .bl-wiz.bl-wiz-page .bl-wiz-body{overflow:visible;}
  .bl-wiz-nav .btn{min-height:42px;} .bl-wiz-nav>div:last-child{flex:1;display:flex;justify-content:flex-end;}
  .bl-wiz-done-hero{flex-wrap:wrap;} .bl-wiz-open{width:100%;}
  .bl-wiz-steps{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;} .bl-wiz-steps .bl-wiz-step{flex-shrink:0;}
  /* v1.4.10.473: phone tap targets — a site's rooms − / + were 34px wide, its "Address & site clock" opener 20px tall */
  .bl-wiz-rooms .bl-step{min-width:40px;}
  .bl-wiz-more>summary{padding:10px 0;margin:0;}
}
/* v1.4.10.482: Add a client, redrawn. The rail on the left (every step with what you have entered under its name,
   the bill under them) and the step on the right; cards on the client step; a room drawn per room on each site; the
   pack coverage bar; an add-on card per site; the Review step as the invoice it becomes, checked and priced by the
   server; a progress strip and the bill in view on a phone; the done screen's tiles. Existing tokens only
   (--brand, --ok, --err, --line, --surface, --surface-2, --text, --text-mute, --grad), so dark mode follows. */
.bl-wiz-grid{grid-template-columns:272px minmax(0,1fr);gap:22px;}
.bl-wiz-side{padding:12px;gap:12px;}
.bl-wiz-side>.bl-wiz-side-h{padding:2px 6px 0;}
.bl-wiz-steps{display:grid;gap:2px;margin:0;padding:0;}
.bl-wiz-steps .bl-wiz-step{display:flex;align-items:flex-start;gap:10px;width:100%;min-height:40px;text-align:left;padding:8px 8px 8px 10px;border-radius:12px;background:transparent;color:var(--text);font-weight:500;position:relative;}
.bl-wiz-steps .bl-wiz-step.on,.bl-wiz-steps .bl-wiz-step.done,.bl-wiz-steps .bl-wiz-step.bad{color:var(--text);}
.bl-wiz-steps .bl-wiz-step.on{background:color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 10%,transparent);}
.bl-wiz-steps .bl-wiz-step:not([disabled]):not(.on):hover{background:var(--surface-2,rgba(120,130,150,.08));}
.bl-wiz-steps .bl-wiz-step .bl-wiz-step-i{width:22px;height:22px;margin-top:1px;flex-shrink:0;}
.bl-wiz-steps .bl-wiz-step .bl-wiz-step-t{display:grid;gap:2px;min-width:0;flex:1;}
.bl-wiz-steps .bl-wiz-step .bl-wiz-step-l{font-size:13px;font-weight:600;letter-spacing:-.005em;line-height:1.5;}
.bl-wiz-steps .bl-wiz-step.on .bl-wiz-step-l{color:var(--brand,var(--bc-blue-v1));}
.bl-wiz-steps .bl-wiz-step .bl-wiz-step-s{font-size:12px;font-weight:400;color:var(--text-mute);line-height:1.45;overflow-wrap:anywhere;}
.bl-wiz-steps .bl-wiz-step .bl-wiz-step-s b{color:var(--text);font-weight:600;}
.bl-wiz-steps .bl-wiz-step .bl-wiz-step-s .bl-wiz-side-site{display:flex;justify-content:space-between;gap:8px;}
.bl-wiz-steps .bl-wiz-step .bl-wiz-step-s .bl-wiz-side-site .device-meta{font-size:12px;white-space:nowrap;}
.bl-wiz-steps .bl-wiz-step .bl-wiz-step-s .bl-wiz-rs-mute{color:var(--text-mute);}
.bl-wiz-steps .bl-wiz-step[disabled]{opacity:.55;}
.bl-wiz-steps .bl-wiz-step+.bl-wiz-step::before{content:"";position:absolute;left:20px;top:-4px;height:4px;border-left:2px solid var(--line,rgba(120,130,150,.3));}
.bl-wiz-side-bill{padding:12px;border-radius:12px;background:var(--surface,transparent);border:1px solid var(--line,rgba(120,130,150,.25));display:grid;gap:6px;}
.bl-wiz-side-bill .bl-wiz-side-h{display:flex;gap:4px;align-items:center;}
.bl-wiz-prog{display:none;}
.bl-wiz-sh h4{display:flex;align-items:center;gap:8px;} .bl-wiz-sh-i{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;background:color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 12%,transparent);color:var(--brand,var(--bc-blue-v1));flex-shrink:0;}
.bl-wiz-card{border:1px solid var(--line,rgba(120,130,150,.25));border-radius:14px;padding:14px 16px;margin:0 0 12px;background:var(--surface,transparent);}
.bl-wiz-card-h{display:flex;gap:10px;align-items:flex-start;margin-bottom:10px;}
.bl-wiz-card-i{width:30px;height:30px;border-radius:9px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;background:color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 12%,transparent);color:var(--brand,var(--bc-blue-v1));}
.bl-wiz-card-t{font-size:14px;font-weight:600;letter-spacing:-.008em;line-height:1.5;} .bl-wiz-card-s{font-size:12px;color:var(--text-mute);line-height:1.5;margin-top:1px;}
.bl-wiz-card-b>.field:last-child{margin-bottom:0;}
.bl-wiz-today{padding:10px 12px;border-radius:10px;background:color-mix(in srgb,var(--ok,#16A34A) 9%,transparent);font-size:13px;line-height:1.5;margin-top:4px;}
.bl-wiz-site-head .bl-wiz-card-i{width:26px;height:26px;border-radius:8px;}
.bl-wiz-roomviz{display:flex;flex-wrap:wrap;gap:3px;align-items:center;margin:8px 0 2px;min-height:14px;}
.bl-wiz-rv-tile{width:14px;height:14px;border-radius:3px;background:color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 22%,transparent);border:1px solid color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 45%,transparent);}
.bl-wiz-rv-more,.bl-wiz-rv-none{font-size:11px;color:var(--text-mute);margin-left:4px;}
.bl-wiz-cover{margin:10px 0 4px;} .bl-wiz-cov-bar{display:flex;height:12px;border-radius:999px;overflow:hidden;background:var(--line,rgba(120,130,150,.2));gap:2px;}
.bl-wiz-cov-seg{display:block;min-width:4px;} .bl-wiz-cov-seg.spare,.bl-wiz-cov-leg i.spare{background:var(--ok,#16A34A);} .bl-wiz-cov-seg.pool,.bl-wiz-cov-leg i.pool{background:#0EA5E9;} .bl-wiz-cov-seg.buy,.bl-wiz-cov-leg i.buy{background:var(--brand,var(--bc-blue-v1));} .bl-wiz-cov-seg.extra,.bl-wiz-cov-leg i.extra{background:var(--bc-purple-v1);} .bl-wiz-cov-seg.short,.bl-wiz-cov-leg i.short{background:var(--err,#DC2626);}
.bl-wiz-cov-legs{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:6px;font-size:12px;color:var(--text-mute);} .bl-wiz-cov-leg{display:inline-flex;align-items:center;gap:5px;} .bl-wiz-cov-leg i{width:9px;height:9px;border-radius:2px;display:inline-block;}
.bl-wiz-ao-site{border:1px solid var(--line,rgba(120,130,150,.25));border-radius:14px;padding:12px 14px;margin-bottom:10px;}
.bl-wiz-ao-h{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px;font-size:13px;} .bl-wiz-ao-h b{font-size:14px;} .bl-wiz-ao-h .bl-wiz-card-i{width:26px;height:26px;border-radius:8px;}
.bl-wiz-ao-opts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;}
.bl-wiz-ao{display:flex;gap:10px;align-items:center;padding:10px 12px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:12px;cursor:pointer;font-size:13px;min-height:40px;}
.bl-wiz-ao.on{border-color:var(--brand,var(--bc-blue-v1));box-shadow:0 0 0 1px var(--brand,var(--bc-blue-v1)) inset;} .bl-wiz-ao.dis{opacity:.55;cursor:default;}
.bl-wiz-ao input{flex-shrink:0;margin:0;width:auto;} .bl-wiz-ao-ico{flex-shrink:0;display:inline-flex;} .bl-wiz-ao-t{display:grid;gap:2px;min-width:0;} .bl-wiz-ao-t .device-meta{font-size:12px;}
.bl-wiz-check{display:grid;gap:6px;padding:10px 12px;border-radius:12px;font-size:13px;line-height:1.5;margin:12px 0;}
.bl-wiz-check.ok{background:color-mix(in srgb,var(--ok,#16A34A) 9%,transparent);color:var(--ok,#15803D);} .bl-wiz-check.wait{background:var(--surface-2,rgba(120,130,150,.08));color:var(--text-mute);}
.bl-wiz-check.warn{background:rgba(217,119,6,.09);} .bl-wiz-check.bad{background:rgba(220,38,38,.07);border:1px solid rgba(220,38,38,.25);}
.bl-wiz-check-h{font-weight:600;color:var(--err,#DC2626);} .bl-wiz-check-row{display:flex;justify-content:space-between;gap:10px;align-items:center;flex-wrap:wrap;}
.bl-wiz-inv{margin-top:12px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:14px;padding:14px 16px 14px 20px;background:var(--surface,transparent);position:relative;overflow:hidden;}
.bl-wiz-inv::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--grad,linear-gradient(180deg,var(--bc-accent),var(--bc-blue-v1)));}
.bl-wiz-inv-h{display:flex;justify-content:space-between;gap:10px;align-items:flex-start;flex-wrap:wrap;margin-bottom:8px;} .bl-wiz-inv-t{font-size:14px;font-weight:600;letter-spacing:-.008em;display:flex;gap:6px;align-items:center;}
.bl-wiz-inv-badge{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:4px 9px;border-radius:999px;background:var(--surface-2,rgba(120,130,150,.1));color:var(--text-mute);white-space:nowrap;display:inline-flex;gap:4px;align-items:center;}
.bl-wiz-inv-badge.ok{background:color-mix(in srgb,var(--ok,#16A34A) 12%,transparent);color:var(--ok,#15803D);}
.bl-wiz .bl-wiz-inv .dt{min-width:0;width:100%;table-layout:auto;} .bl-wiz-inv .dt td{padding:8px 6px;word-break:break-word;} .bl-wiz-inv .dt td.num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums;} .bl-wiz-inv .dt td[colspan]{white-space:normal;}
.bl-wiz-inv tr.bl-wiz-inv-total td{border-top:2px solid var(--line,rgba(120,130,150,.35));font-size:15px;}
.bl-wiz-inv-mo{display:flex;justify-content:space-between;gap:8px;padding:8px 6px;border-top:1px dashed var(--line,rgba(120,130,150,.3));margin-top:2px;font-size:13px;} .bl-wiz-inv-mo b{font-size:15px;}
.bl-wiz-plan-wrap{display:grid;gap:10px;} .bl-wiz-plan-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;} .bl-wiz-plan-t{font-size:15px;font-weight:600;letter-spacing:-.01em;}
.bl-wiz-plan-pct{font-size:20px;font-weight:600;letter-spacing:-.02em;/* v1.4.10.484: the small KPI step (22px was off the scale) */font-variant-numeric:tabular-nums;color:var(--brand,var(--bc-blue-v1));}
.bl-wiz-plan-bar,.bl-wiz-prog-bar{height:8px;border-radius:999px;background:var(--line,rgba(120,130,150,.2));overflow:hidden;} .bl-wiz-plan-bar span,.bl-wiz-prog-bar span{display:block;height:100%;background:var(--grad,linear-gradient(90deg,var(--bc-accent),var(--bc-blue-v1)));transition:width .35s ease;}
.bl-wiz-spin{display:inline-block;width:12px;height:12px;border-radius:50%;border:2px solid var(--line,rgba(120,130,150,.35));border-top-color:var(--brand,var(--bc-blue-v1));animation:blWizSpin .8s linear infinite;} @keyframes blWizSpin{to{transform:rotate(360deg);}}
.bl-wiz-done-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px;margin-top:12px;}
.bl-wiz-done-tile{padding:12px 14px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:12px;background:var(--surface,transparent);} .bl-wiz-done-tile.bill{border-color:color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 40%,transparent);}
.bl-wiz-done-n{font-size:20px;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums;line-height:1.2;}/* v1.4.10.484: the small KPI step (22px was off the scale) */ .bl-wiz-done-l{font-size:12px;font-weight:600;color:var(--text-mute);display:flex;gap:4px;align-items:center;margin-top:2px;}
.bl-wiz-next{counter-reset:blnext;} .bl-wiz-next-row{counter-increment:blnext;} .bl-wiz-next-row>div:first-child{display:flex;gap:10px;align-items:flex-start;min-width:0;}
.bl-wiz-next-row>div:first-child::before{content:counter(blnext);display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 12%,transparent);color:var(--brand,var(--bc-blue-v1));font-size:11px;font-weight:700;flex-shrink:0;margin-top:1px;}
.nc-intro{align-items:center;gap:16px;padding:16px 18px;} .nc-journey{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px;}
.nc-journey span{display:inline-flex;align-items:center;gap:6px;padding:5px 10px 5px 6px;border-radius:999px;background:var(--surface-2,rgba(120,130,150,.08));font-size:12px;font-weight:600;color:var(--text-mute);}
.nc-journey span i{font-style:normal;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:var(--line,rgba(120,130,150,.35));color:#fff;font-size:10px;font-weight:700;}
.nc-journey span.on{background:color-mix(in srgb,var(--brand,var(--bc-blue-v1)) 12%,transparent);color:var(--brand,var(--bc-blue-v1));} .nc-journey span.on i{background:var(--brand,var(--bc-blue-v1));} .nc-journey span.done i{background:var(--ok,#16A34A);}
.nc-unfinished{margin-bottom:12px;} .nc-unf-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:8px;}
.nc-unf{display:flex;justify-content:space-between;gap:10px;align-items:center;padding:10px 12px;border:1px solid var(--line,rgba(120,130,150,.25));border-radius:12px;font-size:13px;} .nc-unf>div{min-width:0;} .nc-unf b{display:block;overflow-wrap:anywhere;} .nc-unf .btn{flex-shrink:0;}
/* v1.4.10.491: Continue on a client still being set up — its own checklist, one action per step left */
.nc-cont{padding:18px 20px;}
.nc-cont-sum{display:flex;align-items:center;gap:12px;margin-bottom:14px;font-size:13px;color:var(--text-mute);}
.nc-cont-bar{flex:0 0 160px;height:8px;border-radius:99px;background:var(--surface-3,rgba(120,130,150,.15));overflow:hidden;}
.nc-cont-bar i{display:block;height:100%;border-radius:inherit;background:var(--grad,var(--brand-blue));}
.nc-cont-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px;}
.nc-cont-step{display:flex;align-items:center;gap:12px;padding:11px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface);}
.nc-cont-step.next{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.nc-cont-step.done{background:var(--surface-2,transparent);}
.nc-cont-dot{flex:0 0 26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;background:var(--surface-3,rgba(120,130,150,.15));color:var(--text-mute);}
.nc-cont-step.done .nc-cont-dot{background:rgba(22,163,74,.14);color:var(--ok,#16A34A);}
.nc-cont-step.next .nc-cont-dot{background:var(--brand-blue);color:#fff;}
.nc-cont-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;font-size:13px;}
.nc-cont-txt b{font-weight:600;color:var(--text);}
.nc-cont-txt span{color:var(--text-mute);font-size:12px;}
.nc-cont-txt small{color:var(--text-mute);font-size:12px;line-height:1.5;}
.nc-cont-step.done .nc-cont-txt b{color:var(--text-mute);}
.nc-cont-step .btn{flex-shrink:0;}
@media (max-width:560px){ .nc-cont-step{flex-wrap:wrap;} .nc-cont-step .btn{width:100%;justify-content:center;min-height:40px;} .nc-cont-bar{flex-basis:100px;} }
@media (max-width:900px){
  .bl-wiz-grid{grid-template-columns:1fr;gap:12px;} .bl-wiz-side{position:static;order:2;padding:0;border:0;background:transparent;}
  .bl-wiz-side .bl-wiz-steps,.bl-wiz-side>.bl-wiz-side-h{display:none;}
  .bl-wiz-prog{display:grid;gap:8px;margin:0 0 12px;} .bl-wiz-prog-top{display:flex;justify-content:space-between;align-items:center;gap:8px;} .bl-wiz-prog-n{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
  .bl-wiz-prog-dots{display:flex;gap:0;margin-right:-10px;}
  .bl-wiz-prog-dot{width:40px;height:40px;border:0;padding:0;background:transparent;cursor:pointer;position:relative;}   /* a 40px tap on a 12px dot */
  .bl-wiz-prog-dot::after{content:"";position:absolute;inset:14px;border-radius:50%;background:var(--line,rgba(120,130,150,.35));}
  .bl-wiz-prog-dot.on::after{background:var(--brand,var(--bc-blue-v1));inset:12px;} .bl-wiz-prog-dot.done::after{background:var(--ok,#16A34A);} .bl-wiz-prog-dot[disabled]{cursor:default;opacity:.6;}
  .bl-wiz-prog-bill{font-size:12px;color:var(--text-mute);} .bl-wiz-prog-bill b{color:var(--text);}
  .bl-wiz-ao-opts{grid-template-columns:1fr;} .bl-wiz-done-tiles{grid-template-columns:repeat(2,minmax(0,1fr));}
}
/* Finance ▸ Next billing run / Invoices & orders */
.fin-h4{margin:6px 0 8px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.fin-run-table tr.fin-run-row:hover td{background:var(--surface-2,rgba(120,130,150,.06));}
.fin-run-table tr.fin-run-total td{border-top:2px solid var(--line,rgba(120,130,150,.35));}
.fin-run-clients{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:6px 16px;padding:4px 6px;font-size:12px;}
.fin-run-clients>div{display:flex;justify-content:space-between;gap:10px;border-bottom:1px dashed var(--line,rgba(120,130,150,.25));padding:4px 0;}
.fin-rooms{margin:6px 0 4px 18px;line-height:1.7;font-size:13px;}
@media (max-width:640px){ .team-row{flex-wrap:wrap;} .nc-intro{align-items:flex-start;} .dep-quote-big b{font-size:20px;} }


/* ═══ v1.4.10.403 — ONE TYPE SYSTEM (the face is Inter since v1.4.10.543; read "Poppins" below as Inter) ═══════════════════════════════════════
   Jay: "Fonts are not consistent, it's all over the place, needs to be AVDesk
   branded fonts and consistent across the control area."
   Poppins (the wordmark's face, as on avdesk.com.au) for every word of the
   interface; JetBrains Mono only for codes — tags, IPs, MACs, refs, OIDs.
   Both are served by css/fonts.css from this install. Every font-family in
   this sheet now reads --font-body / --font-display / --font-mono (all three
   resolve to the two faces); dev/checks/fonts.py fails the build on a face
   named anywhere else. What this block adds is only what the old rules left
   to the browser or to a vendor sheet: */
code,kbd,samp,tt,var{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
pre{font-family:var(--font-source);}   /* v1.4.10.546: blocks of source keep a monospace */
var{font-style:normal;}
button,input,select,textarea,optgroup,option{font-family:inherit;}
/* the map (Leaflet names Helvetica Neue, Lucida Console and Tahoma) */
.leaflet-container,.leaflet-container a.leaflet-popup-close-button,
.leaflet-control-zoom-in,.leaflet-control-zoom-out,.leaflet-tooltip{font-family:var(--font-body);}
.leaflet-popup-content{font-size:13px;line-height:1.45;}
/* v1.4.10.443: Leaflet sizes its attribution in rem (0.75rem = 10.5px against this app's 14px root) */
.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px;}
/* ═══ end v1.4.10.403 ═══ */

/* ═══ v1.4.10.404 — THE CREW ROSTER, CALL-OUTS, AND WORK ACROSS CLIENTS ═════
   Jay: "maintenance — integrators can look at all their clients' maintenance
   work or one by one (selecting top area), tasks needs to do the same" and
   "massively improve the rostering and scheduling, integrators to roster at
   clients/sites for works. For reactive call outs."
   Three groups below: the client strip + grouped rows shared by Maintenance
   and Tasks; the crew board; the call-out rail. Faces and colours come from
   the tokens (v403) — nothing here names a font or a raw hex outside the
   client palette, which is generated in js/27-crew.js. */

/* ── whose work is it: the client strip (Maintenance) ── */
.mt-cstrip{ display:flex; align-items:center; gap:7px; flex-wrap:wrap;
  padding:9px 16px 3px; }
.mt-cstrip-h{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em;
  color:var(--text-mute); margin-right:2px; }
.mt-cchip{ display:inline-flex; align-items:center; gap:7px; padding:5px 11px; min-height:30px;
  background:var(--surface); border:1px solid var(--line); border-radius:999px; cursor:pointer;
  font-size:12px; font-weight:500; color:var(--text); transition:border-color .12s, background .12s; }
.mt-cchip:hover{ border-color:var(--accent); }
.mt-cchip.on{ border-color:var(--accent); background:var(--accent-glow); font-weight:500; }
.mt-cchip-n{ font-weight:600; font-size:12px; color:var(--accent); }   /* v1.4.10.473: a chip's count is the chip's own emphasis, 600 (was 700) */
.mt-cchip.on .mt-cchip-n{ color:var(--accent-deep); }
.mt-cchip-l{ white-space:nowrap; max-width:180px; overflow:hidden; text-overflow:ellipsis; }
/* the grouped list: one heading per client */
tr.mt-grp > td{ background:var(--bg); border-top:1px solid var(--line-2);
  padding:9px 14px; }
.mt-grp-n{ font-weight:700; font-size:13px; color:var(--text); }
.mt-grp-m{ font-size:12px; color:var(--text-mute); margin-left:10px; }
.mt-grp-late{ color:var(--err); }
.mt-grp-only{ float:right; }
.tk-client.on{ border-color:var(--accent); }

/* ── the mode switch at the top of Rostering ── */
.rost-modes{ display:flex; gap:8px; padding:0 0 12px; flex-wrap:wrap; }
.rost-mode{ display:flex; flex-direction:column; gap:1px; align-items:flex-start;
  padding:8px 15px; min-height:44px; border:1px solid var(--line); border-radius:10px;
  background:var(--surface); cursor:pointer; text-align:left; }
.rost-mode b{ font-size:13px; font-weight:600; color:var(--text); }
.rost-mode span{ font-size:12px; color:var(--text-mute); }
.rost-mode.on{ border-color:var(--accent); background:var(--accent-glow); }
.rost-mode.on b{ color:var(--accent-deep); }

/* ── crew page shell ── */
.crew-page{ display:block; }
.crew-rail{ display:grid; grid-template-columns:repeat(5,1fr); gap:10px; margin:0 0 14px; }
.crew-tile{ display:flex; flex-direction:column; gap:1px; padding:12px 14px;
  background:var(--surface); border:1px solid var(--line); border-radius:12px; }
.crew-tile.skel{ height:74px; background:linear-gradient(90deg,var(--bg) 25%,var(--surface) 50%,var(--bg) 75%);
  background-size:200% 100%; animation:tk-sh 1.2s infinite; }
.crew-tile-v{ font-size:20px; font-weight:600; letter-spacing:-.02em; line-height:1.1; color:var(--text); }
.crew-tile-l{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text); }   /* v1.4.10.473: a stat tile's label is the KPI label look, 11/600 uppercase .06em (was 12/600), as the rostering stats and every dashboard tile */
.crew-tile-s{ font-size:11px; color:var(--text-mute); }
.crew-tile.warn .crew-tile-v{ color:var(--warn); }
.crew-tile.err  .crew-tile-v{ color:var(--err); }
.crew-tile.ok   .crew-tile-v{ color:var(--ok); }
.crew-tile.blue .crew-tile-v{ color:var(--accent); }
.crew-tile.purple .crew-tile-v{ color:var(--brand-purple); }
.crew-cols{ display:grid; grid-template-columns:minmax(0,1fr) 340px; gap:14px; align-items:start; }
.crew-col-main{ min-width:0; }
.crew-board-head .head-actions{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }

/* ── the board: crew × day ── */
.crew-gwrap{ overflow-x:auto; }
.crew-grid{ width:100%; min-width:1040px; border-collapse:collapse; }
.crew-grid th, .crew-grid td{ border-right:1px solid var(--line); border-bottom:1px solid var(--line);
  vertical-align:top; }
.crew-grid th:last-child, .crew-grid td:last-child{ border-right:0; }
/* v1.4.10.473: the grid's header cells carried the browser's bold 14px, so a member's role and hours read 11/700 and the
   corner 14/700. Their spans set their own type; the corner is the uppercase label, as the site roster's corner. */
.crew-grid th{ font-size:13px; font-weight:400; }
.crew-grid thead .crew-g-who{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }
.crew-g-who{ width:168px; min-width:168px; text-align:left; padding:9px 12px; background:var(--bg);
  position:sticky; left:0; z-index:2; }
.crew-who-n{ display:block; font-size:13px; font-weight:600; color:var(--text); }   /* v1.4.10.473: a row's name is 13/600 (was 700) */
.crew-who-m{ display:block; font-size:11px; color:var(--text-mute); }
.crew-g-day{ padding:7px 6px; text-align:center; background:var(--bg); }
.crew-g-dow{ display:block; font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }
.crew-g-dnum{ display:block; font-size:15px; font-weight:700; color:var(--text); }   /* v1.4.10.473: 15px, as the site roster's and My shifts' day numbers (was 14) */
.crew-g-day.today .crew-g-dnum{ color:var(--accent-deep); }
.crew-g-cell{ padding:5px; min-width:82px; min-height:58px; cursor:pointer; }
.crew-g-cell.today{ background:var(--accent-glow); }
.crew-g-cell.leave{ background:repeating-linear-gradient(135deg,var(--bg),var(--bg) 6px,var(--surface) 6px,var(--surface) 12px); }
.crew-g-open > .crew-g-who{ background:var(--surface); }
.crew-leave{ display:block; font-size:11px; font-weight:600; color:var(--text-mute);
  text-transform:uppercase; letter-spacing:.06em; margin-bottom:3px; }
.crew-chip{ display:block; width:100%; text-align:left; margin:0 0 4px; padding:4px 7px;
  border:0; border-left:3px solid var(--c,var(--accent)); border-radius:6px;
  background:color-mix(in srgb, var(--c,var(--accent)) 12%, var(--surface));
  cursor:pointer; min-height:34px; }
.crew-chip:hover{ background:color-mix(in srgb, var(--c,var(--accent)) 22%, var(--surface)); }
.crew-chip.open{ border-left-style:dashed; }
.crew-chip.callout{ box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--c) 45%, transparent); }
.crew-chip-t{ display:block; font-size:12px; font-weight:500; color:var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }   /* v1.4.10.473: a chip's first line is the chip look, 12/500 (was 400) */
.crew-chip-s{ display:block; font-size:11px; color:var(--text-mute); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* ── on call ── */
.crew-oncall{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin:0 0 12px;
  padding:10px 14px; border:1px solid var(--line); border-left:3px solid var(--ok);
  border-radius:10px; background:var(--surface); }
.crew-oncall.empty{ border-left-color:var(--warn); }
.crew-oc-h{ display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:600;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }
.crew-oc-who{ font-size:13px; font-weight:600; color:var(--text); }
.crew-oc-who a{ color:var(--accent); }
.crew-oc-till{ font-size:12px; font-weight:400; color:var(--text-mute); margin-left:6px; }
.crew-oc-none{ font-size:13px; color:var(--text-mute); }
.crew-oc-btn{ margin-left:auto; }

/* ── the call-out rail ── */
.crew-side{ padding:0; }
.crew-side-head{ display:flex; align-items:center; gap:8px; padding:11px 14px;
  border-bottom:1px solid var(--line); font-weight:600; font-size:13px; color:var(--text); }   /* v1.4.10.473: a card's sub-heading is 13/600 (was 700) */
.crew-cofilter{ margin-left:auto; }
.crew-colist{ max-height:74vh; overflow-y:auto; }
.crew-co{ padding:11px 14px; border-bottom:1px solid var(--line); }
.crew-co.closed{ opacity:.62; }
.crew-co.late{ background:color-mix(in srgb, var(--err) 6%, transparent); }
.crew-co-top{ display:flex; align-items:center; gap:7px; margin-bottom:5px; }
.crew-co-st{ font-size:11px; font-weight:600; color:var(--text-mute); text-transform:uppercase; letter-spacing:.06em; }
.crew-co-cd{ margin-left:auto; font-size:12px; font-weight:600; color:var(--text-mute); }
.crew-co-cd.late{ color:var(--err); }
.crew-co-t{ font-size:13px; font-weight:600; color:var(--text); line-height:1.35; }
.crew-co-w{ font-size:12px; color:var(--text-mute); margin-top:2px; }
.crew-co-w a{ color:var(--accent); cursor:pointer; }
.crew-co-who{ font-size:12px; color:var(--text); margin-top:5px; display:flex; align-items:center; gap:5px; flex-wrap:wrap; }
.crew-co-non{ color:var(--warn); font-weight:600; }
.crew-co-acts{ display:flex; gap:6px; flex-wrap:wrap; margin-top:8px; }
.crew-co-empty{ padding:26px 18px; text-align:center; color:var(--text-mute); font-size:13px; }

/* ── the forms (share the roster modal shell) ── */
.crew-modal .rost-row3{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:10px; }
.crew-modal .rost-err{ margin-top:8px; font-size:12px; color:var(--err); min-height:16px; }
.crew-modal .crew-dl{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:9px 16px; }
.crew-modal .crew-dl > div{ display:flex; flex-direction:column; gap:1px; }
.crew-modal .crew-dl span{ font-size:11px; font-weight:600; text-transform:uppercase;
  letter-spacing:.06em; color:var(--text-mute); }
.crew-modal .crew-dl b{ font-size:13px; font-weight:600; color:var(--text); }
.crew-notes{ font-size:13px; color:var(--text-mute); line-height:1.55; margin:10px 0 0; }
.crew-rota-add{ margin-bottom:10px; }

/* ── phones: the board scrolls, the rail stacks under it, every control 40px ── */
@media (max-width:1100px){
  .crew-cols{ grid-template-columns:minmax(0,1fr); }
  .crew-rail{ grid-template-columns:repeat(3,1fr); }
}
@media (max-width:700px){
  .crew-rail{ grid-template-columns:repeat(2,1fr); }
  .crew-tile-v{ font-size:20px; }
  .crew-colist{ max-height:none; }
  .crew-board-head .head-actions{ width:100%; }
  .crew-board-head .head-actions .btn{ min-height:40px; }
  .crew-co-acts .btn{ min-height:40px; padding-left:12px; padding-right:12px; }
  .crew-oc-btn{ min-height:40px; }
  .rost-mode{ flex:1 1 46%; min-height:48px; }
  .mt-cchip{ min-height:40px; }
  .crew-modal .rost-row3{ grid-template-columns:minmax(0,1fr); }
  .crew-modal .crew-dl{ grid-template-columns:minmax(0,1fr); }
  .mt-grp-only{ float:none; display:block; margin-top:6px; }
}
/* ═══ end v1.4.10.404 ═══ */


/* ═══ v1.4.10.405 — THE CREW WORKSPACE ════════════════════════════════════
   Jay: "needs way more features and laid out much better with no bugs."
   Five tabs on one toolbar, a board you can drag on, a dispatch day, a
   call-out board with lanes, the crew and their rota, and the reports. The
   v404 block above still supplies the rail, chips, on-call strip and call-out
   card; this adds the frame around them and everything new. */

.crew-bar{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:0 0 12px;
  padding:9px 12px; background:var(--surface); border:1px solid var(--line); border-radius:12px; }
.crew-tabs{ display:flex; gap:4px; flex-wrap:wrap; }
.crew-tab{ display:inline-flex; align-items:center; gap:6px; padding:8px 14px; min-height:38px;
  border:0; border-radius:9px; background:transparent; color:var(--text-mute);
  font-size:13px; font-weight:600; cursor:pointer; }
.crew-tab:hover{ background:var(--bg); color:var(--text); }
.crew-tab.on{ background:var(--accent-glow); color:var(--accent-deep); }
.crew-tab-n{ display:inline-flex; align-items:center; justify-content:center; min-width:19px; height:19px;
  padding:0 5px; border-radius:999px; background:var(--err); color:#fff; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; }   /* v1.4.10.473: badge look */
.crew-bar-right{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-left:auto; }
.crew-range{ font-size:12px; color:var(--text-mute); white-space:nowrap; }
.crew-q{ width:170px; }
.crew-bar-right .ex-sel, .crew-bar-right .btn{ height:32px; }   /* v1.4.10.473: one height across the toolbar (the selects were 33, the buttons 32 and Raise call-out 30) */
.crew-tile{ text-align:left; cursor:pointer; }
.crew-tile:disabled{ cursor:default; }
.crew-tile:not(:disabled):hover{ border-color:var(--accent); }
.crew-note{ padding:12px 16px; font-size:13px; color:var(--text-mute); }
.crew-h4{ margin:18px 0 8px; font-size:13px; font-weight:600; color:var(--text); }
.crew-two{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; align-items:start; }
@media (min-width:1101px){
  .crew-bar-right{ justify-content:flex-end; }   /* a wrapped control row sits right, under the tabs, with the primary action at its end */
  /* v1.4.10.473: the board's toolbar (period, range, three filters, search, four actions) is wider than the bar, so it
     wrapped to a third row with Raise call-out alone on it. The actions now sit right of the tabs and the period and
     filters take the second row: two rows on every tab, nothing orphaned. My shifts (no search) keeps its one row. */
  .crew-bar:has(> .crew-bar-right > .crew-q){ row-gap:5px; }
  .crew-bar-right:has(> .crew-q){ display:contents; }
  .crew-bar-right:has(> .crew-q) > .btn{ order:1; }
  .crew-bar-right:has(> .crew-q) > .btn:first-of-type{ margin-left:auto; }
  .crew-bar:has(> .crew-bar-right > .crew-q)::after{ content:''; order:2; flex-basis:100%; height:0; }
  .crew-bar-right:has(> .crew-q) > :not(.btn){ order:3; }
  /* v1.4.10.473: People & rota side by side: 18px cell padding left a 676px table no room, so phone numbers broke over
     three lines, CALL-OUTS over two and the rota's times mid-stamp */
  .crew-body > .crew-two .dt thead th, .crew-body > .crew-two .dt tbody td{ padding-left:12px; padding-right:12px; }
  .crew-body > .crew-two .dt thead th, .crew-body > .crew-two .dt a[href^="tel:"],
  .crew-body > .crew-two > .panel + .panel .dt td:nth-child(2), .crew-body > .crew-two > .panel + .panel .dt td:nth-child(3){ white-space:nowrap; }
}
/* v1.4.10.473: below 1400px a half-width People or rota panel is narrower than its table (556px for 667 at 1200),
   so the two panels stack there instead of scrolling sideways */
@media (max-width:1400px){ .crew-body > .crew-two{ grid-template-columns:minmax(0,1fr); } }

/* the board */
.crew-g-day.wknd, .crew-g-cell.wknd{ background:color-mix(in srgb, var(--bg) 60%, transparent); }
.crew-g-mon{ display:block; font-size:11px; color:var(--accent); font-weight:600; text-transform:uppercase; letter-spacing:.06em; }   /* v1.4.10.473: the month under a day is the day label's look, 11/600 uppercase .06em (was 11/700) */
.crew-who-h{ display:block; font-size:11px; font-weight:600; color:var(--accent-deep); }
.crew-g-cell.over{ outline:2px dashed var(--accent); outline-offset:-3px; background:var(--accent-glow); }
.crew-chip{ position:relative; }
.crew-chip.dragging{ opacity:.45; }
.crew-chip[draggable="true"]{ cursor:grab; }
.crew-chip.elsewhere{ border-left-style:dotted; background:repeating-linear-gradient(135deg,var(--bg),var(--bg) 5px,var(--surface) 5px,var(--surface) 10px);
  cursor:default; opacity:.85; }
.crew-chip-w{ font-style:normal; font-weight:600; color:var(--ok); }
.crew-legend{ display:flex; gap:14px; flex-wrap:wrap; padding:10px 14px; border-top:1px solid var(--line); }
.crew-lg{ display:inline-flex; align-items:center; gap:6px; font-size:11px; color:var(--text-mute); }
.crew-dot{ width:9px; height:9px; border-radius:3px; display:inline-block; }
.crew-dot-o{ background:transparent; border:1px dotted var(--text-mute); }

/* the dispatch day */
.crew-day{ padding:8px 14px 16px; }
.crew-day-head{ display:flex; gap:10px; align-items:flex-end; height:22px; }
.crew-day-row{ display:flex; gap:10px; align-items:center; margin:0 0 7px; }
.crew-day-who{ width:150px; min-width:150px; font-size:13px; font-weight:600; color:var(--text); }
.crew-day-who span{ display:block; font-size:11px; font-weight:400; color:var(--text-mute); }
.crew-day-track{ position:relative; flex:1; min-height:38px; background:var(--bg);
  border:1px solid var(--line); border-radius:8px; }
.crew-day-h{ position:absolute; top:-2px; transform:translateX(-50%); font-size:11px; color:var(--text-mute); }
.crew-day-tick{ position:absolute; top:0; bottom:0; width:1px; background:var(--line); }
.crew-day-bar{ position:absolute; top:4px; bottom:4px; padding:0 8px; border:0; border-radius:6px;
  background:color-mix(in srgb, var(--c,var(--accent)) 16%, var(--surface));
  border-left:3px solid var(--c,var(--accent)); font-size:12px; color:var(--text);
  text-align:left; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; cursor:pointer; }
.crew-day-bar:hover{ background:color-mix(in srgb, var(--c,var(--accent)) 28%, var(--surface)); }

/* the call-out lanes */
.crew-lanes{ display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:10px; padding:12px 14px; align-items:start; }
.crew-lane{ background:var(--bg); border:1px solid var(--line); border-radius:11px; min-height:120px; }
.crew-lane.over{ outline:2px dashed var(--accent); outline-offset:-3px; }
.crew-lane-h{ display:flex; align-items:center; gap:7px; padding:9px 11px; font-size:11px; font-weight:600;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); border-bottom:1px solid var(--line); }
.crew-lane-n{ margin-left:auto; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--text); }   /* v1.4.10.473: a lane's count is the badge look, as every count in a heading (was 12/700 with the heading's .06em) */
.crew-lane-b{ padding:8px; display:flex; flex-direction:column; gap:8px; }
.crew-lane-e{ text-align:center; color:var(--text-mute); padding:10px 0; }
.crew-lanes .crew-co{ border:1px solid var(--line); border-radius:10px; background:var(--surface); padding:9px 11px; cursor:pointer; }
.crew-lanes .crew-co:hover{ border-color:var(--accent); }
.crew-lanes .crew-co.dragging{ opacity:.45; }
.crew-co-esc{ display:inline-flex; align-items:center; color:var(--err); font-weight:600; font-size:11px; }   /* v1.4.10.473: status-pill weight (was 700) */

/* the call-out drawer */
.crew-drawer .crew-dl{ margin:10px 0 4px; }
.crew-thread-h{ margin:16px 0 6px; font-size:11px; font-weight:600; text-transform:uppercase;
  letter-spacing:.06em; color:var(--text-mute); }
.crew-thread{ max-height:230px; overflow-y:auto; border:1px solid var(--line); border-radius:10px; padding:8px 10px; }
.crew-ev{ padding:6px 0; border-bottom:1px solid var(--line); }
.crew-ev:last-child{ border-bottom:0; }
.crew-ev-k{ font-size:12px; font-weight:600; color:var(--text); text-transform:capitalize; }
.crew-ev-w{ font-size:11px; color:var(--text-mute); margin-left:7px; }
.crew-ev-b{ font-size:12px; color:var(--text); margin-top:2px; white-space:pre-wrap; }
.crew-notebox{ display:flex; gap:8px; margin-top:10px; }
.crew-notebox input{ flex:1; padding:10px 12px; background:var(--surface); border:1px solid var(--line);
  border-radius:8px; color:var(--text); font-size:13px; font-family:inherit; }
.rost-err.warn{ color:var(--warn); }

/* reports */
.crew-figs{ display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:10px; margin:0 0 6px; }
.crew-fig{ display:flex; flex-direction:column; gap:1px; padding:12px 14px; background:var(--bg);
  border:1px solid var(--line); border-radius:11px; }
.crew-fig-v{ font-size:20px; font-weight:600; letter-spacing:-.02em; color:var(--text); }
.crew-fig-l{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text); }   /* v1.4.10.473: KPI label look (was 12/600) */
.crew-fig-s{ font-size:11px; color:var(--text-mute); }
.crew-late{ color:var(--err); }

@media (max-width:1100px){
  .crew-lanes{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .crew-figs{ grid-template-columns:repeat(3,minmax(0,1fr)); }
  .crew-two{ grid-template-columns:minmax(0,1fr); }
}
@media (max-width:700px){
  .crew-bar{ gap:7px; }
  .crew-bar-right{ width:100%; margin-left:0; }
  .crew-q{ width:100%; }
  .crew-tab{ min-height:40px; }
  .crew-tabs{ width:100%; overflow-x:auto; flex-wrap:nowrap; }
  .crew-lanes{ grid-template-columns:minmax(0,1fr); padding:10px; }
  .crew-figs{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .crew-day-who{ width:96px; min-width:96px; }
  .crew-notebox input{ min-height:40px; }
  .crew-bar-right .btn{ min-height:40px; }
  .crew-bar-right .ex-sel{ min-height:40px; }
  /* v1.4.10.473: the tab strip scrolls rather than breaking "Call-outs" and "My shifts" over two lines, and the
     toolbar's selects, search and actions pair up in even halves (they wrapped ragged, Raise call-out alone) */
  .crew-tab{ white-space:nowrap; }
  .crew-bar-right > .ex-sel, .crew-bar-right > .btn{ flex:1 1 calc(50% - 4px); min-width:0; }
  .crew-bar-right > .btn{ justify-content:center; }
}
/* ═══ end v1.4.10.405 ═══ */

/* ═══ v1.4.10.451 — THE CALL-OUT WORKSPACE ═══════════════════════════════
   Jay: "Call out to Rosters need to be more amazing … massive information in
   the call out for the tech when going on onsite … photos and notes … clock in
   and clock out … a log of times." One drawer, five tabs (Job · On site ·
   Photos · Times · Thread), built for a phone in one hand: every control on the
   On site tab is at least 48px, the clock is the biggest thing on the screen. */
#modal-inner.modal-wide:has(.crew-drawer){ max-width:1040px; }
.crew-drawer{ max-height:92vh; }
.crew-ws-head{ align-items:flex-start; }
.crew-ws-title{ min-width:0; flex:1; }
.crew-ws-title h3{ overflow-wrap:anywhere; }
.crew-ws-sub{ font-size:12px; color:var(--text-mute); margin-top:3px; }
.crew-ws-status{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; padding:10px 18px 0; }
.crew-ws-status .pill.xs{ text-transform:none; }
.crew-ws-live{ display:inline-flex; align-items:center; gap:5px; }
.crew-ws-live svg{ width:12px; height:12px; }
.crew-ws-id{ margin-left:auto; font-size:12px; color:var(--text-dim); font-family:var(--font-mono);font-variant-numeric:tabular-nums; }
.crew-ws-tabs{ display:flex; gap:4px; flex-wrap:wrap; padding:10px 18px 0; border-bottom:1px solid var(--line); }
.crew-ws-tab{ display:inline-flex; align-items:center; gap:6px; padding:9px 13px; min-height:38px; border:0; border-bottom:2px solid transparent;
  background:transparent; color:var(--text-mute); font-size:13px; font-weight:600; cursor:pointer; border-radius:8px 8px 0 0; }
.crew-ws-tab:hover{ background:var(--bg); color:var(--text); }
.crew-ws-tab.on{ color:var(--accent-deep); border-bottom-color:var(--accent); }
.crew-ws-tab-n{ display:inline-flex; align-items:center; justify-content:center; min-width:19px; height:19px; padding:0 6px;
  border-radius:999px; background:var(--surface-3); color:var(--text-mute); font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; }   /* v1.4.10.473: a tab's count is the badge look, as .crew-tab-n (was 11/600) */
.crew-ws-tab.on .crew-ws-tab-n{ background:var(--accent-glow); color:var(--accent-deep); }
.crew-ws-body{ gap:14px; }
.crew-ws-grid{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; align-items:start; }
.crew-ws-card{ border:1px solid var(--line); border-radius:12px; padding:13px 15px; background:var(--surface); min-width:0; }
.crew-ws-card.ok{ border-color:color-mix(in srgb, var(--ok) 40%, var(--line)); background:color-mix(in srgb, var(--ok) 5%, var(--surface)); }
.crew-ws-card h4{ display:flex; align-items:center; gap:7px; flex-wrap:wrap; margin:0 0 9px; font-size:15px; font-weight:600; color:var(--text); }
.crew-ws-card h4 svg{ width:16px; height:16px; color:var(--brand-blue); flex-shrink:0; }
.crew-ws-card h4 small{ font-size:12px; font-weight:400; color:var(--text-mute); }
.crew-ws-card .crew-notes{ margin-top:6px; }
.crew-ws-card .crew-co-acts{ margin-top:10px; }
.crew-ws-prog{ margin-left:auto; font-size:12px; font-weight:600; color:var(--text-mute); }
.crew-ws-prog.ok{ color:var(--ok); }
.crew-ws-kv{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:8px 14px; }
.crew-ws-kv > div{ display:flex; flex-direction:column; gap:1px; min-width:0; }
.crew-ws-kv span{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }
.crew-ws-kv b{ font-size:13px; font-weight:600; color:var(--text); overflow-wrap:anywhere; }
.crew-ws-kv b small, .crew-drawer .crew-dl b small{ display:block; font-size:12px; font-weight:400; color:var(--text-mute); }
.crew-ws-kv b.mono{ font-weight:500; }   /* v1.4.10.473: the face is the base .mono's */
.crew-ws-kv b .pill{ vertical-align:middle; }
.crew-ws-maplink{ display:inline-flex; align-items:center; gap:4px; margin-top:3px; font-size:12px; font-weight:600; color:var(--accent); }
.crew-ws-maplink svg{ width:13px; height:13px; }
.crew-ws-access{ margin-top:4px; padding:10px 13px; border-radius:10px; border:1px solid color-mix(in srgb, var(--warn) 45%, var(--line));
  background:color-mix(in srgb, var(--warn) 8%, var(--surface)); font-size:13px; color:var(--text); white-space:pre-wrap; }
.crew-ws-access b{ display:flex; align-items:center; gap:6px; font-size:12px; margin-bottom:3px; color:var(--on-warn); }
.crew-ws-access b svg{ width:14px; height:14px; }
.crew-ws-clamp{ display:-webkit-box; -webkit-line-clamp:6; -webkit-box-orient:vertical; overflow:hidden; white-space:pre-wrap; }
.crew-ws-empty{ font-size:13px; color:var(--text-mute); padding:6px 0; }
.crew-co-acts.big .btn{ min-height:44px; padding-left:14px; padding-right:14px; font-size:13px; }
.crew-co-acts.big .rost-in{ flex:1; min-width:180px; min-height:44px; }
.crew-co-about{ display:flex; align-items:center; gap:8px; padding:9px 12px; border-radius:9px; background:var(--accent-glow); color:var(--accent-deep); font-size:12px; font-weight:500; }
.crew-co-about svg{ width:14px; height:14px; flex-shrink:0; }
.crew-co-plan{ border:1px solid var(--line); border-radius:9px; padding:0 12px 10px; }
.crew-co-plan summary{ cursor:pointer; padding:10px 0; font-size:13px; font-weight:600; color:var(--text); }
.crew-co-plan .rost-field{ margin-top:8px; }
.crew-co-tag{ display:inline-flex; align-items:center; padding:0 6px; height:18px; border-radius:5px; background:var(--surface-3); color:var(--text-mute);
  font-size:11px; font-weight:600; font-family:var(--font-mono);font-variant-numeric:tabular-nums; }
.crew-co-tag.ok{ background:color-mix(in srgb, var(--ok) 14%, var(--surface)); color:var(--ok); }
/* the clock */
.crew-clock{ grid-column:1 / -1; border-color:var(--line-2); }
.crew-clock.running{ border-color:var(--ok); background:color-mix(in srgb, var(--ok) 5%, var(--surface)); }
.crew-clock-now{ display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; margin:2px 0 12px; }
.crew-clock-now.off .crew-clock-k{ color:var(--text-mute); }
.crew-clock-k{ font-size:13px; font-weight:600; color:var(--text); }
.crew-clock-v{ font-size:30px; font-weight:700; letter-spacing:-.03em; color:var(--ok); font-variant-numeric:tabular-nums; line-height:1; }   /* v1.4.10.473: the KPI value, 30/700 (was 36) */
.crew-clock-s{ font-size:12px; color:var(--text-mute); }
.crew-clock-btns{ display:flex; gap:8px; flex-wrap:wrap; }
.crew-clock-btns .btn{ min-height:48px; padding-left:16px; padding-right:16px; font-size:13px; font-weight:600;   /* v1.4.10.473: a button is 13px (was 14) */ flex:1 1 140px; justify-content:center; }
.crew-clock-note{ margin-top:10px; min-height:40px; }
.crew-clock-tot{ margin-top:10px; font-size:12px; color:var(--text-mute); }
/* the checklist and the equipment list */
.crew-list{ display:flex; flex-direction:column; gap:4px; }
.crew-list-item{ display:flex; align-items:flex-start; gap:10px; padding:9px 10px; border-radius:9px; border:1px solid var(--line); background:var(--bg);
  cursor:pointer; min-height:44px; }
.crew-list-item:hover{ border-color:var(--line-2); }
.crew-list-item input{ width:20px; height:20px; margin:1px 0 0; accent-color:var(--ok); flex-shrink:0; cursor:pointer; }
.crew-list-item.done{ background:color-mix(in srgb, var(--ok) 7%, var(--surface)); border-color:color-mix(in srgb, var(--ok) 35%, var(--line)); }
.crew-list-item.done .crew-list-t{ color:var(--text-mute); text-decoration:line-through; text-decoration-color:color-mix(in srgb, var(--text-mute) 50%, transparent); }
.crew-list-t{ flex:1; min-width:0; font-size:13px; color:var(--text); line-height:1.4; overflow-wrap:anywhere; }
.crew-list-t small{ display:block; font-size:11px; color:var(--text-mute); text-decoration:none; }
.crew-list-x{ border:0; background:transparent; color:var(--text-dim); cursor:pointer; padding:2px; border-radius:6px; display:inline-flex; }
.crew-list-x:hover{ color:var(--err); background:var(--surface); }
.crew-list-x svg{ width:14px; height:14px; }
.crew-list-add{ display:flex; gap:8px; margin-top:9px; }
.crew-list-add .rost-in{ flex:1; min-height:40px; }
/* photos */
.crew-gallery{ display:grid; grid-template-columns:repeat(auto-fill, minmax(150px, 1fr)); gap:12px; }
.crew-ph{ margin:0; border:1px solid var(--line); border-radius:10px; overflow:hidden; background:var(--bg); cursor:pointer; }
.crew-ph:hover{ border-color:var(--accent); }
.crew-ph img{ display:block; width:100%; height:130px; object-fit:cover; }
.crew-ph-file{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:6px; height:130px; color:var(--text-mute); font-size:12px; padding:10px; text-align:center; }
.crew-ph-file svg{ width:26px; height:26px; }
.crew-ph figcaption{ padding:7px 9px; font-size:12px; color:var(--text); line-height:1.35; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.crew-ph figcaption small{ display:block; font-size:11px; color:var(--text-mute); }
.crew-ph-big{ display:flex; flex-direction:column; gap:10px; }
.crew-ph-big-bar{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.crew-ph-big-t{ flex:1; min-width:160px; font-size:13px; font-weight:600; color:var(--text); }
.crew-ph-big-t small{ display:block; font-size:11px; font-weight:400; color:var(--text-mute); }
.crew-ph-big img{ display:block; max-width:100%; max-height:70vh; margin:0 auto; border-radius:10px; border:1px solid var(--line); }
/* times */
.crew-time td.r, .crew-time th.r{ text-align:right; font-variant-numeric:tabular-nums; }
.crew-time tr.running td{ background:color-mix(in srgb, var(--ok) 6%, transparent); }
.crew-ws-live-t{ color:var(--ok); font-weight:600; }
.crew-thread.tall{ max-height:52vh; }
.crew-ev-clock_in .crew-ev-k, .crew-ev-clock_out .crew-ev-k{ color:var(--ok); }
.crew-ev-photo .crew-ev-k{ color:var(--brand-purple); }
/* the ticket's Call-outs card */
.tkd-co-row{ cursor:pointer; align-items:center; }
.tkd-co-row:hover .rel-subj b{ color:var(--accent); }
.tkd-co-row .rel-subj{ flex:1; min-width:0; }
/* v1.4.10.471: the ticket's Tasks card (same row as a call-out, with the unlink cross of a linked ticket) */
.tkd-tk-row{ cursor:pointer; align-items:center; position:relative; }
.tkd-tk-row:hover .rel-subj b{ color:var(--accent); }
.tkd-tk-row .rel-subj{ flex:1; min-width:0; }
#tkt-task-add .btn{ margin-top:2px; }
/* the asset's Issues tab: a site visit */
.aiss-callout .pill svg{ width:11px; height:11px; vertical-align:-1px; margin-right:2px; }
@media (max-width:900px){
  .crew-ws-grid{ grid-template-columns:minmax(0,1fr); }
}
@media (max-width:700px){
  .crew-drawer{ max-height:100vh; }
  .crew-ws-status{ padding:8px 12px 0; }
  .crew-ws-tabs{ padding:8px 10px 0; flex-wrap:nowrap; overflow-x:auto; }
  .crew-ws-tab{ min-height:40px; padding:9px 11px; white-space:nowrap; }
  .crew-ws-id{ display:none; }
  .crew-ws-kv{ grid-template-columns:minmax(0,1fr); }
  .crew-clock-v{ font-size:24px; }   /* v1.4.10.473: 24px on a phone, as every KPI (was 30) */
  .crew-clock-btns .btn{ flex:1 1 100%; }
  .crew-co-acts.big .btn{ min-height:48px; flex:1 1 46%; }
  .crew-co-acts .btn{ min-height:40px; }
  .crew-list-item{ min-height:48px; }
  .crew-gallery{ grid-template-columns:repeat(2, minmax(0,1fr)); }
  .crew-ph-big-bar .btn{ min-height:40px; }
}
/* ═══ end v1.4.10.451 ═══ */

/* ══ v1.4.10.409 — THE TICKET READS AS THE JOB'S STORY ════════════════════════
   One bold idea and everything else quiet: the conversation is a timeline on a
   rail. People sit ON the rail; the support team's replies carry the brand
   accent, the requester's stay plain, team-only notes amber, control lines
   green; status / assignment / SLA changes are small events on the rail rather
   than cards of their own; a photo appears where it was attached. */
.conv-thread{padding-left:48px;}
.conv-thread::before{content:"";position:absolute;left:17px;top:8px;bottom:8px;width:2px;border-radius:2px;background:var(--line);}
.conv-thread .conv-item{position:relative;display:block;margin:0 0 18px;}
.conv-thread .conv-item > .cv-av{position:absolute;left:-48px;top:0;width:36px;height:36px;border-radius:50%;font-size:13px;box-shadow:0 0 0 4px var(--surface);}
.conv-thread .conv-item .cv-head{display:flex;align-items:center;gap:8px;margin:0 0 6px;min-height:36px;}
.conv-thread .conv-item .cv-who{font-weight:600;font-size:13px;color:var(--text);}
.conv-thread .conv-item .cv-role{text-transform:none;letter-spacing:0;font-size:11px;font-weight:600;padding:2px 9px;border-radius:999px;}
.conv-thread .conv-item .cv-role::first-letter{text-transform:uppercase;}
.conv-thread .conv-item .cv-when{margin-left:auto;font-size:12px;color:var(--text-dim);white-space:nowrap;}
.conv-thread .conv-item .cv-bubble{border-radius:10px;padding:12px 15px;font-size:14px;line-height:1.6;box-shadow:inset 3px 0 0 var(--line);overflow-wrap:anywhere;}   /* v1.4.10.473: a long link or log line breaks inside the bubble (it ran 501px out of it on a phone) */
.conv-thread .conv-item.cv-agent:not(.note):not(.control) .cv-bubble{background:rgba(var(--bc-accent-rgb),.045);border-color:rgba(var(--bc-accent-rgb),.2);box-shadow:inset 3px 0 0 var(--brand-blue);}
.conv-thread .conv-item.cv-agent:not(.note):not(.control) .cv-role{background:rgba(var(--bc-accent-rgb),.1);color:var(--brand-blue);}
.conv-thread .conv-item.cv-client .cv-role{background:var(--surface-3);color:var(--text-mute);}
.conv-thread .conv-item.note .cv-bubble{box-shadow:inset 3px 0 0 var(--warn);}
.conv-thread .conv-item.control .cv-bubble{box-shadow:inset 3px 0 0 var(--ok);font-size:13px;}
.conv-thread .conv-act{position:relative;display:block;margin:-4px 0 14px;padding:2px 0 0;}
.conv-thread .conv-act .ca-dot{position:absolute;left:-40px;top:2px;width:20px;height:20px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--surface);border:2px solid var(--line);color:var(--text-mute);}
.conv-thread .conv-act .ca-dot svg{width:11px;height:11px;}
.conv-thread .conv-act .ca-body{background:none;border:0;padding:0;margin:0;}
.conv-thread .conv-act .ca-lines{font-size:12px;color:var(--text-mute);line-height:1.5;}
.conv-thread .conv-act .ca-when{font-size:11px;color:var(--text-dim);margin-top:1px;}
.conv-thread .conv-act + .conv-act{margin-top:-6px;}
.conv-thread .conv-day{margin:4px 0 16px -48px;}
.conv-thread .conv-day span{position:relative;z-index:1;background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:3px 11px;font-size:11px;font-weight:600;color:var(--text-mute);letter-spacing:0;text-transform:none;}
.cv-atts{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;}
.cv-att{display:flex;flex-direction:column;gap:4px;width:132px;padding:0;border:1px solid var(--line);border-radius:8px;background:var(--surface);overflow:hidden;cursor:pointer;text-align:left;font-family:var(--font-body);font-size:inherit;color:var(--text);}
.cv-att img{width:100%;height:92px;object-fit:cover;display:block;background:var(--surface-3);}
.cv-att span{font-size:11px;padding:0 8px 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.cv-att:not(.img){flex-direction:row;align-items:center;width:auto;max-width:100%;padding:8px 10px;min-height:40px;}
.cv-att:not(.img) span{padding:0;}
.cv-att.gone img{display:none;}
.cv-att:hover{border-color:rgba(var(--bc-accent-rgb),.35);}
.cv-att:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
.tkd-slabar{height:6px;border-radius:999px;background:var(--surface-3);overflow:hidden;margin-top:8px;}
.tkd-slabar i{display:block;height:100%;border-radius:inherit;background:var(--brand-blue);}
.tkd-slabar.ok i{background:var(--ok);}
.tkd-slabar.warn i{background:var(--warn);}
.tkd-slabar.err i{background:var(--err);}
.tkd-slabar.paused i{background:repeating-linear-gradient(45deg,var(--text-dim) 0 6px,transparent 6px 10px);}
#tkd-props-card .ex-k{text-transform:none;letter-spacing:0;font-size:12px;font-weight:500;color:var(--text-mute);}
#tkd-props-card .ex-row{align-items:flex-start;}
#tkd-props-card .ex-v{text-align:left;align-self:flex-start;justify-self:start;margin-left:0;}
@media (min-width:1180px){
  #modal-inner.modal-tkt{max-width:1240px;}
  .tkd-body{grid-template-columns:minmax(0,1fr) 380px;}
}
@media (max-width:760px){
  .conv-thread{padding-left:40px;}
  .conv-thread::before{left:13px;}
  .conv-thread .conv-item > .cv-av{left:-40px;width:28px;height:28px;font-size:11px;}
  .conv-thread .conv-item .cv-head{min-height:28px;flex-wrap:wrap;gap:4px 8px;}
  .conv-thread .conv-act .ca-dot{left:-36px;}
  .conv-thread .conv-day{margin-left:-40px;}
  .cv-att{width:calc(50% - 4px);}
}
@media (prefers-reduced-motion:no-preference){ .tkd-slabar i{transition:width .4s ease;} }
/* v1.4.10.409 — the triage card reads down the left edge, where the label is */
#tkd-props-card .ex-row{flex-direction:column;align-items:flex-start;justify-content:flex-start;gap:4px;}   /* v1.4.10.473: the value sits under its label (.ex-row's space-between pushed it to the foot of a taller neighbour's row) */
#tkd-props-card .tkt-fact{margin-left:0;text-align:left;align-items:flex-start;justify-content:flex-start;align-self:flex-start;}
/* the photos are one film strip at the top — every picture in view, the story
   still on the first screen (they also appear in the thread where attached) */
.tkt-photos .tkp-grid{display:flex;gap:8px;overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x proximity;padding-bottom:4px;}
.tkt-photos .tkp-cell{flex:0 0 auto;width:168px;margin:0;scroll-snap-align:start;}
.tkt-photos .tkp-cell img{height:112px;width:100%;object-fit:cover;}
@media (max-width:760px){ .tkt-photos .tkp-cell{width:144px;} .tkt-photos .tkp-cell img{height:96px;} }
/* v1.4.10.409 — (1,2,0): the v171 label rule is #tkd-props-card .ex-row .ex-k, so a lighter selector loses to it */
#tkd-props-card .ex-row .ex-k{text-transform:none;letter-spacing:0;font-size:12px;font-weight:500;color:var(--text-mute);}
/* on a phone the triage card is a compact two-column sheet of facts, so the conversation starts sooner */
@media (max-width:760px){
  #tkd-props-card .sbx-body{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px 16px;}
  #tkd-props-card .sbx-body > .ex-row{border:0;padding:0;margin:0;min-width:0;}
  #tkd-props-card .sbx-body > :not(.ex-row){grid-column:1 / -1;}
  /* v1.4.10.473: while editing, the controls take the whole row — in half the card the assignee select was 117px
     and cut the name it held */
  #tkd-props-card.tkt-props-editing .sbx-body{grid-template-columns:minmax(0,1fr);}
  #tkd-props-card .tkt-fact{max-width:100%;}
  #tkd-props-card .tkt-fact b,#tkd-props-card .tkt-fact .device-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;display:block;}
}

/* ══ v1.4.10.410 — SUPPORT ON A PHONE: THE FIRST TICKET ON THE FIRST SCREEN ══════
   Measured at 390x664: the first ticket card started at 835px — the page hero
   (198px: scope eyebrow, title, sub-line, three chips that restate the KPI
   rail) and a 241px toolbar pushed every ticket below the fold. On a phone the
   Support hero is its title alone; the rail, the filters and the list follow. */
@media (max-width:760px){
  #page-hero[data-page="tickets"] .page-hero{padding:12px 16px;min-height:0;}
  #page-hero[data-page="tickets"] .ph-row{min-height:0;}
  #page-hero[data-page="tickets"] .ph-eyebrow,
  #page-hero[data-page="tickets"] .page-sub,
  #page-hero[data-page="tickets"] .ph-chips,
  #page-hero[data-page="tickets"] .ph-art{display:none;}
  #page-hero[data-page="tickets"] .page-title{font-size:18px;margin:0;line-height:1.25;}
}
@media (max-width:760px){
  /* the column note is about table COLUMNS; on a phone the rows are cards, so it
     keeps the one fact that still reads ("All at ICC · all P3") and the toggle,
     on one line (118px → one row) */
  .tkx-colnote{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:4px 10px;}
  .tkx-colnote .tkc-hidden{display:none;}
  .tkx-colnote .tkc-toggle{margin:0;}
  .tkx-toolbar.tkx-tb2{gap:6px;}
  .tkx-toolbar.tkx-tb2 .tkx-tb-main{gap:6px;}
}

/* ══ v1.4.10.412 — THE NEW-TICKET FORM FITS THE SCREEN; THE DETAILS READ ACROSS ═══
   The form ran 1,221px tall at 1440x1000 and 1,437px on a phone: its title
   scrolled away and "Create ticket" sat two screens down. It now has the shape
   of the ticket and asset sheets — head and footer pinned by construction,
   the fields scrolling between them — and a validation message appears beside
   the button it is about. */
#modal-inner.modal-nt{display:flex;flex-direction:column;max-height:calc(100dvh - 72px);overflow:hidden;}
#modal-inner.modal-nt > .modal-head{flex-shrink:0;}
#modal-inner.modal-nt > .modal-body{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;}
#modal-inner.modal-nt > .nt-foot{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px 10px;padding:12px 20px;border-top:1px solid var(--line);background:var(--surface);border-radius:0 0 12px 12px;}
#modal-inner.modal-nt > .nt-foot #nt-error{flex:1 1 100%;color:var(--err);font-size:13px;line-height:1.4;}
#modal-inner.modal-nt > .nt-foot #nt-error:empty{display:none;}
@media (max-width:760px){
  #modal-inner.modal-nt{max-height:calc(100dvh - 24px);}
  #modal-inner.modal-nt > .nt-foot{padding:10px 14px calc(10px + env(safe-area-inset-bottom, 0px));}
  #modal-inner.modal-nt > .nt-foot .btn{flex:1 1 0;min-height:40px;justify-content:center;}   /* v1.4.10.473: the touch layer's one 40px floor (was 44, taller than every other form's footer) */
}
/* The Details tab: a label column and values beside it, read across — they sat
   at opposite edges of an 858px column, 700px apart. */
.tkd-details .tkd-dsec-b .ex-row{display:grid;grid-template-columns:minmax(120px,30%) minmax(0,1fr);align-items:baseline;gap:4px 16px;}
.tkd-details .tkd-dsec-b .ex-row .ex-k{text-transform:none;letter-spacing:0;font-size:12px;font-weight:500;color:var(--text-mute);}
.tkd-details .tkd-dsec-b .ex-row .ex-v{text-align:left;justify-self:start;min-width:0;overflow-wrap:anywhere;}
.tkd-details .tkd-dsec-h{text-transform:none;letter-spacing:0;font-size:13px;font-weight:600;color:var(--text);}
@media (max-width:560px){ .tkd-details .tkd-dsec-b .ex-row{grid-template-columns:minmax(92px,38%) minmax(0,1fr);gap:3px 12px;} }

/* ══════════ SITE STATISTICS v1.4.10.413 — who, where, and the visit as a story ══════════ */
.ss-tabs{flex-wrap:wrap;row-gap:6px;}
.ss-story{border:1px solid var(--line);border-left:4px solid var(--brand-blue);border-radius:var(--radius);background:var(--surface);padding:16px 20px;margin-bottom:18px;}
.ss-story p{margin:0;font-size:14px;line-height:1.7;color:var(--text-mute);max-width:980px;} .ss-story b{color:var(--text);font-weight:600;} .ss-story a{color:var(--brand-blue);}
.ss-kpis .ins-kpi{cursor:help;}
.ss-who{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0;} .ss-who b{font-weight:600;overflow-wrap:anywhere;}
.ss-net{font-size:11px;white-space:nowrap;}
.ss-mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;}
.ss-approx{font-size:11px;color:var(--text-dim);border-bottom:1px dotted var(--text-dim);cursor:help;}
.ss-warn-t{color:var(--warn);}
.ss-route{display:inline-flex;flex-wrap:wrap;align-items:center;gap:4px;}
.ss-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:12px;background:var(--surface-2);border:1px solid var(--line);font-size:12px;font-weight:500;line-height:1.5;max-width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}   /* v1.4.10.473: a quiet chip is 12/500 (was 12/400) */
.ss-chip em{font-style:normal;color:var(--text-dim);font-variant-numeric:tabular-nums;}
.ss-route-sep{display:inline-block;width:8px;height:8px;border-top:1.5px solid var(--text-dim);border-right:1.5px solid var(--text-dim);transform:rotate(45deg);margin:0 3px 0 0;opacity:.6;}
/* Latest visitors list */
.ss-people{display:flex;flex-direction:column;}
.ss-person{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,.9fr) minmax(0,1.3fr) auto;gap:12px;align-items:center;text-align:left;width:100%;padding:10px 4px;border:0;border-bottom:1px solid var(--line);background:transparent;color:var(--text);font:inherit;font-size:12px;cursor:pointer;}
.ss-person:last-child{border-bottom:0;} .ss-person:hover{background:var(--surface-2);} .ss-person:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
.ss-person-what{display:flex;flex-direction:column;gap:2px;min-width:0;}
/* Visitors tab */
.ss-vhead{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:-4px 0 10px;}
.ss-vsearch{margin-left:auto;align-items:stretch;}   /* v1.4.10.473: the Search button takes the box's height (32 beside 36px) */
.ss-vsearch input{font:inherit;font-size:13px;padding:7px 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);width:320px;max-width:100%;}
.ss-filters{margin:0 0 12px;}
.ss-sortbar{display:flex;align-items:center;gap:4px;flex-wrap:wrap;font-size:12px;color:var(--text-dim);padding:10px 14px 0;}
.ss-sorth{border:0;background:transparent;font:inherit;font-size:12px;font-weight:600;padding:3px 7px;border-radius:5px;}
.ss-vtbl tbody td{vertical-align:top;}
.ss-dt tbody tr[tabindex]:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
/* The visit */
.ss-jtitle{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;} .ss-jtitle-sub{font-weight:400;color:var(--text-mute);font-size:14px;}
.ss-jgrid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:6px;}
.ss-jcard{border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;background:var(--surface);}
.ss-jcard h4{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--text);}
.ss-kv{display:grid;grid-template-columns:118px minmax(0,1fr);gap:10px;padding:5px 0;font-size:12px;border-top:1px solid var(--line);} .ss-kv:first-of-type{border-top:0;}
.ss-kv>span{color:var(--text-dim);} .ss-kv>div{min-width:0;overflow-wrap:anywhere;} .ss-kv a{color:var(--brand-blue);font-size:12px;}
.ss-jhead{display:flex;align-items:center;justify-content:space-between;gap:10px;} .ss-jhead .ss-h4{margin:18px 0 8px;}
.ss-story-tl{list-style:none;margin:0;padding:0 0 0 4px;position:relative;}
.ss-story-tl::before{content:"";position:absolute;left:15px;top:8px;bottom:14px;width:2px;background:var(--line);}
.ss-st{position:relative;display:grid;grid-template-columns:24px minmax(0,1fr);gap:12px;padding:0 0 14px;}
.ss-st-n{position:relative;z-index:1;width:24px;height:24px;border-radius:50%;background:var(--brand-blue);color:#fff;font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;font-variant-numeric:tabular-nums;}
.ss-st-dot{position:relative;z-index:1;width:12px;height:12px;margin:6px 6px 0;border-radius:50%;background:var(--surface);border:2px solid var(--text-dim);}
.ss-st-end .ss-st-dot{border-color:var(--text-mute);background:var(--text-mute);} .ss-st-end.lead .ss-st-dot{border-color:var(--ok);background:var(--ok);}
.ss-st-body{min-width:0;font-size:13px;line-height:1.5;}
.ss-st:not(.ss-st-start):not(.ss-st-end) .ss-st-body{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);padding:10px 14px;}
.ss-st-head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;} .ss-st-head a{color:var(--text);text-decoration:none;} .ss-st-head a:hover b{color:var(--brand-blue);text-decoration:underline;}
.ss-st-time{margin-left:auto;color:var(--text-dim);font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap;}
.ss-st-start .ss-st-time{margin:0 0 2px;}
.ss-st-meta{font-size:12px;color:var(--text-dim);margin:2px 0 6px;}
.ss-read{display:flex;flex-wrap:wrap;align-items:center;gap:5px;margin:4px 0 6px;} .ss-read>span:first-child{font-size:12px;color:var(--text-dim);margin-right:2px;}
.ss-acts{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-direction:column;gap:4px;}
.ss-act{display:grid;grid-template-columns:18px minmax(0,1fr) auto;gap:8px;align-items:baseline;font-size:12px;}
.ss-act-i{display:inline-flex;justify-content:center;color:var(--text-dim);} .ss-act-i svg{width:13px;height:13px;vertical-align:-2px;}
.ss-act-t{font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;}
.ss-act-cta .ss-act-i,.ss-act-form .ss-act-i{color:var(--brand-blue);} .ss-act-lead{color:var(--ok);font-weight:600;} .ss-act-lead .ss-act-i{color:var(--ok);}
.ss-act-bad{color:var(--err);} .ss-act-bad .ss-act-i{color:var(--err);} .ss-act-out .ss-act-i{color:var(--warn);}
.ss-next{font-size:11px;color:var(--ok);white-space:nowrap;}
.ss-raw{margin:0 0 14px;max-height:340px;overflow:auto;border:1px solid var(--line);border-radius:var(--radius);}
.ss-help{margin:14px 0 18px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);padding:0 14px;font-size:12px;}
.ss-help summary{cursor:pointer;padding:11px 0;font-weight:600;color:var(--text-mute);min-height:20px;}
.ss-help dl{display:grid;grid-template-columns:140px minmax(0,1fr);gap:6px 14px;margin:0 0 12px;max-width:900px;} .ss-help dt{font-weight:600;} .ss-help dd{margin:0;color:var(--text-mute);line-height:1.55;}
.ss-kvs{padding-bottom:10px;} .ss-ua{word-break:break-all;}
.ss-back{margin-bottom:6px;}
.ss-check{display:flex;align-items:flex-start;gap:8px;font-size:13px;margin-bottom:4px;text-transform:none;letter-spacing:0;font-weight:400;color:var(--text);} .ss-check input{margin-top:3px;}
.ss-pickpage{font-size:12px;font-weight:500;color:var(--text-dim);} .ss-pickpage select{font:inherit;font-size:13px;font-weight:400;padding:5px 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);max-width:320px;}
/* Journeys flow */
.ssf-wrap{overflow-x:auto;} .ssf{width:100%;min-width:760px;height:auto;display:block;}
.ssf-band{opacity:.26;transition:opacity .12s;} .ssf-band:hover{opacity:.55;}
.ssf-tail{fill:var(--err);opacity:.22;} .ssf-tail:hover{opacity:.45;}
.ssf-lab{font-size:12px;fill:var(--text);cursor:pointer;font-family:var(--font-body);paint-order:stroke;stroke:var(--surface);stroke-width:4px;stroke-linejoin:round;} .ssf-lab:hover{fill:var(--brand-blue);} .ssf-n{fill:var(--text-dim);font-size:11px;}
.ssf-head{font-size:11px;fill:var(--text-dim);font-weight:600;}
@media (prefers-reduced-motion:reduce){ .ssf-band,.ssf-tail{transition:none;} }
@media (max-width:900px){ .ss-jgrid{grid-template-columns:1fr;} .ss-person{grid-template-columns:minmax(0,1fr) minmax(0,1fr);} .ss-person-what{grid-column:1/-1;} .ss-help dl{grid-template-columns:1fr;} .ss-help dd{margin-bottom:6px;} }
@media (max-width:760px){ .ss-vsearch{margin-left:0;width:100%;} .ss-vsearch input{flex:1 1 100%;width:auto;}   /* v1.4.10.473: the box takes the line, its buttons below (the placeholder was cut at 256px) */ .ss-kv{grid-template-columns:96px minmax(0,1fr);} .ss-st-time{margin-left:0;width:100%;} .ss-story{padding:14px;} .ss-story p{font-size:13px;} }
@media (max-width:760px){
  .ss-tabs{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;padding-bottom:2px;} .ss-tabs::-webkit-scrollbar{display:none;}
  .ss-tabs>*{flex:0 0 auto;} .ss-tabs>div[style*="flex:1"]{display:none;}
  .ss-rangebar .ss-custom{margin-left:0;width:100%;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr) auto;} .ss-rangebar .ss-custom input{min-width:0;width:100%;}
  .ss-rangebar .ss-custom:has(> input[type=search]){display:flex;}   /* v1.4.10.473: the date grid is for From / to / To / Apply; a search box keeps its own line (it got half of it, 118px) */
  #sec-log-body .ss-custom > input[type=search]{flex:1 1 0;} #sec-log-body .ss-rangebar > .mini-select{flex:1 1 100%;}   /* v1.4.10.473: Settings > Security sign-in log: the box keeps its Search button beside it (its placeholder fits) and each filter takes the line (were 326 / 59 / 161 / 213px, four ragged widths) */
}
@media (min-width:761px){ #sec-log-body .ss-rangebar > .mini-select, #sec-log-body .ss-custom > input[type=search], #sec-log-body .ss-custom > .btn{height:36px;box-sizing:border-box;} }   /* v1.4.10.473: the sign-in log's search box and Search button (32px) and its two filters (37px) share one row and one height */

/* ══ CLIENT STATISTICS v1.4.10.414 — movement against the previous period, the portfolio's search and filters ══ */
.rxr-kpi .d{display:flex;align-items:center;gap:5px;margin-top:6px;font-size:11px;font-weight:600;color:#8FA6C4;line-height:1.3;}
.rxr-kpi .d svg{width:13px;height:13px;flex:0 0 auto;}
.rxr-kpi .d.tone-good{color:#5EE3A1;} .rxr-kpi .d.tone-bad{color:#FF9A8F;}
.cs-tools{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px;}
.cs-tools .cs-q{flex:1 1 220px;max-width:340px;min-height:36px;padding:7px 12px;border:1px solid var(--line);border-radius:8px;font:inherit;font-size:13px;background:var(--surface,#fff);color:var(--text);}
.cs-tools .cs-q:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow,rgba(var(--bc-accent-rgb),.12));}
.cs-tools label.cs-att{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--text-mute);cursor:pointer;min-height:36px;user-select:none;}
.cs-tools .rxr-sel{height:36px;}   /* v1.4.10.473: the integrator picker is as tall as the search and the checkbox beside it (was 32 in a 36px row) */
.cs-tools label.cs-att input{width:auto;padding:0;margin:0;}
.cs-ptable-meta{font-size:12px;color:var(--text-mute);margin:0 0 6px;}
.cs-dchip{display:inline-flex;align-items:center;gap:3px;font-size:11px;font-weight:600;color:var(--text-mute);margin-left:6px;vertical-align:middle;}
.cs-dchip svg{width:12px;height:12px;}
.cs-dchip.tone-good{color:#15803D;} .cs-dchip.tone-bad{color:#B91C1C;}
@media (max-width:700px){ .cs-tools .cs-q{max-width:none;flex-basis:100%;min-height:42px;font-size:16px;} .cs-tools select{min-height:42px;} .cs-tools label.cs-att{min-height:42px;} }
/* v1.4.10.473: one height for the row on a phone — the touch rule's min-height:40 outranks the 42 above on the field and
   the picker, so they measured 41 / 40 beside the 42px checkbox */
@media (max-width:700px){ .cs-tools .cs-q,.cs-tools .rxr-sel,.cs-tools label.cs-att{height:42px;} }

/* ══ TABLES v1.4.10.415 — every figure lines up ══
   Report tables (all reports): the foot row takes the body's padding (it sat flush left, "81.0Healthy"); a long-text
   column may wrap instead of being cut off at 320px. Client Statistics portfolio: each composite column is a grid with
   the same slot widths in every row, the client column stays put while the wide table scrolls. */
.rxr-dt tfoot td{padding:13px 18px;}
.rxr-dt th.w,.rxr-dt td.w{white-space:normal;min-width:260px;max-width:none;overflow:visible;text-overflow:clip;}
.rxr-dt td.w{line-height:1.45;}
.cs-table .n{font-variant-numeric:tabular-nums;}
.cs-table .mute{color:var(--text-mute);}
.cs-slots{display:inline-grid;grid-auto-flow:column;align-items:center;column-gap:6px;vertical-align:middle;white-space:nowrap;}
.cs-slots>*{text-align:right;min-width:0;}
.cs-slots .sep{color:var(--text-dim);text-align:center;}
.cs-slots .fl{display:flex;align-items:center;justify-content:flex-start;}
.cs-slots .cs-dchip{margin-left:0;}
.cs-g-h{grid-template-columns:24px 26px 56px;}
.cs-g-h b.n{font-size:13px;font-weight:700;}
.cs-g-sr{grid-template-columns:24px 8px 36px;}   .cs-g-sr.x{grid-template-columns:24px 8px 36px 40px;}
.cs-g-as{grid-template-columns:48px;}            .cs-g-as.x{grid-template-columns:48px 54px;}
.cs-g-on{grid-template-columns:52px 70px;}       .cs-g-on.x{grid-template-columns:52px 70px 10px;}
.cs-g-oc{grid-template-columns:36px 8px 36px;}   .cs-g-oc.x{grid-template-columns:36px 8px 36px 62px;}
.cs-g-op{grid-template-columns:30px;}            .cs-g-op.x{grid-template-columns:30px 58px;}
.cs-g-mt{grid-template-columns:94px;}            .cs-g-mt .fl{justify-content:flex-end;}
.cs-g-pp{grid-template-columns:32px 8px 32px;}
.cs-g-pk{grid-template-columns:30px;}            .cs-g-pk.x{grid-template-columns:30px 40px;} .cs-g-pk .fl{justify-content:flex-start;}
.cs-bar{display:inline-block;width:56px;height:6px;border-radius:999px;background:#EEF2F7;overflow:hidden;}
.cs-bar em{display:block;height:100%;border-radius:999px;}
.cs-pct{display:inline-block;min-width:52px;box-sizing:border-box;padding:2px 6px;border-radius:6px;font-size:11px;font-weight:600;text-align:center;font-variant-numeric:tabular-nums;background:#EEF2F7;color:#46596B;}   /* v1.4.10.473: status pill 11/600, like .cs-tag beside it (was 12/700) */
.cs-pct.tone-ok{background:#DCFCE7;color:#166534;} .cs-pct.tone-warn{background:#FEF3C7;color:#92400E;} .cs-pct.tone-err{background:#FEE2E2;color:#991B1B;} .cs-pct.tone-muted{background:transparent;color:var(--text-dim);}
.cs-tag{display:inline-flex;align-items:center;gap:3px;padding:1px 6px;border-radius:5px;font-size:11px;font-weight:600;white-space:nowrap;line-height:1.5;}
.cs-tag svg{width:11px;height:11px;}
.cs-tag.warn{background:#FEF3C7;color:#92400E;} .cs-tag.purple{background:#EDE9FE;color:#5B21B6;}
/* v1.4.10.417 — Monthly client reports */
.cs-tag.ok{background:#DCFCE7;color:#166534;} .cs-tag.mute{background:#EEF2F6;color:#475569;}
.cs-mr-status{min-height:20px;margin:4px 2px 10px;font-size:13px;color:var(--ink2, #46596B);}
.cs-mr-table td,.cs-mr-table th{vertical-align:middle;}
.cs-mr-act{white-space:nowrap;} .cs-mr-act .btn + .btn{margin-left:6px;}
/* v1.4.10.489: on a phone each client is a card: its name, then each figure named (the cell's data-label), then PDF and
   Email side by side. The table was 1,066px on a 390px phone, outside any scroller: the page scrolled sideways, a client's
   name broke letter by letter and the buttons were off screen. */
@media (max-width:640px){
  .cs-mr-table, .cs-mr-table tbody, .cs-mr-table tr, .cs-mr-table td{display:block;width:100%;}
  table.data-table.cs-mr-table{min-width:0;}   /* the phone floor every data table keeps (430px) is for one scrolled sideways */
  .cs-mr-table thead{display:none;}
  .cs-mr-table tr{margin:0 0 10px;padding:10px 12px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);}
  .cs-mr-table td{display:flex;align-items:center;justify-content:flex-end;gap:6px;padding:4px 0;border:0;text-align:right;}
  .cs-mr-table td[data-label]::before{content:attr(data-label);flex:0 0 auto;margin-right:auto;padding-right:12px;font-size:12px;color:var(--text-mute);text-align:left;}
  .cs-mr-table td:first-child{display:block;text-align:left;padding:0 0 6px;margin-bottom:4px;border-bottom:1px solid var(--line);font-weight:600;}
  .cs-mr-table td:first-child::before{content:none;}
  .cs-mr-table td.cs-mr-act{display:flex;justify-content:stretch;gap:8px;padding-top:8px;white-space:normal;}
  .cs-mr-table td.cs-mr-act .btn{flex:1 1 0;justify-content:center;margin:0;}
}
/* …and between a phone and a laptop the table scrolls inside its panel, as a .panel-body's does (the safety net below) */
@media (max-width:760px){ .cs-table-panel:has(table.data-table){overflow-x:auto;-webkit-overflow-scrolling:touch;} }
.cs-mr-sub{font-size:12px;color:var(--ink3, #75899B);font-weight:400;}
.cs-mr-modal{display:flex;flex-direction:column;gap:10px;}
.cs-mr-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ink2, #46596B);margin-top:4px;}
.cs-mr-to{max-height:260px;overflow:auto;border:1px solid var(--line);border-radius:10px;padding:2px 12px;}
.cs-mr-to label,.cs-mr-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid var(--line);}
.cs-mr-to label:last-child,.cs-mr-row:last-child{border-bottom:0;}
.cs-mr-to label span{display:flex;flex-direction:column;line-height:1.35;} .cs-mr-to label i{font-style:normal;font-size:12px;color:var(--ink3, #75899B);}
.cs-mr-row{justify-content:space-between;}
.cs-mr-copy{display:flex;align-items:center;gap:8px;font-size:13px;}
.cs-mr-note{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:10px;padding:10px 12px;resize:vertical;}
/* v1.4.10.418 — the month in summary */
.cs-sum-list{margin:2px 0 16px;padding-left:20px;} .cs-sum-list li{margin:0 0 6px;line-height:1.55;}
/* v1.4.10.489: the monthly report's analysis (csInsightsHtml): the verdict, what went well beside what needs attention,
   what drove the numbers, the numbered recommendations and what is coming. One column on a phone. */
.cs-insights{display:flex;flex-direction:column;gap:14px;margin:0 0 18px;}
.cs-verdict{position:relative;padding:16px 18px 16px 22px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);overflow:hidden;}
.cs-verdict::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--accent);}
.cs-verdict.tone-ok::before{background:var(--ok);} .cs-verdict.tone-warn::before{background:var(--warn);} .cs-verdict.tone-err::before{background:var(--err);}
.cs-verdict-w{font-size:16px;font-weight:600;margin:0 0 6px;color:var(--accent);}
.cs-verdict.tone-ok .cs-verdict-w{color:var(--ok);} .cs-verdict.tone-warn .cs-verdict-w{color:var(--warn);} .cs-verdict.tone-err .cs-verdict-w{color:var(--err);}
.cs-verdict p{margin:0;font-size:14px;line-height:1.6;color:var(--text);}
.cs-ins-pair{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
.cs-ins{padding:14px 16px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);min-width:0;}
.cs-ins h4{margin:0 0 10px;font-size:15px;font-weight:600;}
.cs-ins-list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:9px;counter-reset:csrec;}
.cs-ins-list li{position:relative;padding-left:18px;font-size:13px;line-height:1.55;color:var(--text);}
.cs-ins-list li::before{content:'';position:absolute;left:2px;top:7px;width:7px;height:7px;border-radius:50%;background:var(--accent);}
.cs-ins-list li.tone-ok::before{background:var(--ok);} .cs-ins-list li.tone-warn::before{background:var(--warn);} .cs-ins-list li.tone-err::before{background:var(--err);}
.cs-ins-list li b{display:block;font-weight:600;margin-bottom:2px;}
.cs-ins-list li span{display:block;color:var(--text);}
.cs-ins-list li b + span{color:var(--text-mute);}
/* v1.4.10.538: the AVDesk glyph that leads an item (csGly) stands where the dot was; the verdict's sits before its word */
.cs-ins-list li.has-gly{padding-left:24px;} .cs-ins-list li.has-gly::before{content:none;}
.cs-gly{position:absolute;left:0;top:2px;display:inline-flex;font-size:15px;line-height:1;color:var(--accent);}
.cs-ins-list li.tone-ok .cs-gly{color:var(--ok);} .cs-ins-list li.tone-warn .cs-gly{color:var(--warn);} .cs-ins-list li.tone-err .cs-gly{color:var(--err);} .cs-ins-list li.tone-purple .cs-gly{color:var(--brand-purple);}
.cs-verdict-w{display:flex;align-items:center;gap:8px;} .cs-verdict-w .cs-gly{position:static;font-size:18px;color:inherit;}
.rxr-sec-ic{display:inline-flex;align-items:center;font-size:18px;line-height:1;color:var(--accent);} .rxr-nav-i .rxr-sec-ic{font-size:15px;margin:0 -2px;}
.cs-ins.recs .cs-ins-list li{padding-left:34px;min-height:24px;counter-increment:csrec;}
.cs-ins.recs .cs-ins-list li::before{content:counter(csrec);left:0;top:1px;width:22px;height:22px;border-radius:50%;color:#fff;font-size:11px;font-weight:700;line-height:22px;text-align:center;}
@media (max-width:760px){ .cs-ins-pair{grid-template-columns:1fr;} .cs-verdict{padding:14px 14px 14px 18px;} .cs-ins{padding:12px 14px;} }
.cs-dot{display:inline-block;width:8px;height:8px;border-radius:50%;}
.cs-dot.err{background:#DC2626;box-shadow:0 0 0 3px rgba(220,38,38,.16);}
.cs-twrap{position:relative;}
.cs-table th:first-child,.cs-table td.cs-first{position:sticky;left:0;z-index:1;background:var(--surface,#fff);box-shadow:inset -1px 0 0 var(--line,#E5E7EB);}
.cs-table thead th:first-child{z-index:2;}
.cs-table tbody tr.rxr-click:hover td{background:var(--accent-soft,#F1F5FF);}
.cs-bar.none{background:transparent;}
@media (max-width:700px){ .cs-table th:first-child,.cs-table td.cs-first{max-width:170px;} .cs-cname{min-width:0;} .cs-cname .cust-u-n,.cs-cname .device-meta{overflow:hidden;text-overflow:ellipsis;max-width:118px;display:block;} }
@media (max-width:700px){ .rxr-dt th.w,.rxr-dt td.w{min-width:190px;} }
/* ═══ v1.4.10.422 — the support ticket's action bar on an iPhone ═══════════════
   Jay: "the 3 buttons in a support ticket on the iOS app don't do anything".
   On a phone the bar is three icon buttons (tick · Reply · ⋯) around two selects.
   · ⋯ — its menu is placed by avPopFix (js/06 tktMoreToggle); nothing to add here.
   · tick — the Acknowledge button is amber again, as v211 designed it: the brand
     restyle's `.btn.primary` (two classes) outranked `.tkd-ackbtn` (one), so it
     became a second blue square beside Reply — two identical icons side by side.
   · the tick once acknowledged is a <button> (it shows who and when on a tap), so it
     sheds the browser's button face and keeps the pill's. */
.btn.primary.tkd-ackbtn{background:#FFF4DC;border:1px solid #E8A93C;color:#8A5B00;box-shadow:none;filter:none;}
.btn.primary.tkd-ackbtn:hover{background:#FFE9BC;box-shadow:none;filter:none;transform:none;}
button.tkd-ackdone{-webkit-appearance:none;appearance:none;border:0;font-family:inherit;cursor:pointer;}
/* ═══ v1.4.10.422 — a phone held sideways: the ticket and asset modals ═════════
   Both pin their head and scroll only the body, inside a panel capped to the
   screen (v201 asset, v203 ticket). MEASURED on an iPhone held sideways
   (844x390): the ticket's cap is 294px and its head alone is 392px — half the
   action bar was cut off and the conversation had NO height at all (932x430:
   56px; the asset modal: 97px of tabs under a 219px head). Where the screen is
   that short the head scrolls away with everything else: the panel is ONE
   scroller, capped to the screen. The asset tabs take the phone's horizontal
   strip (the 226px rail was taller than the screen), the ticket's fact chips go
   (the phone head budget — the facts are in the cards), and the backdrop stops
   spending 60px of a 390px screen above the panel and keeps it off the notch. */
@media (max-height:500px){
  .modal-back{padding-top:8px;padding-bottom:max(8px,env(safe-area-inset-bottom));
    padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right));}
  #modal-inner.modal-tkt,#modal-inner.modal-asset{display:block;overflow-y:auto;overscroll-behavior:contain;
    max-height:calc(100dvh - 16px);}
  #modal-inner.modal-tkt .tkd-main,#modal-inner.modal-tkt .tkd-side{overflow-y:visible;}
  #modal-inner.modal-tkt .tkd-hero-chips{display:none;}
  #modal-inner.modal-asset .adt-body{flex-direction:column;}
  #modal-inner.modal-asset .adt-tabs{flex-direction:row;width:auto;align-self:auto;border-right:0;
    border-bottom:1px solid var(--line);overflow-x:auto;overflow-y:hidden;padding:8px 10px;gap:6px;}
  #modal-inner.modal-asset .adt-railgroup{display:none;}
  #modal-inner.modal-asset .adt-tab{width:auto;flex-shrink:0;padding:9px 12px;font-size:13px;}   /* v1.4.10.473: tab 13/600 (was 12) */
  #modal-inner.modal-asset .adt-tab.active::before{display:none;}
  #modal-inner.modal-asset .adt-panes{overflow-y:visible;padding:16px;}
}

/* ══════════════════════════════════════════════════════════════════════════
   BILLING & ROOM PACKS (v1.4.10.425)

   One look for the whole billing area, on the brand tokens: figure tiles with a
   stacked bar (in use · spare on clients · in the pool — the same three colours
   everywhere a pack is counted), attention rows with the action beside them,
   the Room Packs client table with its Give control and room drill-down (a card
   per client on a phone), the Buy form, Accounts cards, the client's own pack
   card and the add-room pack line. Everything is a class — the screens carry
   no layout inline styles of their own.
   ══════════════════════════════════════════════════════════════════════════ */
.bl-pane [hidden]{display:none !important;}
.bl-pane{--bl-use:var(--brand-blue,var(--bc-accent));--bl-spare:var(--ok,#16A34A);--bl-pool:var(--brand-purple,var(--bc-purple));}
.bl-ent,.bl-dash,.bl-ent-strip,.bl-packline,#bl-dash-card,.cust-panel{--bl-use:var(--brand-blue,var(--bc-accent));--bl-spare:var(--ok,#16A34A);--bl-pool:var(--brand-purple,var(--bc-purple));}
.bl-mute{color:var(--text-mute);}
.bl-okc{color:var(--ok);}
.bl-link{color:var(--brand-blue);font-weight:600;text-decoration:none;}
.bl-link:hover{text-decoration:underline;}
.bl-link.warn{color:var(--warn);}
.bl-save{font-size:11px;font-weight:600;color:var(--ok);}
.bl-unit{display:inline-block;white-space:pre;font-size:12px;font-weight:500;color:var(--text-mute);}   /* v1.4.10.473: "incl. GST" moves to the next line as one unit (on a phone it broke over two lines inside the figure's line box); white-space:pre keeps the span's leading space, which an inline-block otherwise drops ("$5,364.04incl. GST") */
.bl-row-acts{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:10px;}
.bl-quote{margin-top:6px;padding:6px 10px;border-left:3px solid var(--line-2);color:var(--text);font-size:12px;line-height:1.5;background:var(--surface-2);border-radius:0 var(--r-ctl,4px) var(--r-ctl,4px) 0;}
.bl-lead{font-size:13px;line-height:1.6;margin:0 0 12px;color:var(--text);}
.bl-scope-note{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--text-mute);margin:-8px 0 16px;}

/* tabs with a count */
.bl-tabs .set-tab{position:relative;}
.bl-tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:19px;height:19px;padding:0 6px;border-radius:999px;font-size:10px;font-weight:700;line-height:1;text-transform:uppercase;letter-spacing:.04em;background:var(--warn);color:#fff;}   /* v1.4.10.473: a count badge, the badge look 10/700 uppercase .04em (was untracked) */
.bl-tab-badge.blue{background:var(--brand-blue);}
.bl-count{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:20px;padding:0 7px;margin-left:6px;border-radius:999px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;vertical-align:2px;background:var(--surface-3);color:var(--text-mute);}   /* v1.4.10.473: a count badge, 10/700 uppercase .04em (was untracked) */
.bl-count.blue{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);}
.bl-count.warn{background:rgba(217,119,6,.13);color:var(--warn);}

/* figure tiles */
.bl-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px;}
.bl-tiles-top{margin-bottom:18px;}
.bl-tile{min-width:0;padding:14px 16px 13px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);display:flex;flex-direction:column;gap:4px;}
.bl-tile-l{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim,var(--text-mute));}
.bl-tile-l svg{flex:0 0 auto;color:var(--brand-blue);}
.bl-tile-v{font-size:30px;font-weight:700;line-height:1.15;letter-spacing:-.03em;font-variant-numeric:tabular-nums;color:var(--text);}   /* v1.4.10.473: a KPI value, 30/700 -.03em like the Room Pack stock figure beside it (was 24/700 -.02em) */
.bl-tile-v a{color:inherit;text-decoration:none;border-bottom:1px dashed var(--line-2);}
.bl-tile-v a:hover{border-bottom-color:var(--brand-blue);}
.bl-tile-s{font-size:12px;line-height:1.55;color:var(--text-mute);}
.bl-tile.ok .bl-tile-v{color:var(--ok);}
.bl-tile.warn .bl-tile-v{color:var(--warn);}
.bl-tile.err .bl-tile-v{color:var(--err);}
.bl-tile.warn{border-color:rgba(217,119,6,.35);}
.bl-tile.err{border-color:rgba(220,38,38,.35);}
.bl-tile-packs .bl-meter{margin:4px 0 2px;}
.bl-dotline{display:inline-flex;align-items:center;gap:5px;margin-right:10px;white-space:nowrap;}
.bl-dotline i,.bl-legend i{display:inline-block;width:8px;height:8px;border-radius:2px;flex:0 0 auto;}
.bl-dotline i.use,.bl-legend i.use{background:var(--bl-use);}
.bl-dotline i.spare,.bl-legend i.spare{background:var(--bl-spare);}
.bl-dotline i.pool,.bl-legend i.pool{background:var(--bl-pool);}

/* the stacked bar */
.bl-meter{display:flex;height:10px;border-radius:999px;overflow:hidden;background:var(--surface-3);gap:2px;}
.bl-meter.empty{background:repeating-linear-gradient(90deg,var(--surface-3) 0 6px,var(--surface-2) 6px 12px);padding:0;}
/* v1.4.10.473: "empty" is the meter's state (nothing to show yet), not the app's empty-state panel — that rule's 44/40
   padding and brand tile reached it too, so an empty 10px meter measured 84px tall */
div.bl-meter.empty::before,div.bl-meter.empty::after{content:none;display:none;}
.bl-meter span{display:block;height:100%;min-width:3px;}
.bl-meter span.use{background:var(--bl-use);}
.bl-meter span.spare{background:var(--bl-spare);}
.bl-meter span.pool{background:var(--bl-pool);}
.bl-legend{display:flex;flex-wrap:wrap;gap:6px 16px;margin-top:9px;font-size:11px;color:var(--text-mute);}
.bl-legend span{display:inline-flex;align-items:center;gap:6px;}
.bl-legend b{color:var(--text);font-variant-numeric:tabular-nums;}

/* subscription hero */
.bl-hero .panel-body{display:flex;flex-direction:column;gap:14px;}
.bl-pay{display:flex;gap:14px;align-items:center;flex-wrap:wrap;padding:14px 16px;border-radius:var(--radius);border:1px solid var(--line);border-left:4px solid var(--ok);background:var(--surface-2);}
.bl-pay.warn{border-left-color:var(--warn);background:rgba(217,119,6,.06);}
.bl-pay.err{border-left-color:var(--err);background:rgba(220,38,38,.05);}
.bl-pay-main{flex:1 1 320px;min-width:0;}
.bl-pay-h{font-size:15px;font-weight:600;letter-spacing:-.012em;display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.bl-pay-sub{font-size:12px;color:var(--text-mute);margin-top:4px;line-height:1.65;}
.bl-pay-acts{display:flex;gap:8px;flex-wrap:wrap;}
.bl-mailto{display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:12px 14px;border:1px dashed var(--line-2);border-radius:var(--radius);}
.bl-mailto-main{flex:1 1 300px;min-width:0;font-size:13px;line-height:1.5;}
.bl-mailto-form{display:flex;gap:6px;align-items:center;flex:0 1 380px;min-width:0;}
.bl-mailto-form input{flex:1 1 auto;min-width:0;padding:8px 12px;border:1px solid var(--line);border-radius:6px;font:inherit;font-size:13px;background:var(--surface);color:var(--text);}
.bl-mailto-form input:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.bl-foot{font-size:12px;line-height:1.6;color:var(--text-mute);}

/* attention rows */
.bl-attn-list{display:flex;flex-direction:column;}
.bl-attn-row{display:flex;gap:14px;align-items:center;padding:13px 20px;border-bottom:1px solid var(--line);}
.bl-attn-row:last-child{border-bottom:0;}
.bl-attn-ico{flex:0 0 36px;height:36px;border-radius:var(--radius);display:flex;align-items:center;justify-content:center;background:var(--surface-2);color:var(--text-mute);}
.bl-attn-row.blue .bl-attn-ico{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);}
.bl-attn-row.warn .bl-attn-ico{background:rgba(217,119,6,.12);color:var(--warn);}
.bl-attn-main{flex:1 1 auto;min-width:0;font-size:13px;line-height:1.45;}
.bl-attn-main .bl-give-hint{margin-top:6px;}
.bl-attn-acts{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;flex:0 0 auto;}

/* invoices strip */
.bl-inv-strip{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px;}
.bl-inv-chip{display:flex;flex-direction:column;gap:3px;text-align:left;padding:11px 14px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);cursor:pointer;font:inherit;color:inherit;transition:border-color .14s,box-shadow .14s;}
.bl-inv-chip:hover{border-color:var(--brand-blue);box-shadow:var(--shadow-sm);}
.bl-inv-chip-p{font-size:12px;color:var(--text-mute);}
.bl-inv-chip-v{font-size:20px;font-weight:600;letter-spacing:-.02em;display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-variant-numeric:tabular-nums;}
.bl-inv-chip-n{font-size:11px;color:var(--text-dim,var(--text-mute));}

/* tables */
.bl-pane .dt th.num,.bl-pane .dt td.num{text-align:right;font-variant-numeric:tabular-nums;}
.bl-glance td.bl-glance-meter{min-width:150px;}
.bl-glance .bl-meter{height:8px;}

/* Room Pack stock */
.bl-stock-row{display:flex;gap:22px;align-items:center;flex-wrap:wrap;}
.bl-stock-total{flex:0 0 auto;min-width:120px;}
.bl-big{font-size:30px;font-weight:700;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums;}
.bl-lbl{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim,var(--text-mute));margin-top:5px;}
.bl-stock-meter{flex:1 1 320px;min-width:0;}
.bl-stock-meter .bl-meter{height:14px;}
.bl-stock-pools{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;}
.bl-stock-side{flex:0 0 auto;}

/* waiting rooms · room lists */
.bl-wait-group + .bl-wait-group{margin-top:14px;padding-top:14px;border-top:1px solid var(--line);}
.bl-wait-h{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:8px;font-size:13px;}   /* v1.4.10.473: a group heading inside the card, 13 (inherited the page's 14) */
.bl-wait-h .btn{margin-left:auto;}
.bl-rlist{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:8px;}
.bl-room{display:flex;gap:10px;align-items:center;padding:9px 10px 9px 12px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);min-width:0;}
.bl-room-dot{flex:0 0 9px;height:9px;border-radius:50%;background:var(--bl-use);}
.bl-room.blocked{border-color:rgba(217,119,6,.4);background:rgba(217,119,6,.05);}
.bl-room.blocked .bl-room-dot{background:var(--warn);}
.bl-room.unlicensed .bl-room-dot{background:var(--line-2);}
.bl-room-main{flex:1 1 auto;min-width:0;}
.bl-room-n{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bl-room-main .device-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bl-room-act{flex:0 0 auto;}

/* set-up */
.bl-nc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;}

/* the clients table */
.bl-toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:12px 20px;border-bottom:1px solid var(--line);background:var(--surface-2);}
.bl-search{display:flex;align-items:center;gap:8px;flex:1 1 240px;max-width:360px;padding:0 12px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text-mute);}
.bl-search:focus-within{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.bl-search input{flex:1 1 auto;min-width:0;border:0;background:transparent;padding:9px 0;font:inherit;font-size:13px;color:var(--text);outline:none;box-shadow:none;}
.bl-search.sm{flex:0 1 220px;padding:0 10px;}
.bl-search.sm input{padding:6px 0;font-size:13px;}
.bl-chips{display:flex;gap:6px;flex-wrap:wrap;align-items:center;}
.bl-chip{display:inline-flex;align-items:center;gap:7px;padding:6px 11px;border:1px solid var(--line-2);border-radius:999px;background:var(--surface);color:var(--text);font:inherit;font-size:12px;font-weight:500;cursor:pointer;line-height:1.2;transition:background .12s,border-color .12s,color .12s;}
.bl-chip:hover{border-color:var(--brand-blue);}
.bl-chip span{font-size:11px;font-weight:600;color:var(--text-mute);font-variant-numeric:tabular-nums;}   /* v1.4.10.473: the count in a chip at the chip's own emphasis, 600 (was 700) */
.bl-chip.on{background:var(--brand-blue);border-color:var(--brand-blue);color:#fff;}
.bl-chip.on span{color:rgba(255,255,255,.8);}
.bl-ctable tbody td{vertical-align:top;}
.bl-ctable tr.bl-crow:hover > td{background:var(--surface-2);}
.bl-ctable tr.bl-crow.open > td{background:var(--accent-soft,var(--bc-accent-soft));border-bottom-color:transparent;}
.bl-ctable tr.bl-flash > td{animation:blFlash 1.8s ease-out;}
@keyframes blFlash{0%,30%{background:rgba(var(--bc-grad-a-rgb),.18);}100%{background:transparent;}}
.bl-c-top{display:flex;gap:8px;align-items:flex-start;}
.bl-caret{flex:0 0 26px;width:26px;height:26px;margin-top:-2px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text-mute);cursor:pointer;transition:transform .15s,color .15s,border-color .15s;}
.bl-caret:hover{color:var(--brand-blue);border-color:var(--brand-blue);}
.bl-crow.open .bl-caret,.bl-acct[open] > summary .bl-caret{transform:rotate(90deg);color:var(--brand-blue);}
.bl-c-id{min-width:0;}
.bl-c-link{font-weight:700;font-size:13px;color:var(--text);text-decoration:none;}   /* v1.4.10.473: 13, the size of every bold name in a billing table (was 14) */
.bl-c-link:hover{color:var(--brand-blue);}
.bl-c-badges{display:flex;gap:4px;flex-wrap:wrap;margin-top:5px;}
.bl-finish{margin-top:6px;}
.bl-c-sites .bl-tag{margin:0 2px 4px 0;}
.bl-c-siteacts{display:flex;gap:4px;flex-wrap:wrap;margin-top:4px;}
.bl-c-give{min-width:200px;}
.bl-give{display:flex;gap:6px;align-items:stretch;}
.bl-stepper{display:inline-flex;align-items:stretch;border:1px solid var(--line-2);border-radius:6px;overflow:hidden;background:var(--surface);}
.bl-stepper .btn{border:0;border-radius:0;box-shadow:none;min-width:30px;justify-content:center;}   /* v1.4.10.473: − / + in the .btn.xs look, 11/500 (were 14/700, a size no button has) */
.bl-stepper input{width:46px;border:0;border-left:1px solid var(--line);border-right:1px solid var(--line);text-align:center;font:inherit;font-weight:400;font-size:13px;color:var(--text);background:transparent;padding:0 2px;}
.bl-stepper input:focus{outline:none;background:var(--accent-soft,var(--bc-accent-soft));}
.bl-give-hint{font-size:12px;line-height:1.45;color:var(--text-mute);margin-top:6px;max-width:260px;}
.bl-give-hint svg{margin-right:2px;}
.bl-takeback{margin-top:6px;}
.bl-addon-cell > div .btn{margin-top:4px;}

/* a client, opened */
.bl-ctable tr.bl-cdetail > td{padding:0 18px 18px;background:var(--accent-soft,var(--bc-accent-soft));}
.bl-cd{display:grid;grid-template-columns:minmax(260px,320px) minmax(0,1fr);gap:14px;align-items:start;}
.bl-cd-side{display:flex;flex-direction:column;gap:10px;min-width:0;}
.bl-cd-card{padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);font-size:13px;line-height:1.5;}
.bl-cd-card.blue{border-color:rgba(var(--bc-grad-a-rgb),.35);}
.bl-cd-card .bl-meter{margin:4px 0 8px;height:8px;}
.bl-cd-h{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim,var(--text-mute));margin-bottom:6px;}
.bl-cd-kv{display:flex;justify-content:space-between;gap:8px;padding:3px 0;font-variant-numeric:tabular-nums;}
.bl-cd-kv span{color:var(--text-mute);display:inline-flex;align-items:center;gap:4px;}
.bl-cd-rooms{min-width:0;padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);}
.bl-rooms-head{display:flex;gap:10px;align-items:center;justify-content:space-between;flex-wrap:wrap;margin-bottom:10px;font-size:13px;}
.bl-rooms-empty{padding:18px 4px;font-size:13px;color:var(--text-mute);}
.bl-rooms-empty.err{color:var(--err);}
.bl-rsite + .bl-rsite{margin-top:12px;}
.bl-rsite-h{display:flex;align-items:center;gap:6px;font-size:13px;margin-bottom:6px;color:var(--text);}
.bl-rsite-h svg{color:var(--text-mute);}
/* v1.4.10.489: on a phone the site's header wraps: its name and Buy for this site on the first line, what it holds beneath
   (the button was squeezed to four one-word lines beside a two-line name) */
.bl-rsite-h > .btn{white-space:nowrap;flex:0 0 auto;}
@media (max-width:560px){ .bl-rsite-h{flex-wrap:wrap;row-gap:2px;} .bl-rsite-h > b{flex:1 1 auto;min-width:0;} .bl-rsite-h > .device-meta{order:3;flex:1 1 100%;padding-left:19px;} }
.bl-rsite-empty{padding:2px 0 4px 20px;}
.bl-showall{margin-top:10px;}

/* on / off switch (a button, role=switch) */
.bl-switch-row{display:flex;gap:10px;align-items:flex-start;margin-bottom:6px;}
.bl-switch{flex:0 0 40px;width:40px;height:22px;margin-top:1px;border-radius:999px;border:0;background:var(--line-2);position:relative;cursor:pointer;padding:0;transition:background .15s;}
.bl-switch span{position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(12,27,42,.25);transition:left .15s;}
.bl-switch.on{background:var(--ok);}
.bl-switch.on span{left:21px;}
.bl-switch:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
.bl-switch[disabled]{opacity:.6;cursor:default;}

/* the ledger */
.bl-backbar{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin:0 0 14px;}
details.bl-grant > summary{list-style:none;cursor:pointer;}
details.bl-grant > summary::-webkit-details-marker{display:none;}
details.bl-grant:not([open]) > summary{border-bottom:0;}

/* Buy */
.bl-buy{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:18px;align-items:start;}
.bl-buy > .panel{margin:0;}
.bl-qty-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;}
.bl-qty-row > input{align-self:stretch;max-width:96px;text-align:center;padding:9px 6px;border:1px solid var(--line);border-radius:6px;font:inherit;font-size:13px;font-weight:400;background:var(--surface);color:var(--text);}
.bl-qty-row > .bl-chips{margin-left:4px;}
.field .bl-qty-row > input{width:96px;}
.bl-nudge{margin-top:10px;padding:10px 14px;border-radius:var(--radius);background:linear-gradient(120deg,rgba(var(--bc-grad-a-rgb),.08),rgba(var(--bc-purple-rgb),.08));border:1px solid rgba(var(--bc-purple-rgb),.22);font-size:13px;line-height:1.6;}
.bl-nudge .btn{margin-left:6px;}
.bl-billed{padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface-2);font-size:13px;line-height:1.7;}
.bl-cta{margin-top:4px;}
.bl-tiers tr.on td{font-weight:700;background:var(--accent-soft,var(--bc-accent-soft));}
.bl-calc{margin-top:16px;border-top:1px solid var(--line);padding-top:12px;font-size:13px;display:grid;gap:7px;}   /* v1.4.10.473: body text 13 (was 14) */
.bl-calc > div:not(.device-meta){display:flex;justify-content:space-between;gap:10px;font-variant-numeric:tabular-nums;}
.bl-calc-total{font-size:18px;padding:6px 0;border-top:1px dashed var(--line);border-bottom:1px dashed var(--line);}

/* Accounts */
details.bl-acct > summary{list-style:none;}
details.bl-acct > summary::-webkit-details-marker{display:none;}
.bl-acct{border-left:4px solid var(--ok);}
.bl-acct.warn{border-left-color:var(--warn);}
.bl-acct.err{border-left-color:var(--err);}
.bl-acct-head{display:flex;gap:12px;align-items:flex-start;padding:16px 20px;cursor:pointer;flex-wrap:wrap;}
.bl-acct[open] > .bl-acct-head{border-bottom:1px solid var(--line);}
.bl-acct-head .bl-caret{margin-top:1px;}
.bl-acct-id{flex:1 1 360px;min-width:0;}
.bl-acct-id h3{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0;}
.bl-acct-due{font-size:13px;font-weight:700;color:var(--text);}
.bl-acct-due.warn{color:var(--warn);} .bl-acct-due.err{color:var(--err);}
.bl-acct-pills{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;}
.bl-acct-head .head-actions{display:flex;gap:8px;flex-wrap:wrap;cursor:default;}
.bl-sec-h{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim,var(--text-mute));margin:16px 0 8px;}
.bl-sec-h:first-child{margin-top:0;}
.bl-okline{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--ok);}
.bl-note{padding:10px 14px;border-radius:var(--radius);font-size:13px;margin-bottom:12px;display:flex;gap:6px;align-items:flex-start;}
.bl-note.err{background:rgba(220,38,38,.07);}
.bl-gift{display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:10px 14px;border:1px dashed var(--line-2);border-radius:var(--radius);margin-top:14px;font-size:13px;}
.bl-gift-main{flex:1 1 280px;min-width:0;line-height:1.5;}
.bl-gift-form{display:flex;gap:6px;align-items:center;}
.bl-gift-form input{width:64px;text-align:center;padding:7px 6px;border:1px solid var(--line);border-radius:6px;font:inherit;background:var(--surface);color:var(--text);}

/* the client's own pack card, the Rooms strip, the notes under them */
.bl-ent-row{display:flex;gap:20px;align-items:center;flex-wrap:wrap;}
.bl-ent-big{flex:0 0 auto;min-width:110px;}
.bl-ent-big.ok .bl-big{color:var(--ok);}
.bl-ent-big.warn .bl-big{color:var(--warn);}
.bl-ent-meter{flex:1 1 260px;min-width:0;}
.bl-ent-meter .bl-meter{height:12px;}
.bl-ent-note{display:flex;gap:8px;align-items:flex-start;margin-top:12px;padding:9px 12px;border-radius:var(--radius);background:var(--surface-2);font-size:13px;line-height:1.5;}
.bl-ent-note svg{flex:0 0 auto;margin-top:2px;}
.bl-ent-note.blue{background:var(--accent-soft,var(--bc-accent-soft));}
.bl-ent-note.blue svg{color:var(--brand-blue);}
.bl-ent-note.warn{background:rgba(217,119,6,.08);}
.bl-ent-note.warn svg{color:var(--warn);}
.bl-ent-strip{display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:12px 16px;margin-bottom:16px;border:1px solid var(--line);border-left:4px solid var(--ok);border-radius:var(--radius);background:var(--surface);box-shadow:var(--shadow-sm);}
.bl-ent-strip.warn{border-left-color:var(--warn);}
.bl-ent-strip.err{border-left-color:var(--err);}
.bl-ent-strip-ico{flex:0 0 auto;color:var(--ok);display:flex;}
.bl-ent-strip.warn .bl-ent-strip-ico{color:var(--warn);}
.bl-ent-strip.err .bl-ent-strip-ico{color:var(--err);}
.bl-ent-strip-main{flex:1 1 260px;min-width:0;font-size:13px;line-height:1.5;}
.bl-ent-tags{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px;}
.bl-ent-req{display:flex;gap:6px;align-items:flex-start;margin-top:4px;font-size:12px;color:var(--text);}
.bl-ent-req svg{flex:0 0 auto;margin-top:2px;color:var(--brand-blue);}
.cust-panel .bl-meter{margin-top:8px;height:8px;}

/* the add-room pack line */
.bl-packline{display:flex;gap:8px;align-items:flex-start;margin-top:12px;padding:10px 12px;border-radius:var(--radius);border:1px solid var(--line);background:var(--surface-2);font-size:13px;line-height:1.5;}
.bl-packline > svg{flex:0 0 auto;margin-top:2px;}
.bl-packline.ok{border-color:rgba(22,163,74,.3);background:rgba(22,163,74,.06);}
.bl-packline.ok > svg{color:var(--ok);}
.bl-packline.info{border-color:rgba(var(--bc-purple-rgb),.28);background:rgba(var(--bc-purple-rgb),.05);}
.bl-packline.info > svg{color:var(--bl-pool,var(--bc-purple));}
.bl-packline.warn{border-color:rgba(217,119,6,.4);background:rgba(217,119,6,.07);}
.bl-packline.warn > svg{color:var(--warn);}
.bl-packline-acts{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:8px;}
.bl-packline-form{display:block;}
.bl-packline-form .bl-lead{font-size:13px;margin-bottom:8px;}

/* the integrator's dashboard card */
.bl-dash{border-left:4px solid var(--ok);}
.bl-dash.warn{border-left-color:var(--warn);}
.bl-dash.err{border-left-color:var(--err);}
.bl-dash .panel-body > .bl-meter{height:10px;margin-bottom:12px;}
.bl-dash-segs{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;}
.bl-dash-seg{padding:10px 12px;border-radius:var(--radius);background:var(--surface-2);text-align:center;min-width:0;}
.bl-dash-v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.2;font-variant-numeric:tabular-nums;}
.bl-dash-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin-top:3px;}
.bl-dash-seg.ok .bl-dash-v{color:var(--ok);}
.bl-dash-seg.warn .bl-dash-v{color:var(--warn);}
.bl-dash-seg.err .bl-dash-v{color:var(--err);}
.bl-dash-inv{font-size:12px;margin-top:10px;line-height:1.6;}
.bl-dash-acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px;}   /* v1.4.10.478: Pay online / View invoice on the dashboard card */
/* v1.4.10.480: the Hand back Room Packs window (blRenderHbModal): spares by how many, packs on rooms by tick, the money */
.bl-hb-sec{font-size:13px;font-weight:600;margin:14px 0 8px;}
.bl-hb-sec:first-child{margin-top:0;}
.bl-hb-grp{display:flex;gap:10px;align-items:center;padding:8px 10px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);margin-bottom:6px;font-size:13px;}
.bl-hb-grp > div:first-child{flex:1 1 auto;min-width:0;}
.bl-hb-rooms{display:flex;flex-direction:column;gap:6px;max-height:300px;overflow:auto;}
.bl-hb-chosen{display:flex;flex-direction:column;gap:6px;margin-bottom:6px;}
.bl-hb-room{display:flex;gap:10px;align-items:center;min-height:40px;padding:6px 10px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);cursor:pointer;font-size:13px;}
.bl-hb-room input{flex:0 0 auto;width:16px;height:16px;margin:0;}
.bl-hb-room-main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;}
.bl-hb-room-n{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bl-hb-room-n b{font-weight:600;}
.bl-hb-room-main .device-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bl-hb-room-rate{flex:0 0 auto;text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;}
.bl-hb-quote{flex:0 0 auto;padding:0 18px 12px;}
.bl-hb-sum{margin-top:10px;padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface-2);font-size:13px;line-height:1.55;}
.bl-hb-sum.muted{color:var(--text-mute);}
.bl-hb-sum.err{color:var(--err);border-color:rgba(220,38,38,.35);}
.bl-hb-sum-h{font-weight:600;margin-bottom:6px;}
.bl-hb-kv{display:flex;justify-content:space-between;gap:12px;padding:3px 0;font-variant-numeric:tabular-nums;}
.bl-hb-kv span{color:var(--text-mute);}
.bl-hb-kv b{white-space:nowrap;}
@media (max-width:560px){ .bl-hb-grp{flex-wrap:wrap;} .bl-hb-kv{flex-direction:column;gap:0;padding:2px 0;} .bl-hb-quote{padding:0 12px 10px;} .bl-hb-sum{padding:10px 12px;line-height:1.45;} }
/* v1.4.10.489: a Room Pack's 12-month minimum term — the tag on a pack still inside it, a locked row, the notes that say
   until when (the Buy form, the delete windows, the Hand back summary) and the dialog that refuses an early removal */
.bl-term-tag{display:inline-flex;align-self:flex-start;align-items:center;margin-top:3px;padding:1px 8px;border-radius:999px;font-size:11px;font-weight:600;line-height:18px;white-space:nowrap;color:var(--warn);background:rgba(217,119,6,.10);}
.bl-hb-room.locked{cursor:not-allowed;background:var(--surface-2);}
.bl-hb-room.locked .bl-hb-room-n b{color:var(--text-mute);}
.bl-hb-grp.locked{background:var(--surface-2);}
.bl-hb-grp.locked .bl-term-tag{margin-top:0;}
.bl-hb-term{margin:0 0 8px;padding:8px 10px;border-radius:8px;background:rgba(217,119,6,.10);color:var(--text);font-size:12px;line-height:1.5;}
.bl-term-note{display:flex;gap:8px;align-items:flex-start;margin-top:10px;padding:10px 12px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface-2);font-size:12px;line-height:1.55;color:var(--text);}
.bl-term-note svg{flex:0 0 auto;margin-top:2px;color:var(--warn);}
.bl-term-note.warn{margin:0 0 10px;border-color:rgba(217,119,6,.35);background:rgba(217,119,6,.08);}
.bl-term-msg{margin:0 0 12px;font-size:14px;line-height:1.6;color:var(--text);}
.bl-term-list{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;}
.bl-term-li{display:flex;gap:12px;align-items:center;justify-content:space-between;padding:10px 12px;font-size:13px;}
.bl-term-li + .bl-term-li{border-top:1px solid var(--line);}
.bl-term-li-main{flex:1 1 auto;min-width:0;}
.bl-term-li-main b{font-weight:600;overflow-wrap:anywhere;}
.bl-term-li-free{flex:0 0 auto;display:flex;flex-direction:column;align-items:flex-end;text-align:right;}
.bl-term-li-free b{font-weight:600;white-space:nowrap;color:var(--warn);}
.bl-dash-attn{display:flex;gap:16px;flex-wrap:wrap;margin-top:10px;font-size:13px;}
.bl-dash-attn a{display:inline-flex;align-items:center;gap:6px;}

@media (max-width:900px){
  .bl-buy{grid-template-columns:1fr;}
  .bl-cd{grid-template-columns:1fr;}
}
@media (max-width:760px){
  .bl-toolbar{padding:10px 14px;}
  .bl-search{max-width:none;flex-basis:100%;}
  .bl-attn-row{flex-wrap:wrap;padding:12px 14px;}
  .bl-attn-acts{width:100%;justify-content:flex-start;padding-left:50px;}
  .bl-acct-head{padding:14px;}
  .bl-acct-head .head-actions{width:100%;}
  .bl-wait-h .btn{margin-left:0;}
  .bl-stock-side{width:100%;}
  /* the clients table becomes a card per client */
  .tbl-scroll table.dt.bl-ctable,table.dt.bl-ctable{min-width:0;}
  .bl-ctable thead{display:none;}
  .bl-ctable,.bl-ctable tbody{display:block;width:100%;}
  .bl-ctable tr.bl-crow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:14px;border-bottom:1px solid var(--line);}
  .bl-ctable tr.bl-crow > td{display:block;padding:0;border:0;min-width:0;background:transparent !important;}
  .bl-ctable tr.bl-crow.open{background:var(--accent-soft,var(--bc-accent-soft));border-bottom-color:transparent;}
  .bl-ctable td.bl-c-name,.bl-ctable td.bl-c-sites,.bl-ctable td.bl-c-give,.bl-ctable td.bl-addon-cell{grid-column:1 / -1;}
  .bl-ctable td.num{text-align:left !important;padding:7px 10px !important;border-radius:6px;background:var(--surface-2) !important;}
  .bl-ctable td.num::before{content:attr(data-l);display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim,var(--text-mute));margin-bottom:2px;}
  .bl-ctable tr.bl-cdetail{display:block;}
  .bl-ctable tr.bl-cdetail > td{display:block;padding:0 14px 14px;}
  .bl-ctable tr.bl-nomatch{display:block;} .bl-ctable tr.bl-nomatch > td{display:block;}
  .bl-give-hint{max-width:none;}
  .bl-c-give{min-width:0;}
  .bl-rlist{grid-template-columns:1fr;}
}
@media (max-width:560px){
  .bl-tiles{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;}
  .bl-tile{padding:11px 12px;}
  .bl-tile-v{font-size:24px;}   /* v1.4.10.473: the phone KPI value, 24/700 (was 20) */
  .bl-tile-s{font-size:12px;}
  .bl-dotline{white-space:normal;}
  .bl-big{font-size:24px;}
  .bl-mailto-form{flex-basis:100%;}
  .bl-pay-acts{width:100%;}
  .bl-pay-acts .btn{flex:1 1 auto;justify-content:center;}
  .bl-inv-strip{grid-template-columns:1fr 1fr;}
}
/* billing panel heads: the words take the room, the buttons stay on one line beside them (wide screens) */
.bl-pane .panel-head{gap:10px 16px;}
.bl-pane .panel-head > div:first-child{flex:1 1 320px;min-width:0;}
@media (min-width:901px){ .bl-pane .panel-head .head-actions{flex:0 0 auto;flex-wrap:nowrap;} }
.bl-pane .dt .pill{white-space:nowrap;}
.bl-pane .dt td.nw{white-space:nowrap;}
.bl-room-main .device-meta{white-space:normal;overflow:visible;}
.bl-acct-head h3{font-size:15px;font-weight:600;letter-spacing:-.012em;}
.bl-acct-head .panel-sub{font-size:12px;color:var(--text-mute);margin-top:4px;line-height:1.5;}
.bl-pane .dt thead th{white-space:nowrap;}
.bl-search{box-sizing:border-box;}
.bl-search input{width:auto !important;min-width:0 !important;max-width:none;flex:1 1 auto;}
.bl-switch,.dt td .bl-switch{min-height:0 !important;min-width:0 !important;}
@media (max-width:760px){
  .bl-ctable tr.bl-crow > td.num{background:var(--surface-2) !important;}
  .bl-rooms-head{align-items:stretch;}
  .bl-rooms-head .bl-search.sm{flex:1 1 100%;}
}
.ef-packline .bl-packline{margin:0 0 16px;}
/* <b> inside an already-bold line would ask for weight 900, which the app does not serve (fonts-403) */
.bl-pane b,.bl-pane strong,.bl-ent b,.bl-ent-strip b,.bl-dash b,.bl-packline b{font-weight:700;}
.grid-2.bl-tiles{grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px;}
@media (max-width:560px){ .grid-2.bl-tiles{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;} }
.bl-mailto-form,.bl-gift-form{align-items:stretch;}
.bl-mailto-form .btn,.bl-gift-form .btn{justify-content:center;}
.bl-search{min-width:0;}
.bl-search input{width:0 !important;}
.bl-pane .panel-head .head-actions > input,.bl-pane .panel-head .head-actions > select{min-height:32px;padding:4px 10px;border:1px solid var(--line);border-radius:6px;font:inherit;font-size:13px;background:var(--surface);color:var(--text);}   /* v1.4.10.473: + the ledger's two filters, which drew as bare browser selects (0 padding, square grey border) */
@media (max-width:760px){ .bl-pane .panel-head .head-actions > input,.bl-pane .panel-head .head-actions > select{min-height:40px;font-size:16px;} }
/* v1.4.10.473: the waiting rooms' client name is a sub-heading, 13/600 (the b rule above made it 700) */
.bl-pane .bl-wait-h > b{font-weight:600;}
/* v1.4.10.473: Billing settings' group headings (Bank Transfer, PayID, The connection …) are sub-headings, 13/600 — they had no
   size and drew at the browser's h4 default, 14 */
.bl-pane .panel-body > h4:not([class]){font-size:13px;}
/* v1.4.10.473: Insights' half-width tables (Collections, Integrator book, Top clients) fit their panel: the 680px floor every
   flush table carries made each 675px panel scroll sideways by 5px */
.bl-pane .grid-2 > .panel > .panel-body.flush > .dt{min-width:0;}
/* v1.4.10.473: on a phone the same tables take 12px cell sides (18 in the base): at 18 'Top clients by MRR' was 363px in a
   354px panel, a 9px sideways scroll; it fits now, and the 7-column Integrator book scrolls as a real wide table */
@media (max-width:760px){ .bl-pane .grid-2 > .panel > .panel-body.flush > .dt :is(th,td){padding-left:12px;padding-right:12px;} }
/* v1.4.10.473: the invoice and email-preview documents fill their popup's body: as inline iframes they sat on a text line
   (its descender space scrolled the body by 2px on a phone), and a 70vh iframe in a body the popup had already shrunk
   below 70vh scrolled it by 1px */
.bl-pane .modal-backdrop .panel-body:has(> iframe){display:flex;flex-direction:column;}
.bl-pane .modal-backdrop .panel-body > iframe{display:block;flex:1 1 auto;min-height:0;}
@media (max-width:760px){
  /* v1.4.10.473: phone tap targets 40px wide too — the row caret (26), the Give stepper's − / + (30), the 1 / 10 / 25 pack
     chips (28-39) and the pricing tier's delete (38) */
  .bl-caret{flex-basis:40px;width:40px;}
  .bl-stepper .btn{min-width:40px;}
  .bl-chip{min-width:40px;justify-content:center;}
  #bl-tiers td .btn{min-width:40px;justify-content:center;}
  /* v1.4.10.473: the pool switch keeps its 22px look but takes a 40px-tall tap */
  .bl-switch::before{content:'';position:absolute;left:0;right:0;top:-9px;bottom:-9px;}
}
@media (max-width:560px){
  /* v1.4.10.473: the billing address and its Save stack on a phone: beside the button the field was 200px and cut its
     own placeholder */
  .bl-mailto-form{flex-wrap:wrap;}
  .bl-mailto-form input{flex:1 1 100%;}
  .bl-mailto-form .btn{flex:1 1 auto;}
  /* v1.4.10.473: in a half-width tile each pack line is a line of text: as an inline-flex row its bold part and the words
     after it wrapped as two narrow columns side by side ("6 gifted / by / AVDesk" beside "(never billed) · 142 paid") */
  .bl-dotline{display:block;margin-right:0;}
  .bl-dotline i{margin-right:5px;vertical-align:1px;}
}
/* v1.4.10.473: an <input class="field"> takes the field look from the base (input.field, beside .field input); the Xero
   contact search is as tall as the .btn.sm beside it (the Search button had stretched to 56px). */
input#bl-xc-q.field{min-height:32px;padding:6px 12px;}
@media (max-width:760px){ input#bl-xc-q.field{min-height:40px;} }
/* v1.4.10.473: inputs that sit outside a .field — Records' search, the pricing tiers' From / price cells, the special-pricing
   editor's tier cells — drew as bare browser boxes too (2px padding, square grey border). They take the field look. */
#fin-rec-q,#bl-tiers td > input,.bl-pane .modal-backdrop td > input{min-height:32px;padding:6px 10px;border:1px solid var(--line-2);border-radius:var(--r-ctl);background:var(--surface);color:var(--text);font:inherit;font-size:13px;}
#fin-rec-q:focus,#bl-tiers td > input:focus,.bl-pane .modal-backdrop td > input:focus{outline:none;border-color:var(--bc-grad-a);box-shadow:0 0 0 3px rgba(var(--bc-grad-a-rgb),.14);}
@media (max-width:760px){ #fin-rec-q,#bl-tiers td > input,.bl-pane .modal-backdrop td > input{min-height:40px;font-size:16px;} }


/* ═══════════════════════════════════════════════════════════════════════════
   v1.4.10.426 — THE DASHBOARD, REFRESHED
   Jay: "refresh the dashboard, make it look amazing and everything is bug
   free". Everything here is scoped to .dash-v2 (renderDashboard's wrapper) so
   no other page moves. The page is a command-centre grid (see the diagram in
   renderDashboard): a navy hero that says in one line whether anything needs
   you, a six-tile rail with tinted icon badges, the attention band, then a
   main column (live estate + analysis) beside a rail (your work, monitoring,
   coming up). One column below 1200px, ordered work → main → rail.
   ═══════════════════════════════════════════════════════════════════════════ */
.dash-v2{--dv-r:14px;--dv-gap:18px;
  --dv-shadow:0 1px 2px rgba(12,27,42,.04),0 12px 30px -22px rgba(12,27,42,.28);
  --dv-shadow-hi:0 1px 2px rgba(12,27,42,.05),0 18px 40px -20px rgba(12,27,42,.30);}

/* ── Hero ───────────────────────────────────────────────────────────────── */
.dash-hero.dh-v2{padding:26px 30px;gap:32px;border-radius:16px;margin-bottom:var(--dv-gap);
  background:
    var(--brand-grad) top left/100% 3px no-repeat,
    radial-gradient(720px 360px at 98% -34%,rgba(var(--bc-grad-a-rgb),.46),transparent 70%),
    radial-gradient(560px 300px at -8% 135%,rgba(var(--bc-purple-rgb),.30),transparent 70%),
    radial-gradient(420px 220px at 55% 120%,rgba(62,210,124,.07),transparent 70%),
    var(--bc-navy);
  box-shadow:0 24px 50px -30px rgba(var(--bc-navy-rgb),.75);}
.dh-v2 .dh-eyebrow{display:flex;align-items:center;flex-wrap:wrap;gap:8px;font-family:var(--font-body);font-size:11px;font-weight:600;
  letter-spacing:.06em;text-transform:uppercase;color:#9FB6D6;margin-bottom:12px;}   /* v1.4.10.473: the eyebrow look said once (it read mono 500 .07em here and was overridden to it further down) */
.dh-v2 .dh-eyebrow .dh-today{color:#9FB6D6;}
.dh-v2 .dh-eyebrow .dh-sub-sep{margin:0;opacity:.45;}
.dh-v2 .dh-portal{color:#DCE6F5;}
.dh-v2 .dh-led{width:8px;height:8px;border-radius:50%;flex:none;background:var(--av-led);animation:avLed 2.6s var(--av-ease) infinite;}
.dh-v2 .dh-led.warn{background:#FFB000;animation-name:dvLedWarn;}
.dh-v2 .dh-led.err{background:#FF6B5E;animation-name:dvLedErr;}
@keyframes dvLedWarn{0%{box-shadow:0 0 0 0 rgba(255,176,0,.55)}70%{box-shadow:0 0 0 7px rgba(255,176,0,0)}100%{box-shadow:0 0 0 0 rgba(255,176,0,0)}}
@keyframes dvLedErr{0%{box-shadow:0 0 0 0 rgba(255,107,94,.6)}70%{box-shadow:0 0 0 7px rgba(255,107,94,0)}100%{box-shadow:0 0 0 0 rgba(255,107,94,0)}}
.dh-v2 .dh-hi{font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.12;color:#fff;}
.dh-v2 .dh-sub{margin-top:6px;font-size:13px;color:#C3D0DE;}
.dh-v2 .dh-sub strong{color:#fff;}
.dh-v2 .dh-status{display:inline-flex;align-items:center;gap:8px;margin-top:16px;padding:5px 14px 5px 10px;min-height:32px;   /* v1.4.10.473: 32px, the height of the quick actions beside it (was 34) */
  border-radius:999px;border:1px solid;background:transparent;font:inherit;font-size:13px;font-weight:600;cursor:pointer;
  transition:filter .15s,transform .15s;}
.dh-v2 .dh-status svg{width:16px;height:16px;flex:none;}
.dh-v2 .dh-status:hover{filter:brightness(1.18);transform:translateY(-1px);}
.dh-v2 span.dh-status{cursor:default;}   /* v1.4.10.472: all clear has nothing to jump to */
.dh-v2 span.dh-status:hover{filter:none;transform:none;}
.dh-v2 .dh-status:focus-visible{outline:2px solid rgba(255,255,255,.8);outline-offset:2px;}
.dh-v2 .dh-status.ok{color:#86EBB0;border-color:rgba(62,210,124,.40);background:rgba(62,210,124,.10);}
.dh-v2 .dh-status.warn{color:#FFD47E;border-color:rgba(255,176,0,.42);background:rgba(255,176,0,.10);}
.dh-v2 .dh-status.err{color:#FFB4AC;border-color:rgba(255,107,94,.48);background:rgba(255,107,94,.13);}
.dh-v2 .dh-facts{margin-top:16px;}
.dh-v2 .dh-quick{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px;}
.dh-v2 .dh-qa{display:inline-flex;align-items:center;gap:6px;background:var(--brand-grad);color:#fff;border:0;min-height:32px;
  box-shadow:0 10px 22px -12px rgba(var(--bc-grad-a-rgb),.95);}   /* v1.4.10.473: 32px like the status pill beside it (a borderless one alone, the Site Admin's New ticket, was 30) */
.dh-v2 .dh-qa:hover{filter:brightness(1.08);background:var(--brand-grad);color:#fff;}
.dh-v2 .dh-qa.ghost{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.26);box-shadow:none;}
.dh-v2 .dh-qa.ghost:hover{background:#fff;color:var(--bc-navy);border-color:#fff;filter:none;}
.dh-v2 .dh-qa svg{width:14px;height:14px;}
.dh-v2 .dh-right{background:linear-gradient(160deg,rgba(255,255,255,.07),rgba(255,255,255,.02));border:1px solid rgba(255,255,255,.10);
  border-radius:14px;padding:16px 20px;}
.dh-v2 .dh-right .hs-pending{max-width:420px;}
/* v1.4.10.504: the integrator's logo at the head of the hero (dashHeroLogoHtml). The slot is nothing until a logo is known,
   so a hero without one lays out exactly as before; with one, the text sits beside a white tile on the navy. */
.dh-v2 .dh-left{display:flex;align-items:center;gap:20px;}
.dh-v2 .dh-left-text{min-width:0;flex:1 1 auto;}
.dh-v2 .dh-logo-slot:empty{display:none;}
.dh-v2 .dh-logo{width:68px;height:68px;flex:none;border-radius:16px;background:#fff;padding:8px;display:grid;place-items:center;
  box-shadow:0 14px 28px -16px rgba(0,0,0,.7),0 0 0 1px rgba(255,255,255,.14);}
.dh-v2 .dh-logo img{max-width:100%;max-height:100%;object-fit:contain;display:block;}

/* ── v1.4.10.472: the Integrator row under the hero (dashIntgCard; was a 175px card in v471) ──
   One slim row: "Integrator", the logo and name, who looks after this client, and Call / Email / Website as small
   pill links. Wraps on a narrow screen; the person and the links take full rows on a phone. */
.dash-intg{display:flex;align-items:center;flex-wrap:wrap;gap:12px 22px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--dv-r,14px);padding:12px 16px;margin-bottom:var(--dv-gap,18px);box-shadow:var(--dv-shadow);}
.dmi-id{display:flex;align-items:center;gap:12px;min-width:0;flex:0 1 auto;}
.dmi-logo{width:44px;height:44px;flex:none;border-radius:10px;display:grid;place-items:center;background:var(--surface-2);
  border:1px solid var(--line);color:var(--brand-blue);font-weight:700;font-size:15px;letter-spacing:-.02em;overflow:hidden;}
.dmi-logo.has{background:#fff;padding:5px;}
.dmi-logo img{max-width:100%;max-height:100%;object-fit:contain;display:block;}
.dmi-who{display:flex;flex-direction:column;min-width:0;line-height:1.25;}
.dmi-eyebrow{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}   /* v1.4.10.473: 11/600 .06em like every uppercase label (was 10.5px, .08em) */
.dmi-name{font-size:15px;font-weight:600;letter-spacing:-.01em;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:340px;}
.dmi-person{display:flex;align-items:center;gap:10px;min-width:0;padding-left:22px;border-left:1px solid var(--line);}
.dmi-av{width:32px;height:32px;flex:none;border-radius:50%;display:grid;place-items:center;background:var(--accent-glow);color:var(--brand-blue);font-size:12px;font-weight:700;}   /* v1.4.10.473: a 32px avatar's initials at 12, as userAv draws them (was 11.5); the name above 15/600 like a card title (was 700) */
.dmi-pid{display:flex;flex-direction:column;min-width:0;line-height:1.25;}
.dmi-pid b{font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dmi-pid span{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dmi-acts{display:flex;flex-wrap:wrap;gap:8px;margin-left:auto;min-width:0;}
.dmi-act{display:inline-flex;align-items:center;gap:7px;min-height:36px;padding:0 13px;border-radius:999px;border:1px solid var(--line);
  background:var(--surface);color:var(--text);font-size:13px;font-weight:500;text-decoration:none;max-width:280px;transition:border-color .15s,background .15s;}
.dmi-act span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dmi-act svg{width:15px;height:15px;flex:none;color:var(--brand-blue);}
.dmi-act:hover{border-color:var(--brand-blue);background:var(--accent-glow);}
.dmi-act:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
.dmi-none{font-size:12px;color:var(--text-mute);}   /* v1.4.10.473: meta 12 (was 12.5); the contact's name above 13 (was 13.5) */
.dash-intg-nudge{display:flex;align-items:center;flex-wrap:wrap;gap:8px 12px;font-size:13px;color:var(--text);background:var(--surface);
  border:1px dashed color-mix(in srgb,var(--brand-blue) 40%,var(--line));border-radius:var(--dv-r,14px);padding:10px 14px;margin-bottom:var(--dv-gap,18px);}
.dash-intg-nudge svg{width:16px;height:16px;flex:none;color:var(--brand-blue);}
.dash-intg-nudge .btn{margin-left:auto;}
.dash-intg-nudge > span{flex:1 1 220px;min-width:0;}   /* v1.4.10.473: the sentence shares the icon's line (on a phone the icon sat alone above it) */
@media (max-width:760px){
  .dash-intg{padding:12px 14px;gap:12px;}
  .dmi-name{max-width:none;white-space:normal;}
  .dmi-person{padding-left:0;border-left:0;flex:1 1 100%;}
  .dmi-acts{margin-left:0;width:100%;}
  .dmi-act{flex:1 1 auto;justify-content:center;min-height:40px;max-width:none;min-width:0;}   /* v1.4.10.473: min-width 0, so a long website shortens with an ellipsis (it ran 200px past the card) */
}
/* ── v1.4.10.481: contacting the integrator ──────────────────────────────────────────────────────────────────────
   The header's Contact button (the client's people, every page), the contact card (intgContactHtml: the Contact window,
   a disabled room, the no-pack notice, the sign-in card), a disabled room's page (locLockedHtml) and the disabled look of
   a room without a licence in the lists. */
.intg-btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;flex:0 1 auto;min-width:0;max-width:280px;height:36px;padding:0 12px;
  border:1px solid var(--line-2);border-radius:var(--r-ctl,6px);background:var(--surface);color:var(--text);font:inherit;font-size:13px;font-weight:600;
  cursor:pointer;white-space:nowrap;transition:border-color .15s,background .15s,color .15s;-webkit-tap-highlight-color:transparent;touch-action:manipulation;}
.intg-btn[hidden]{display:none;}
.intg-btn svg{width:16px;height:16px;flex:none;color:var(--brand-blue);}
.intg-btn-l{overflow:hidden;text-overflow:ellipsis;min-width:0;}
.intg-btn:hover{border-color:var(--brand-blue);background:var(--accent-glow);color:var(--brand-blue);}
.intg-btn:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
@media (max-width:1180px){ .intg-btn{width:36px;padding:0;flex:none;} .intg-btn-l{display:none;} }
@media (max-width:920px){ .intg-btn{width:40px;height:40px;} }
/* the two-row header (≤760): row 1 keeps search, sound and the bell; the button closes row 2, after the site picker */
@media (max-width:760px){ .topbrand .intg-btn{order:6;} }
/* the card */
.ic-card{display:flex;flex-direction:column;gap:12px;margin:12px 0 0;padding:14px 16px;border:1px solid var(--line);border-radius:12px;background:var(--surface);}
.ic-top{display:flex;align-items:center;flex-wrap:wrap;gap:12px 22px;min-width:0;}
.ic-top .dmi-name{max-width:none;white-space:normal;}
.ic-person{display:flex;align-items:center;gap:10px;min-width:0;padding-left:22px;border-left:1px solid var(--line);}
.ic-acts{display:flex;flex-wrap:wrap;gap:8px;min-width:0;}
.ic-acts .dmi-act{max-width:100%;min-width:0;}
.ic-addr{display:flex;align-items:flex-start;gap:8px;font-size:12px;color:var(--text-mute);line-height:1.5;}
.ic-addr svg{width:14px;height:14px;flex:none;margin-top:2px;color:var(--text-dim);}
.ic-body .ic-lead{margin:0 0 8px;font-size:14px;line-height:1.6;color:var(--text);}/* v1.4.10.484: reading text, 14px (13.5px was off the scale) */
.ic-body .ic-lead + .ic-lead{margin-top:-2px;}
.ic-none{margin-top:12px;padding:12px 14px;border:1px dashed var(--line-2);border-radius:10px;font-size:13px;color:var(--text-mute);line-height:1.55;}
@media (max-width:560px){
  .ic-person{padding-left:0;border-left:0;flex:1 1 100%;}
  .ic-acts .dmi-act{flex:1 1 auto;justify-content:center;min-height:40px;}
}
/* inside the no-pack notice of the add-room form */
.bl-packline.has-intg .ic-card{margin:10px 0 2px;padding:12px 14px;}
/* a disabled room's page */
.loc-locked{padding:22px 24px 20px;border-left:4px solid var(--err);max-width:760px;}
.ll-head{display:flex;align-items:center;gap:14px;margin-bottom:12px;min-width:0;}
.ll-ico{width:46px;height:46px;flex:none;border-radius:12px;display:grid;place-items:center;color:var(--err);background:color-mix(in srgb,var(--err) 10%,transparent);}
.ll-id{min-width:0;}
.ll-eyebrow{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
.ll-name{margin:2px 0 0;font-size:20px;font-weight:600;letter-spacing:-.015em;line-height:1.25;color:var(--text);overflow-wrap:anywhere;}/* v1.4.10.484: the page-title step (22px was off the scale) */
.ll-name .ll-code{font-size:13px;font-weight:600;letter-spacing:0;vertical-align:middle;}
.ll-lead{margin:0 0 8px;font-size:14px;line-height:1.6;color:var(--text);}
.ll-acts{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px;}
@media (max-width:560px){ .loc-locked{padding:16px 14px;} .ll-name{font-size:18px;} }/* v1.4.10.484: the page title on a phone, 18px */
/* a room without a licence in the lists: still clickable (it says who to contact), drawn as disabled */
.sd-locrow.is-off,.sd-room-card.is-off,.rm-row.is-off,.rb-room.is-off{opacity:.72;}
.sd-locrow.is-off .lr-name,.sd-room-card.is-off .sd-room-name,.rb-room.is-off .rb-room-name{color:var(--text-mute);}
.sd-room-card.is-off .sd-room-thumb{filter:grayscale(1);}
.sd-locrow.is-off:hover,.sd-room-card.is-off:hover,.rm-row.is-off:hover,.rb-room.is-off:hover{opacity:1;}
/* the Room Pack strips' buttons (Contact + Request packs) */
.bl-ent-strip-acts{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
.bl-ent-strip-acts:empty{display:none;}
.bl-ent-strip-acts .btn svg{width:14px;height:14px;}
/* the sign-in card, when access is paused */
.login-intg .ic-card{margin:0 0 14px;padding:12px 14px;text-align:left;}
.login-intg .ic-acts .dmi-act{flex:1 1 auto;justify-content:center;}
/* ── KPI rail ───────────────────────────────────────────────────────────── */
.dash-v2 .dash-kpis{gap:14px;margin-bottom:var(--dv-gap);}
.dash-v2 .dk{--dk-c:var(--brand-blue);border-radius:var(--dv-r);padding:16px 18px 15px;background:var(--surface);
  box-shadow:var(--dv-shadow);display:flex;flex-direction:column;}
.dash-v2 .dk.ok{--dk-c:var(--ok);} .dash-v2 .dk.warn{--dk-c:#D97706;} .dash-v2 .dk.err{--dk-c:var(--err);}
.dash-v2 .dk.purple{--dk-c:var(--brand-purple);} .dash-v2 .dk.muted{--dk-c:var(--text-dim);}
.dash-v2 .dk::before{left:0;right:0;top:0;bottom:auto;width:auto;height:3px;opacity:1;}
.dash-v2 .dk::after{content:'';position:absolute;right:-56px;bottom:-64px;width:150px;height:150px;border-radius:50%;
  background:radial-gradient(closest-side,color-mix(in srgb,var(--dk-c) 8%,transparent),transparent);pointer-events:none;}
.dash-v2 .dk:hover{transform:translateY(-2px);box-shadow:var(--dv-shadow-hi);}
.dash-v2 .dk.clickable:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
.dash-v2 .dk-head{justify-content:flex-start;gap:10px;}
.dash-v2 .dk-i{width:34px;height:34px;border-radius:10px;display:inline-grid;place-items:center;flex:none;
  background:color-mix(in srgb,var(--dk-c) 12%,var(--surface));color:var(--dk-c);}
.dash-v2 .dk-i svg{width:18px;height:18px;}
.dash-v2 .dk-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;line-height:1.35;color:var(--text-mute);min-width:0;}   /* v1.4.10.473: the KPI label look every tile in the app wears, Insights' included (was 12/600 sentence case) */
.dash-v2 .dk-go{margin-left:auto;display:inline-flex;color:var(--text-dim);opacity:0;transform:translateX(-4px);transition:opacity .18s,transform .18s;}
.dash-v2 .dk-go svg{width:14px;height:14px;}
.dash-v2 .dk.clickable:hover .dk-go,.dash-v2 .dk.clickable:focus-visible .dk-go{opacity:1;transform:none;}
.dash-v2 .dk-v{font-size:30px;font-weight:700;letter-spacing:-.03em;margin:14px 0 4px;color:var(--text);flex-wrap:wrap;}
.dash-v2 .dk.err .dk-v{color:var(--err);}
.dash-v2 .dk-s{font-size:12px;line-height:1.4;}
.dash-v2 .dk-spark{margin-top:auto;padding-top:10px;}
.ins-delta.flat{color:var(--text-mute);background:var(--surface-3);}

/* ── Attention band ─────────────────────────────────────────────────────── */
/* v1.4.10.484: a panel like every other on the dashboard (the same radius and shadow), its icon tile in the band's tone
   (amber to watch, red when something is urgent), white inside: the tiles carry the colour, one each. */
.dash-v2 .dash-attn{border-radius:var(--dv-r);padding:0;margin-bottom:var(--dv-gap);box-shadow:var(--dv-shadow);background:var(--surface);
  border-color:color-mix(in srgb,var(--warn) 38%,var(--line));}
.dash-v2 .dash-attn.has-err{border-color:color-mix(in srgb,var(--err) 34%,var(--line));}
.dash-v2 .dash-attn .da-ico{display:inline-grid;place-items:center;width:34px;height:34px;border-radius:10px;flex:none;
  background:color-mix(in srgb,var(--warn) 18%,var(--surface));color:#B45309;}
.dash-v2 .dash-attn.has-err .da-ico{background:color-mix(in srgb,var(--err) 14%,var(--surface));color:var(--err);}
.dash-v2 .dash-attn .da-ico svg{width:17px;height:17px;}
.dash-v2 .da-item{border-radius:12px;}
.dash-v2 .dash-attn.ok{border-color:color-mix(in srgb,var(--ok) 34%,var(--line));color:#166534;font-size:13px;font-weight:600;
  background:linear-gradient(90deg,color-mix(in srgb,var(--ok) 9%,var(--surface)),var(--surface) 55%);}
.dash-v2 .dash-attn.ok .da-ico{background:color-mix(in srgb,var(--ok) 16%,var(--surface));color:var(--ok);}
.dash-attn.flash{animation:dvFlash 1.3s var(--av-ease);}
@keyframes dvFlash{0%{box-shadow:0 0 0 0 rgba(var(--bc-grad-a-rgb),.55)}35%{box-shadow:0 0 0 7px rgba(var(--bc-grad-a-rgb),.22)}100%{box-shadow:0 0 0 0 rgba(var(--bc-grad-a-rgb),0)}}

/* ── Panels ─────────────────────────────────────────────────────────────── */
.dash-v2 .panel{border-radius:var(--dv-r);box-shadow:var(--dv-shadow);margin-bottom:var(--dv-gap);transition:box-shadow .2s var(--av-ease);}
.dash-v2 .panel:hover{box-shadow:var(--dv-shadow-hi);}
.dash-v2 .panel-head{padding:16px 20px 14px;background:linear-gradient(180deg,#FAFBFD,var(--surface));}
.dash-v2 .panel-head h3{display:flex;align-items:center;gap:8px;font-size:15px;}
.dash-v2 .panel-head h3 svg{width:17px;height:17px;color:var(--brand-blue);flex:none;}
.dash-v2 .dash-okline{border-radius:12px;box-shadow:var(--dv-shadow);}
.dash-v2 .dash-sec{margin:26px 0 14px;}
.dash-v2 .dash-sec > span{font-size:11px;letter-spacing:.06em;}
.dash-v2 .clbcard{border-radius:12px;transition:transform .18s var(--av-ease),box-shadow .18s,border-color .18s;}
.dash-v2 .dash-fu{border-radius:var(--dv-r);}

/* ── The bands (v1.4.10.430) ─────────────────────────────────────────────
   The v426 grid pinned a permanent narrow right rail; with up to twelve
   short panels in it, the rail outran the main column by screens and the
   page ended as a right-hand strip beside a blank gutter (Jay: "a lot of
   it is banked on the right side of the page"). The rail is gone — every
   section is a full-width band that balances itself. .dash-row is the
   workhorse: one wide panel beside one narrow one, both stretched to the
   row's height so a band always ends flush; .eq splits 50/50; .dash-stack
   piles the planning cards beside Your work. Below 1200px every band is
   one column and the page reads Today → estate → monitoring → analysis. */
.dash-row{display:grid;grid-template-columns:minmax(0,1.85fr) minmax(320px,1fr);gap:var(--dv-gap);align-items:stretch;margin-bottom:var(--dv-gap);}
.dash-row.eq{grid-template-columns:repeat(2,minmax(0,1fr));}
.dash-row > *{min-width:0;}
.dash-row > .panel,.dash-row > .dash-fu,.dash-stack > .panel{margin-bottom:0;}
.dash-row > .panel{display:flex;flex-direction:column;}
.dash-row > .panel > .panel-body{flex:1 1 auto;}
/* the estate map fills whatever height its row settles on */
.dash-row > .panel > .panel-body.flush{display:flex;flex-direction:column;}
.dash-row > .panel > .panel-body.flush .sites-map{flex:1 1 auto;height:auto;min-height:340px;}
.dash-stack{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--dv-gap);align-content:start;min-width:0;}
.dash-v2 .dash-deck{gap:var(--dv-gap);margin-bottom:var(--dv-gap);}
.dash-v2 .dash-oklines{margin-bottom:var(--dv-gap);}
/* Your work sits in the wide (~61%) column now: two lanes across, the
   checklist lane full width beneath — three across needs the full page. */
@media(min-width:761px){   /* v1.4.10.473: not on a phone, where it beat the one-column rule and squeezed the lanes into two 154px columns */
.dash-row .dyw-grid.n3{grid-template-columns:1fr 1fr;}
.dash-row .dyw-grid.n3 .dyw-lane.items{grid-column:1/-1;}
}
/* status rows (Ody, SSO, switches, discovery) in the monitoring deck:
   name + detail take the room, the pill sits right */
.dash-mon .dsr{display:flex;align-items:center;gap:10px;}
.dash-mon .dsr-name{flex:1 1 auto;white-space:normal;}
.dash-mon .dsr-name .dsr-meta{white-space:normal;line-height:1.35;}
.dash-v2 .dsr-name .dsr-meta,.dash-v2 .dsr .device-meta{font-size:12px;font-weight:400;}   /* v1.4.10.473: on the dashboard a row's second line is meta 12/400 like every other list here (the shared rule's 11/500 stays with the site page); the newly discovered devices' line too (it read 11 beside the switches' 12) */
.dash-mon .panel-head{flex-wrap:wrap;row-gap:8px;}
.dash-mon .panel-head .dash-map-key{margin-left:auto;}
/* v1.4.10.473: a chart's legend and the map's key sit at the head's right, where head-actions sit (they ran on from the
   title with no gap: "Ticket flow · 30 days● Opened"); under it on a phone, where the head wraps */
.panel-head > .ins-key,.panel-head > .dash-map-key{margin-left:auto;padding-left:16px;}
@media(max-width:760px){ .panel-head > .ins-key,.panel-head > .dash-map-key{margin-left:0;padding-left:0;} }
.dash-mon .ins-donut-row{gap:18px;}
/* the paused stream says so where the pulsing dot used to over-promise */
.live-toggle{display:inline-flex;align-items:center;gap:6px;margin-left:7px;padding:2px 9px 2px 7px;border:1px solid var(--line);border-radius:999px;background:var(--surface-2,var(--surface));font-size:11px;font-weight:500;letter-spacing:0;color:var(--text-mute);cursor:pointer;vertical-align:middle;}
.live-toggle:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
.live-dot.paused{background:var(--text-dim);margin-left:0;}
.live-dot.paused::after{animation:none;opacity:0;}
.live-toggle .live-dot{margin-left:0;}   /* v1.4.10.432: the running stream's pill (click to pause) */
/* ── The dashboard's event feed (v1.4.10.430) — two-line cards in place of
   the monitor page's one-line terminal rows, which truncated every message
   at this panel's width. Severity paints the dot and a soft left edge. ── */
.logf{display:flex;flex-direction:column;}
.logf-row{display:flex;align-items:flex-start;gap:10px;padding:9px 10px 9px 12px;border-radius:9px;position:relative;transition:background .13s;}
.logf-row[role="button"]{cursor:pointer;}
.logf-row:hover{background:var(--surface-2);}
.logf-row + .logf-row{margin-top:2px;}
.logf-row::before{content:'';position:absolute;left:0;top:9px;bottom:9px;width:3px;border-radius:3px;background:var(--line);}
.logf-row.lv-err::before{background:var(--err);} .logf-row.lv-warn::before{background:var(--warn);}
.logf-row.lv-info::before{background:var(--brand-blue);} .logf-row.resolved::before{background:var(--ok);opacity:.55;}
.logf-dot{width:8px;height:8px;border-radius:50%;margin-top:5px;flex:none;background:var(--text-dim);}
.logf-row.lv-err .logf-dot{background:var(--err);box-shadow:0 0 0 3px color-mix(in srgb, var(--err) 18%, transparent);}
.logf-row.lv-warn .logf-dot{background:var(--warn);box-shadow:0 0 0 3px color-mix(in srgb, var(--warn) 18%, transparent);}
.logf-row.lv-info .logf-dot{background:var(--brand-blue);}
.logf-row.resolved .logf-dot{background:var(--ok);}
.logf-row.resolved .logf-main{opacity:.62;}
.logf-main{flex:1 1 auto;min-width:0;}
.logf-t{font-size:13px;font-weight:600;color:var(--text);line-height:1.35;}   /* v1.4.10.473: a feed row's title 13/600 like every other dashboard row title (was 12/600) */
.logf-where{color:var(--text-mute);font-size:12px;font-weight:400;}   /* v1.4.10.473: the room and site beside the device are its meta line, 12/400 (was the title's size at 500) */
.logf-m{font-size:12px;color:var(--text-mute);line-height:1.4;margin-top:1px;overflow-wrap:anywhere;}
.logf-side{display:flex;flex-direction:column;align-items:flex-end;gap:4px;flex:none;}
.logf-side .ts{font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap;}
.logf-side .pill{font-size:11px;}
@media(max-width:1199px){
  .dash-row,.dash-row.eq{grid-template-columns:minmax(0,1fr);}
  .dash-row > .panel,.dash-row > .dash-fu,.dash-stack > .panel{margin-bottom:0;}
}
@media(max-width:760px){
  .dash-hero.dh-v2{padding:18px 16px;gap:16px;border-radius:14px;}
  .dh-v2 .dh-left{gap:12px;align-items:flex-start;}   /* v1.4.10.504: the logo beside the greeting on a phone, 48px */
  .dh-v2 .dh-logo{width:48px;height:48px;border-radius:12px;padding:5px;}
  .dh-v2 .dh-hi{font-size:18px;}
  .dh-v2 .dh-status,.dh-v2 .dh-qa{min-height:40px;}
  .dh-v2 .dh-right{padding:12px 14px;}
  .dash-v2 .dk{padding:13px 14px 12px;}
  .dash-v2 .dk-i{width:30px;height:30px;border-radius:9px;}
  .dash-v2 .dk-v{font-size:24px;margin-top:10px;}
  .dash-v2 .dk-go{display:none;}
  .dash-row{gap:12px;margin-bottom:12px;}
  .dash-stack{gap:12px;}
}
/* the narrow-column empty states ("All quiet", "Nothing scheduled") say it in less height */
.dash-stack .empty,.dash-mon .empty,.dash-row .empty{padding:18px 12px;}
.dash-stack .empty .empty-ico,.dash-mon .empty .empty-ico,.dash-row .empty .empty-ico{width:40px;height:40px;margin-bottom:8px;}
.dash-stack .empty .empty-sub,.dash-mon .empty .empty-sub,.dash-row .empty .empty-sub{max-width:320px;margin-left:auto;margin-right:auto;}
/* ── v1.4.10.472: the dashboard, cleaned up (Jay: "Dashboard still looks messy, really clean it up and work on it so it
   looks really nice") ─────────────────────────────────────────────────────────────────────────────────────────────────
   · ONE card language: every block has the same radius, hairline border and soft shadow; panel headers sit on the
     card's own white (no grey wash) with a hairline under them.
   · The tiles say their number in ink; red only for something wrong. The tone rides the icon badge alone (it was a
     top bar, a tinted badge and a coloured number: three ways of saying one thing), and no glow blob.
   · A row's two cards align to the top: a short card no longer stretches into blank space beside a long one.
   · The hero: status and the quick actions on one line (the fact chips are gone: the tiles carry those numbers).
   · All quiet: everything with nothing to report, gathered into one row of small links (quietBox). */
.dash-v2 .panel,.dash-v2 .dk,.dash-v2 .dash-attn,.dash-v2 .dash-fu,.dash-v2 .clbcard,.dash-v2 .dash-quietbox,.dash-v2 .dash-intg{border:1px solid var(--line);border-radius:var(--dv-r);}
.dash-v2 .panel{box-shadow:var(--dv-shadow);}
.dash-v2 .panel-head{background:var(--surface);padding:15px 20px 12px;border-bottom:1px solid var(--line);}
.dash-v2 .panel-head h3{font-size:15px;font-weight:600;letter-spacing:-.01em;}   /* v1.4.10.473: 15/600 like every other panel title (was 14.5, off the scale) */
.dash-v2 .panel-sub,.dash-v2 .panel-head .device-meta{font-size:12px;}
.dash-v2 .dk::before,.dash-v2 .dk::after{content:none;display:none;}
.dash-v2 .dk .dk-v,.dash-v2 .dk.ok .dk-v,.dash-v2 .dk.warn .dk-v,.dash-v2 .dk.blue .dk-v,.dash-v2 .dk.purple .dk-v,.dash-v2 .dk.muted .dk-v{color:var(--text);}
.dash-v2 .dk.err .dk-v{color:var(--err);}
.dash-v2 .dk-v{margin:12px 0 3px;}   /* v1.4.10.473: the size is the KPI's 30/700 above (and 24 on a phone); a 28px here beat both */
.dash-v2 .dk-s{color:var(--text-mute);}
.dash-v2 .dk:hover{transform:none;border-color:color-mix(in srgb,var(--brand-blue) 35%,var(--line));box-shadow:var(--dv-shadow-hi);}
.dash-v2 .dash-row{align-items:start;}
.dash-v2 .dash-row > .panel{height:auto;}
.dash-v2 .dash-sec{margin:30px 0 14px;}
.dh-v2 .dh-statusrow{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:18px;}
.dh-v2 .dh-statusrow .dh-status,.dh-v2 .dh-statusrow .dh-quick{margin-top:0;}
.dh-v2 .dh-statusrow .dh-status{margin-right:6px;}
.dash-hero.dh-v2 > .dh-left{align-self:center;}
/* a donut's legend stays beside it (it ran the panel's full width, the numbers 1,000px from their labels) */
.dash-v2 .ins-donut-row{justify-content:flex-start;gap:28px;}
.dash-v2 .ins-donut-row .ins-legend{flex:0 1 360px;max-width:360px;}
/* the issues table: one line a row where it fits (the site and the room side by side), less padding */
.dash-v2 table.dash-issues td,.dash-v2 table.dash-issues th{padding-top:10px;padding-bottom:10px;}
/* figures in ink (the colours said the same thing as the meters under them) */
.dash-v2 .dash-asset-figs .daf .v{color:var(--text);}
.dash-v2 .dash-asset-figs .daf{border:1px solid var(--line);background:var(--surface-2,#F6F8FB);border-radius:10px;}
/* ── v1.4.10.493: the dashboard, continued (Jay: "Continue on improving the dashboard layout") ──
   · A donut panel with nothing to list beside it (Device status on a healthy estate, Warranty coverage) spent a whole
     band on a 168px donut and a 360px legend: the legend is a row of stat chips across the width now (count, label and
     the share), so the panel is as short as the donut and reads left to right.
   · Active issues: the site and the room share one line where it fits (the room was a second line under every site,
     doubling the row's height); the SLA badges keep to one line.
   · A panel's header controls (View all, Open) sit on the baseline of the title, and a panel head wraps cleanly on a
     narrow band. */
.dash-v2 .panel-body.ins-donut-row:not(.has-attn){align-items:center;gap:22px 28px;}
.dash-v2 .panel-body.ins-donut-row:not(.has-attn) .ins-legend{flex:1 1 320px;max-width:none;display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px;min-width:0;}
.dash-v2 .panel-body.ins-donut-row:not(.has-attn) .ins-leg{display:flex;align-items:center;gap:9px;min-height:50px;padding:8px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);font-size:12px;min-width:0;}
.dash-v2 .panel-body.ins-donut-row:not(.has-attn) .ins-leg .dot{width:10px;height:10px;border-radius:3px;}
.dash-v2 .panel-body.ins-donut-row:not(.has-attn) .ins-leg .lab{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-mute);font-weight:500;}
.dash-v2 .panel-body.ins-donut-row:not(.has-attn) .ins-leg .num{font-size:18px;font-weight:600;letter-spacing:-.02em;color:var(--text);}
.dash-v2 .dash-issues td.di-loc{white-space:nowrap;}
.dash-v2 .dash-issues td.di-loc .device-meta{display:inline;margin-left:0;}
.dash-v2 .dash-issues td.di-loc .device-meta:not(:empty)::before{content:'·';margin:0 6px;color:var(--text-dim);}
.dash-v2 .dash-issues td.di-subj{min-width:220px;}
.dash-v2 .panel-head{align-items:flex-start;flex-wrap:wrap;row-gap:8px;}
.dash-v2 .panel-head > .head-actions{margin-left:auto;}
@media(max-width:760px){
  .dash-v2 .panel-body.ins-donut-row:not(.has-attn){justify-content:center;}
  .dash-v2 .panel-body.ins-donut-row:not(.has-attn) .ins-legend{grid-template-columns:repeat(2,minmax(0,1fr));flex-basis:100%;}
  .dash-v2 .dash-issues td.di-loc{white-space:normal;}
}
.dash-quietbox{display:flex;align-items:center;flex-wrap:wrap;gap:8px 14px;padding:10px 14px;margin-bottom:var(--dv-gap);
  background:var(--surface);box-shadow:var(--dv-shadow);}
.dqb-h{display:inline-flex;align-items:center;gap:8px;font-size:11px;font-weight:600;color:var(--text-mute);letter-spacing:.06em;text-transform:uppercase;flex:none;}   /* v1.4.10.473: 11/600 .06em, the uppercase label (was 700, .07em) */
.dqb-h .da-dot{background:var(--ok);box-shadow:0 0 0 3px color-mix(in srgb,var(--ok) 18%,transparent);}
.dqb-items{display:flex;flex-wrap:wrap;gap:6px;min-width:0;flex:1 1 auto;}
.dash-quietbox .dash-okline,.dash-quietbox .dash-okline.dash-quiet{display:inline-flex;align-items:center;flex:0 1 auto;gap:7px;margin:0;padding:0 12px;min-height:32px;
  border-radius:999px;border:1px solid var(--line);box-shadow:none;background:var(--surface-2,#F6F8FB);font-size:12px;font-weight:500;
  color:var(--text-mute);max-width:100%;flex-wrap:nowrap;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}   /* v1.4.10.473: the quiet chip 12/500 (was 12.5) */
.dash-quietbox .dash-okline[role="button"]{cursor:pointer;}
.dash-quietbox .dash-okline[role="button"]:hover{border-color:var(--brand-blue);color:var(--text);}
.dash-quietbox .dash-okline .dol-go{display:none;}
.dash-quietbox .dash-okline .da-dot{width:7px;height:7px;box-shadow:none;}
.dash-quietbox .dash-okline.dash-quiet .dq-h{font-size:12px;font-weight:600;color:var(--text);}   /* v1.4.10.473: the chip's name at the chip's 12, in 600 like the counts in the attention chips (it was the chip's 12.5) */
.dash-quietbox .dash-okline.dash-quiet .dq-t{font-size:12px;max-width:300px;}
@media(max-width:760px){
  .dash-quietbox{padding:10px 12px;}
  .dash-quietbox .dash-okline,.dash-quietbox .dash-okline.dash-quiet{min-height:40px;white-space:normal;}
  .dash-quietbox .dash-okline.dash-quiet .dq-t{display:none;}
  .dash-quietbox .dash-okline.dash-quiet:has(.dq-live){padding:3px 3px 3px 12px;}   /* v1.4.10.473: the 40px Live control sits inside its chip (it touched the chip's edges) */
  .dh-v2 .dh-statusrow{margin-top:14px;}
  /* v1.4.10.473: the date on its own line under the portal, without the separator (the '/' dangled at the end of the
     first line and the date wrapped flush left under the LED) */
  .dh-v2 .dh-eyebrow{row-gap:4px;}
  .dh-v2 .dh-eyebrow .dh-sub-sep{display:none;}
  .dh-v2 .dh-eyebrow .dh-today{flex-basis:100%;padding-left:16px;}
  /* v1.4.10.473: the quick actions two to a row, a lone last one across both (three wrapped 2 + 1 at the left) */
  .dh-v2 .dh-quick{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));width:100%;}
  .dh-v2 .dh-quick > .dh-qa{justify-content:center;min-width:0;}
  .dh-v2 .dh-quick > .dh-qa:last-child:nth-child(odd){grid-column:1/-1;}
}
/* v1.4.10.426 — the area chart: an SVG plot with ordinary text axes around it */
.ins-area{display:grid;grid-template-columns:auto minmax(0,1fr);column-gap:8px;padding-bottom:22px;}
.ins-area-y{position:relative;height:var(--ia-h,200px);min-width:22px;}
.ins-area-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap;line-height:1;}
.ins-area-yw{display:block;visibility:hidden;height:0;overflow:hidden;font-size:11px;font-style:normal;font-variant-numeric:tabular-nums;white-space:nowrap;line-height:1;}   /* v1.4.10.445: sizes the y gutter to its widest label */
.ins-area-plot{position:relative;min-width:0;}
.fx-val{position:absolute;transform:translate(-50%,-100%);margin-top:-4px;font-size:11px;font-weight:500;color:var(--text-mute);white-space:nowrap;line-height:1;pointer-events:none;}   /* v1.4.10.445: finance chart bar values */
.fx-dot{position:absolute;width:7px;height:7px;margin:-5px 0 0 -5px;border-radius:50%;background:var(--brand-purple);border:1.6px solid var(--surface,#fff);} .fx-dot.blue{background:var(--brand-blue);}
.ins-now-tag{position:absolute;top:-14px;transform:translateX(-50%);font-size:11px;color:var(--text-dim);line-height:1;}   /* v1.4.10.445: insLineMarked's "now" */
.ins-area-plot svg{display:block;overflow:visible;}
.ins-area-x{position:absolute;left:0;right:0;top:100%;height:22px;}
.ins-area-x span{position:absolute;top:7px;font-size:11px;color:var(--text-dim);white-space:nowrap;line-height:1;}
/* v1.4.10.473: a narrow dashboard plot (a phone) keeps every other x label counted back from the last one: the 30-day
   flow's seven dates and the twelve acquisition months ran into each other at 280px */
.dash-v2 .ins-area-plot{container-type:inline-size;}
@container (max-width:440px){ .dash-v2 .ins-area-x:has(> span:nth-child(5)) span:nth-last-child(even){display:none;} }   /* v1.4.10.473: only on an axis of five labels or more (a two-point series lost its first year) */
/* v1.4.10.426: at the narrower two-column widths a ticket ref and a status pill never break */
.dash-v2 table.dash-issues td.di-ref strong{white-space:nowrap;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;}   /* v1.4.10.473: a ticket ref is a code: JetBrains Mono 12/600 as at the top of the ticket (it was Poppins 13/700) */
.dash-v2 table.dash-issues td.di-ref{white-space:nowrap;}
.dash-mon .dsr .pill{white-space:nowrap;flex:none;}

/* ══ v1.4.10.433 — AVDesk's own drawings ════════════════════════════════════════════════════════════════
   The icon set is AVDesk's (AVI in js/01-core.js): one accent stroke per drawing (.ac, or .acf when it is a
   filled shape) and a status LED (.led) on the hardware. Both stay currentColor unless a surface sets
   --ico-ac, which is how the brand violet reaches the navigation, the tiles and the empty states without
   ever colouring an icon that carries a meaning of its own (a red delete, a green check). */
svg .ac{stroke:var(--ico-ac,currentColor);}
svg .acf{fill:var(--ico-ac,currentColor);}
svg .led{fill:var(--ico-led,currentColor);}
.nav-item.active .ico,.nav-dd-trigger.has-active .ico,.nav-dd-item.active .ico,.nav-dd-item:hover .ico,
.akpi-ico.blue,.akpi-ico.purple,.empty .empty-ico,.lg-fi,.ph-chip,.ico-brand{--ico-ac:var(--brand-purple);}
.nav-item.active .ico .led,.nav-dd-item.active .ico .led,.empty .empty-ico .led{--ico-led:#16A34A;}

/* Empty states: a quiet tile with the AV mark's blade (the A's crossbar) running under the drawing, in
   place of the dotted drafting grid; an empty state with no drawing of its own shows the AV mark itself. */
.empty .empty-ico{border-radius:16px;background:linear-gradient(160deg,#FFFFFF 0%,#F3F5FF 100%);
  border:1px solid rgba(var(--bc-grad-b-rgb),.16);box-shadow:0 12px 26px -18px rgba(var(--bc-grad-a-rgb),.55),inset 0 1px 0 #fff;overflow:hidden;}
.empty .empty-ico::before{content:none;display:none;}
.empty .empty-ico::after{content:'';position:absolute;inset:auto -10% 9px -10%;height:9px;border-radius:0;
  background:var(--brand-grad);opacity:.16;transform:skewX(-38deg) rotate(-8deg);pointer-events:none;}
.empty .empty-ico svg{width:28px;height:28px;}
.empty:not(:has(.empty-ico)):not(:has(svg))::before{border-radius:16px;background:linear-gradient(160deg,#FFFFFF 0%,#F3F5FF 100%);
  border:1px solid rgba(var(--bc-grad-b-rgb),.16);}
.empty:not(:has(.empty-ico)):not(:has(svg))::after{opacity:1;
  -webkit-mask:url("../img/avdesk-mark-mono.svg") center/30px auto no-repeat;mask:url("../img/avdesk-mark-mono.svg") center/30px auto no-repeat;}

/* v1.4.10.433 — the eyebrows speak in the brand face. The monospace status line with an always-green pulsing
   LED read as a template; a page hero now opens with the AV blade (the A's crossbar, in the brand gradient)
   and plain words. The dashboard keeps its LED because it carries the estate's health, but it no longer pulses. */
.ph-eyebrow,.ah-eyebrow,.dh-v2 .dh-eyebrow{font-family:var(--font-display);font-weight:600;letter-spacing:.06em;font-size:11px;}   /* v1.4.10.473: the display role token (was the --font-brand face token) */
.ph-eyebrow .ph-live{width:15px;height:4px;border-radius:1px;background:var(--brand-grad);box-shadow:none;animation:none;
  transform:skewX(-38deg);margin-right:2px;}
.dh-v2 .dh-led,.dh-v2 .dh-led.warn,.dh-v2 .dh-led.err{animation:none;}
.topbrand .brand-text small{font-family:var(--font-display);font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase;}   /* v1.4.10.473: the display role token (was --font-brand) */
/* v1.4.10.433 — no soft colour glow in the corner of the dashboard's tiles (a stock-template flourish). */
.dash-v2 .dk::after{content:none;display:none;}
/* Dev Team: drawn reactions and empty-state glyphs (v1.4.10.433) */
.dv-react .dv-rx-g,.dv-react-menu .dv-rx-g{display:inline-flex;font-size:15px;color:var(--brand-purple);vertical-align:-2px;}
.dv-react-menu button .dv-rx-g{font-size:18px;}
.dv-empty-g{font-size:36px;margin-bottom:10px;color:var(--brand-blue);--ico-ac:var(--brand-purple);}
/* v1.4.10.433 — the drawn step in a menu path (GLY_SEP) */
.gsep{display:inline-flex;align-items:center;opacity:.55;margin:0 .1em;vertical-align:-.1em;}
.gsep svg.gly{width:.82em;height:.82em;vertical-align:0;}
/* v1.4.10.433 — the reload splash is the AVDesk app icon (the favicon's navy tile and gradient mark), with the
   loading ring around it rather than a bare gradient square */
#av-resume .avr-mark{width:52px;height:52px;border-radius:15px;background:var(--bc-navy);box-shadow:0 12px 26px -12px rgba(var(--bc-navy-rgb),.6);}
#av-resume .avr-mark img{position:absolute;left:50%;top:50%;width:32px;height:auto;transform:translate(-50%,-52%);display:block;}
#av-resume .avr-mark span{inset:-5px;border-radius:19px;border:2px solid rgba(var(--bc-grad-a-rgb),.18);border-top-color:var(--bc-grad-b);}
/* v1.4.10.433 — every map's zoom buttons are AVDesk controls: the app's button shape, and the plus and minus drawn
   (the AVI strokes as a mask) instead of Leaflet's stock "+" and "−" characters */
.leaflet-bar{border:1px solid var(--line) !important;border-radius:10px !important;box-shadow:0 6px 16px -10px rgba(12,27,42,.35) !important;overflow:hidden;}
.leaflet-control-zoom a{width:32px !important;height:32px !important;line-height:32px !important;font-size:0 !important;color:transparent !important;
  background:#fff !important;border-bottom:1px solid var(--line) !important;position:relative;}
.leaflet-control-zoom a:last-child{border-bottom:0 !important;}
.leaflet-control-zoom a::before{content:'';position:absolute;inset:0;background:var(--brand-blue);
  -webkit-mask:var(--zm) center/16px 16px no-repeat;mask:var(--zm) center/16px 16px no-repeat;}
.leaflet-control-zoom a:hover{background:var(--accent-soft,var(--bc-accent-soft)) !important;}
.leaflet-control-zoom a.leaflet-disabled::before{background:var(--text-dim);opacity:.5;}
.leaflet-control-zoom-in{--zm:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round'><path d='M12 5.2v13.6M5.2 12h13.6'/></svg>");}
.leaflet-control-zoom-out{--zm:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round'><path d='M5.2 12h13.6'/></svg>");}
.ah-bc-sep{display:inline-flex;align-items:center;margin:0 .12em;vertical-align:-.12em;}
.ah-bc-sep svg.gly{width:.85em;height:.85em;}

/* v1.4.10.433: a greyed band (an Ody enrolled but never heard from) still carries its stats row. st-muted named
   only "id acts", so the stats row's area did not exist: the grid invented columns for it and the box, its name
   and "Heartbeat never" were squeezed to 0 px, one letter per line. The row comes back whenever it is there. */
.mon-band.st-muted:has(> .mon-stats){grid-template-areas:"id acts" "stats stats";}
@media (max-width:980px){ .mon-band.st-muted:has(> .mon-stats){grid-template-areas:"id" "acts" "stats";} }
/* …and until the box has told Control its host name, "Ody box" is a label, not a host name: the app's own type */
.mon-host.unnamed{font-family:inherit;letter-spacing:0;}

/* ── v1.4.10.434: Due by / Done on (js/18 tkWhen*) ─────────────────────────── */
/* v1.4.10.656: the picker's wrapper is .tk-when (it was .tkw, the class the ticket window took in this release, so the window's
   rules reached into the picker and the picker's gap into the window); its parts keep their tkw- names (the batteries read them) */
.tk-when{display:flex;flex-direction:column;gap:8px;}
.tkw-seg,.tkw-sub{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:3px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);}
.tkw-sub{border-radius:8px;background:transparent;}
.tkw-seg button,.tkw-sub button{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;background:transparent;color:var(--text-mute);font:inherit;font-size:12px;font-weight:600;padding:7px 8px;border-radius:7px;cursor:pointer;min-width:0;}
.tkw-seg button svg,.tkw-sub button svg{width:15px;height:15px;flex:none;}
.tkw-seg button span,.tkw-sub button span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.tkw-seg button.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);}
.tkw-sub button.on{background:color-mix(in srgb, var(--brand-purple) 12%, transparent);color:var(--brand-purple);}
.tkw-help{margin:0;font-size:12px;color:var(--text-mute);line-height:1.45;}
.tk-when .avdt-quick{margin:0;}
.tkw-cal{padding:8px;}
.avdt-d.tkw-in{background:color-mix(in srgb, var(--brand-purple) 14%, transparent);border-radius:0;}
.avdt-d.tkw-in.sel,.avdt-d.tkw-pk{background:var(--brand-purple);color:#fff;border-radius:6px;box-shadow:none;}
.tkw-hours .avdt-allday{margin-top:2px;}
.tkw-hrow{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:8px;}
.tkw-hrow label{display:flex;flex-direction:column;gap:4px;font-size:12px;font-weight:500;color:var(--text-mute);}
.tkw-hrow .avdt-tin{width:100%;}
.tkw-note{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:12px;color:var(--brand-purple);} .tkw-note svg{width:14px;height:14px;flex:none;}
.tk-when .avdt-sum{margin-top:0;}
.tk-chip.due.on{background:color-mix(in srgb, var(--brand-purple) 10%, transparent);color:var(--brand-purple);}
.tk-chip.due.on.today{background:#FFF7ED;color:#B45309;} .tk-chip.due.on.over{background:#FEF2F2;color:#DC2626;}
.tk-cal-item.on .tk-cal-dot{border-radius:2px;width:10px;}
@media (max-width:700px){ .tkw-seg button,.tkw-sub button{min-height:40px;font-size:12px;} .tkw-hrow .avdt-tin{min-height:40px;font-size:16px;} }

/* v1.4.10.436 — a list that cannot be deleted yet; a closed task's deleted list; the Reflect reading + clear */
.tk-mini.blocked{opacity:.45}
.tk-chip.list.gone{opacity:.85}
.tk-chip.list.gone i{font-style:normal;color:var(--text-mute)}
.ipol-read{margin-top:4px;line-height:1.35}
.ipol-clear{margin-top:6px}

/* ═══ v1.4.10.438 — THE ASSET VIEW ON A PHONE: the head scrolls away, the tabs stay ═══════════════════════════
   Jay: "When I went on an android mobile phone, went to asset, I couldn't see the bottom of the asset information
   at all, the header had eaten up all the space. Make sure its android and ios friendly, maybe for mobiles not need
   such a big heroes." Two faults. (1) The panel pinned its head and scrolled only the body, inside a panel capped to
   the screen: a head as tall as the screen left the body NO height and nothing to scroll (the one escape was the
   max-height:500px rule above). (2) The phone head was keyed on WIDTH (680px and under), so an Android phone in
   Chrome's "Desktop site" (a 980px page), a foldable or a tablet got the desktop head: a 150px photo, the 140px QR
   tile and six labelled buttons wrapping to three rows, in a 60px-inset panel.
   Now, on any touch screen up to 1100px wide and in any window up to 680px: the compact head (the three blocks
   above take the same condition), the panel is the whole screen and ONE scroller — the head scrolls away with the
   page, the tab strip sticks to the top, the close button stays in the corner — and the head's breadcrumb, sub-line
   and figures keep to one line each (a long room name scrolls sideways instead of wrapping to three lines).
   Measured on an asset in the ICC room "X05-U05_Floor Comms Distr-FCD Room Adj. to Hall 6": the head 420px -> 259px
   at 390x664 and 412x780, 543px -> 255px on a 768x1024 tablet, 361px -> 255px at Android's "Desktop site" 980px;
   held sideways (780x360) the tab strip and the close button stay on screen at the end of the page (both were
   scrolled away before). Desktop (a mouse) is unchanged. */
@media (max-width:680px), (hover:none) and (pointer:coarse) and (max-width:1100px){
  .modal-back:has(> .modal-asset){padding:0;}
  #modal-inner.modal-asset{width:100vw;max-width:100vw;height:100vh;height:100dvh;max-height:100vh;max-height:100dvh;
    margin:0;border-radius:0;display:block;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;}
  #modal-inner.modal-asset > .ah-head{border-radius:0;padding-top:calc(12px + env(safe-area-inset-top));
    padding-left:max(14px, env(safe-area-inset-left));padding-right:max(14px, env(safe-area-inset-right));}
  /* the close button stays in the corner however far the page is scrolled: dark glass reads on the navy head and
     on the light tab strip alike */
  #modal-inner.modal-asset > .ah-head .close{position:fixed;z-index:9;top:calc(8px + env(safe-area-inset-top));right:calc(8px + env(safe-area-inset-right));
    width:44px;height:44px;min-width:44px;min-height:44px;border-radius:50%;background:rgba(15,23,42,.62);
    border:1px solid rgba(255,255,255,.28);display:flex;align-items:center;justify-content:center;
    -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);}
  #modal-inner.modal-asset > .ah-head .close svg{width:18px;height:18px;stroke:#fff;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-thumb.xl{width:56px;height:56px;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  /* at most two lines: the steps flow as text (a long room name wraps where it needs to) and a third line is cut
     with an ellipsis — it was three or four lines, the space-code chip on a line of its own. The full place is on
     the Overview's Placement card, just below. */
  #modal-inner.modal-asset .ah-head.asd-hero .ah-breadcrumb{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;
    overflow:hidden;white-space:normal;margin-top:6px;line-height:1.6;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-bc-part{display:inline;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-bc-sep{display:inline-block;margin:0 5px;vertical-align:-1px;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-bc-code{display:inline-block;margin-left:6px;line-height:1.35;vertical-align:1px;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-quickstats{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;
    -webkit-overflow-scrolling:touch;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-quickstats > *{flex:0 0 auto;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-quickstats::-webkit-scrollbar{display:none;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-quickstats{gap:16px;margin-top:8px;}
  #modal-inner.modal-asset .ah-head.asd-hero .ah-mfr-logo{height:20px;max-width:72px;}
  /* the body flows under the head; the tabs are a strip that sticks to the top of the panel */
  #modal-inner.modal-asset .adt-body{display:block;min-height:0;}
  #modal-inner.modal-asset .adt-tabs{position:sticky;top:0;z-index:6;display:flex;flex-direction:row;width:auto;align-self:auto;
    border-right:0;border-bottom:1px solid var(--line);overflow-x:auto;overflow-y:hidden;gap:6px;
    padding:8px 60px 8px max(10px, env(safe-area-inset-left));background:var(--surface-2);scrollbar-width:none;}
  #modal-inner.modal-asset .adt-tabs::-webkit-scrollbar{display:none;}
  #modal-inner.modal-asset .adt-railgroup{display:none;}
  #modal-inner.modal-asset .adt-tab{width:auto;flex-shrink:0;padding:9px 12px;font-size:13px;}   /* v1.4.10.473: tab 13/600 (was 12) */
  #modal-inner.modal-asset .adt-tab.active::before{display:none;}
  #modal-inner.modal-asset .adt-tab .adt-count{margin-left:4px;}
  #modal-inner.modal-asset .adt-panes{overflow:visible;min-height:0;
    padding:16px max(16px, env(safe-area-inset-right)) calc(28px + env(safe-area-inset-bottom)) max(16px, env(safe-area-inset-left));}
}
/* v1.4.10.438 — on a phone's width the head is identity, place and actions only: the figures strip (connection,
   value, cost, warranty, assignee) repeats the Overview's health banner and key facts, which now sit directly under
   the tab strip, and on 390px it was a second 56px row. Touch screens wider than 600px keep it, on one line. */
@media (max-width:600px){
  #modal-inner.modal-asset .ah-head.asd-hero .ah-quickstats{display:none;}
}

/* ═══ v1.4.10.438 — THE DASHBOARD CONDENSES TO WHAT IT HAS (see dashQuiet in js/03-pages.js) ══════════════════════
   A panel with nothing to say is one line in its section's quiet strip; a lone narrow panel shares a band with the
   next one; Your work spreads its rows across the width when it has the band to itself; the device donut lists
   what needs attention beside it. */
.dash-oklines.dash-quietlines{display:flex;flex-wrap:wrap;}
.dash-oklines.dash-quietlines > .dash-okline{flex:1 1 380px;min-width:0;}
.dash-okline.dash-quiet{font-weight:500;color:var(--text-mute);background:var(--surface);min-height:44px;flex-wrap:nowrap;}
.dash-okline.dash-quiet .dq-h{font-weight:700;color:var(--text);white-space:nowrap;}
.dash-okline.dash-quiet .dq-t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;}
.dash-okline.dash-quiet .dq-t::before{content:"·";margin:0 7px 0 1px;color:var(--text-dim);}
.dash-okline.dash-quiet .dq-live{flex-shrink:0;display:inline-flex;}
.dash-okline.dash-quiet .dq-live .live-toggle{margin-left:4px;}
.da-dot.quiet{background:var(--text-dim);box-shadow:0 0 0 3px color-mix(in srgb,var(--text-dim) 16%,transparent);}
.dash-okline.dash-quiet:not([role="button"]){cursor:default;}
.dash-okline.dash-quiet:not([role="button"]):hover{box-shadow:var(--shadow-sm);}
/* the device donut's "needs attention" list */
.ins-donut-row.has-attn{align-items:flex-start;}
.dash-devattn{flex:1 1 300px;min-width:0;border-left:1px solid var(--line);padding-left:18px;}
.dash-devattn .dda-h{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);margin:2px 0 6px;}
.dash-devattn .dda-row{display:flex;align-items:center;gap:10px;padding:7px 8px;border-radius:6px;cursor:pointer;}
.dash-devattn .dda-row:hover{background:var(--surface-2);}
.dash-devattn .dda-main{flex:1;min-width:0;}
.dash-devattn .dda-main .t{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dash-devattn .dda-main .s{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}   /* v1.4.10.473: row title 13/600 and its meta 12, as the rest of the dashboard's lists (were 12 and 11) */
.dash-devattn .dda-more{padding:6px 8px 0;}
@media (max-width:700px){ .dash-devattn{border-left:0;padding-left:0;border-top:1px solid var(--line);padding-top:10px;flex-basis:100%;} }
/* Your work: a lane wide enough for two (it has the band to itself, or a wide lane) sets its rows in two columns */
.dyw-lane{container-type:inline-size;}
@container (min-width:700px){
  .dyw-lane-b{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 10px;align-items:start;}
  .dyw-lane-b > .dyw-row+.dyw-row{margin-top:0;}
  .dyw-lane-b > .dyw-more,.dyw-lane-b > .dyw-empty{grid-column:1/-1;}
}
@container (min-width:1100px){ .dyw-lane-b{grid-template-columns:repeat(3,minmax(0,1fr));} }
.dsr-idle{margin-top:10px;padding:9px 12px;border-radius:8px;background:var(--surface-2);font-size:12px;color:var(--text-mute);}   /* v1.4.10.438 */
@media (max-width:560px){   /* v1.4.10.438: a quiet line may take two lines on a phone rather than lose its words */
  .dash-okline.dash-quiet{flex-wrap:wrap;row-gap:2px;}
  .dash-okline.dash-quiet .dq-t{white-space:normal;flex:1 1 60%;}
  .dash-okline.dash-quiet .dq-t::before{display:none;}
}
/* ═══ v1.4.10.438 — TASKS BY LIST, LAID OUT AS CARDS (tkListHtml) ═══════════════════════════════════════════════════
   Each group is a card with its facts in the heading (open · overdue · today · how far through a list); on the All
   sites board a site's card holds its lists as sections; long groups show their first rows and "Show all"; rows keep
   to one line where the screen is wide enough (title left, facts right). */
.tk-listwrap{display:flex;flex-direction:column;gap:14px;}
.tk-quick-panel{margin:0;} .tk-quick-panel .tk-quick{border-bottom:0;border-radius:var(--radius);}
.tk-listwrap > .tk-group{background:var(--surface);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow-sm);overflow:hidden;}
.tk-listwrap > .tk-group > .tk-group-head{padding:12px 16px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,var(--surface),var(--surface-2));}
.tk-listwrap > .tk-group.collapsed > .tk-group-head{border-bottom:0;}
.tk-listwrap > .tk-group > .tk-rows > .tk-row:first-child,.tk-sub > .tk-rows > .tk-row:first-child{border-top:0;}
.tk-listwrap > .tk-group > .tk-group-head h4{font-size:15px;}
.tk-listwrap > .tk-group.tk-done-group{margin-top:0;border-radius:12px;background:var(--surface-2);}
.tk-ghead-facts{margin-left:auto;display:inline-flex;align-items:center;gap:7px;flex-wrap:wrap;justify-content:flex-end;}
.tk-group-head .tk-ghead-facts + .tk-mini,.tk-sub-head .tk-ghead-facts + .tk-mini{margin-left:2px;}
.tk-gpill{font-size:11px;font-weight:600;padding:2px 8px;border-radius:999px;white-space:nowrap;}
.tk-gpill.err{background:#FEF2F2;color:#DC2626;} .tk-gpill.warn{background:#FFF7ED;color:#B45309;}
.tk-gprog{display:inline-block;width:72px;height:6px;border-radius:3px;background:var(--surface-3);overflow:hidden;}
.tk-gprog > span{display:block;height:100%;border-radius:3px;background:var(--ok);}
.tk-gprog-l{font-size:11px;font-weight:600;color:var(--text-mute);white-space:nowrap;}
.tk-gsub{font-size:12px;color:var(--text-mute);white-space:nowrap;}
.tk-subgroups{display:flex;flex-direction:column;}
.tk-sub + .tk-sub{border-top:1px solid var(--line);}
.tk-sub-head{display:flex;align-items:center;gap:8px;padding:8px 16px 8px 22px;background:var(--surface-2);cursor:pointer;user-select:none;border-bottom:1px solid var(--line);}
.tk-sub-head h5{margin:0;font-size:13px;font-weight:600;}
.tk-sub-head .tk-caret svg{width:14px;height:14px;}
.tk-sub > .tk-rows > .tk-row{padding-left:22px;}
.tk-showall{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;border:0;border-top:1px dashed var(--line);background:transparent;color:var(--brand-blue);font:inherit;font-weight:500;font-size:13px;padding:9px;cursor:pointer;}
.tk-showall:hover{background:var(--surface-2);} .tk-showall svg{width:14px;height:14px;}
.tk-foldbar{display:flex;align-items:center;justify-content:flex-end;gap:14px;font-size:12px;padding:0 6px;margin-bottom:-4px;}
.tk-foldbar a{color:var(--brand-blue);font-weight:600;text-decoration:none;} .tk-foldbar .device-meta{margin-right:auto;}
/* one line where there is room: the title takes the space it needs, the facts sit to its right, and wrap under it
   only when the two do not fit side by side */
.tk-listwrap .tk-row .tk-main{display:flex;flex-wrap:wrap;align-items:center;column-gap:14px;row-gap:3px;}
.tk-listwrap .tk-row .tk-title{flex:1 1 300px;min-width:0;}
.tk-listwrap .tk-row .tk-chips{flex:0 1 auto;margin-top:0;justify-content:flex-end;}
.tk-listwrap .tk-row{padding-top:9px;padding-bottom:9px;}
@media (max-width:900px){
  .tk-listwrap .tk-row .tk-main{display:block;}
  .tk-listwrap .tk-row .tk-chips{justify-content:flex-start;margin-top:4px;}
  .tk-ghead-facts .tk-gprog,.tk-ghead-facts .tk-gprog-l{display:none;}
  .tk-sub-head{padding-left:16px;} .tk-sub > .tk-rows > .tk-row{padding-left:16px;}
}
@media (max-width:760px){
  .tk-listwrap{gap:10px;}
  .tk-listwrap > .tk-group > .tk-group-head,.tk-sub-head{min-height:44px;}
  .tk-showall{min-height:44px;}
  .tk-foldbar a{min-height:40px;display:inline-flex;align-items:center;}
  /* v1.4.10.473: the row's small icon buttons are 40px wide too (were 26x40), so each is a whole tap target */
  .tk-group-head .tk-mini,.tk-sub-head .tk-mini,.tk-col-head .tk-mini,.tk-item .tk-mini,.tk-tp-sel .tk-mini{min-width:40px;}
}
/* v1.4.10.473: a placeholder longer than its box ends in an ellipsis (the quick add's example and the pickers' hints
   cannot fit a phone's width at 16px) */
.tk-quick input,.tk-tp-box input,.tk-search input{text-overflow:ellipsis;}
@media (max-width:700px){
  /* v1.4.10.438: the toolbar is a column here, so the search box's flex-basis (220px) became its HEIGHT: a 220px-tall
     search field on every phone. It is one line tall. */
  .tk-tb2 .tk-tb-main .tk-search{flex:0 0 auto;min-height:40px;}
}
@media (max-width:760px){
  /* v1.4.10.438: the phone rule that hides the quick-add hint also emptied the "pick a site first" bar to a lone + */
  .tk-quick.muted .device-meta{display:inline;}
}
/* ═══ v1.4.10.440 — EVERY DASHBOARD LIST STOPS AT TEN (dashCap / dashMoreCtl / dashPackDecks in js/03-pages.js) ═══════
   The control under a capped list: how many of how many on the left, Show less / Show N more on the right. It sits in
   the list's own panel (a table's flush body gets the panel's padding back), spans every column of a grid it sits in,
   and on a phone its buttons keep the 40px floor (the global .btn.sm rule at 700px and under). */
.dash-more{display:flex;align-items:center;gap:8px 12px;flex-wrap:wrap;margin-top:10px;padding-top:10px;border-top:1px solid var(--line);}
.dash-more .dm-n{font-size:12px;color:var(--text-mute);margin-right:auto;white-space:nowrap;}
.dash-more .dm-n b{color:var(--text);font-weight:700;}
.dash-more .dm-acts{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;margin-left:auto;}
.dash-more .btn{gap:6px;}
.dash-more .dm-ico{display:inline-flex;}
.dash-more .dm-ico svg{width:14px;height:14px;}
.panel-body.flush > .dash-more{margin:0;padding:10px 16px 12px;}
.dyw-lane-b > .dash-more{grid-column:1/-1;margin:6px 4px 2px;}
.dyw-other > .dash-more{margin-top:6px;}
.dash-devattn > .dash-more{margin-left:8px;}
.clbgrid + .dash-more{margin-top:14px;}
.dash-fu > .dash-more{border-top-color:#FDBA74;}
.dash-fu > .dash-more .dm-n{color:#9A3412;}
/* the one row that stands for every device behind a dark Ody */
.dash-devattn .dda-row.dda-dark .t{color:var(--err);}
/* the monitoring deck, packed: 1px rows, each card spanning its own height (dashPackOne), dense placement = the card
   goes under the shortest column. The span carries the gap below each card, so the deck keeps no margin of its own. */
.dash-v2 .dash-deck.dv-packed{grid-auto-rows:1px;grid-auto-flow:row dense;row-gap:0;align-items:start;margin-bottom:0;}
.dash-v2 .dash-deck.dv-packed > *{align-self:start;}
@media (max-width:560px){
  .dash-more .dm-n{flex:1 1 100%;margin-right:0;}
  .dash-more .dm-acts{margin-left:0;width:100%;}
  .dash-more .dm-acts .btn{flex:1 1 0;justify-content:center;}
}

/* v1.4.10.441 — My day email (js/18 tkDayMail): the signed-in person's own day email for a day, as it is sent. */
#modal-inner .tk-dm{display:flex;flex-direction:column;gap:12px;}
.tk-dm-top{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;}
.tk-dm-days button{min-width:84px;}
.tk-dm-pickl{display:inline-flex;align-items:center;gap:8px;font-size:12px;font-weight:500;color:var(--text-mute);}
.tk-dm-pick{height:34px;border:1px solid var(--line);border-radius:6px;padding:0 10px;font:inherit;font-size:13px;font-weight:400;color:var(--text);background:var(--surface);}
.tk-dm-subj{font-size:13px;line-height:1.45;color:var(--text);padding:9px 12px;border:1px solid var(--line);border-radius:6px;background:var(--surface-2);overflow-wrap:anywhere;}
.tk-dm-subj span{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin-right:6px;}
.tk-dm-frame{display:block;width:100%;height:560px;border:1px solid var(--line);border-radius:8px;background:#F4F7FA;}
.tk-dm-rule{margin:0;font-size:12px;line-height:1.55;color:var(--text-mute);}
.tk-ev-why{color:var(--text-mute);}
@media (max-width:700px){
  .tk-dm-top{gap:10px;}
  .tk-dm-pickl{width:100%;}
  .tk-dm-pick{flex:1 1 auto;height:44px;font-size:16px;}
  .tk-dm-days{width:100%;} .tk-dm-days button{flex:1 1 0;min-height:44px;}
}
/* v1.4.10.441 — the on/off switch on a touch screen. The coarse tap floor (button{min-height:40px}, v248) stretched the
   42x24 track to 42x40, so every switch (Task settings, the site Modules panel) drew as a blue disc with its dot in the
   top corner. The button keeps its 40px tap height, transparent; the track is drawn inside it at its own 24px. */
@media (hover:none) and (pointer:coarse){
  .rost-switch{ width:46px; min-width:46px; height:40px; min-height:40px; background:transparent !important; border-radius:0; }
  .rost-switch::before{ content:''; position:absolute; left:2px; right:2px; top:8px; height:24px; border-radius:20px; background:var(--surface-3); transition:background .15s; }
  .rost-switch.on::before{ background:var(--brand-blue); }
  .rost-switch .rost-switch-dot{ top:11px; left:5px; z-index:1; }
  .rost-switch.on .rost-switch-dot{ left:23px; }
}
/* v1.4.10.441 — Tasks on a phone: the tiles three to a row without their sub-line, the pickers two to a row, the five
   secondary buttons under More, the filters behind a Filters button. The first task moves from 1,437px down to within
   the first screen and a half at 390x664 (js/18 tkTbMore / tkFiltersToggle). Wide screens are unchanged. */
.tk-tb2 .tk-tb-more, .tk-tb2 .tk-tb-ftog{display:none;}
.tk-tb-ftog .tk-tb-fn{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;margin-left:2px;border-radius:9px;background:var(--brand-blue);color:#fff;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;}   /* v1.4.10.473: badge look */
.tk-tb-ftog.on{border-color:var(--brand-blue);color:var(--brand-blue);}
.tk-tb-menu button svg{width:15px;height:15px;flex:0 0 auto;}
@media (max-width:700px){
  .tk-rail{grid-template-columns:repeat(3,1fr);gap:6px;}
  .tk-rail .tk-tile{padding:8px 9px 7px;min-height:0;gap:1px;}
  .tk-rail .tk-tile-v{font-size:20px;}
  .tk-rail .tk-tile-l{font-size:11px;line-height:1.25;}
  .tk-rail .tk-tile-s{display:none;}
  .tk-tb2 .tk-tb-main{display:grid;grid-template-columns:1fr 1fr;gap:8px;}
  .tk-tb2 .tk-tb-main > .tk-tabs, .tk-tb2 .tk-tb-main > .tk-search, .tk-tb2 .tk-tb-main > .tk-tb-right{grid-column:1 / -1;}
  .tk-tb2 .tk-tb-main > .tk-client, .tk-tb2 .tk-tb-main > .tk-site, .tk-tb2 .tk-tb-main > .tk-listpick{width:100%;max-width:none;min-width:0;}
  .tk-tb2 .tk-tb-right{display:flex;flex-wrap:wrap;gap:8px;width:100%;margin-left:0;}
  .tk-tb2 .tk-tb-right .tk-viewtog{flex:1 1 auto;display:flex;grid-column:auto;}
  .tk-tb2 .tk-tb-right .tk-tb-sec{display:none;}
  .tk-tb2 .tk-tb-right .tk-tb-more, .tk-tb2 .tk-tb-right .tk-tb-ftog{display:inline-flex;align-items:center;justify-content:center;gap:5px;flex:0 0 auto;min-height:40px;min-width:40px;}
  .tk-tb2 .tk-tb-right .tk-new{flex:1 1 100%;grid-column:auto;}
  .tk-tb2 .tk-tb-filters:not(.open) > :not(.tk-tb-count){display:none;}
  .tk-tb2 .tk-tb-filters:not(.open){margin-top:6px;padding-top:6px;}
}

/* ═══ v1.4.10.452 — VALUE & LIFECYCLE ═══════════════════════════════════════════════════════════════════════════════
   The asset's Value & lifecycle tab (js/05 avvTabHtml), the Overview's value band (avvOverviewHtml), the editor's live
   preview (aeValuePreview) and the forecast's category / site panels (js/03 fxCategoryValuePanel, fxSiteStagePanel).
   The chart is an .ins-area: the SVG draws only the plot, the axis text, the marker chips, the dots and the readout are
   HTML and keep their size at any width. Every size is a step of the scale; uppercase tracks in em. */
.avv{display:flex;flex-direction:column;gap:18px;}
.avv-panel{margin:0;}
.avv-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px;}
.avv-kpi{background:var(--surface,#fff);border:1px solid var(--line);border-top:3px solid var(--kc,var(--brand-blue));border-radius:7px;padding:13px 15px;min-width:0;}
/* v1.4.10.473: line-height 1.25 (was 1.1) — the overflow:hidden box clipped 3px off the figure */
.avv-kpi .v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.avv-kpi .l{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);font-weight:600;margin-top:4px;}
.avv-kpi .s{font-size:12px;color:var(--text-dim);margin-top:2px;line-height:1.4;}
.avv-grid2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;}
/* the curve */
.avv-chart{padding-bottom:24px;}
.avv-plot{touch-action:pan-y;cursor:crosshair;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none;}
.avv-chart.compact .avv-plot{cursor:default;}
.avv-dot{position:absolute;width:12px;height:12px;margin:-6px 0 0 -6px;border-radius:50%;background:var(--brand-purple);border:2px solid var(--surface,#fff);box-shadow:0 0 0 3px rgba(var(--bc-purple-v1-rgb),.18);pointer-events:none;}
.avv-marks{position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;}
.avv-mk{position:absolute;transform:translateX(-50%);font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;line-height:1;padding:3px 7px;border-radius:5px;white-space:nowrap;border:1px solid transparent;}
.avv-mk.top{top:0;} .avv-mk.bot{bottom:4px;}
.avv-mk.now{background:var(--text);color:#fff;}
.avv-mk.eol{background:rgba(220,38,38,.1);color:var(--err);border-color:rgba(220,38,38,.3);}
.avv-mk.warr{background:rgba(var(--bc-purple-v1-rgb),.1);color:var(--brand-purple);border-color:rgba(var(--bc-purple-v1-rgb),.3);}
.avv-floor{position:absolute;right:0;transform:translateY(-100%);margin-top:-3px;font-size:11px;color:var(--warn);font-weight:600;pointer-events:none;white-space:nowrap;}
.avv-cursor{position:absolute;top:0;bottom:0;width:0;border-left:1px dashed var(--text-mute);display:none;pointer-events:none;}
.avv-cursor.on{display:block;}
.avv-cursor i{position:absolute;left:0;width:10px;height:10px;margin:-5px 0 0 -5px;border-radius:50%;background:var(--surface,#fff);border:2px solid var(--brand-blue);}
.avv-tip{position:absolute;display:none;transform:translate(10px,-50%);background:var(--text);color:#fff;border-radius:6px;padding:6px 9px;font-size:12px;line-height:1.35;white-space:nowrap;pointer-events:none;z-index:3;box-shadow:var(--shadow-md);} /* v1.4.10.473: tooltip 12 (was 11) */
.avv-tip.on{display:block;} .avv-tip.flip{transform:translate(calc(-100% - 10px),-50%);}
.avv-tip b{display:block;font-size:13px;font-weight:700;} .avv-tip span{opacity:.85;}
.avv-legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:11px;color:var(--text-mute);align-items:center;}
.avv-legend span{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;}
.avv-legend i{display:inline-block;width:16px;height:0;border-top:3px solid var(--brand-blue);border-radius:2px;}
.avv-legend i.l-floor{border-top:2px dashed var(--warn);} .avv-legend i.l-now{border-top:2px solid var(--text);} .avv-legend i.l-warr{border-top:2px dashed var(--brand-purple);} .avv-legend i.l-eol{border-top:2px dashed var(--err);}
/* the ring and the stage */
.avv-ring{position:relative;flex:none;}
.avv-ring svg{display:block;}
.avv-ring-c{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;pointer-events:none;}
.avv-ring-c b{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;color:var(--text);}
.avv-ring-c span{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-dim);margin-top:4px;}
.avv-stage{display:inline-flex;align-items:center;gap:7px;font-size:11px;font-weight:600;padding:4px 10px 4px 8px;border-radius:999px;background:var(--accent-glow);background:color-mix(in srgb,var(--sc) 12%,transparent);color:var(--sc);white-space:nowrap;}
.avv-stage i{width:8px;height:8px;border-radius:50%;background:var(--sc);flex:none;}
.avv-pos{display:flex;gap:22px;align-items:flex-start;}
.avv-pos-ring{display:flex;flex-direction:column;align-items:center;gap:10px;flex:none;}
.avv-facts{flex:1;min-width:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 18px;}
.avv-fact{min-width:0;}
.avv-fact .k{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;margin-bottom:3px;}
.avv-fact .v{font-size:13px;color:var(--text);display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
/* method & assumptions */
.avv-mrow{display:flex;gap:14px;padding:10px 0;border-top:1px solid var(--line);font-size:13px;}
.avv-mrow:first-child{border-top:0;padding-top:0;}
.avv-mrow .k{flex:0 0 118px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-weight:600;padding-top:2px;}
.avv-mrow .v{flex:1;min-width:0;font-weight:400;}   /* v1.4.10.473: a value reads 13/400 like .avv-fact .v and .asd-kv-row .v (was 500) */
.avv-mrow .s{font-size:12px;color:var(--text-mute);font-weight:400;line-height:1.5;margin-top:2px;}
.avv-mbtns{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px;}
/* the proportional timeline: labels above and below the rail in turn */
.avv-tl{position:relative;height:150px;margin:6px 10px 0;}
.avv-tl-rail{position:absolute;left:0;right:0;top:50%;height:4px;margin-top:-2px;border-radius:3px;background:var(--surface-3);}
.avv-tl-rail span{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,var(--brand-blue),var(--brand-purple));}
.avv-tn{position:absolute;top:50%;width:0;}
.avv-td{position:absolute;left:0;top:0;width:28px;height:28px;margin:-14px 0 0 -14px;border-radius:50%;background:var(--surface);border:2px solid var(--line);color:var(--text-dim);display:flex;align-items:center;justify-content:center;z-index:1;}
.avv-td svg{width:13px;height:13px;}
.avv-tn.done .avv-td{background:var(--brand-blue);border-color:var(--brand-blue);color:#fff;}
.avv-tn.now .avv-td{background:#fff;border-color:var(--brand-purple);color:var(--brand-purple);box-shadow:0 0 0 4px rgba(var(--bc-purple-v1-rgb),.16);}
.avv-tn.warn .avv-td{background:var(--warn);border-color:var(--warn);color:#fff;}
.avv-tn.err .avv-td{background:var(--err);border-color:var(--err);color:#fff;}
.avv-tn.eol .avv-td{background:#fff;border-color:var(--err);color:var(--err);}
.avv-tx{position:absolute;left:0;transform:translateX(-50%);text-align:center;white-space:nowrap;line-height:1.3;}
.avv-tn.up .avv-tx{bottom:22px;} .avv-tn.dn .avv-tx{top:22px;}
.avv-tn.edge-l .avv-tx{transform:none;text-align:left;} .avv-tn.edge-r .avv-tx{transform:translateX(-100%);text-align:right;}
/* v1.4.10.473: a timeline node's name is an uppercase label, 11/600 .06em (was 11/700 sentence case) — the same look as .lt-label */
.avv-tx b{display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text);}
.avv-tx span{font-size:11px;color:var(--text-dim);}
/* year by year, cost of ownership */
.avv-tblwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;}
.avv-years th,.avv-years td{white-space:nowrap;}
.avv-years tr.now td{background:var(--accent-glow);}
.avv-tco-note{margin-top:12px;padding-top:10px;border-top:1px dashed var(--line);font-size:12px;color:var(--text-mute);line-height:1.5;}
/* the Overview's band */
.avv-ov{display:grid;grid-template-columns:minmax(0,1fr) 236px;gap:16px;align-items:center;margin:12px 15px 4px;}
.avv-ov-chart{min-width:0;}
.avv-ov-side{display:flex;align-items:center;gap:14px;}
.avv-ov-side .depr-figs{gap:8px;}
.avv-ov-foot{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:8px 15px 12px;}
.avv-ov-more{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--brand);cursor:pointer;min-height:28px;}
.avv-ov-more svg{width:14px;height:14px;}
/* the editor's live preview */
.ae-vp{margin-top:14px;border:1px solid var(--line);border-radius:7px;background:var(--surface);padding:12px 14px 10px;}
.ae-vp-empty{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-dim);}
.ae-vp-empty svg{width:16px;height:16px;flex:none;}
.ae-vp-line{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:12px;color:var(--text-mute);margin-top:4px;line-height:1.5;}
.ae-vp-line b{color:var(--text);}
/* the forecast's category and site panels */
.fxc-legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:11px;color:var(--text-mute);margin-bottom:10px;}
.fxc-legend span{display:inline-flex;align-items:center;gap:6px;}
.fxc-legend i{width:10px;height:10px;border-radius:3px;background:var(--brand-blue);flex:none;} .fxc-legend i.book{background:var(--surface-3);border:1px solid var(--line-2);}
.fxc-row{margin-bottom:10px;} .fxc-row:last-child{margin-bottom:0;}
.fxc-top{display:flex;align-items:baseline;gap:8px;font-size:12px;margin-bottom:4px;}
.fxc-lab{font-weight:600;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fxc-n{font-size:11px;color:var(--text-dim);} .fxc-val{margin-left:auto;color:var(--text-mute);white-space:nowrap;} .fxc-val b{color:var(--text);}
.fxc-track{position:relative;height:10px;border-radius:5px;}
.fxc-track span{position:absolute;left:0;top:0;height:100%;border-radius:5px;}
.fxc-book{background:var(--surface-3);border:1px solid var(--line-2);} .fxc-cur{background:linear-gradient(90deg,var(--brand-blue),var(--brand-purple));}
.fxs-row{margin-bottom:10px;} .fxs-row:last-child{margin-bottom:0;}
.fxs-top{display:flex;justify-content:space-between;gap:8px;font-size:12px;margin-bottom:4px;}
.fxs-lab{font-weight:600;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .fxs-n{color:var(--text-dim);white-space:nowrap;font-size:11px;}
.fxs-bar{display:flex;height:10px;border-radius:5px;overflow:hidden;background:var(--surface-3);}
.fxs-bar span{display:block;height:100%;}
@media (max-width:900px){ .avv-grid2{grid-template-columns:1fr;} .avv-ov{grid-template-columns:1fr;} }
@media (max-width:700px){
  .avv{gap:14px;} .avv-kpis{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;} .avv-kpi{padding:10px 11px;} /* v1.4.10.473: the small KPI stays 20/600 on a phone (was 18, no KPI step) */
  .avv-pos{flex-direction:column;align-items:center;} .avv-facts{width:100%;}
  .avv-mrow{flex-direction:column;gap:3px;} .avv-mrow .k{flex:none;}
  .avv-tl{height:auto;margin:0;display:flex;flex-direction:column;gap:10px;}
  .avv-tl-rail{display:none;}
  .avv-tn{position:static;width:auto;display:flex;align-items:center;gap:12px;}
  .avv-td{position:static;margin:0;}
  .avv-tx{position:static;transform:none !important;text-align:left;white-space:normal;}
  .avv-tx b,.avv-tx span{display:inline;margin-right:8px;}
  .avv-mk{padding:2px 5px;}
  .avv-ov{margin:10px 13px 2px;} .avv-ov-foot{padding:8px 13px 10px;}
  .avv-ov-more{min-height:40px;}   /* v1.4.10.473: the Overview card's "Value & lifecycle" link was a 28px tap target */
  .avv-legend{display:none;}
}

/* ═══ v1.4.10.452 — SAFARI AND iOS ═════════════════════════════════════════════════════════════════════════════════
   1. WebKit reads only the prefixed user-select, and before Safari 18 only the prefixed backdrop-filter: every rule in
      this sheet that set one gets its prefix here, same selector, same value, in the same order as the originals.
   2. Rules written with 100dvh alone: a browser without dvh (iOS before 15.4) dropped the declaration and let the panel
      grow past the screen. @supports not gives those the vh form.
   3. Rules written with 100vh alone take dvh too, so a panel is not sized under Safari's own bars.
   4. touch-action:manipulation on everything tapped: no wait on a tap and no accidental double-tap zoom on a control.
   5. The grey tap flash off the rows and links that act as buttons.
   6. Date and time fields on iOS: the value starts at the left like every other field, and an empty field keeps its
      height (an empty iOS date field collapses once its native look is taken off). */
.acc-chip,.ra-space-head,.rel-grp-in,.oc-creds > summary,.chip-pick,.help-tip,.dv-nf-chip,.dv-list th,th.th-sort,.est-int-head,.est-cli-head,.est-site-head,
#dv-dock .dv-dock-head,.loc-layout-canvas,.tkx-table th.tkx-th,.tkx-pg-ellip,.ws-hdr th,.ws-rh,.ss-dt th.ss-sort,.tk-group-head,.sh-live,.aow-chip,
.cs-table th.cs-th,.cs-tools label.cs-att,.tk-sub-head{-webkit-user-select:none;}
.modal-back{-webkit-backdrop-filter:blur(4px);} .rc-media .rc-photo-tag{-webkit-backdrop-filter:blur(3px);} .ah-hm{-webkit-backdrop-filter:blur(2px);}
.pc-btn{-webkit-backdrop-filter:blur(2px);} .lightbox{-webkit-backdrop-filter:blur(6px);} .ah-thumb-zoom{-webkit-backdrop-filter:blur(4px);}
.dv-bodydrop{-webkit-backdrop-filter:saturate(1.2);} .svx-photo-acts .btn{-webkit-backdrop-filter:blur(6px);} .sd-room-code{-webkit-backdrop-filter:blur(3px);}
.cam-sheet{-webkit-backdrop-filter:blur(4px);} .mnav-back{-webkit-backdrop-filter:blur(3px);} .tk-drawer-scrim{-webkit-backdrop-filter:blur(2px);} .sd-room-cog{-webkit-backdrop-filter:blur(3px);}
.ph-chip,.dh-chip,.ah-hm{-webkit-backdrop-filter:none;}
@supports not (height:100dvh){
  .nav-dd-menu{max-height:calc(100vh - 84px);}
  #modal-inner.modal-tkt{max-height:calc(100vh - 96px);}
  .ef-modal-body .ef-scroll{max-height:calc(100vh - 168px);}
  #modal-inner.modal-asset{max-height:calc(100vh - 72px);}
  .dv-col-scroll{max-height:calc(100vh - 340px);}
  .svx-rail{max-height:calc(100vh - 240px);}
  .svx-dbody{max-height:calc(100vh - 330px);}
  .ue-tabs ~ .ef-modal-body .ef-scroll{max-height:calc(100vh - 212px);}
  #modal-inner.modal-nt{max-height:calc(100vh - 72px);}
}
.wk-toc-rail .wk-toc{max-height:calc(100dvh - 170px);}
.opi .opi-tblwrap{max-height:max(420px,calc(100dvh - 250px));}
.rost-modal{max-height:88dvh;} .crew-drawer{max-height:92dvh;} .lightbox .lb-frame{height:78dvh;} .ws-ctx{max-height:min(80dvh,560px);}
@media (max-width:700px){ .crew-drawer{max-height:100dvh;} }
@media (max-width:640px){ #dv-dock{height:52dvh;} }
button,.btn,a,[role="button"],.seg-btn,.tab,.adt-tab,.att-row,.comp-row,.dt tbody tr[onclick],label.check,.view-toggle button,.pill[onclick],.icon-btn{touch-action:manipulation;}
a,[role="button"],.btn,.att-row,.comp-row,.adt-tab,.seg-btn,.tab,.dt tbody tr[onclick],.ah-cat-link,.asd-note-more a,.avv-ov-more,.pill[onclick]{-webkit-tap-highlight-color:transparent;}
@supports (-webkit-touch-callout:none){
  input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{min-width:0;-webkit-appearance:none;appearance:none;text-align:left;}
  input[type="date"]::-webkit-date-and-time-value,input[type="time"]::-webkit-date-and-time-value,input[type="datetime-local"]::-webkit-date-and-time-value,input[type="month"]::-webkit-date-and-time-value{text-align:left;min-height:1.3em;}
}
/* 7. Controls that only appeared on hover show on a touch screen: the Dev Team board's column tools, the bin on an
      attachment thumbnail, the delete on a checklist item (the v300 rule, three more cases). */
@media (hover:none){
  .dv-col-tools{display:inline-flex;}
  .dv-thumb-x{display:flex;width:36px;height:36px;}
  .dv-check-item .cx{opacity:.7;min-width:40px;min-height:40px;display:inline-flex;align-items:center;justify-content:center;}
}
/* 8. Sticky bars inside a .panel never stuck: the panel's overflow:hidden made it their scroll box, and a panel does
      not scroll. The wiki editor's toolbar, the document toolbar and the activity feed's day headings sit in a panel
      that clips without scrolling (overflow:clip keeps the rounded corners); a browser without clip gets visible. */
.panel.wk-editwrap,.panel.wd-panel:not(.is-full),.panel.aac-panel{overflow:clip;}
@supports not (overflow:clip){ .panel.wk-editwrap,.panel.wd-panel:not(.is-full),.panel.aac-panel,.bl-wiz.bl-wiz-page{overflow:visible;} }
/* 9. The two custom-arrow selects drew the native arrow as well on iOS before 15.4. */
.asb-field select,.atb-sel select{-webkit-appearance:none;}
/* 10. Fixed bars, sheets and corner controls clear the home indicator and the notch (viewport-fit=cover puts them
       under both). */
.bulk-bar{bottom:calc(24px + env(safe-area-inset-bottom,0px));}
#dv-dock{bottom:calc(22px + env(safe-area-inset-bottom,0px));}
@media (max-width:560px){ .dv-assign-toast{bottom:calc(14px + env(safe-area-inset-bottom,0px));} }
@media (max-width:760px){ .tk-who-menu{bottom:calc(12px + env(safe-area-inset-bottom,0px));} .tk-who-menu:focus-within{top:calc(8px + env(safe-area-inset-top,0px));bottom:auto;max-height:45dvh;} }
.toast{bottom:calc(24px + env(safe-area-inset-bottom,0px));right:max(24px,env(safe-area-inset-right,0px));}
.wk-upl{bottom:calc(16px + env(safe-area-inset-bottom,0px));right:max(16px,env(safe-area-inset-right,0px));}
.lightbox .lb-close{top:max(20px,env(safe-area-inset-top,0px));right:max(24px,env(safe-area-inset-right,0px));}
.lightbox .lb-prev{left:max(24px,env(safe-area-inset-left,0px));} .lightbox .lb-next{right:max(24px,env(safe-area-inset-right,0px));}
/* 11. Small controls on a touch screen, sized in both axes: the 40px floor made a 20px swatch a 20x40 sliver, and a
       16px badge or a 15px help tip was no target at all. */
@media (hover:none) and (pointer:coarse){
  .dv-label .lx{display:inline-flex;align-items:center;justify-content:center;min-width:28px;min-height:28px;}
  .tk-dot.big{width:28px;height:28px;}
  .loc-pin-x{width:26px;height:26px;line-height:25px;top:-12px;right:-12px;}
  .help-tip{width:24px;height:24px;}
  .tk-pal button{width:34px;height:34px;min-height:34px;} .tk-pal button.none{width:auto;}
  .dt-sw{width:34px;height:34px;min-height:34px;}
  .ws-obj-cols button{width:24px;height:24px;min-height:24px;}
  .nt-att-chip button{width:32px;height:32px;min-height:32px;}
  .dv-col-add,.dv-side-x{width:40px;height:40px;min-height:40px;}   /* v1.4.10.473: the board's column tools and the workload toggle take the 40px tap floor (were 32px) */
}
/* 12. Two date-time fields side by side at a phone's width were each too narrow to show a date and a time. */
@media (max-width:560px){ .aow-times{grid-template-columns:minmax(0,1fr);} .dv-cal-range{grid-template-columns:minmax(0,1fr) !important;} }
/* 13. A report grid track of 330px overflowed a screen narrower than 354px. */
.rxr-rgrid{grid-template-columns:repeat(auto-fill,minmax(min(330px,100%),1fr));}

/* ═══ v1.4.10.454 — SHIFTS: THE TECHNICIAN'S OWN SCREEN (js/27-crew.js crewMineHtml) ═══════════════
   Jay: "technicians can see their shift and what they have to do, and call-outs and site visits they
   need to do." Built for a phone in one hand: one column under 760px, 44px controls, the live call-out
   first. Colours come from the tokens; the client colour rides --c as the board's chips do. */
.crew-my{ display:block; }
.crew-my-top{ display:grid; grid-template-columns:minmax(0,2fr) minmax(0,1fr); gap:12px; margin:0 0 12px; }
.crew-my-now, .crew-my-oncall{ background:var(--surface); border:1px solid var(--line); border-radius:12px; padding:14px 16px;
  border-left:4px solid var(--accent); min-width:0; }
.crew-my-now.on{ border-left-color:var(--ok); background:color-mix(in srgb, var(--ok) 5%, var(--surface)); }
.crew-my-now.idle{ border-left-color:var(--line); }
.crew-my-oncall{ border-left-color:var(--line); }
.crew-my-oncall.on{ border-left-color:var(--ok); background:color-mix(in srgb, var(--ok) 5%, var(--surface)); }
.crew-my-now-k{ display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:600; text-transform:uppercase;
  letter-spacing:.06em; color:var(--text-mute); margin-bottom:4px; }
.crew-my-now-k svg{ width:14px; height:14px; }
.crew-my-now-t{ font-size:16px; font-weight:600; letter-spacing:-.012em; color:var(--text); line-height:1.25; }   /* v1.4.10.473: a section title, 16/600 (was 18) */
.crew-my-now-s{ font-size:13px; color:var(--text-mute); margin-top:3px; }
.crew-my-now-s > div{ margin-top:4px; }
.crew-my-now-a{ display:flex; gap:8px; flex-wrap:wrap; align-items:center; margin-top:10px; }
.crew-my-now-a .btn{ min-height:40px; }
.crew-my-since{ display:inline-flex; align-items:center; gap:5px; font-size:13px; font-weight:600; color:var(--ok); }
.crew-my-since svg{ width:14px; height:14px; }
.crew-my-notes{ font-size:13px; color:var(--text); margin-top:6px; white-space:pre-line; line-height:1.45; }
.crew-my-live{ margin:0 0 12px; }
.crew-my-h{ display:inline-flex; align-items:center; gap:7px; font-size:13px; font-weight:600; color:var(--text); margin:0 0 8px; }   /* v1.4.10.473: sub-heading 13/600 (was 700) */
.crew-my-h svg{ width:15px; height:15px; color:var(--err); }
.crew-my-h .crew-tab-n{ margin-left:2px; }
.crew-my-stats{ display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:10px; margin:0 0 12px; }
.crew-my-stat{ display:flex; flex-direction:column; gap:1px; padding:11px 13px; background:var(--surface); border:1px solid var(--line); border-radius:11px; min-width:0; }
.crew-my-stat b{ font-size:20px; font-weight:600; letter-spacing:-.02em; line-height:1.1; color:var(--text); }
.crew-my-stat span{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text); }   /* v1.4.10.473: KPI label look (was 12/600) */
.crew-my-stat small{ font-size:11px; color:var(--text-mute); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.crew-my-stat small em{ font-style:normal; color:var(--err); font-weight:600; }
/* the fortnight strip */
.crew-my-strip{ display:flex; gap:6px; overflow-x:auto; padding:2px 2px 8px; margin:0 0 12px; scrollbar-width:thin; -webkit-overflow-scrolling:touch; }
.crew-my-day{ flex:0 0 auto; display:flex; flex-direction:column; align-items:center; gap:1px; min-width:52px; min-height:60px; padding:7px 6px 5px;
  background:var(--surface); border:1px solid var(--line); border-radius:11px; cursor:pointer; color:var(--text); }
.crew-my-day.wknd{ background:color-mix(in srgb, var(--bg) 70%, var(--surface)); }
.crew-my-day.today{ border-color:var(--accent); }
.crew-my-day.today .crew-my-dnum{ color:var(--accent-deep); }
.crew-my-day.on{ background:var(--accent-glow); border-color:var(--accent); }
.crew-my-day:hover{ border-color:var(--accent); }
.crew-my-dow{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }   /* v1.4.10.473: 11/600 .06em, as the boards' day labels (10px uppercase is for badges) */
.crew-my-dnum{ font-size:15px; font-weight:700; line-height:1.1; }
.crew-my-dots{ display:flex; gap:2px; align-items:center; height:8px; margin-top:3px; }
.crew-my-dots i{ display:block; width:5px; height:5px; border-radius:50%; background:var(--accent); }
.crew-my-dots i.n{ width:auto; height:auto; border-radius:999px; background:var(--accent); color:#fff; font-style:normal; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; padding:0 4px; line-height:12px; }   /* v1.4.10.473: a count bubble is the badge look, 10/700 (9px was off the scale) */
/* the agenda */
.crew-my-agenda .panel-head{ flex-wrap:wrap; }
.crew-my-list{ padding:4px 0 8px; }
.crew-my-date{ padding:12px 16px 6px; font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }   /* v1.4.10.473: an uppercase label is 11/600 (was 12/700) */
.crew-my-date.today{ color:var(--accent-deep); }
.crew-my-item{ display:grid; grid-template-columns:72px minmax(0,1fr); gap:0 10px; margin:0 12px 8px; padding:11px 12px 11px 0;
  background:var(--surface); border:1px solid var(--line); border-left:4px solid var(--c,var(--accent)); border-radius:11px; cursor:pointer; min-width:0; }
.crew-my-item:hover{ border-color:var(--accent); border-left-color:var(--c,var(--accent)); }
.crew-my-item.callout{ --c:var(--err); }
.crew-my-item.callout.late{ background:color-mix(in srgb, var(--err) 6%, var(--surface)); }
.crew-my-item.callout.closed{ opacity:.7; }
.crew-my-item.visit{ --c:var(--brand-purple,var(--bc-purple-v1)); }
.crew-my-item.task{ --c:#0891B2; }
.crew-my-item.big{ grid-template-columns:minmax(0,1fr); padding-left:12px; margin:0 0 8px; }
.crew-my-time{ display:flex; flex-direction:column; align-items:flex-end; padding:1px 0 0; font-variant-numeric:tabular-nums; }
.crew-my-time b{ font-size:14px; font-weight:700; color:var(--text); }
.crew-my-time span{ font-size:12px; color:var(--text-mute); }
.crew-my-body{ min-width:0; }
.crew-my-t{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; font-size:13px; font-weight:600; color:var(--text); line-height:1.35; }   /* v1.4.10.473: a row's title is 13/600, as a task's (was 14) */
.crew-my-kind{ margin-left:auto; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--text-mute);   /* v1.4.10.473: a badge tracks .04em (was .06em) */
  padding:1px 7px; border-radius:999px; background:var(--bg); white-space:nowrap; }
.crew-my-w{ font-size:12px; color:var(--text-mute); margin-top:2px; }
.crew-my-w small{ display:block; font-size:11px; color:var(--text-dim); }
.crew-my-meta{ display:flex; gap:6px; flex-wrap:wrap; margin-top:6px; }
.crew-my-meta a{ color:var(--accent); }
.crew-my-acts{ display:flex; gap:6px; flex-wrap:wrap; align-items:center; margin-top:8px; }
.crew-my-acts .btn{ min-height:34px; }
.crew-my-hours{ font-size:11px; color:var(--text-mute); margin-left:auto; }
.crew-my-empty{ padding:26px 16px; text-align:center; color:var(--text-mute); font-size:13px; }
@media (max-width:900px){
  .crew-my-stats{ grid-template-columns:repeat(3,minmax(0,1fr)); }
}
@media (max-width:760px){
  .crew-my-top{ grid-template-columns:minmax(0,1fr); }
  .crew-my-stats{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .crew-my-item{ grid-template-columns:minmax(0,1fr); padding-left:12px; margin:0 8px 8px; }
  .crew-my-time{ flex-direction:row; align-items:baseline; gap:6px; margin-bottom:2px; }
  .crew-my-kind{ margin-left:0; }
  .crew-my-acts .btn, .crew-my-now-a .btn{ min-height:44px; }
  .crew-my-hours{ margin-left:0; width:100%; }
}

/* ═══ v1.4.10.454 — CONTROL SYSTEMS ON THE MONITORING PAGE AND TAB (js/03-pages.js monCtlPanelHtml, js/05-assets.js amCtlSummaryHtml) ═══ */
.mon-ctl-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(min(380px,100%),1fr)); gap:14px; }
.mon-ctl-card{ border:1px solid var(--line); border-radius:12px; background:var(--surface); padding:13px 15px 11px; cursor:pointer; min-width:0; }
.mon-ctl-card:hover{ border-color:var(--accent); }
.mon-ctl-card.nodata{ border-style:dashed; }
.mon-ctl-head{ display:flex; align-items:flex-start; gap:11px; }
.mon-ctl-ico{ flex-shrink:0; width:38px; height:38px; border-radius:10px; display:flex; align-items:center; justify-content:center; background:var(--bg); color:var(--brand-blue); }
.mon-ctl-ico svg{ width:20px; height:20px; }
.mon-ctl-who{ flex:1; min-width:0; }
.mon-ctl-name{ font-size:15px; font-weight:600; letter-spacing:-.01em; color:var(--text); }
.mon-ctl-name small{ font-size:12px; font-weight:400; color:var(--text-mute); margin-left:4px; }
.mon-ctl-st{ flex-shrink:0; }
.mon-ctl-body{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px 16px; margin-top:12px; }
.mon-ctl-sect{ min-width:0; }
.mon-ctl-sh{ display:flex; align-items:center; gap:7px; font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); margin-bottom:6px; }
.mon-ctl-sh .pill{ text-transform:none; letter-spacing:0; }   /* v1.4.10.473: the program's state pill is a status pill ("Running"), not part of the uppercase label it sits in */
.mon-ctl-kv{ display:flex; flex-direction:column; gap:3px; }
.mon-ctl-kv > div{ display:flex; gap:8px; align-items:baseline; font-size:12px; min-width:0; flex-wrap:wrap; }
.mon-ctl-kv > div > span{ color:var(--text-mute); min-width:84px; }
.mon-ctl-kv > div > b{ color:var(--text); font-weight:600; overflow:hidden; text-overflow:ellipsis; }
.mon-ctl-kv > div > b.mono{ font-size:11px; }   /* v1.4.10.473: the face is the base .mono's */
.mon-ctl-kv > div > small{ width:100%; font-size:11px; color:var(--text-dim); }
.mon-ctl-bar{ display:grid; grid-template-columns:minmax(60px,auto) minmax(0,1fr) 38px; gap:8px; align-items:center; font-size:12px; margin-top:6px; }
.mon-ctl-bar .k{ color:var(--text-mute); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.mon-ctl-bar .track{ height:7px; border-radius:999px; background:var(--bg); overflow:hidden; }
.mon-ctl-bar .fill{ height:100%; background:var(--accent); border-radius:999px; }
.mon-ctl-bar .fill.warn{ background:var(--warn); }
.mon-ctl-bar .fill.err{ background:var(--err); }
.mon-ctl-bar .v{ text-align:right; font-weight:600; color:var(--text); font-variant-numeric:tabular-nums; }
.mon-ctl-descr{ margin-top:6px; font-size:11px; }
.mon-ctl-svcs{ display:flex; flex-direction:column; gap:4px; }
.mon-ctl-svc{ display:flex; align-items:center; gap:7px; font-size:12px; min-width:0; }
.mon-ctl-svc b{ color:var(--text); font-weight:600; }
.mon-ctl-svc span:last-child{ color:var(--text-mute); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.mon-ctl-warn{ display:flex; gap:7px; align-items:flex-start; margin-top:8px; padding:8px 10px; border-radius:8px; font-size:12px;
  background:color-mix(in srgb, var(--err) 8%, var(--surface)); color:var(--err); }
.mon-ctl-warn svg{ width:14px; height:14px; flex-shrink:0; margin-top:1px; }
.mon-ctl-none{ display:flex; gap:9px; align-items:flex-start; margin-top:12px; padding:10px 12px; border-radius:9px; font-size:12px; line-height:1.5;
  background:var(--bg); color:var(--text-mute); }
.mon-ctl-none svg{ width:15px; height:15px; flex-shrink:0; margin-top:2px; color:var(--brand-blue); }
.mon-ctl-acts{ display:flex; align-items:center; justify-content:space-between; gap:8px; margin-top:10px; flex-wrap:wrap; }
.mon-ctl-acts > span:last-child{ display:inline-flex; gap:6px; flex-wrap:wrap; }
.am-ctl-kpis .am-kpi-s{ font-size:11px; color:var(--text-mute); margin-top:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* the shift workspace (v1.4.10.454) shares the call-out drawer's classes; these are its own */
.crew-chip.done{ opacity:.72; }
.crew-chip-k{ font-style:normal; color:var(--text-mute); }
.crew-plan-ul{ list-style:none; margin:0; padding:0; }
.crew-plan-ul li{ padding:3px 0 3px 20px; position:relative; font-size:13px; color:var(--text); }
.crew-plan-ul li::before{ content:''; position:absolute; left:2px; top:7px; width:10px; height:10px; border:1px solid var(--text-mute); border-radius:3px; }
.crew-plan-ul li.on{ color:var(--text-mute); text-decoration:line-through; }
.crew-plan-ul li.on::before{ background:var(--ok); border-color:var(--ok); }
.crew-dl > div > b > small{ display:block; font-size:11px; font-weight:400; color:var(--text-mute); }
.am-ctl-chips{ display:flex; gap:6px; flex-wrap:wrap; margin-bottom:6px; }
.am-ph h3 svg{ width:16px; height:16px; vertical-align:-3px; margin-right:4px; }
@media (max-width:640px){
  .mon-ctl-body{ grid-template-columns:minmax(0,1fr); }
}

/* ═══ v1.4.10.455 — MAINTENANCE: the type strip, Mine, the phone card list, the job view's rostered shifts and
   completion note, Mark done / Reschedule; SHIFTS: photos from the phone (js/03-pages.js, js/27-crew.js) ═══ */
.mt-tstrip{ margin-top:-4px; }
.mt-tchip .mt-tdot{ width:9px; height:9px; border-radius:3px; background:var(--c, var(--accent)); flex-shrink:0; }
.mt-tchip.on{ border-color:var(--c, var(--accent)); background:color-mix(in srgb, var(--c, var(--accent)) 10%, var(--surface)); }
.mt-tchip.on .mt-cchip-n{ color:var(--c, var(--accent)); }
.mt-minechip svg{ width:13px; height:13px; }
.mt-cards{ display:none; }
.mt-card{ display:grid; grid-template-columns:72px minmax(0,1fr); gap:0 10px; margin:0 10px 8px; padding:10px 12px 10px 0;
  background:var(--surface); border:1px solid var(--line); border-left:4px solid var(--c, var(--accent)); border-radius:11px; cursor:pointer; min-width:0; }
.mt-card.late{ background:color-mix(in srgb, var(--err) 5%, var(--surface)); }
.mt-card-when{ display:flex; flex-direction:column; align-items:flex-end; padding-left:8px; font-variant-numeric:tabular-nums; }
.mt-card-when b{ font-size:13px; font-weight:700; color:var(--text); text-align:right; line-height:1.2; }
.mt-card-when span{ font-size:12px; color:var(--text-mute); }
.mt-card-when em{ font-size:11px; font-style:normal; margin-top:2px; }
.mt-card-main{ min-width:0; }
.mt-card-t{ font-size:13px; font-weight:600; color:var(--text); line-height:1.35; overflow-wrap:anywhere; }   /* v1.4.10.473: the job's title is 13/600 as in the list it replaces on a phone (was 14/600) */
.mt-card-att{ font-size:10px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; padding:1px 7px; vertical-align:middle; }   /* v1.4.10.473: count badge, 10/700 uppercase .04em (was untracked) */
.mt-card-att svg{ width:11px; height:11px; }
.mt-card-m{ font-size:12px; color:var(--text-mute); margin-top:2px; overflow-wrap:anywhere; }
.mt-card-p{ display:flex; gap:6px; align-items:center; flex-wrap:wrap; margin-top:7px; }
.mt-card-who{ font-size:12px; color:var(--text-mute); margin-left:auto; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:50%; }
.mt-card-grp{ padding:12px 14px 6px; font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-mute); }   /* v1.4.10.473: uppercase label 11/600 (was 12/700) */
.mt-card-grp span{ font-weight:600; color:var(--text-dim); margin-left:4px; }
.mt-card-empty{ padding:30px 16px; text-align:center; color:var(--text-mute); font-size:13px; }
@media (max-width:700px){
  .mt-listbody .mt-table{ display:none; }
  .mt-listbody.flush{ overflow-x:visible; }
  .mt-cards{ display:block; padding:8px 0 6px; }
  .mt-card{ min-height:44px; }
  .mt-tstrip{ overflow-x:auto; flex-wrap:nowrap; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
  .mt-tstrip::-webkit-scrollbar{ display:none; }
  .mt-tstrip .mt-cchip{ flex-shrink:0; }
}
/* the job view's action bar keeps its words on a phone (the ticket's bar goes icon-only under 760px): these
   five or six are the job, not a ticket's twelve, and "Mark done" as a tick alone is a guess */
@media (max-width:760px){
  .tkd-actionbar.mtv-actionbar{ flex-wrap:wrap; overflow-x:visible; }
  .tkd-actionbar.mtv-actionbar > .btn.sm > .tkd-ab-t{ display:inline; }
  .tkd-actionbar.mtv-actionbar > .btn.sm{ min-height:40px; flex:1 1 auto; justify-content:center; }   /* v1.4.10.473: 40, the floor the bar already drew at (the 44 lost to .tkd-hero .tkd-actionbar .btn.sm) */
}
.mtv-att-acts{ display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }
.mtv-att-acts .btn{ min-height:40px; }
.mtv-done .tk-desc.ro{ border-color:color-mix(in srgb, var(--ok) 40%, var(--line)); background:color-mix(in srgb, var(--ok) 5%, var(--surface)); }
.mtv-done-by{ margin-top:6px; }
.mtv-done-by a{ color:var(--accent); cursor:pointer; }
.mtv-done-modal{ max-width:520px; width:100%; }
.mtv-done-modal textarea{ font-size:14px; }
.mt-rs-quick{ display:flex; gap:6px; flex-wrap:wrap; }
.mt-rs-quick .btn{ min-height:34px; }
.mtv-shifts{ display:flex; flex-direction:column; gap:6px; }
.mtv-shift{ display:flex; align-items:center; gap:10px; padding:8px 10px; border:1px solid var(--line); border-radius:9px; background:var(--surface); min-width:0; }
.mtv-shift.go{ cursor:pointer; }
.mtv-shift.go:hover{ border-color:var(--accent); }
.mtv-shift-when{ display:flex; flex-direction:column; min-width:74px; font-variant-numeric:tabular-nums; }
.mtv-shift-when b{ font-size:12px; font-weight:700; color:var(--text); }
.mtv-shift-when small{ font-size:11px; color:var(--text-mute); }
.mtv-shift-who{ flex:1; min-width:0; font-size:13px; font-weight:600; color:var(--text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.mtv-shift-who small{ font-weight:400; color:var(--text-mute); }
.mtv-shift-who small svg{ width:11px; height:11px; vertical-align:-1px; }
.mtv-shift-go{ display:inline-flex; color:var(--text-dim); }
.mtv-shift-go svg{ width:13px; height:13px; }
@media (max-width:700px){ .mtv-shift{ min-height:48px; } .mt-rs-quick .btn{ min-height:40px; } }
/* the drawer is a flex column (head, status, tabs, the scrolling body, foot): on a phone a long On site tab let the
   body's height SQUASH the rows above it, and the tab strip painted at half height with its labels cut through
   (measured at 375px: the strip at 19px of its 40). The rows above the body never give way; only the body scrolls. */
.crew-drawer > .crew-ws-head, .crew-drawer > .crew-ws-status, .crew-drawer > .crew-ws-tabs, .crew-drawer > .rost-modal-foot{ flex-shrink:0; }
.crew-drawer > .crew-ws-body{ flex:1 1 auto; min-height:0; }
/* photos on a shift and a call-out: the camera first, the gallery second, the caption under both on a phone */
.crew-ph-acts{ align-items:center; }
.crew-ph-acts .btn svg{ width:15px; height:15px; }
@media (max-width:700px){
  .crew-ph-acts .btn{ flex:1 1 46%; }
  .crew-ph-acts .rost-in{ flex:1 1 100%; min-width:0; }
  .crew-my-now-a .btn svg{ width:15px; height:15px; }
}
/* ═══ v1.4.10.455 — REMOTE ACCESS CARDS: what the device last said, and the commands it offers (js/03-pages.js raCardFacts / raCardControls) ═══ */
.remote-card .rc-detail{ font-size:12px; color:var(--text-mute); margin:-6px 0 8px; line-height:1.4; overflow:hidden; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; }
.remote-card .rc-facts{ display:flex; flex-wrap:wrap; gap:5px; margin:0 0 10px; }
.remote-card .rc-fact{ display:inline-flex; align-items:center; gap:5px; padding:2px 8px; border-radius:999px; background:var(--bg); font-size:11px; color:var(--text-mute); max-width:100%; }
.remote-card .rc-fact b{ color:var(--text); font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:180px; }
.remote-card .rc-fact.ok b{ color:var(--ok); } .remote-card .rc-fact.err b{ color:var(--err); } .remote-card .rc-fact.warn b{ color:var(--warn); }
.remote-card .rc-cmds{ display:flex; flex-wrap:wrap; gap:6px; margin:0 0 10px; }
.remote-card .rc-cmds .btn svg{ width:13px; height:13px; }
.remote-card .rc-cmds .btn[disabled]{ opacity:.5; cursor:not-allowed; }
.remote-card .rc-ctlnote{ display:flex; gap:6px; align-items:flex-start; font-size:11px; color:var(--text-dim); margin:0 0 10px; line-height:1.4; }
.remote-card .rc-ctlnote svg{ width:12px; height:12px; flex-shrink:0; margin-top:2px; }
@media (max-width:700px){ .remote-card .rc-cmds .btn{ min-height:40px; } }
/* ═══ v1.4.10.455 — SUPPORT ON A PHONE (iOS Safari, Android): the list as cards, the ticket full-screen and still,
   a head that leaves the screen to the conversation (js/03-pages.js tkxList, js/06 tktDetailHtml) ═══ */
.tkx-phone{ display:none; }
@media (max-width:700px){
  .tkx-listbody table.dt.tkx-table{ display:none; }   /* out-specifies the v177 "table.dt.tkx-table{display:block}" reflow */
  .tkx-phone{ display:block; padding:8px 8px 4px; }
  .tkx-phone .tkx-card{ margin-bottom:8px; min-height:44px; box-shadow:none; }
  .tkx-phone .tkx-card .tc-subj{ font-size:13px; line-height:1.35; }   /* v1.4.10.473: a ticket's subject is 13/600 in every list (was 14) */
  .tkx-phone .tkx-card .tc-meta{ margin-top:4px; }
  /* THE TICKET FILLS THE PHONE. The modal sat inside a padded backdrop that scrolled (overflow:auto) and was itself
     capped to the viewport with a second scroller inside it; on iOS the two scrollers chained and rubber-banded, the
     page underneath bounced, and 100dvh moved as Safari's toolbar hid and showed: "the tickets scroll around". One
     scroller now: the backdrop is still, the panel is the screen, the conversation scrolls inside it and stops at
     its own ends (overscroll-behavior:contain). */
  .modal-back:has(> #modal-inner.modal-tkt){ padding:0; align-items:stretch; overflow:hidden; overscroll-behavior:none; }
  #modal-inner.modal-tkt{ max-width:100%; width:100%; max-height:100dvh; height:100dvh; border-radius:0; border:0; animation:none; }
  #modal-inner.modal-tkt .tkd-body{ overscroll-behavior:contain; -webkit-overflow-scrolling:touch; }
  /* the head: measured 240px of an 812px screen (390px on a 667 iPhone leaves 60% to the ticket) -> a budget of ~170 */
  .tkd-hero .tkd-hero-top{ padding:9px 12px 8px; }
  .tkd-hero .tkd-row1{ gap:9px; }
  .tkd-head .tkd-pchip, .tkd-hero .tkd-pchip{ width:30px; height:30px; font-size:12px; border-radius:7px; }
  .tkd-hero-pic{ display:none; }
  /* v1.4.10.473: the ticket's title is 18/600 on a phone like every other hero title (the task and event heroes beside
     it are 18; this one was 15), and the field that edits it in place is the same size (it stayed 20) */
  .tkd-head h3, .tkd-hero .tkd-subjrow h3{ font-size:18px; line-height:1.25; -webkit-line-clamp:2; }
  .tkd-subj-input{ font-size:18px; }
  .tkd-hero .tkd-refrow{ gap:5px; }
  .tkd-hero .tkd-ref{ font-size:11px; }
  .tkd-hero .tkd-statepill{ font-size:11px; padding:1px 7px; }   /* v1.4.10.473: a status pill is 11/600 (was 10, a non-badge 10px) */
  .tkd-head .tkd-sub{ margin-top:3px; font-size:12px; gap:1px; }   /* v1.4.10.473: the meta line is 12, as on a desktop (was 11) */
  .tkd-head .tkd-sub .tkd-loc{ flex-wrap:nowrap; overflow:hidden; white-space:nowrap; max-width:100%; }
  .tkd-head .tkd-sub .tkd-cr{ overflow:hidden; text-overflow:ellipsis; flex:0 1 auto; min-width:0; }
  .tkd-head .tkd-sub .tkd-cr-sc{ display:none; }
  .tkd-head .tkd-opened{ white-space:nowrap; }
  .tkd-hero .tkd-actionbar{ padding:6px 10px 8px; gap:6px; }
  .tkd-hero .tkd-actionbar .btn.sm{ min-height:40px; }
  /* the tabs stay in reach while a long thread scrolls */
  #modal-inner.modal-tkt .tkd-tabs{ position:sticky; top:0; z-index:5; background:var(--surface); box-shadow:0 0 0 6px var(--surface); }
  #modal-inner.modal-tkt .tkd-main{ padding:14px 12px 16px; }
  .tkd-side-top{ padding:10px 12px 0; }
  .tkd-side-rest{ padding:12px; }
  .rel-row{ min-height:40px; }   /* v1.4.10.473: the related / linked / call-out / task rows are tap targets (were 36px) */
  /* the Assignment card above the thread: four stacked rows (188px) become two columns of facts, and an empty
     "Service vendor" row is not spent on a phone */
  .tkd-side-top .tkt-props-view .sbx-head{ padding:6px 12px; min-height:0; }
  .tkd-side-top .tkt-props-view .sbx-head .btn.xs{ min-height:40px; }   /* v1.4.10.473: the 40px tap floor (was 34) */
  .tkd-side-top .tkt-props-view .sbx-body.tight{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:4px 10px; padding:6px 12px 8px; }
  .tkd-side-top .tkt-props-view .ex-row{ display:flex; flex-direction:column; gap:1px; min-width:0; padding:0; border:0; }
  /* v1.4.10.473: the 20px avatar's initials at 10px, the scale's floor (were 9px, off the scale); userAv() gives every
     10px initial the badge look */
  .tkd-side-top .tkt-props-view .tkt-fact.who .u-av{ width:20px !important; height:20px !important; font-size:10px !important; margin-right:7px; }
  /* v1.4.10.473: the assignee's name ends in an ellipsis in its half of the sheet — a flex row cannot ellipsise its bare
     text, so it was cut mid-letter */
  .tkd-side-top .tkt-props-view .tkt-fact.who{ display:block; }
  .tkd-side-top .tkt-props-view .ex-row:has(> .ex-v.device-meta){ display:none; }
  .tkd-side-top .tkt-props-view .ex-k{ font-size:12px; }   /* v1.4.10.473: the field-label 12 that #tkd-props-card draws anyway (was 10) */
  /* v1.4.10.473: the facts are 12, as on a desktop and in the Details sheet (were 13) */
  .tkd-side-top .tkt-props-view .tkt-fact{ font-size:12px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  /* the words themselves: reading type in the bubbles, and a 16px composer (iOS zooms a field under 16px) */
  /* v1.4.10.473: reading text is 14/400 at 1.5 everywhere (the bubbles were 15 on a phone) */
  .conv-item .cv-bubble, .conv-thread .conv-item .cv-bubble{ font-size:14px; line-height:1.5; padding:10px 12px; }
  .conv-item{ gap:9px; margin-bottom:13px; }
  .conv-item .cv-av{ width:28px; height:28px; font-size:11px; }
  #tkt-composer{ font-size:16px; min-height:88px; }
}
@media (max-width:700px) and (max-height:700px){
  /* the short phones (iPhone SE / 8 at 667, a browser toolbar open): one line of subject, no breadcrumb line */
  .tkd-head h3, .tkd-hero .tkd-subjrow h3{ -webkit-line-clamp:1; }
  .tkd-head .tkd-opened{ display:none; }
}
/* ═══ v1.4.10.456 — the Control tab's table cards: the table's own name, a sentence-case description, one hint per card ═══ */
.ctl-sect-t .ctl-desc{ text-transform:none; letter-spacing:0; font-weight:400; font-size:12px; }
.ctl-sect-t .ctl-tag{ font-size:11px; font-weight:500;   /* v1.4.10.473: 11, a sentence-case tag (10 is for uppercase badges only) */ letter-spacing:0; text-transform:none; color:var(--text-dim); background:var(--bg); border:1px solid var(--line); border-radius:4px; padding:0 5px; margin-left:4px; vertical-align:middle; }
.ctl-tables-hint{ display:flex; gap:8px; align-items:flex-start; margin:8px 0 12px; padding:9px 11px; border-radius:8px; background:var(--accent-glow); color:var(--text); font-size:12px; line-height:1.45; }
.ctl-tables-hint svg{ width:14px; height:14px; flex-shrink:0; margin-top:2px; color:var(--brand-blue); }
.ctl-unread-t{ margin-top:2px; }
/* ═══ v1.4.10.456 — DEVICE ESTATE ROWS: quick telemetry chips, the asset column with its button (js/03-pages.js devEstateRow) ═══ */
.dv-tele{ display:flex; flex-wrap:wrap; gap:4px; margin-top:4px; white-space:normal; }
.dv-tc{ display:inline-flex; align-items:center; gap:4px; padding:1px 7px; border-radius:999px; background:var(--bg); font-size:11px; color:var(--text-mute); line-height:1.5; max-width:100%; }
.dv-tc b{ color:var(--text); font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:160px; }
.dv-tc.ok b{ color:var(--ok); } .dv-tc.err b{ color:var(--err); } .dv-tc.warn b{ color:var(--warn); }
table.est-fixed col.ec-ast{ width:210px; }
table.est-fixed td.dv-astcell{ overflow:visible; text-overflow:clip; }
.dv-ast{ min-width:0; }
.dv-astbtn{ display:inline-flex; align-items:center; gap:5px; border:1px solid var(--line); background:var(--surface); border-radius:7px; padding:3px 8px; font:inherit; font-size:12px; cursor:pointer; color:var(--text); max-width:100%; min-height:28px; }
.dv-astbtn:hover{ border-color:var(--accent); color:var(--accent-deep); }
.dv-astbtn svg{ width:13px; height:13px; color:var(--brand-blue); flex-shrink:0; }
.dv-astbtn b{ font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dv-astm{ font-size:11px; color:var(--text-mute); margin-top:3px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dv-astx{ display:flex; gap:5px; align-items:center; flex-wrap:wrap; margin-top:3px; font-size:11px; }
.dv-astx .pill{ font-size:10px; padding:1px 6px; }
.dv-astw{ color:var(--text-mute); white-space:nowrap; } .dv-astw.warn{ color:var(--warn); } .dv-astw.err{ color:var(--err); }
.dv-ast.none .btn{ white-space:nowrap; }
.dv-astmini{ display:none; }
@media (max-width:1000px){ table.est-fixed col.ec-ast{ width:150px; } .dv-astx{ display:none; } }
@media (max-width:700px){
  table.est-fixed col.ec-ast{ width:0; }
  table.est-fixed td.dv-astcell, table.est-fixed th.dv-astcell{ display:none; }
  .dv-astmini{ display:inline-flex; align-items:center; gap:4px; margin-top:4px; border:1px solid var(--line); border-radius:6px; padding:2px 7px; background:var(--surface); font:inherit; font-size:11px; color:var(--text); min-height:28px; cursor:pointer; }
  .dv-astmini svg{ width:12px; height:12px; color:var(--brand-blue); }
  .dv-tele{ margin-top:3px; }
  .dv-tc b{ max-width:120px; }
  /* the flat List view kept the generic 680px table floor on a phone (measured 680 in a 339 wrapper): the tree dropped it
     in v322; the list follows, its columns being fixed widths with the device name taking the rest */
  .panel-body.flush table.dt.est-list.est-fixed{ min-width:0; }
}
/* ═══ v1.4.10.456 — DEVICE ESTATE ROWS AS DEVICE CARDS: the asset's picture, the issues line, the asset block with its QR ═══ */
table.est-fixed col.ec-pic{ width:92px; }
table.est-fixed td.dv-piccell{ padding-right:4px; overflow:visible; }
.dv-pic{ display:block; width:76px; height:58px; border-radius:8px; object-fit:cover; border:1px solid var(--line); background:var(--surface); }
.dv-pic.ph{ display:flex; align-items:center; justify-content:center; background:var(--bg); }
.dv-pic.ph svg{ width:26px; height:26px; }
.dv-row td{ vertical-align:top !important; padding-top:10px !important; padding-bottom:10px !important; }
.dv-row .dv-stcell{ padding-top:14px !important; }
.dv-issues{ display:flex; flex-wrap:wrap; gap:4px 8px; margin-top:5px; }
.dv-iss{ display:inline-flex; align-items:center; gap:4px; font-size:11px; font-weight:600; }
.dv-iss svg{ width:12px; height:12px; }
.dv-iss.err{ color:var(--err); } .dv-iss.warn{ color:var(--warn); } .dv-iss.ok{ color:var(--ok); font-weight:500; }
table.est-fixed col.ec-ast{ width:300px; }
.dv-astwrap{ display:flex; gap:10px; align-items:flex-start; min-width:0; }
.dv-astwrap .dv-ast{ flex:1; min-width:0; }
.dv-astm.dim{ color:var(--text-dim); }
.dv-qr{ flex-shrink:0; width:60px; height:60px; border-radius:6px; background:#fff; border:1px solid var(--line); padding:2px; box-sizing:content-box; cursor:pointer; overflow:hidden; }
.dv-qr svg{ display:block; width:100%; height:100%; }
.dv-qr:empty{ display:none; }
.dv-astmini small{ font-weight:400; color:var(--text-mute); }
@media (max-width:1100px){ table.est-fixed col.ec-ast{ width:220px; } .dv-qr{ display:none; } }
@media (max-width:1000px){ table.est-fixed col.ec-ast{ width:170px; } }
@media (max-width:700px){
  table.est-fixed col.ec-pic{ width:56px; }
  .dv-pic{ width:44px; height:36px; border-radius:6px; }
  .dv-pic.ph svg{ width:18px; height:18px; }
  .dv-row td{ padding-top:8px !important; padding-bottom:8px !important; }
  table.est-fixed th.dv-piccell{ display:none; }
}/* the phone: the asset and location columns give their tracks back to the device name (the room rides under the name there) */
.dv-room-mini{ display:none; }
@media (max-width:700px){
  table.est-fixed col.ec-ast{ width:0; }
  table.est-fixed col.ec-loc{ width:0; }
  table.est-fixed td.dv-loccell, table.est-fixed th.dv-loccell{ display:none; }
  .dv-room-mini{ display:block; font-size:11px; color:var(--text-mute); margin-top:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
}

/* v1.4.10.468 — the integrator on the work itself (intgChip in js/01-core.js): "Supported by" with the integrator's
   logo on a white tile and its name, on the support ticket, the maintenance job, the task, the shift and the call-out.
   Default: on a navy hero. .light: on a white card. .sm: a list row. */
.intg-chip{display:inline-flex;align-items:center;gap:8px;min-width:0;max-width:100%;vertical-align:middle;}
.intg-chip[hidden]{display:none;}
.intg-chip-l{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:rgba(255,255,255,.72);white-space:nowrap;}   /* v1.4.10.473: the chip's "Integrator" label is an uppercase label, 11/600 .06em (was 10/600 .07em: 10px is for badges, and labels track .06em) */
.intg-chip-tile{display:inline-flex;align-items:center;gap:7px;min-width:0;background:#fff;color:#0C1B2A;border-radius:8px;padding:4px 9px;box-shadow:0 2px 6px rgba(var(--bc-navy-rgb),.22);}
.intg-chip-logo{display:inline-flex;align-items:center;flex:none;}
.intg-chip-logo img{display:block;max-height:22px;max-width:88px;object-fit:contain;}
.intg-chip-tile b{font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;max-width:180px;}
.intg-chip.light .intg-chip-l{color:var(--text-mute);}
.intg-chip.light .intg-chip-tile{box-shadow:none;border:1px solid var(--line);}
.intg-chip.sm{gap:6px;}
.intg-chip.sm .intg-chip-l{display:none;}
.intg-chip.sm .intg-chip-tile{padding:2px 7px;border-radius:6px;}
.intg-chip.sm .intg-chip-logo img{max-height:16px;max-width:60px;}
.intg-chip.sm .intg-chip-tile b{font-size:11px;max-width:130px;}
/* where each surface puts it */
.tkd-intg{flex:none;align-self:flex-start;margin-top:2px;}
@media (max-width:700px){
  .tkd-intg .intg-chip-l{display:none;}
  .tkd-intg .intg-chip-tile b{max-width:96px;}
}.ph-intg{flex:none;align-self:center;margin-left:auto;padding-left:14px;}
.ph-intg + .ph-art{margin-left:14px;}
@media (max-width:700px){
  .ph-intg{align-self:flex-start;padding-left:8px;}
  .ph-intg .intg-chip-l{display:none;}
  .ph-intg .intg-chip-tile b{max-width:110px;}
}.crew-ws-intg{flex:none;align-self:center;margin-right:4px;}
@media (max-width:700px){
  .crew-ws-intg .intg-chip-l{display:none;}
  .crew-ws-intg .intg-chip-tile b{max-width:90px;}
}/* v1.4.10.468: on a phone the integrator is its logo alone (its name only when it has none), so the subject keeps the width */
@media (max-width:700px){
  .tkd-intg .intg-chip-tile,.crew-ws-intg .intg-chip-tile,.ph-intg .intg-chip-tile{padding:3px 6px;border-radius:7px;}
  .tkd-intg .intg-chip-logo img,.crew-ws-intg .intg-chip-logo img,.ph-intg .intg-chip-logo img{max-height:18px;max-width:58px;}
  .tkd-intg .intg-chip-logo + b,.crew-ws-intg .intg-chip-logo + b,.ph-intg .intg-chip-logo + b{display:none;}
  .tkd-intg .intg-chip-tile b,.crew-ws-intg .intg-chip-tile b,.ph-intg .intg-chip-tile b{max-width:76px;font-size:11px;}
}
/* v1.4.10.469: the chip gives way to the subject. Measured at 820px wide the ticket hero row was 514px and the
   chip (flex:none, label + logo + 180px name) took 382px of it, leaving the subject a 10px column. Now it shrinks
   (the name ellipsises, the full name stays in its title) and never takes more than ~40% of the row; from tablet
   width down it drops the "Supported by" label (the phone rules above still win below 701px). */
.tkd-intg,.crew-ws-intg{flex:0 1 auto;min-width:0;max-width:40%;}
.ph-intg{flex:0 1 auto;min-width:0;max-width:45%;}
.tkd-intg .intg-chip,.crew-ws-intg .intg-chip,.ph-intg .intg-chip{display:flex;}
.tkd-intg .intg-chip[hidden],.crew-ws-intg .intg-chip[hidden],.ph-intg .intg-chip[hidden]{display:none;}
@media (min-width:701px) and (max-width:1100px){
  .tkd-intg .intg-chip-l,.crew-ws-intg .intg-chip-l,.ph-intg .intg-chip-l{display:none;}
  .tkd-intg .intg-chip-tile b,.crew-ws-intg .intg-chip-tile b,.ph-intg .intg-chip-tile b{max-width:140px;}
}
/* the iPad-portrait ticket / job / task popup is capped at 560px: there the chip is the logo alone, as on a phone */
@media (min-width:701px) and (max-width:920px){
  .tkd-intg .intg-chip-logo img{max-height:20px;max-width:64px;}
  .tkd-intg .intg-chip-logo + b{display:none;}
}
/* a logo too wide or too tall to read alone (intgChipInner marks it 'odd') keeps its name beside it */
.intg-chip-tile.odd .intg-chip-logo + b{display:block!important;}
/* no stray gap where the chip is hidden (no integrator, or the server said none) */
.tkd-intg:not(:has(.intg-chip:not([hidden]))),.ph-intg:not(:has(.intg-chip:not([hidden]))),.crew-ws-intg:not(:has(.intg-chip:not([hidden]))){display:none;}
/* v1.4.10.472: a requester's ticket closed more than a day ago: a notice instead of the reply box */
.tkd-composer.tkd-sealed{padding:14px 16px;}
.tkd-sealed .cmp-sealed{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:var(--text-mute);line-height:1.5;}
.tkd-sealed .cmp-sealed > svg{width:16px;height:16px;flex:none;color:var(--text-dim);}
.tkd-sealed .cmp-sealed > span{flex:1 1 220px;min-width:0;}

/* ══════════════════════════════════════════════════════════════════════════
   THE OPERATIONS WALLBOARD — v1.4.10.475: one stylesheet for the whole board
   The board was styled in ten layers across this file (v211, v218, v223,
   v233, v296, v299, v311, v327, v369, v371), each re-stating the one before
   with a later, stronger selector. They are folded into this block, the only
   place a .wb- class is styled; what each layer was for is kept beside the
   rule that now does it. The palette is v369's (AVDesk navy, tally colours
   for state only), the type is Poppins for words and the mono face for every
   numeral, and the signature stays: the strobing lamps and the perimeter.

   Layout (js/08 wbFitBoard): under 1,000 px the board is a page that scrolls.
   From 1,000 px it is a WALL (.wb-wall): a column exactly the visible height
   — masthead, alarms, attention strip, ticket tiles, then the working area
   (.wb-ops3, three columns) taking the rest, and under it the deck (.wb-deck:
   Stats · Ody sites · Estate, one page at a time) at --wb-deck-h. Every panel
   on a wall is a column whose list (data-wb-fit) takes what is left of it and
   keeps the rows that fit; .wb-fh hides the rest and .wb-fit-more names them.
   ══════════════════════════════════════════════════════════════════════════ */
.wb-root{
  --wb-ink:#081221; --wb-panel:#0F1B2F; --wb-tile:#0B1628; --wb-line:#1E2F4E;
  --wb-text:#EDF3FE; --wb-dim:#8B9DB5;
  --wb-sig:#4C9EFF; --wb-ok:#2EE6A8; --wb-amber:#FFC24B; --wb-alarm:#FF5D5D;
  --wb-mono:var(--font-mono); --wb-disp:var(--font-display);
  --wb-brand:linear-gradient(112deg,var(--bc-accent) 0%,#3D8BFF 42%,var(--bc-purple) 100%);
  --wb-gap:12px; --wb-pad:clamp(11px,0.95vw,18px);
  position:relative;display:flex;flex-direction:column;gap:var(--wb-gap);box-sizing:border-box;
  font-family:var(--font-body);color:var(--wb-text);background-color:var(--wb-ink);
  /* the ambient scene (v254, re-toned v369): two brand radials, a faint dot grid, a floor vignette — background only */
  background-image:radial-gradient(1200px 520px at 12% -12%, rgba(var(--bc-accent-rgb),0.22), transparent 62%),
                   radial-gradient(900px 460px at 100% -6%, rgba(var(--bc-purple-rgb),0.14), transparent 58%),
                   radial-gradient(rgba(133,152,184,0.05) 1px, transparent 1.5px),
                   linear-gradient(180deg, transparent 64%, rgba(3,7,18,0.55));
  background-size:auto,auto,26px 26px,auto;
  border-radius:10px;padding:clamp(14px,1.3vw,24px);margin:-4px 0;min-height:72vh;}
.wb-root > *{flex:none;min-width:0;}
.wb-root.wb-wall{min-height:0;overflow:hidden;padding:clamp(10px,0.85vw,16px) clamp(12px,1.05vw,20px);}
.wb-root:fullscreen{border-radius:0;margin:0;}
.wb-root:fullscreen:not(.wb-wall){overflow-y:auto;}
.wb-root.wb-wall > .wb-ops3{flex:1 1 0;min-height:0;}
.wb-root.wb-wall > .wb-deck{flex:0 0 var(--wb-deck-h,300px);min-height:0;}
.wb-root.wb-wall.wb-d2view > .wb-deck{flex:1 1 0;}
.wb-root.wb-wall.wb-nodeck > .wb-deck{display:none;}
.wb-fh{display:none !important;}
.wb-loading{text-align:center;padding:80px 0;color:var(--wb-dim);}
.wb-empty{color:var(--wb-dim);font-size:clamp(12px,0.9vw,15px);padding:8px 0;}

/* The board "on air" (v211): a breathing red perimeter the whole room can see; a breach (v217) outranks it */
.wb-root.onair{animation:wbPerim 1.6s ease-in-out infinite;}
.wb-root.breach{animation:wbBreachEdge 0.85s ease-in-out infinite;}
@keyframes wbPerim{0%,100%{box-shadow:inset 0 0 0 2px rgba(255,93,93,0.55), inset 0 0 60px rgba(255,93,93,0.10);}
                   50%{box-shadow:inset 0 0 0 2px rgba(255,93,93,0.15), inset 0 0 24px rgba(255,93,93,0.03);}}
@keyframes wbBreachEdge{0%,100%{box-shadow:inset 0 0 0 3px rgba(255,93,93,0.95), inset 0 0 90px rgba(255,93,93,0.22);}
                        50%{box-shadow:inset 0 0 0 3px rgba(255,93,93,0.30), inset 0 0 30px rgba(255,93,93,0.06);}}
/* No keyframe here starts from opacity:0: WebKit can hold innerHTML-inserted markup at an entry animation's first
   frame for good (v211), which would leave an alarm as an invisible gap on an iPhone. */
@keyframes wbStrobe{0%,49%{background:var(--wb-alarm);box-shadow:0 0 40px rgba(255,93,93,0.9);}50%,100%{background:#7F2222;box-shadow:none;}}
@keyframes wbBreachLamp{0%,49%{background:var(--wb-alarm);color:#1A0505;box-shadow:0 0 60px rgba(255,93,93,1);}
                        50%,100%{background:#5C1414;color:#FFD9D9;box-shadow:none;}}
@keyframes wbBreachRow{0%,100%{background:rgba(255,93,93,0.20);}50%{background:rgba(255,93,93,0.05);}}
@keyframes wbBreachTile{0%,100%{background:rgba(255,93,93,0.22);border-color:rgba(255,93,93,0.95);}
                        50%{background:rgba(255,93,93,0.05);border-color:rgba(255,93,93,0.35);}}
@keyframes wbPulse{0%,100%{opacity:1;}50%{opacity:0.35;}}
@keyframes wbSheen{0%{background-position:120% 0;}55%,100%{background-position:-160% 0;}}
@keyframes wbClearBreathe{0%,100%{box-shadow:0 0 26px rgba(46,230,168,0.18), inset 0 0 22px rgba(46,230,168,0.05);}
                          50%{box-shadow:0 0 8px rgba(46,230,168,0.05), inset 0 0 8px rgba(46,230,168,0.02);}}
@keyframes wbDeckTurn{to{transform:scaleX(1);}}

/* ── the masthead: the AVDesk lockup on the brand rule, one tray of controls, the clock (v369) ── */
.wb-head{display:flex;align-items:center;justify-content:space-between;gap:10px 16px;flex-wrap:wrap;position:relative;padding-bottom:12px;}
.wb-head::after{content:'';position:absolute;left:0;right:0;bottom:0;height:3px;border-radius:3px;background:var(--wb-brand);pointer-events:none;}
.wb-brand{display:flex;align-items:center;gap:16px;min-width:0;}
.wb-logo{height:clamp(28px,2.2vw,42px);width:auto;display:block;flex:none;}
.wb-logo-txt{font-family:var(--wb-disp);font-weight:700;font-size:clamp(22px,1.9vw,32px);color:#fff;letter-spacing:-0.02em;}
.wb-brand-sep{width:1px;align-self:stretch;min-height:34px;flex:none;background:linear-gradient(180deg,transparent,var(--wb-line) 20%,var(--wb-line) 80%,transparent);}
.wb-brand-t{min-width:0;}
.wb-title{font-family:var(--wb-disp);font-weight:600;font-size:clamp(16px,1.3vw,23px);letter-spacing:-0.01em;line-height:1.2;color:var(--wb-text);}
.wb-scope{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px;margin-top:3px;color:var(--wb-dim);font-size:clamp(11.5px,0.85vw,14px);letter-spacing:0.01em;}
.wb-scope-u{font-variant-numeric:tabular-nums;}
.wb-scope-u::before{content:'·';margin-right:8px;}
.wb-live{width:9px;height:9px;border-radius:50%;flex:none;background:var(--wb-ok);box-shadow:0 0 10px var(--wb-ok);animation:wbPulse 2.4s ease-in-out infinite;}
.wb-live.stale{background:var(--wb-alarm);box-shadow:0 0 10px var(--wb-alarm);animation:none;}
.wb-head-r{display:flex;align-items:center;justify-content:flex-end;gap:10px 14px;flex-wrap:wrap;}
.wb-tray{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
/* on a wall the masthead is ONE row whatever the width: the title block gives way (its scope line wraps under the
   title) and the controls and the clock keep their size. The inline flex-wrap (v197) is for a phone. */
.wb-wall .wb-head,.wb-wall .wb-head-r,.wb-wall .wb-tray{flex-wrap:nowrap !important;}
.wb-wall .wb-brand{flex:1 1 auto;}
.wb-wall .wb-head-r{flex:none;}
.wb-wall .wb-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
/* every control in the tray is one family: panel ink, a line border, a 40 px floor (v197) */
.wb-mode{display:flex;border:1px solid var(--wb-line);border-radius:7px;overflow:hidden;flex:none;}
.wb-modebtn{background:var(--wb-panel);border:0;color:var(--wb-dim);padding:0 12px;min-height:40px;cursor:pointer;font:inherit;font-size:13px;white-space:nowrap;}
.wb-modebtn + .wb-modebtn{border-left:1px solid var(--wb-line);}
.wb-modebtn.on{background:rgba(76,158,255,0.16);color:var(--wb-text);}
.wb-d2btn,.wb-stats-btn,.wb-snd,.wb-size{background:var(--wb-panel);border:1px solid var(--wb-line);color:var(--wb-dim);border-radius:7px;min-height:40px;cursor:pointer;font-family:inherit;font-size:13px;white-space:nowrap;box-sizing:border-box;}
.wb-d2btn{display:inline-flex;align-items:center;gap:6px;padding:0 14px;}
.wb-d2btn svg{width:14px;height:14px;}
.wb-stats-btn{padding:0 12px;}
.wb-stats-btn.on{color:var(--wb-text);border-color:rgba(76,158,255,0.5);background:rgba(76,158,255,0.12);}
.wb-snd{min-width:40px;padding:0;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;}
.wb-snd svg{width:17px;height:17px;}
.wb-snd.off{color:var(--wb-amber);border-color:rgba(255,194,75,0.5);}
.wb-size{padding:0 10px;}
.wb-d2tag{display:inline-flex;align-items:center;min-height:40px;padding:0 14px;border:1px solid var(--wb-line);border-radius:7px;color:var(--wb-sig);font-size:12px;font-weight:700;letter-spacing:0.12em;text-transform:uppercase;box-sizing:border-box;}
.wb-modebtn:hover,.wb-d2btn:hover,.wb-stats-btn:hover,.wb-snd:hover,.wb-size:hover{color:var(--wb-text);border-color:#3B537F;}
.wb-modebtn:focus-visible,.wb-d2btn:focus-visible,.wb-stats-btn:focus-visible,.wb-snd:focus-visible,.wb-size:focus-visible,
.wb-fs:focus-visible,.wb-ackbtn:focus-visible,.wb-deck-tab:focus-visible{outline:2px solid var(--wb-sig);outline-offset:2px;}
/* what the deck folded away, in words, on the scope line (v1.4.10.475; it was a box in the tray and pushed the masthead
   onto two rows on a 1,280 px panel) */
.wb-low-hid{color:#D5C8FF;}
.wb-low-hid::before{content:'·';margin-right:8px;color:var(--wb-dim);}
.wb-low-hid[hidden]{display:none;}
.wb-timebox{text-align:right;border-left:1px solid var(--wb-line);padding-left:14px;}
#wb-clock{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-variant-numeric:tabular-nums;font-size:clamp(24px,2.3vw,40px);font-weight:500;letter-spacing:0.04em;line-height:1.05;text-shadow:0 0 26px rgba(61,139,255,0.35);}
#wb-date{color:var(--wb-dim);font-size:clamp(11px,0.8vw,14px);letter-spacing:0.03em;}
.wb-fs{display:inline-flex;align-items:center;gap:7px;min-height:40px;padding:0 14px;border:0;border-radius:7px;background:var(--wb-brand);color:#fff;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;box-sizing:border-box;white-space:nowrap;}
.wb-fs:hover{filter:brightness(1.08);}
.wb-fs svg{width:16px;height:16px;}
/* v1.4.10.475: in fullscreen a wall shows the board, not its settings — the tray and the button step back until a
   pointer comes to the masthead (a muted board keeps its bell showing; a touch screen keeps them all, below) */
.wb-root:fullscreen .wb-tray > :not(.wb-snd.off),.wb-root:fullscreen .wb-fs{opacity:0;transition:opacity .25s ease;}
.wb-root:fullscreen .wb-head:hover .wb-tray > *,.wb-root:fullscreen .wb-head:hover .wb-fs,
.wb-root:fullscreen .wb-head:focus-within .wb-tray > *,.wb-root:fullscreen .wb-head:focus-within .wb-fs{opacity:1;}

/* ── the two alarms, side by side (v369): the lamps strobe until a person acts ── */
.wb-action{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--wb-gap);}
.wb-action.two{grid-template-columns:minmax(0,1fr) minmax(0,1fr);}
.wb-brc,.wb-onair{display:flex;align-items:stretch;min-width:0;border-radius:10px;overflow:hidden;}
.wb-brc{border:2px solid var(--wb-alarm);background:linear-gradient(135deg,rgba(255,93,93,0.22),rgba(255,93,93,0.07));}
.wb-onair{border:1px solid rgba(255,93,93,0.65);background:linear-gradient(135deg,rgba(255,93,93,0.14),rgba(255,93,93,0.04));}
.wb-brc-lamp,.wb-onair-lamp{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;flex:none;min-width:clamp(84px,6.4vw,118px);
  padding:12px clamp(12px,1.3vw,24px);box-sizing:border-box;background:var(--wb-alarm);color:#1A0505;font-family:var(--wb-disp);font-weight:700;letter-spacing:0.14em;}
.wb-brc-lamp{animation:wbBreachLamp 0.85s steps(2,jump-none) infinite;}
.wb-onair-lamp{animation:wbStrobe 1.1s steps(2,jump-none) infinite;}
.wb-brc-word,.wb-onair-word{font-size:clamp(18px,1.75vw,32px);line-height:1;}
.wb-brc-word2,.wb-onair-word2{font-size:clamp(10px,0.85vw,15px);line-height:1;}
.wb-brc-main,.wb-onair-main{flex:1;min-width:0;padding:10px clamp(12px,1.1vw,18px);}
.wb-brc-h,.wb-onair-h{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 10px;margin-bottom:8px;font-family:var(--wb-disp);font-size:clamp(12.5px,1vw,18px);font-weight:700;letter-spacing:0.05em;text-transform:uppercase;}
.wb-brc-h{color:#FFC9C9;}
.wb-onair-h{color:#FFB3B3;}
.wb-more-n{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;letter-spacing:0;text-transform:none;color:var(--wb-text);opacity:0.85;font-size:0.9em;}
.wb-more-n[hidden]{display:none;}
.wb-onair.wb-onair-mini .wb-onair-main{display:flex;align-items:center;}
.wb-onair.wb-onair-mini .wb-onair-h{margin:0;}
.wb-cards{display:grid;grid-template-columns:repeat(var(--cols,2),minmax(0,1fr));gap:8px;}
.wb-tcard{display:flex;align-items:center;gap:10px;min-width:0;padding:7px 10px;border-radius:8px;background:rgba(6,10,22,0.55);border:1px solid rgba(255,93,93,0.30);box-sizing:border-box;}
.wb-tcard-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;}
.wb-tcard-top{display:flex;align-items:center;gap:8px;min-width:0;font-size:clamp(12px,0.88vw,15px);}
.wb-tcard-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:clamp(12.5px,0.92vw,16px);color:var(--wb-text);font-weight:500;}
.wb-tcard-meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:clamp(11px,0.76vw,13px);color:#FFD0D0;opacity:0.85;}
.wb-tcard.onair .wb-tcard-meta{color:var(--wb-dim);opacity:1;}
.wb-brc-ref,.wb-onair-ref{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:600;flex:none;}
.wb-brc-over{margin-left:auto;flex:none;white-space:nowrap;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:700;color:#FFD9D9;}
.wb-onair-when{margin-left:auto;flex:none;white-space:nowrap;color:var(--wb-dim);font-size:12px;}
.wb-ackbtn{flex:none;min-height:36px;padding:7px 12px;border:0;border-radius:7px;background:var(--wb-alarm);color:#1A0505;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;}
.wb-ackbtn:hover{background:#FF7A7A;}
.wb-ackbtn:disabled{opacity:0.6;cursor:default;}

/* ── the attention strip, worst first (on a wall one line, keeping the chips that fit), or the all-clear ── */
.wb-attn{display:flex;flex-wrap:wrap;gap:8px;}
.wb-wall .wb-attn{flex-wrap:nowrap;overflow:hidden;}
.wb-chip{flex:none;white-space:nowrap;border:1px solid var(--wb-line);border-radius:999px;padding:6px 13px;font-size:clamp(12px,0.88vw,15px);font-weight:700;background:var(--wb-panel);color:var(--wb-text);}
.wb-chip.err{color:#FFB3B3;border-color:rgba(255,93,93,0.5);}
.wb-chip.warn{color:#FFDA8A;border-color:rgba(255,194,75,0.5);}
.wb-chip.off{color:#A9B6C8;border-color:#3B537F;}
.wb-chip.acc{color:#D5C8FF;border-color:rgba(167,139,250,0.55);}
.wb-attn > .wb-chip-more{display:inline-block;padding:6px 13px;border:1px dashed var(--wb-line);border-radius:999px;color:var(--wb-dim);font-weight:600;}
.wb-clear{display:flex;align-items:center;gap:14px;padding:13px 18px;border:1px solid rgba(46,230,168,0.4);border-radius:10px;background:linear-gradient(135deg,rgba(46,230,168,0.12),rgba(46,230,168,0.03));
  font-family:var(--wb-disp);font-size:clamp(15px,1.15vw,19px);font-weight:600;color:var(--wb-ok);animation:wbClearBreathe 4.5s ease-in-out infinite;}
.wb-clear-dot{width:12px;height:12px;border-radius:50%;flex:none;background:var(--wb-ok);box-shadow:0 0 12px var(--wb-ok);}
.wb-clear.wb-clear-sm{margin-top:8px;padding:10px 14px;font-size:clamp(13px,0.95vw,16px);animation:none;}

/* ── panels and tile rails ── */
.wb-panel{min-width:0;box-sizing:border-box;padding:var(--wb-pad);border:1px solid var(--wb-line);border-radius:10px;
  background:linear-gradient(180deg,rgba(255,255,255,0.028),transparent 42%),var(--wb-panel);
  box-shadow:0 12px 30px rgba(3,7,18,0.45), inset 0 1px 0 rgba(255,255,255,0.045);}
.wb-panel-h{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:4px 12px;position:relative;margin-bottom:10px;padding-bottom:7px;}
.wb-panel-h::after{content:'';position:absolute;left:0;right:0;bottom:0;height:1px;background:linear-gradient(90deg,var(--wb-line) 0%,rgba(34,48,76,0.25) 62%,transparent 95%);}
.wb-panel-t{display:flex;align-items:center;gap:8px;white-space:nowrap;font-family:var(--wb-disp);font-size:clamp(11px,0.8vw,14px);font-weight:700;letter-spacing:0.08em;text-transform:uppercase;color:var(--wb-dim);}
.wb-eyedot{width:7px;height:7px;border-radius:50%;flex:none;box-shadow:0 0 8px currentColor;}
.wb-panel-sub{min-width:0;color:var(--wb-dim);font-size:clamp(11px,0.8vw,13.5px);}
/* on a wall every panel is a column: its head and tiles keep their height, its list takes the rest and fits it */
.wb-wall .wb-panel{display:flex;flex-direction:column;min-height:0;overflow:hidden;}
.wb-wall .wb-panel > *{flex:none;}
.wb-wall .wb-panel-h{flex-wrap:nowrap;}
.wb-wall .wb-panel-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.wb-wall [data-wb-fit]:not([data-wb-fit-axis]):not([data-wb-fit-rows]){flex:1 1 auto;min-height:0;overflow:hidden;}
/* the ticket strip on a wall is one row: its name and the day's figures in a column at the left, then the tiles */
.wb-wall .wb-support{flex-direction:row;align-items:stretch;gap:14px;padding:clamp(8px,0.6vw,12px) var(--wb-pad);}
.wb-wall .wb-support > .wb-panel-h{flex:0 0 clamp(150px,10.5vw,210px);flex-direction:column;align-items:flex-start;justify-content:center;gap:5px;margin:0;padding:0 14px 0 0;border-right:1px solid var(--wb-line);}
.wb-wall .wb-support > .wb-panel-h::after{display:none;}
.wb-wall .wb-support > .wb-panel-h .wb-panel-sub{white-space:normal;line-height:1.35;}
.wb-wall .wb-support > .wb-tiles{flex:1 1 auto;min-width:0;}
.wb-wall .wb-panel-h{margin-bottom:8px;padding-bottom:6px;}
.wb-wall .wb-brc-main,.wb-wall .wb-onair-main{padding:8px clamp(10px,0.9vw,16px);}
.wb-wall .wb-brc-h,.wb-wall .wb-onair-h{margin-bottom:6px;}
.wb-wall #wb-clock{font-size:clamp(22px,2vw,36px);}
.wb-wall .wb-status-tiles .wb-tile{padding-top:clamp(6px,0.5vw,10px);padding-bottom:clamp(6px,0.5vw,10px);}
.wb-wall .wb-status-tiles .wb-tile-v{font-size:clamp(22px,1.95vw,40px);}
.wb-fit-more{display:block;padding:5px 8px 2px;border-top:1px dashed var(--wb-line);color:#FFDA8A;font-size:clamp(11px,0.8vw,13px);}
.wb-fit-more[hidden]{display:none !important;}
.wb-tiles + [data-wb-fit]{margin-top:8px;}
.wb-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;}
.wb-tiles.wb-t3{grid-template-columns:repeat(3,minmax(0,1fr));}
/* the status tiles: one column per status + the SLA tile, --n set by wbTicketTiles (v296) */
.wb-tiles.wb-auto{grid-template-columns:repeat(var(--n,6),minmax(0,1fr));}
/* a tile is a channel strip: dark face, tally keel on the left washing into it, mono numeral with a bloom in its own colour */
.wb-tile{position:relative;min-width:0;overflow:hidden;box-sizing:border-box;border:1px solid var(--wb-line);border-radius:8px;
  padding:clamp(8px,0.7vw,13px) clamp(10px,0.8vw,15px) clamp(8px,0.7vw,13px) clamp(13px,1.05vw,20px);
  background:linear-gradient(90deg,color-mix(in srgb,var(--keel,transparent) 10%,transparent),transparent 40%),
             linear-gradient(180deg,rgba(255,255,255,0.03),transparent 30%),var(--wb-tile);}
.wb-tile::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--keel,var(--wb-line));box-shadow:0 0 12px var(--keel,transparent);}
.wb-tile-l{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:clamp(10px,0.72vw,12.5px);font-weight:600;letter-spacing:0.09em;text-transform:uppercase;color:var(--wb-dim);}
.wb-tile-v{margin-top:3px;white-space:nowrap;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:clamp(24px,2.2vw,44px);font-weight:500;line-height:1.08;font-variant-numeric:tabular-nums;text-shadow:0 0 24px;}
.wb-small .wb-tile{padding:clamp(6px,0.5vw,10px) 10px clamp(6px,0.5vw,10px) clamp(12px,0.9vw,16px);}
.wb-small .wb-tile-v{font-size:clamp(19px,1.6vw,33px);}
/* a tile holding a plain zero recedes (v254) so the numbers that say something own the eye */
.wb-tile.wb-zero::before{box-shadow:none;opacity:0.55;}
.wb-tile.wb-zero .wb-tile-v{opacity:0.5;text-shadow:none;}
.wb-tile.wb-zero .wb-tile-l{opacity:0.75;}
.wb-tile.wb-tile-alarm{animation:wbBreachTile 0.85s ease-in-out infinite;}
/* the estate meter: one signal bar, LED slots over it, a slow sheen (v254) */
.wb-meter{position:relative;height:14px;margin-top:12px;overflow:hidden;border:1px solid var(--wb-line);border-radius:6px;background:var(--wb-tile);}
.wb-meter-fill{display:flex;height:100%;}
.wb-meter-fill > div{background-image:linear-gradient(180deg,rgba(255,255,255,0.32),rgba(255,255,255,0.05) 45%,transparent 60%);}
.wb-meter::after{content:'';position:absolute;inset:0;pointer-events:none;background:linear-gradient(100deg,transparent 30%,rgba(237,243,254,0.14) 50%,transparent 70%);background-size:280% 100%;animation:wbSheen 7s ease-in-out infinite;}
.wb-meter-slots{position:absolute;inset:0;pointer-events:none;background:repeating-linear-gradient(90deg,transparent 0 10px,var(--wb-ink) 10px 12px);}
.wb-subline{display:flex;flex-wrap:wrap;gap:6px 20px;margin-top:10px;color:var(--wb-dim);font-size:clamp(12px,0.88vw,15px);}
.wb-subline b{color:var(--wb-text);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;font-variant-numeric:tabular-nums;}
.wb-wall .wb-estate .wb-subline{gap:4px 14px;font-size:clamp(12px,0.78vw,14px);}
.wb-pp{flex:none;border:1px solid;border-radius:6px;padding:1px 7px;font-size:11px;font-weight:700;}

/* ── the working area: the clocks | the day | live monitoring, three columns ending level ── */
.wb-ops3{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.55fr) minmax(0,1fr);gap:var(--wb-gap);align-items:stretch;}
.wb-ops3 > *{min-width:0;}
.wb-stack{display:flex;flex-direction:column;gap:var(--wb-gap);min-width:0;}
.wb-root:not(.wb-wall) .wb-stack > .wb-panel:last-child{flex:1 1 auto;}
.wb-wall .wb-ops3{grid-template-rows:minmax(0,1fr);}
.wb-wall .wb-ops3 > *{min-height:0;}
.wb-wall .wb-stack{overflow:clip;overflow-clip-margin:20px;}   /* a safety net: a column never spills (its panels' shadows still show) */
.wb-wall .wb-stack > .wb-panel{flex:1 1 auto;}
/* SLA countdown rows — the countdown is timecode */
.wb-sla-row{display:flex;align-items:center;gap:12px;min-width:0;padding:8px 2px;border-top:1px solid var(--wb-line);}
.wb-sla-row:first-child{border-top:0;}
.wb-sla-cd{flex:none;min-width:8.6ch;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-variant-numeric:tabular-nums;font-weight:500;font-size:clamp(17px,1.4vw,26px);text-shadow:0 0 18px;}
.wb-sla-row.ok .wb-sla-cd{color:var(--wb-ok);}
.wb-sla-row.warn .wb-sla-cd{color:var(--wb-amber);}
.wb-sla-row.err .wb-sla-cd{color:var(--wb-alarm);animation:wbPulse 1.2s ease-in-out infinite;}
.wb-sla-row.paused .wb-sla-cd{color:var(--wb-dim);text-shadow:none;}
.wb-sla-row.overdue{padding-left:8px;padding-right:8px;border-radius:6px;animation:wbBreachRow 1.1s ease-in-out infinite;}
.wb-sla-od{display:inline-block;vertical-align:middle;padding:1px 7px;border-radius:5px;background:var(--wb-alarm);color:#1A0505;font-family:var(--wb-disp);font-weight:700;font-size:0.78em;letter-spacing:0.1em;}
.wb-sla-mid{flex:1;min-width:0;}
.wb-sla-top{display:flex;align-items:center;gap:8px;min-width:0;font-size:clamp(13px,0.95vw,16px);}
.wb-sla-top b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;}
.wb-sla-st{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--wb-dim);font-size:12px;}
.wb-sla-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--wb-dim);font-size:clamp(12px,0.85vw,14px);}
.wb-sla-phase{flex:none;padding:3px 8px;border:1px solid var(--wb-line);border-radius:6px;color:var(--wb-dim);font-size:11px;letter-spacing:0.08em;text-transform:uppercase;}
/* the latest arrivals */
.wb-feed-row{display:flex;align-items:center;gap:10px;min-width:0;padding:7px 2px;border-top:1px solid var(--wb-line);font-size:clamp(13px,0.92vw,15.5px);}
.wb-feed-row:first-child{border-top:0;}
.wb-feed-row.fresh{padding-left:8px;border-radius:6px;background:linear-gradient(90deg,rgba(255,93,93,0.12),transparent);}
.wb-feed-when{flex:none;min-width:7.5ch;white-space:nowrap;color:var(--wb-dim);font-size:12px;}
.wb-feed-mid{flex:1;min-width:0;display:flex;align-items:baseline;gap:8px;}
.wb-feed-mid b{flex:none;white-space:nowrap;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;}
.wb-feed-mid span{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#B7C3D8;}
.wb-feed-st{flex:none;white-space:nowrap;padding:3px 8px;border-radius:6px;font-size:11px;font-weight:700;}
.wb-feed-st.live{color:#9FC8FF;border:1px solid rgba(76,158,255,0.45);}
.wb-feed-st.closed{color:var(--wb-dim);border:1px solid var(--wb-line);}
/* monitoring alerts — the live list (v369) */
/* on a wall the alert counts are one strip of tallies, so the list itself (what is down, where) keeps the room */
.wb-wall .wb-alerts .wb-tile{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:4px 9px 4px 12px;}
.wb-wall .wb-alerts .wb-tile-v{margin-top:0;font-size:clamp(16px,1.25vw,23px);text-shadow:none;}
.wb-wall .wb-alerts .wb-tile-l{letter-spacing:0.04em;}
.wb-wall .wb-alerts .wb-tiles{gap:6px;}
.wb-al-row{display:flex;align-items:center;gap:10px;min-width:0;padding:6px 0;border-top:1px solid var(--wb-line);}
.wb-al-row:first-child{border-top:0;}
.wb-al-sev{flex:none;padding:1px 6px;border:1px solid var(--sc);border-radius:4px;color:var(--sc);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;}
.wb-al-mid{flex:1;min-width:0;}
.wb-al-t{display:flex;align-items:baseline;gap:6px;min-width:0;white-space:nowrap;overflow:hidden;font-size:clamp(12.5px,0.9vw,15px);}
.wb-al-t > *{flex:none;}
.wb-al-t span{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;}
.wb-al-t b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;}
.wb-al-t em{font-style:normal;color:#FFC9C9;font-size:0.9em;}
.wb-al-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--wb-dim);font-size:clamp(11px,0.76vw,13px);}
.wb-al-tk{flex:none;color:var(--wb-sig);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;}
.wb-al-age{flex:none;min-width:4.6em;text-align:right;color:var(--wb-dim);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;font-variant-numeric:tabular-nums;}
/* status line rows: connectors, switch alerts, readiness, compliance */
.wb-line-row{display:flex;align-items:center;gap:10px;min-width:0;padding:7px 0;border-top:1px solid var(--wb-line);font-size:clamp(13px,0.92vw,15px);}
.wb-line-row:first-child{border-top:0;}
.wb-dot{width:9px;height:9px;border-radius:50%;flex:none;}
.wb-line-mid{flex:1;min-width:0;display:flex;flex-direction:column;}
.wb-line-mid b{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;}
.wb-line-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--wb-dim);font-size:clamp(11px,0.8vw,13px);}
.wb-line-st{flex:none;white-space:nowrap;font-weight:700;}
.wb-line-mix{display:flex;gap:8px;flex:none;font-size:12px;}

/* ── Today: maintenance | tasks by person (v296) ── */
.wb-today-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--wb-gap);align-items:start;min-width:0;}
.wb-wall .wb-today > .wb-today-cols{flex:1 1 auto;min-height:0;grid-template-rows:minmax(0,1fr);align-items:stretch;}
.wb-today-col{display:flex;flex-direction:column;min-width:0;min-height:0;}
.wb-today-col > *{flex:none;}
.wb-today-h{display:flex;align-items:center;gap:10px;min-width:0;margin-bottom:6px;padding:6px 10px;border:1px solid var(--wb-line);border-radius:8px;background:var(--wb-tile);}
.wb-today-t{flex:none;font-family:var(--wb-disp);font-weight:700;font-size:clamp(13px,1vw,17px);}
.wb-today-kpis{display:flex;flex-wrap:wrap;gap:2px 10px;flex:1;min-width:0;}
.wb-kpi{display:inline-flex;align-items:baseline;gap:5px;white-space:nowrap;color:var(--wb-dim);font-size:clamp(11px,0.8vw,13px);letter-spacing:0.04em;text-transform:uppercase;}
.wb-kpi b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;font-size:clamp(15px,1.2vw,21px);color:var(--wb-text);opacity:0.55;font-variant-numeric:tabular-nums;}
.wb-kpi.on b{opacity:1;color:var(--k,var(--wb-text));text-shadow:0 0 14px var(--k,transparent);}
.wb-today-h .wb-svg-ring{width:42px;flex:none;}
/* on a wall the column heads are one line: the counts stay, the ring (the same counts as a percentage) goes */
.wb-wall .wb-today-h{flex-wrap:nowrap;overflow:hidden;padding:5px 10px;}
.wb-wall .wb-today-h .wb-svg-ring{display:none;}
.wb-wall .wb-today-kpis{flex-wrap:nowrap;overflow:hidden;gap:2px 9px;}
.wb-wall .wb-kpi{gap:4px;font-size:clamp(9.5px,0.64vw,11.5px);letter-spacing:0.02em;}
.wb-wall .wb-kpi b{font-size:clamp(14px,1vw,18px);}
.wb-td-list{min-width:0;}
.wb-td-row{display:flex;align-items:center;gap:10px;min-width:0;padding:6px 8px;border-top:1px solid var(--wb-line);border-radius:6px;font-size:clamp(13px,0.92vw,15.5px);}
.wb-td-list > .wb-td-row:first-child,.wb-person-h + .wb-tk-wrap > .wb-td-row{border-top:0;}
.wb-td-row.late{background:linear-gradient(90deg,rgba(255,93,93,0.12),transparent 60%);}
.wb-td-when{flex:none;min-width:5.6ch;white-space:nowrap;color:var(--wb-text);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-variant-numeric:tabular-nums;font-weight:500;}
.wb-td-when small{color:var(--wb-dim);font-size:0.78em;font-weight:400;}
.wb-td-when.late{color:#FFB3B3;}
.wb-td-when.on{color:#C4B5FD;}
.wb-td-dot{width:9px;height:9px;border-radius:50%;flex:none;}
.wb-td-mid{flex:1;min-width:0;}
.wb-td-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.wb-td-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--wb-dim);font-size:clamp(11px,0.8vw,13px);}
.wb-td-sub b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;color:#B7C3D8;}
.wb-td-late{display:inline-block;vertical-align:middle;padding:1px 6px;border-radius:5px;background:var(--wb-alarm);color:#1A0505;font-family:var(--wb-disp);font-weight:700;font-size:0.72em;letter-spacing:0.1em;}
/* the kind (or a task's priority) and the person lead the second line (v1.4.10.475; they were columns beside the title) */
.wb-td-kind{display:inline-block;vertical-align:1px;margin-right:6px;padding:0 5px;border:1px solid;border-radius:4px;font-size:0.82em;font-weight:700;line-height:1.35;letter-spacing:0.05em;text-transform:uppercase;}
.wb-td-who{color:#B7C3D8;}
.wb-td-who.none{color:var(--wb-dim);font-style:italic;}
.wb-person{margin-bottom:6px;padding:5px 7px 3px;border:1px solid var(--wb-line);border-radius:8px;background:linear-gradient(180deg,rgba(255,255,255,0.02),transparent 50%);}
.wb-person.all{border-color:rgba(167,139,250,0.45);}
.wb-person.none{border-style:dashed;}
.wb-person-h{display:flex;align-items:center;gap:10px;min-width:0;padding:2px 4px 5px;font-size:clamp(13px,0.95vw,16px);}
.wb-person-h b{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:var(--wb-disp);font-weight:700;}
.wb-person-n{margin-left:auto;white-space:nowrap;color:var(--wb-dim);font-size:0.85em;}
.wb-person-n em{color:#FFB3B3;font-style:normal;font-weight:700;}
.wb-av{width:24px;height:24px;border-radius:50%;flex:none;display:inline-flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:11px;letter-spacing:0.02em;box-shadow:0 0 10px rgba(0,0,0,0.4);}
.wb-av svg{width:13px;height:13px;}
.wb-tk-prog{flex:none;width:56px;height:6px;overflow:hidden;border:1px solid var(--wb-line);border-radius:3px;background:var(--wb-tile);}
.wb-tk-prog i{display:block;height:100%;background:var(--wb-ok);}
.wb-tk-st{display:inline-block;margin-right:6px;padding:0 5px;border:1px solid color-mix(in srgb,var(--sc,#8598B8) 55%,transparent);border-radius:5px;color:var(--sc,#8598B8);font-size:0.85em;}
/* the checklist under a task (v299); a short region packs it onto one line (.wb-chk-tight), then leaves it out */
.wb-tk-items{margin:0 0 4px 14px;padding:3px 8px 5px 20px;border-left:2px solid var(--wb-line);}
.wb-tk-ih{margin:0 0 3px;color:var(--wb-dim);font-size:clamp(9.5px,0.68vw,11px);font-weight:700;letter-spacing:0.08em;text-transform:uppercase;}
.wb-tk-items.mine .wb-tk-ih{color:var(--wb-sig);}
.wb-tk-i{display:flex;align-items:center;gap:7px;min-width:0;padding:2px 0;font-size:clamp(11px,0.8vw,13px);line-height:1.35;}
.wb-tk-ck{flex:none;width:14px;height:14px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--wb-dim);border-radius:4px;color:#fff;}
.wb-tk-ck svg{width:10px;height:10px;}
.wb-tk-i.done .wb-tk-ck{background:var(--wb-ok);border-color:var(--wb-ok);}
.wb-tk-i.done .wb-tk-it{text-decoration:line-through;color:var(--wb-dim);}
.wb-tk-it{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--wb-text);}
.wb-tk-iw{flex:none;max-width:34%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--wb-dim);font-size:clamp(10px,0.7vw,11.5px);}
.wb-tk-i.more .wb-tk-ck{border-style:dashed;}
.wb-tk-i.more .wb-tk-it{color:var(--wb-dim);font-style:italic;}
.wb-chk-tight .wb-tk-items{display:flex;flex-wrap:wrap;gap:2px 12px;margin-bottom:2px;padding:0 6px 3px 20px;border-left:0;}
.wb-chk-tight .wb-tk-ih,.wb-chk-tight .wb-tk-iw{display:none;}
.wb-chk-tight .wb-tk-i{max-width:48%;padding:0;font-size:clamp(10.5px,0.72vw,12px);}
.wb-chk-tight .wb-tk-ck{width:11px;height:11px;}
.wb-chk-off .wb-tk-items{display:none;}

/* ── the deck: Stats · Ody sites · Estate, one page at a time under the working area (v1.4.10.475) ── */
.wb-deck{display:flex;flex-direction:column;gap:8px;min-width:0;}
.wb-deck-bar{display:flex;align-items:center;flex-wrap:wrap;gap:6px;flex:none;}
.wb-deck-tab{position:relative;overflow:hidden;min-height:28px;padding:3px 14px;border:1px solid var(--wb-line);border-radius:999px;background:var(--wb-panel);color:var(--wb-dim);
  font-family:inherit;font-size:clamp(10.5px,0.72vw,12.5px);font-weight:700;letter-spacing:0.08em;text-transform:uppercase;cursor:pointer;box-sizing:border-box;}
.wb-deck-tab:hover{color:var(--wb-text);}
.wb-deck-tab.on{color:var(--wb-text);border-color:rgba(76,158,255,0.55);background:rgba(76,158,255,0.14);}
/* the turn's progress: a line that fills under the page on show (its delay is negative mid-turn, so a repaint continues it) */
.wb-deck-tab.on.run::after{content:'';position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--wb-sig);transform-origin:left center;transform:scaleX(0);
  animation:wbDeckTurn var(--wb-deck-ms,15000ms) linear var(--wb-deck-el,0ms) forwards;}
.wb-deck-page{display:none;min-width:0;}
.wb-deck-page.on,.wb-deck-all > .wb-deck-page{display:block;}
.wb-wall .wb-deck-page.on{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;}
.wb-wall .wb-deck-page > *{flex:1 1 auto;min-height:0;}
.wb-root:not(.wb-wall) .wb-deck{gap:var(--wb-gap);}
.wb-root:not(.wb-wall) .wb-deck-page{display:block;}
.wb-root:not(.wb-wall) .wb-deck-bar{display:none;}
/* display 2 (v212): every page at once, in bands across the full width — the stats, the Ody sites, then the Estate
   panels (two rows of them when there are more than four) taking the rest */
.wb-wall .wb-deck-all{display:flex;flex-direction:column;gap:var(--wb-gap);}
.wb-wall .wb-deck-all > .wb-deck-page{display:flex;flex-direction:column;min-height:0;flex:1 1 0;}
.wb-wall .wb-deck-all > .wb-deck-page[data-page="stats"]{flex:0 0 28%;}
.wb-wall .wb-deck-all > .wb-deck-page[data-page="ody"]{flex:0 0 26%;}
.wb-wall .wb-deck-all.no-ody > .wb-deck-page[data-page="stats"]{flex-basis:36%;}
.wb-wall .wb-deck-all.no-stats > .wb-deck-page[data-page="ody"]{flex-basis:38%;}
.wb-wall .wb-deck-all.no-estate > .wb-deck-page[data-page="ody"]{flex:1 1 0;}
.wb-wall .wb-deck-all.no-estate.no-ody > .wb-deck-page[data-page="stats"]{flex:1 1 0;}
/* the Estate page: its panels side by side (a wall), or as many columns as fit (a page) */
.wb-estate-grid{display:grid;grid-template-columns:repeat(var(--cols,3),minmax(0,1fr));gap:var(--wb-gap);min-width:0;}
.wb-wall .wb-estate-grid{grid-auto-rows:minmax(0,1fr);}
/* an Estate panel narrower than four readable tiles lays them two by two (labels like "In service" were cut) */
.wb-estate-grid > .wb-panel{container:wbpanel / inline-size;}
@container wbpanel (max-width: 470px){ .wb-tiles.wb-t4{grid-template-columns:repeat(2,minmax(0,1fr));} }
.wb-root:not(.wb-wall) .wb-estate-grid{grid-template-columns:repeat(auto-fit,minmax(min(320px,100%),1fr));}

/* ── the Stats page (v296): flow, open work, workload, resolution ── */
.wb-analytics{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr) minmax(0,1fr) minmax(0,1.1fr);gap:var(--wb-gap);min-width:0;}
.wb-wall .wb-analytics{grid-template-rows:minmax(0,1fr);}
.wb-svg{display:block;width:100%;height:auto;overflow:visible;}
.wb-svg text{font-family:var(--wb-disp);}
.wb-lg{display:inline-flex;align-items:center;gap:6px;margin-left:12px;}
.wb-lg i{width:10px;height:10px;border-radius:3px;display:inline-block;}
.wb-mini-h{margin:10px 0 6px;color:var(--wb-dim);font-size:clamp(10px,0.72vw,12px);font-weight:700;letter-spacing:0.10em;text-transform:uppercase;}
/* HTML bar charts (v296). The x labels sit under the plot in the chart's own bottom padding and the value labels in its
   top padding, so the y axis and the plot share one box: the axis lost 1.5em to a margin the plot did not have, and its
   "0" sat above the baseline (v1.4.10.475) */
.wb-bars{display:flex;align-items:stretch;gap:6px;min-width:0;padding:1.15em 0 1.55em;box-sizing:border-box;}
.wb-bars-y{position:relative;flex:none;width:2.6em;color:var(--wb-dim);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:clamp(10px,0.72vw,12px);}
.wb-bars-y span{position:absolute;right:0;transform:translateY(-50%);line-height:1;}
.wb-bars-plot{flex:1;min-width:0;display:flex;align-items:stretch;gap:2px;height:clamp(110px,9vw,180px);border-bottom:1px solid var(--wb-line);
  background:repeating-linear-gradient(180deg,var(--wb-line) 0 1px,transparent 1px calc(100%/var(--ticks,4)));background-size:100% calc(100% + 1px);}
.wb-wall .wb-flow > .wb-bars{flex:1 1 auto;min-height:72px;}
.wb-wall .wb-flow .wb-bars-plot{height:auto;}
.wb-bars-col{flex:1;min-width:0;display:flex;flex-direction:column;position:relative;}
.wb-bars-col.hi{border-radius:4px 4px 0 0;background:rgba(76,158,255,0.08);}
.wb-bars-bars{flex:1;display:flex;align-items:flex-end;justify-content:center;gap:2px;padding:0 12%;}
.wb-bars-b{flex:1;min-width:2px;position:relative;border-radius:2px 2px 0 0;opacity:0.92;background-image:linear-gradient(180deg,rgba(255,255,255,0.25),transparent 50%);}
.wb-bars-b.zero{opacity:0.35;}
.wb-bars-b i{position:absolute;left:50%;top:-1.25em;transform:translateX(-50%);font-style:normal;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:clamp(9px,0.66vw,11.5px);line-height:1;}
.wb-bars-x{position:absolute;left:0;right:0;top:100%;margin-top:3px;text-align:center;white-space:nowrap;color:var(--wb-dim);font-size:clamp(9.5px,0.68vw,12px);}
.wb-bars-col.hi .wb-bars-x{color:var(--wb-text);font-weight:700;}
.wb-hourly{display:flex;align-items:flex-end;gap:2px;position:relative;flex:none;height:clamp(30px,2.5vw,48px);margin-bottom:1.5em;}
.wb-hourly-col{flex:1;min-width:0;height:100%;display:flex;align-items:flex-end;position:relative;}
.wb-hourly-b{width:100%;border-radius:2px 2px 0 0;opacity:0.9;}
.wb-hourly-col.future .wb-hourly-b{opacity:0.35;}
.wb-hourly-col.now .wb-hourly-b{box-shadow:0 0 8px var(--wb-sig);}
.wb-hourly-x{position:absolute;left:0;top:100%;margin-top:2px;color:var(--wb-dim);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:clamp(9px,0.66vw,11px);}
/* open work: the ring and its legend, then priority as four tallies */
.wb-openwork{display:flex;align-items:center;gap:14px;min-width:0;}
.wb-wall .wb-openw > .wb-openwork{flex:1 1 auto;min-height:0;align-items:stretch;}
.wb-donut-wrap{flex:none;width:clamp(96px,7.5vw,150px);display:flex;align-items:center;}
.wb-wall .wb-openw .wb-donut-wrap .wb-svg{max-height:100%;}
.wb-donut-seg,.wb-ring-fill{filter:drop-shadow(0 0 6px currentColor);}
.wb-legend{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:safe center;gap:4px;}
.wb-legend.wb-lg-nz .wb-lg-row.zero{display:none;}
.wb-lg-row{display:flex;align-items:center;gap:8px;min-width:0;font-size:clamp(12px,0.86vw,14px);}
.wb-lg-row i{width:10px;height:10px;border-radius:3px;flex:none;}
.wb-lg-row span{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#B7C3D8;}
.wb-lg-row b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;font-variant-numeric:tabular-nums;}
.wb-lg-row.zero{opacity:0.5;}
.wb-prio{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;}
.wb-prio-c{display:flex;align-items:baseline;gap:6px;min-width:0;padding:4px 8px;border:1px solid var(--wb-line);border-left:3px solid var(--pc);border-radius:6px;background:var(--wb-tile);color:var(--wb-dim);font-size:clamp(10.5px,0.75vw,12.5px);font-weight:700;letter-spacing:0.04em;}
.wb-prio-c b{color:var(--pc);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;font-size:clamp(15px,1.15vw,21px);letter-spacing:0;font-variant-numeric:tabular-nums;}
.wb-prio-c.zero{opacity:0.55;}
.wb-prio-c.zero b{color:var(--wb-text);}
/* horizontal bars: workload, age */
.wb-hbars{display:flex;flex-direction:column;gap:5px;min-width:0;}
.wb-hbar-row{display:flex;align-items:center;gap:8px;min-width:0;font-size:clamp(12px,0.9vw,15px);}
.wb-hbar-row.zero{opacity:0.55;}
.wb-hbar-l{flex:none;width:34%;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right;color:#B7C3D8;}
.wb-hbars-age .wb-hbar-l{width:6.4em;}
.wb-hbar-track{flex:1;min-width:0;height:12px;overflow:hidden;border:1px solid var(--wb-line);border-radius:4px;background:var(--wb-tile);}
.wb-hbar{display:block;height:100%;border-radius:3px;background-image:linear-gradient(180deg,rgba(255,255,255,0.28),rgba(255,255,255,0.04) 45%,transparent 60%);box-shadow:0 0 8px currentColor;}
.wb-hbar-n{flex:none;min-width:2.2em;white-space:nowrap;text-align:right;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;font-variant-numeric:tabular-nums;}
.wb-hbar-n small{color:var(--wb-dim);font-weight:400;font-size:0.8em;}
/* resolution: the SLA ring and three facts */
.wb-res-row{display:flex;align-items:center;gap:14px;flex:none;}
.wb-res-ring{flex:none;width:clamp(76px,5.2vw,96px);text-align:center;}
.wb-res-ring .wb-svg-ring{width:100%;max-width:84px;margin:0 auto;}
.wb-res-cap{margin-top:2px;color:var(--wb-dim);font-size:11px;letter-spacing:0.04em;}
.wb-res-facts{flex:1;min-width:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;}
.wb-fact{min-width:0;padding:7px 9px;border:1px solid var(--wb-line);border-radius:6px;background:var(--wb-tile);}
.wb-fact b{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;font-size:clamp(16px,1.2vw,23px);line-height:1.1;font-variant-numeric:tabular-nums;}
.wb-fact span{display:block;margin-top:3px;color:var(--wb-dim);font-size:10px;line-height:1.25;letter-spacing:0.05em;text-transform:uppercase;}


/* ── Ody · site monitoring (v311): one card per site, a channel strip like the tiles ── */
.wb-ody-stats{display:flex;flex-wrap:wrap;gap:4px 20px;margin:0 0 8px;color:var(--wb-dim);font-size:clamp(12px,0.85vw,14.5px);}
.wb-ody-stat b{margin-right:6px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:500;font-size:1.3em;font-variant-numeric:tabular-nums;}
.wb-ody-stat.zero{opacity:0.7;}
.wb-ody .wb-subline{margin:0 0 8px;}
.wb-ody-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(300px,100%),1fr));gap:clamp(8px,0.6vw,12px);align-content:start;min-width:0;}
.wb-ody-card{position:relative;min-width:0;overflow:hidden;box-sizing:border-box;padding:clamp(9px,0.8vw,14px);border:1px solid var(--wb-line);border-left:3px solid var(--keel,var(--wb-line));border-radius:8px;
  background:linear-gradient(90deg,color-mix(in srgb,var(--keel,transparent) 9%,transparent),transparent 45%),linear-gradient(180deg,rgba(255,255,255,0.03),transparent 30%),var(--wb-tile);}
/* a dark box or a stalled sweep is the loudest card: a steady wash, never a strobe (the alarms own motion) */
.wb-ody-card.off{background:linear-gradient(90deg,color-mix(in srgb,var(--wb-alarm) 16%,transparent),transparent 55%),var(--wb-tile);}
.wb-ody-card.stale,.wb-ody-card.late{background:linear-gradient(90deg,color-mix(in srgb,var(--wb-amber) 13%,transparent),transparent 55%),var(--wb-tile);}
.wb-ody-card.os,.wb-ody-card.paused{background:linear-gradient(90deg,color-mix(in srgb,#A78BFA 14%,transparent),transparent 55%),var(--wb-tile);}
.wb-ody-card.none{opacity:0.78;}
.wb-ody-top{display:flex;align-items:center;gap:8px;min-width:0;}
.wb-ody-name{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:700;font-size:clamp(13px,1vw,17px);}
.wb-ody-state{flex:none;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:clamp(10px,0.76vw,12px);font-weight:700;letter-spacing:0.08em;text-transform:uppercase;}
.wb-ody-sub{margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--wb-dim);font-size:clamp(10.5px,0.76vw,13px);}
.wb-ody-meter{height:11px;margin-top:8px;}
.wb-ody-empty{margin-top:8px;color:var(--wb-dim);font-size:clamp(10.5px,0.76vw,13px);font-style:italic;}
.wb-ody-osbar{height:5px;margin:6px 0 2px;overflow:hidden;border-radius:999px;background:var(--wb-line);}
.wb-ody-osbar > i{display:block;height:100%;border-radius:999px;background:var(--wb-brand);}
.wb-ody-mid{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:8px;}
.wb-ody-count{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:clamp(11px,0.82vw,14px);font-weight:700;}
.wb-ody-mix{display:flex;gap:6px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:clamp(10px,0.76vw,13px);}
.wb-ody-chip{margin-left:auto;padding:2px 7px;white-space:nowrap;border:1px solid var(--wb-line);border-radius:999px;color:var(--wb-dim);font-size:clamp(9.5px,0.68vw,11px);letter-spacing:0.04em;}
.wb-ody-chip.ok{color:var(--wb-ok);border-color:color-mix(in srgb,var(--wb-ok) 45%,transparent);}
.wb-ody-chip.warn{color:var(--wb-amber);border-color:color-mix(in srgb,var(--wb-amber) 45%,transparent);}
.wb-ody-chip.err{color:var(--wb-alarm);border-color:color-mix(in srgb,var(--wb-alarm) 55%,transparent);font-weight:700;}
.wb-ody-chip.acc{color:var(--wb-sig);border-color:color-mix(in srgb,var(--wb-sig) 45%,transparent);}
.wb-ody-foot{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;}
.wb-ody-f{padding:1px 6px;border:1px solid var(--wb-line);border-radius:6px;color:var(--wb-dim);font-size:clamp(9.5px,0.7vw,12px);}
.wb-ody-f.warn{color:var(--wb-amber);border-color:color-mix(in srgb,var(--wb-amber) 40%,transparent);}
.wb-ody-f.acc{color:var(--wb-sig);border-color:color-mix(in srgb,var(--wb-sig) 40%,transparent);}
.wb-ody-grid > .wb-ody-more{display:flex;align-items:center;justify-content:center;padding:10px;border:1px dashed var(--wb-line);border-radius:8px;color:var(--wb-dim);font-size:clamp(12px,0.85vw,14px);text-align:center;}
/* the sites grid (several sites in view): worst first */
.wb-sites{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(200px,100%),1fr));gap:8px;align-content:start;min-width:0;}
.wb-site{min-width:0;padding:9px 12px;border:1px solid var(--wb-line);border-left:4px solid var(--wb-ok);border-radius:6px;background:var(--wb-tile);}
.wb-site-n{margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;font-size:clamp(13px,0.9vw,15px);}
.wb-site-mix{display:flex;gap:12px;color:var(--wb-dim);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;}
.wb-sites > .wb-fit-more{grid-column:1 / -1;}

/* a deck page is a size container: a short deck (in the app rather than fullscreen, or a band of display 2) keeps
   each panel's main figure and leaves its second section out, rather than cutting both in half. Kept after every rule
   it overrides (same specificity: the later rule wins). */
.wb-wall .wb-deck-page{container:wbpage / size;}
.wb-wall .wb-resol > .wb-age-sec{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;}
.wb-wall .wb-sec > .wb-mini-h{flex:none;}
@container wbpage (max-height: 330px){
  .wb-hourly-sec,.wb-wall .wb-resol > .wb-age-sec{display:none;}
  .wb-resol > .wb-res-row{flex:1 1 auto;}
}
@container wbpage (max-height: 270px){
  .wb-prio-sec,.wb-ody-foot,.wb-ody > .wb-subline{display:none;}
}
@container wbpage (max-height: 240px){
  .wb-ody-stats,.wb-ody-sub{display:none;}
}

/* ── a page, not a wall: a tablet and a phone (v197 and v233 guarantees kept: the header rows wrap, 40 px targets,
   nothing pushes the board sideways). The wall itself is 1,000 px and up and keeps its layout (v371). ── */
@media (max-width:1180px){
  .wb-root:not(.wb-wall) .wb-action.two{grid-template-columns:minmax(0,1fr);}
  .wb-root:not(.wb-wall) .wb-tiles.wb-auto{grid-template-columns:repeat(4,minmax(0,1fr));}
  .wb-root:not(.wb-wall) .wb-analytics{grid-template-columns:repeat(2,minmax(0,1fr));}
}
@media (max-width:1100px){
  .wb-root:not(.wb-wall) .wb-ops3{grid-template-columns:repeat(2,minmax(0,1fr));}
  .wb-root:not(.wb-wall) .wb-ops3 > .wb-today{grid-column:1 / -1;order:3;}
}
@media (max-width:900px){
  .wb-root:not(.wb-wall) .wb-ops3{grid-template-columns:minmax(0,1fr);}
  .wb-root:not(.wb-wall) .wb-cards{grid-template-columns:minmax(0,1fr) !important;}
}
@media (max-width:760px){
  .wb-root{padding:12px;}
  .wb-head{gap:10px;}
  .wb-head-r{width:100%;justify-content:space-between;gap:10px;}
  .wb-tray{width:100%;}
  .wb-head-r #wb-clock{font-size:18px;}
  .wb-timebox{text-align:left;border-left:0;padding-left:0;}
  .wb-brand-sep{display:none;}
  .wb-logo{height:28px;}
  .wb-tiles,.wb-tiles.wb-t4,.wb-tiles.wb-t3,.wb-root:not(.wb-wall) .wb-tiles.wb-auto{grid-template-columns:repeat(2,minmax(0,1fr));}
  .wb-root:not(.wb-wall) .wb-analytics{grid-template-columns:minmax(0,1fr);}
  .wb-today-cols{grid-template-columns:minmax(0,1fr);}
  .wb-today-kpis{gap:2px 8px;}
  .wb-sla-cd{min-width:7ch;font-size:16px;}
  .wb-sla-phase,.wb-al-tk{display:none;}
  .wb-feed-when{min-width:6ch;}
  .wb-brc,.wb-onair{flex-direction:column;}
  .wb-brc-lamp,.wb-onair-lamp{flex-direction:row;gap:8px;padding:10px 14px;}
  .wb-tcard{flex-wrap:wrap;}
  .wb-tcard .wb-ackbtn{width:100%;min-height:40px;}
  .wb-openwork{flex-direction:column;align-items:stretch;}
  .wb-donut-wrap{margin:0 auto;}
  .wb-res-row{flex-wrap:wrap;}
  .wb-ody-grid{grid-template-columns:minmax(0,1fr);}
  .wb-ody-chip{margin-left:0;}
}
@media (max-width:700px){
  .wb-root{max-width:100%;}
  .wb-root *{min-width:0;}
}
/* a touch screen (the board opened on an iPad): every control a 40 px target, and in fullscreen the tray stays, since
   a touch screen has no hover to bring it back */
@media (hover:none) and (pointer:coarse){
  .wb-modebtn,.wb-stats-btn,.wb-snd,.wb-fs,.wb-ackbtn,.wb-d2btn,.wb-deck-tab{min-height:40px;}
  .wb-snd{min-width:40px;}
  .wb-root:fullscreen .wb-tray > *,.wb-root:fullscreen .wb-fs{opacity:1;}
}
/* Quality floor: every strobe and pulse becomes a steady light, every colour stays. An accessibility preference must
   not silently downgrade a breach to a whisper, so the alarms keep their full red without moving. */
@media (prefers-reduced-motion: reduce){
  .wb-meter::after{animation:none;background:none;}
  .wb-clear{animation:none;box-shadow:0 0 26px rgba(46,230,168,0.18), inset 0 0 22px rgba(46,230,168,0.05);}
  .wb-root.onair{animation:none;box-shadow:inset 0 0 0 2px rgba(255,93,93,0.55);}
  .wb-root.breach{animation:none;box-shadow:inset 0 0 0 3px rgba(255,93,93,0.95);}
  .wb-onair-lamp{animation:none;}
  .wb-brc-lamp{animation:none;background:var(--wb-alarm);color:#1A0505;}
  .wb-live,.wb-sla-row.err .wb-sla-cd{animation:none;}
  .wb-sla-row.overdue{animation:none;background:rgba(255,93,93,0.20);}
  .wb-tile.wb-tile-alarm{animation:none;background:rgba(255,93,93,0.22);border-color:rgba(255,93,93,0.95);}
  .wb-donut-seg,.wb-ring-fill{filter:none;}
  .wb-deck-tab.on.run::after{animation:none;transform:scaleX(1);opacity:0.5;}
  .wb-root:fullscreen .wb-tray > *,.wb-root:fullscreen .wb-fs{transition:none;}
}
/* ═══ end of the Operations Wallboard ═══ */
/* ══ v1.4.10.475 — files you can act on: the viewer's buttons and the attachment rows ════════════════════════
   Jay: "in Support ticket, make sure attachments, when you click on it, the download button is visible" and
   "make sure the delete button is visible". The viewer's Download was a `.btn.ghost`: transparent, with the
   page's dark text and icon on the viewer's near-black backdrop, so only its 1 px outline showed until a mouse
   hovered it; the viewer had no Delete at all. It now carries a white-on-dark Download (the primary action) and,
   on a ticket, a red Delete for whoever may remove the file. The image is held to the screen's height minus the
   room the caption and buttons need (it was 80vh, which pushed the buttons off a phone held sideways), and the
   viewer sits above the Team chat dock and any drawer (it was z-index 90, under the dock's 1,600 on a phone). */
.lightbox{z-index:1650;overflow-y:auto;justify-content:safe center;}
.lightbox img{max-height:calc(100vh - 200px);max-height:calc(100dvh - 200px);}
.lightbox .lb-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:10px;margin-top:14px;}
.lightbox .lb-actions .btn{display:inline-flex;align-items:center;gap:8px;min-height:40px;padding:8px 18px;border-radius:10px;font-size:13px;font-weight:600;
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.45);color:#fff;box-shadow:none;text-decoration:none;transform:none;}
.lightbox .lb-actions .btn:hover{background:rgba(255,255,255,.26);border-color:rgba(255,255,255,.75);color:#fff;}
.lightbox .lb-actions .btn svg{width:16px;height:16px;flex:none;color:currentColor;}
.lightbox .lb-actions .btn.primary{background:var(--brand-grad,var(--bc-grad-a));border-color:rgba(255,255,255,.18);}
.lightbox .lb-actions .btn.primary:hover{filter:brightness(1.1);}
.lightbox .lb-actions .btn.danger{background:rgba(220,38,38,.25);border-color:rgba(248,113,113,.8);color:#FEE2E2;}
.lightbox .lb-actions .btn.danger:hover{background:rgba(220,38,38,.45);color:#fff;}
.lightbox .lb-actions .btn:focus-visible,.lightbox .lb-close:focus-visible{outline:2px solid #fff;outline-offset:2px;}
/* An attachment row's Download and Remove are buttons you can see (they were bare 14 px glyphs in the dim text
   colour): Download in the brand blue, Remove in red, each in its own bordered square */
.att-row .att-del{display:inline-flex;align-items:center;justify-content:center;flex:none;width:32px;height:32px;padding:0;margin-left:6px;
  border:1px solid color-mix(in srgb,var(--err) 40%,var(--line-2));border-radius:8px;background:var(--surface);color:var(--err);cursor:pointer;}
.att-row .att-del svg{width:15px;height:15px;}
.att-row .att-del:hover{background:color-mix(in srgb,var(--err) 10%,var(--surface));border-color:var(--err);color:var(--err);}
.att-row .att-del.att-dl{margin-left:auto;border-color:color-mix(in srgb,var(--brand-blue) 40%,var(--line-2));color:var(--brand-blue);}
.att-row .att-del.att-dl:hover{background:color-mix(in srgb,var(--brand-blue) 10%,var(--surface));border-color:var(--brand-blue);color:var(--brand-blue);}
@media (max-width:700px){ .att-row .att-del{width:40px;height:40px;} }
/* a task's attachment: its remove button showed only under a hovering mouse; it is always there now */
.tk-att-del{opacity:1;}
/* ══ v1.4.10.475 — the asset's Control tab, laid out in the order it is used ══════════════════════════════════
   Jay: "make sure in Control, it's laid out nicely and not confusing". Measured in the browser before: three of the
   tab's class names were also given to other things, and the later rule won on the tab:
     · .ctl-grid is the ticket's Device control card's two-column button grid (display:grid) and also the class of
       every walked SNMP table here, so a port table put its column headers in the left half and its rows in the
       right half;
     · .ctl-name (the Shure command list: bold, display:flex) turned each object's name cell into a bold flex row
       that ran the name, its OID and its description together;
     · .ctl-acts (the alert rule chips: display:inline-flex) did the same to the Set / Read cell, which clipped the
       Read button at 750 px.
   They are put back for the tab's tables here, on a phone too (a walked table keeps its columns and scrolls inside
   its frame rather than stacking cells under hidden headers). */
table.ctl-grid{display:table;}
td.ctl-name{font-weight:400;}
td.ctl-acts{text-align:right;white-space:nowrap;}
@media (min-width:701px){ td.ctl-name,td.ctl-acts{display:table-cell;} }
@media (max-width:700px){
  table.ctl-tbl.ctl-grid{display:table;width:auto;min-width:520px;}
  .ctl-tbl.ctl-grid thead{display:table-header-group;}
  .ctl-tbl.ctl-grid tbody{display:table-row-group;width:auto;}
  .ctl-tbl.ctl-grid tr{display:table-row;width:auto;padding:0;border-bottom:0;}
  .ctl-tbl.ctl-grid td,.ctl-tbl.ctl-grid th{display:table-cell;width:auto;padding:6px 10px;border-bottom:1px solid var(--line);}
}
/* one rhythm for every card on the tab (they mixed 12, 14 and 16 px, and three kinds of card head) */
#asset-ctl-root .panel{margin:0 0 14px;}
#asset-ctl-root .panel > .panel-head{padding:12px 16px;}
#asset-ctl-root .am-ph h3{font-size:15px;font-weight:600;letter-spacing:-.012em;text-transform:none;color:var(--text);}
#asset-ctl-root .ctl-strip{margin-bottom:10px;}
#asset-ctl-root .ctl-tabs{margin-top:4px;}
/* Quick actions: the device's commands, then the Ody's checks, each row named; a command that cuts the room is red */
.qa-row-h{margin:0 0 8px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.quick-actions + .qa-row-h,.device-meta + .qa-row-h{margin-top:14px;}
.qa.danger .qa-ico{color:var(--err);}
.qa.danger .qa-t{color:var(--err);}
.qa.danger:hover{border-color:var(--err);background:color-mix(in srgb,var(--err) 7%,var(--surface));}
.qa:disabled{opacity:.5;cursor:not-allowed;}
.qa:disabled:hover{border-color:var(--line);background:var(--navy-2);}
/* v1.4.10.523: the Display panel (Samsung MDC / LG signage): power, source, volume and addressing as four cards, the
   schedule under them. Every control on the 40px floor; one column on a phone. */
.dsp-head-state{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.dsp-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px;}
.dsp-card{border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:var(--surface);min-width:0;}
.dsp-card-t{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);margin-bottom:8px;display:flex;justify-content:space-between;gap:8px;align-items:center;flex-wrap:wrap;}
.dsp-card-t .pill{text-transform:none;letter-spacing:0;}
.dsp-row{display:flex;gap:8px;align-items:flex-end;flex-wrap:wrap;}
.dsp-row .btn{min-height:40px;}
.dsp-row > select,.dsp-row > input:not([type=range]){min-height:40px;flex:1 1 150px;min-width:0;}   /* direct children only: inside a column .fld the basis would become a height */
.dsp-row .fld{margin:0;min-width:0;}
.dsp-row .fld input{width:100%;min-width:0;min-height:40px;}
.dsp-vol{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.dsp-vol input[type=range]{flex:1 1 120px;min-width:90px;accent-color:var(--accent);min-height:40px;}
.dsp-vol .btn{min-height:40px;}
.dsp-vol-n{min-width:34px;text-align:right;font-weight:600;font-variant-numeric:tabular-nums;}
.dsp-cur{font-size:12px;color:var(--text-mute);margin-top:8px;line-height:1.45;}
.dsp-hint{margin-top:6px;line-height:1.45;}
.dsp-setup{margin-top:12px;font-size:12px;color:var(--text-mute);}
.dsp-setup summary{cursor:pointer;min-height:40px;display:flex;align-items:center;font-weight:600;color:var(--text);}
.dsp-setup ol{margin:4px 0 0 18px;padding:0;}
.dsp-setup li{margin:3px 0;line-height:1.45;}
.dsp-sched-foot{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;margin-top:10px;}
.dsp-sched-foot .btn{min-height:40px;}
.dsp-panel .ctl-mon{display:flex;}
/* v1.4.10.525: the MIB manager's note for a Samsung / LG screen model (it is controlled by its protocol, not a MIB) */
.mibm-disp-hint{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:10px;border:1px solid var(--brand-blue,var(--bc-accent));background:var(--band,#F7F9FC);font-size:13px;line-height:1.5;margin:0 0 12px;}
.mibm-disp-hint > svg{width:18px;height:18px;flex:0 0 auto;margin-top:2px;color:var(--brand-blue,var(--bc-accent));}
.mibm-disp-hint .btn{margin-top:8px;min-height:40px;}
/* v1.4.10.524: the schedule group — the picker, the group's name and pills, its screens, the 7-day calendar */
.dg-pick .fld,.dg-name .fld{margin:0;}
.dg-pick select{width:100%;min-height:40px;}
.dg-state{display:flex;gap:6px;flex-wrap:wrap;align-items:center;padding-bottom:4px;}
.dg-members{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:10px 0;}
.dg-cal-wrap{margin:6px 0 4px;}
.dg-cal{width:100%;border-collapse:collapse;table-layout:fixed;}
.dg-cal th,.dg-cal td{padding:4px 6px;text-align:left;vertical-align:middle;border-bottom:1px solid var(--line);}
.dg-cal thead th{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.dg-cal tbody th{font-weight:600;font-size:13px;width:46px;}
.dg-cal td{width:120px;}
.dg-cal td.dg-note,.dg-cal th.dg-note{width:auto;}
.dg-cal input.dg-time{width:100%;min-width:0;min-height:40px;font-variant-numeric:tabular-nums;text-align:center;}
.dg-cal input.dg-time.bad{border-color:var(--err);background:color-mix(in srgb,var(--err) 7%,var(--surface));}
.dg-note{font-size:12px;color:var(--text-mute);}
.dg-helpers{margin:8px 0 4px;}
.dg-helpers .btn{min-height:40px;}
.dg-last{font-size:12px;color:var(--text-mute);margin:6px 0;line-height:1.45;}
.dg-new{border:1px solid var(--brand-blue,var(--bc-accent));border-radius:12px;padding:12px 14px;margin:8px 0;}
.dg-new .fld{margin-bottom:6px;}
@media (max-width:700px){ .dsp-grid{grid-template-columns:1fr;} .dsp-head-state{width:100%;} .dg-cal th.dg-note,.dg-cal td.dg-note{display:none;} .dg-cal td{width:auto;} .dg-state{width:100%;} }
/* "Connection": how the Ody reaches the device, at the foot of the tab */
.ctl-group-h{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 10px;margin:22px 0 10px;padding-top:14px;border-top:1px solid var(--line);}
.ctl-group-h span{font-size:13px;font-weight:700;letter-spacing:-.01em;color:var(--text);}
.ctl-group-h small{font-size:12px;color:var(--text-mute);}
/* "Browse every object": the MIB files, the controls and the readings are sections of one card (they were cards in a card) */
.ctl-browse-body{padding:4px 16px 14px;}
.ctl-sub{margin-top:14px;padding-top:12px;border-top:1px solid var(--line);}
.ctl-sub:first-child{margin-top:0;padding-top:4px;border-top:0;}
.ctl-sub-h{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:8px 12px;margin-bottom:8px;}
.ctl-sub-h h3{margin:0;font-size:14px;font-weight:600;color:var(--text);}
.ctl-sub-h .panel-sub{margin-top:2px;font-size:12px;color:var(--text-mute);}
.ctl-sub-t{min-width:0;flex:1 1 320px;}
.ctl-sub > .panel-body{padding:0;}
.ctl-sub > .panel-body.flush{overflow:hidden;border:1px solid var(--line);border-radius:8px;}
.ctl-browse-body > .ctl-search{margin:12px 0 0;}
/* the Graph tick (it was "Monitor") is a full 40 px target on touch, a compact one under a mouse */
@media (hover:hover) and (pointer:fine){ #asset-ctl-root .ctl-fgrid .ctl-mon{min-height:28px;} }
/* ══ v1.4.10.485 — a Cancel you can see, wherever it sits ══════════════════════════════════════════════════════════════
   Jay: "Cancel buttons sometimes are hidden, check for hidden colour buttons". A `.btn.ghost` is transparent and takes
   the page's dark text. On a band painted navy or in the brand gradient that does NOT re-point the text tokens (the
   ticket drawer's hero, where Edit header shows Save and Cancel; the Room Pack picker's hero) the dark text vanished
   into the band and only a hairline outline showed; on the bands that do re-point them but were left out of the v13071
   list (.site-ed-head, .tkt-head, .user-ed-head, .hgm-hero, .asset-hero, the asset card banner, the template preview bar)
   the text was white but the outline was navy on navy. Every band that carries white text now draws its ghost buttons
   white-on-dark with a visible outline (the same look as the det-hero's), and its plain .btn the same way, so a Cancel,
   a Close or a Back is a button at a glance and not a word that may or may not be there. */
.tkd-hero .tkd-hero-top .btn.ghost,.rr-pick-hero .btn.ghost,.modal .rr-pick-hero .btn.ghost,.site-ed-head .btn.ghost,.tkt-head .btn.ghost,.user-ed-head .btn.ghost,
.hgm-hero .btn.ghost,.asset-hero .btn.ghost,.ast-card .ac-banner .btn.ghost,.nt-preview .npv-bar .btn.ghost{
  background:rgba(255,255,255,.10);border-color:rgba(255,255,255,.55);color:#fff;box-shadow:none;}
.tkd-hero .tkd-hero-top .btn.ghost:hover,.rr-pick-hero .btn.ghost:hover,.site-ed-head .btn.ghost:hover,.tkt-head .btn.ghost:hover,.user-ed-head .btn.ghost:hover,
.hgm-hero .btn.ghost:hover,.asset-hero .btn.ghost:hover,.ast-card .ac-banner .btn.ghost:hover,.nt-preview .npv-bar .btn.ghost:hover{
  background:#fff;border-color:#fff;color:var(--bc-navy);}
.tkd-hero .tkd-hero-top .btn:not(.primary):not(.ghost):not(.danger),.rr-pick-hero .btn:not(.primary):not(.ghost):not(.danger){
  background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.40);color:#fff;box-shadow:none;}
.tkd-hero .tkd-hero-top .btn:not(.primary):not(.ghost):not(.danger):hover,.rr-pick-hero .btn:not(.primary):not(.ghost):not(.danger):hover{
  background:rgba(255,255,255,.26);border-color:rgba(255,255,255,.7);color:#fff;}
.tkd-hero .tkd-hero-top .btn.ghost svg,.rr-pick-hero .btn svg{color:currentColor;}
/* on a white surface a ghost button never reads as bare text: the stronger hairline, and the text colour kept even
   when a parent sets its own (a modal body that greys its copy, say) */
.modal .btn.ghost,.rost-modal .btn.ghost,.panel .btn.ghost{color:var(--text);}
.modal .btn.ghost.danger,.rost-modal .btn.ghost.danger,.panel .btn.ghost.danger{color:var(--err);}
/* ── the assets a call-out is for (v1.4.10.485): chips for what is picked, the shared search box under them ── */
.crew-ap-chips{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 8px;}
.crew-ap-chip{display:inline-flex;align-items:center;gap:6px;max-width:100%;padding:4px 6px 4px 9px;border:1px solid #BFDBFE;background:#EFF6FF;border-radius:6px;color:var(--brand-blue);font-size:12px;line-height:1.3;}
.crew-ap-chip svg{width:13px;height:13px;flex:none;}
.crew-ap-chip b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:600;font-size:12px;letter-spacing:0;}
.crew-ap-chip small{color:var(--text-mute);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px;}
.crew-ap-x{display:inline-grid;place-items:center;width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--text-dim);cursor:pointer;padding:0;}
.crew-ap-x:hover{background:rgba(var(--bc-grad-a-rgb),.12);color:var(--err);}
.crew-ap-x svg{width:12px;height:12px;}
.crew-ap .tk-tp-box input{flex:1;min-width:0;border:0;background:transparent;font:inherit;font-size:13px;color:var(--text);padding:8px 0;outline:none;}
.crew-ap .tk-tp-box input::placeholder{color:var(--text-dim);}
.crew-ap .tk-tp-listhost{position:relative;}
.crew-ap-none{font-size:12px;color:var(--text-mute);padding:2px 0 6px;}
.crew-ws-kit{display:flex;flex-wrap:wrap;gap:4px 6px;}
.crew-ws-kit .crew-co-tag{font-family:var(--font-mono);font-variant-numeric:tabular-nums;height:20px;cursor:pointer;}
.crew-ws-kit .crew-co-tag:hover{color:var(--brand-blue);background:var(--accent-glow);}
@media (max-width:700px){ .crew-ap-x{width:32px;height:32px;} .crew-ap-chip{padding-right:2px;} }

/* ── v1.4.10.490: AVDesk Staff (the badge, the role's colours) ───────────────────────────────────────────────── */
.staff-badge{display:inline-flex;align-items:center;gap:4px;margin-left:8px;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--brand-purple);background:color-mix(in srgb, var(--brand-purple) 12%, transparent);border:1px solid color-mix(in srgb, var(--brand-purple) 38%, transparent);vertical-align:1px;white-space:nowrap;line-height:16px;}
.staff-badge svg{flex-shrink:0;}
.staff-badge.big{padding:2px 10px;margin-left:6px;}
#user-name .staff-badge{margin-left:6px;}
.ua-roli[data-r="avdesk_staff"] .ua-ric{background:color-mix(in srgb, var(--brand-purple) 12%, transparent);color:var(--brand-purple);}
.ua-av.r-avdesk_staff{background:linear-gradient(135deg,var(--bc-purple-v1),#4C1D95);}
.ua-gh-ic.r-avdesk_staff{background:color-mix(in srgb, var(--brand-purple) 12%, transparent);color:var(--brand-purple);}
/* Billing, read-only for approved AVDesk Staff */
.bl-ro-banner{display:flex;gap:12px;align-items:flex-start;margin:0 0 12px;padding:12px 14px;border-radius:12px;border:1px solid color-mix(in srgb, var(--brand-purple) 30%, var(--line));background:color-mix(in srgb, var(--brand-purple) 6%, var(--surface));font-size:13px;line-height:1.5;}
.bl-ro-banner b{display:block;font-weight:600;}
.bl-ro-banner span{color:var(--text-mute);}
.bl-ro-banner svg{flex-shrink:0;margin-top:2px;color:var(--brand-purple);}
.bl-prov{margin-top:6px;display:flex;flex-wrap:wrap;gap:4px 6px;align-items:center;}

/* ── v1.4.10.490: Provisioning ───────────────────────────────────────────────────────────────────────────────── */
.pv-tiles{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin:0 0 12px;}
.pv-tile{display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:12px 14px;border-radius:12px;border:1px solid var(--line);background:var(--surface);cursor:pointer;text-align:left;font:inherit;color:var(--text);min-height:44px;}
.pv-tile b{font-size:24px;font-weight:600;letter-spacing:-.02em;line-height:1.1;}
.pv-tile span{font-size:13px;font-weight:500;}
.pv-tile small{font-size:11px;color:var(--text-mute);}
.pv-tile.err b{color:var(--err);} .pv-tile.warn b{color:var(--warn);} .pv-tile.info b{color:var(--brand-purple);} .pv-tile.ok b{color:var(--ok);}
.pv-tile.on{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.pv-bar{flex-wrap:wrap;row-gap:6px;}
.pv-loading-line{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-mute);margin:0 0 8px;}
.pv-loading-line .spinner{width:14px;height:14px;}
.pv-table td{vertical-align:top;}
.pv-row{cursor:pointer;}
.pv-row:hover td{background:var(--surface-2,rgba(120,130,150,.06));}
.pv-prod{display:inline-flex;gap:8px;align-items:flex-start;}
.pv-prod b{display:block;font-weight:600;}
.pv-prod small{display:block;font-size:11px;color:var(--text-mute);}
.pv-warn{color:var(--err);font-weight:600;}
.pv-err{color:var(--err);font-size:12px;min-height:16px;margin-top:8px;}
.pv-head .panel-body{display:grid;gap:14px;}
.pv-head-top{display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap;}
.pv-head-ico{width:56px;height:56px;border-radius:14px;display:flex;align-items:center;justify-content:center;background:var(--surface-2,rgba(120,130,150,.08));flex-shrink:0;}
.pv-head-id{flex:1;min-width:220px;}
.pv-head-kind{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.pv-head-id h2{margin:2px 0 4px;font-size:20px;font-weight:600;letter-spacing:-.015em;}
.pv-head-sub{font-size:13px;color:var(--text-mute);line-height:1.55;}
.pv-head-ctl{display:flex;gap:8px;align-items:center;flex-wrap:wrap;}
.pv-steps{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;}
.pv-step{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:12px;border:1px solid var(--line);background:var(--surface);font:inherit;color:var(--text);text-align:left;cursor:pointer;min-height:44px;}
.pv-step:disabled{cursor:default;}
.pv-step-dot{width:24px;height:24px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex-shrink:0;background:var(--surface-3);color:var(--text-mute);}
.pv-step-t b{display:block;font-size:13px;font-weight:600;}
.pv-step-t small{display:block;font-size:11px;color:var(--text-mute);line-height:1.4;}
.pv-step.done .pv-step-dot{background:var(--ok);color:#fff;}
.pv-step.now{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.pv-step.now .pv-step-dot{background:var(--brand-blue);color:#fff;}
.pv-step.todo:hover,.pv-step.done:hover{border-color:color-mix(in srgb, var(--brand-blue) 45%, var(--line));}
.pv-step.off{opacity:.55;}
.pv-step-acts{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.pv-cancelled{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:10px 12px;border-radius:10px;background:var(--surface-2,rgba(120,130,150,.08));font-size:13px;}
.pv-cancelled span{flex:1;min-width:200px;}
.pv-cols{margin-top:14px;}
.pv-sec{margin-bottom:14px;}
.pv-sec h3 svg{vertical-align:-3px;}
.pv-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 14px;}
.pv-fld{margin:0;}
.pv-fld.wide{grid-column:1/-1;}
.pv-fld input.bad,.pv-fld select.bad,.pv-fld textarea.bad{border-color:var(--err);box-shadow:0 0 0 3px color-mix(in srgb, var(--err) 18%, transparent);}
.pv-secret{display:flex;gap:6px;align-items:center;}
.pv-secret input{flex:1;min-width:0;font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.pv-creds{border-left:4px solid var(--brand-purple);}
.pv-savebar{position:sticky;bottom:0;z-index:2;display:flex;gap:10px;align-items:center;justify-content:space-between;flex-wrap:wrap;padding:10px 14px;margin:0 0 14px;border-radius:12px;border:1px solid var(--line);background:var(--surface);box-shadow:0 -4px 14px rgba(15,23,42,.06);}
.pv-kv{display:flex;gap:10px;align-items:baseline;justify-content:space-between;flex-wrap:wrap;padding:6px 0;border-bottom:1px solid var(--line);font-size:13px;}
.pv-kv:last-child{border-bottom:0;}
.pv-kv span{color:var(--text-mute);}
.pv-kv b{font-weight:500;text-align:right;}
.pv-login,.pv-install{margin-top:12px;padding:10px 12px;border-radius:10px;background:var(--surface-2,rgba(120,130,150,.06));display:grid;gap:6px;}
.pv-login-h{font-size:13px;}
.pv-ol{margin:0;padding-left:18px;font-size:13px;line-height:1.6;}
.pv-ol code.opi-cmdline{display:block;white-space:pre-wrap;word-break:break-all;margin:4px 0;}
.pv-hist-row{display:flex;flex-direction:column;gap:1px;padding:6px 0;border-bottom:1px solid var(--line);font-size:13px;}
.pv-hist-row:last-child{border-bottom:0;}
.pv-hist-row small{font-size:11px;color:var(--text-mute);}
@media (max-width:1100px){ .pv-tiles{grid-template-columns:repeat(3,minmax(0,1fr));} .pv-steps{grid-template-columns:repeat(3,minmax(0,1fr));} }
@media (max-width:760px){
  .pv-tiles{grid-template-columns:repeat(2,minmax(0,1fr));}
  .pv-steps{grid-template-columns:1fr;}
  .pv-fields{grid-template-columns:1fr;}
  .pv-head-ctl{width:100%;}
  .pv-head-ctl .btn{min-height:40px;}
  .pv-step-acts .btn,.pv-savebar .btn,.pv-secret .btn{min-height:40px;}
  .pv-secret{flex-wrap:wrap;}
  .pv-secret input{flex-basis:100%;}
}/* v1.4.10.490: a badge beside a name wraps under it when the column is tight (the name kept breaking a letter to a line) */
.ua-un{flex-wrap:wrap;row-gap:3px;}
.ua-un .staff-badge,.ua-un .boss-badge{margin-left:0;}
/* ═══ v1.4.10.491: FILE SYSTEMS — AVDesk's own document library (js/30-filesystem.js) ═══ */
/* ══════════ FILE SYSTEMS (v1.4.10.491; redrawn and share links v1.4.10.493) ══════════
   Jay: "In File System make it look way better and add anything you recommend." The page is three cards on the grey
   ground: the AREAS rail (areas with their folder tree, Recent files, Shared links, the recycle bin, the storage used),
   the FILES card (breadcrumb, a titled folder, the command bar, the list or tiles) and the DETAILS pane. Rows show their
   actions on hover (Share, Download, More), a folder lights up when rows are dragged over it, the home page opens with
   the library's figures, the area cards and the newest files. */
.fsx{display:grid;grid-template-columns:248px minmax(0,1fr);gap:16px;align-items:start;position:relative;}
.fsx.with-details{grid-template-columns:248px minmax(0,1fr) 324px;}
.fsx .spinner.xs{width:14px;height:14px;border-width:2px;display:inline-block;vertical-align:middle;}
/* ── the areas rail ── */
.fsx-side{position:sticky;top:12px;display:flex;flex-direction:column;gap:2px;padding:12px 10px 10px;border:1px solid var(--line);border-radius:12px;background:var(--surface);box-shadow:var(--shadow-sm);}
.fsx-side-h{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:2px 8px 8px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.fsx-side-h .btn{text-transform:none;letter-spacing:0;}
.fsx-areas{display:flex;flex-direction:column;gap:1px;max-height:52vh;overflow:auto;margin:0 -2px;padding:0 2px;}
.fsx-nav{display:flex;align-items:center;gap:9px;width:100%;min-height:34px;padding:6px 9px;border:0;border-radius:8px;background:transparent;color:var(--text);font:inherit;font-size:13px;font-weight:500;text-align:left;cursor:pointer;transition:background .12s,color .12s;}
.fsx-nav:hover{background:var(--surface-2);}
.fsx-nav.on{background:var(--accent-glow);color:var(--brand-blue);font-weight:600;}
.fsx-nav.in{font-weight:600;}
.fsx-nav:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
.fsx-nav > svg{width:15px;height:15px;flex-shrink:0;color:var(--text-mute);}
.fsx-nav.on > svg{color:var(--brand-blue);}
.fsx-nav.sub > svg{color:#E0A526;fill:rgba(224,165,38,.18);}
.fsx-nav.sub.limited > svg{opacity:.55;}
.fsx-nav-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-nav small{font-size:11px;font-weight:600;color:var(--text-dim);font-variant-numeric:tabular-nums;padding:1px 6px;border-radius:999px;background:var(--surface-2);}
.fsx-nav.on small{background:color-mix(in srgb,var(--brand-blue) 12%,transparent);color:var(--brand-blue);}
.fsx-nav-lock{display:inline-flex;color:var(--text-dim);}
.fsx-nav-lock svg{width:12px;height:12px;}
.fsx-dot{width:12px;height:12px;border-radius:4px;flex-shrink:0;background:var(--fsx-c,var(--bc-grad-a));box-shadow:inset 0 0 0 1px rgba(0,0,0,.06);}
/* the tree: a chevron cell, then the row; deeper rows step in */
.fsx-tn{display:grid;grid-template-columns:22px minmax(0,1fr);align-items:center;gap:0;padding-left:calc(var(--d,0) * 14px);}
.fsx-tn.in > .fsx-nav{color:var(--text);}
.fsx-tw{display:inline-flex;align-items:center;justify-content:center;width:22px;height:30px;border:0;border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer;padding:0;transition:transform .15s,background .12s;}
.fsx-tw svg{width:12px;height:12px;transition:transform .15s;}
.fsx-tw.open svg{transform:rotate(90deg);}
.fsx-tw:hover{background:var(--surface-2);color:var(--text);}
.fsx-tw.none{pointer-events:none;}
.fsx-tree-wait,.fsx-tree-none{display:flex;align-items:center;gap:6px;min-height:30px;padding:0 9px;font-size:12px;color:var(--text-dim);}
.fsx-side-sep{height:1px;background:var(--line);margin:8px 6px;}
.fsx-side-empty{padding:6px 9px;font-size:12px;color:var(--text-dim);}
.fsx-use{display:flex;flex-direction:column;gap:2px;margin:10px 2px 0;padding:10px 12px;border-radius:10px;background:var(--surface-2);font-size:12px;color:var(--text-mute);line-height:1.45;}
.fsx-use-h{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
.fsx-use-h svg{width:13px;height:13px;}
.fsx-use b{font-size:15px;font-weight:600;color:var(--text);letter-spacing:-.01em;}
/* the area colours */
.c-blue{--fsx-c:var(--bc-grad-a);} .c-violet{--fsx-c:#7C4DFF;} .c-green{--fsx-c:#16A34A;} .c-amber{--fsx-c:#D97706;}
.c-red{--fsx-c:#DC2626;} .c-teal{--fsx-c:#0D9488;} .c-slate{--fsx-c:#64748B;} .c-pink{--fsx-c:#DB2777;}
/* ── the files card ── */
.fsx-main{min-width:0;padding:18px 20px 20px;border:1px solid var(--line);border-radius:12px;background:var(--surface);box-shadow:var(--shadow-sm);}
.fsx-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px 16px;flex-wrap:wrap;margin-bottom:14px;}
.fsx-head h3{margin:0;font-size:16px;font-weight:600;letter-spacing:-.012em;}
.fsx-head-t{min-width:0;flex:1 1 300px;}
.fsx-title-row{display:flex;align-items:center;gap:12px;margin-top:8px;min-width:0;}
.fsx-title-row > .fsx-ic.folder.big{width:46px;height:46px;}
.fsx-title-row > .fsx-ic.folder.big svg{width:40px;height:40px;}
.fsx-title-id{min-width:0;}
.fsx-title{margin:0!important;font-size:20px!important;font-weight:600;letter-spacing:-.02em;line-height:1.2;overflow-wrap:anywhere;}
.fsx-title-m{margin-top:2px;font-size:12px;color:var(--text-mute);}
.fsx-desc{margin-top:4px;font-size:13px;color:var(--text-mute);line-height:1.5;}
.fsx-search{position:relative;flex:0 1 320px;min-width:200px;}
.fsx-search svg{position:absolute;left:11px;top:50%;transform:translateY(-50%);width:15px;height:15px;color:var(--text-mute);pointer-events:none;}
.fsx-search input{width:100%;height:36px;padding:0 32px 0 34px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--text);font:inherit;font-size:13px;}
.fsx-search input:focus,.fsx-filter input:focus,.fsx-sel:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.fsx-search-x{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:0;background:transparent;color:var(--text-mute);cursor:pointer;padding:4px;display:flex;}
.fsx-search-x svg{position:static;transform:none;width:13px;height:13px;}
.fsx-crumbs{display:flex;align-items:center;flex-wrap:wrap;gap:2px;font-size:12px;color:var(--text-mute);}
.fsx-crumb{border:0;background:transparent;font:inherit;font-size:12px;font-weight:500;color:var(--text-mute);padding:3px 6px;border-radius:5px;cursor:pointer;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
button.fsx-crumb:hover{color:var(--brand-blue);background:var(--accent-glow);}
.fsx-crumb.cur{color:var(--text);font-weight:600;cursor:default;}
.fsx-crumb-sep{display:inline-flex;color:var(--text-dim);}
.fsx-crumb-sep svg{width:12px;height:12px;}
/* the stat strip and the area cards (the home page) */
.fsx-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:0 0 16px;}
.fsx-stat{display:flex;align-items:center;gap:10px;min-height:58px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);color:var(--text);font:inherit;text-align:left;}
.fsx-stat.go{cursor:pointer;transition:border-color .15s,background .15s;}
.fsx-stat.go:hover{border-color:var(--brand-blue);background:var(--surface);}
.fsx-stat.go:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
.fsx-stat-i{display:inline-grid;place-items:center;width:32px;height:32px;border-radius:9px;flex:none;background:color-mix(in srgb,var(--brand-blue) 11%,var(--surface));color:var(--brand-blue);}
.fsx-stat-i svg{width:16px;height:16px;}
.fsx-stat-v{font-size:18px;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums;line-height:1;}
.fsx-stat-l{font-size:11px;color:var(--text-mute);line-height:1.3;min-width:0;}
.fsx-agrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px;}
.fsx-acard{position:relative;display:flex;flex-direction:column;gap:12px;min-height:150px;padding:16px 16px 14px;border:1px solid var(--line);border-radius:12px;background:var(--surface);color:var(--text);font:inherit;text-align:left;cursor:pointer;overflow:hidden;transition:box-shadow .15s,border-color .15s,transform .15s;}
.fsx-acard::before{content:'';position:absolute;inset:0 0 auto 0;height:3px;background:var(--fsx-c,var(--bc-grad-a));opacity:.9;}
.fsx-acard:hover{border-color:color-mix(in srgb,var(--fsx-c,var(--brand-blue)) 55%,var(--line));box-shadow:var(--shadow-md);transform:translateY(-1px);}
.fsx-acard:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
.fsx-acard.drop-on{border-color:var(--brand-blue);background:var(--accent-glow);}
.fsx-acard-top{display:flex;align-items:flex-start;gap:12px;min-width:0;}
.fsx-acard-ic{display:inline-grid;place-items:center;width:42px;height:42px;border-radius:11px;flex:none;color:var(--fsx-c,var(--bc-grad-a));background:color-mix(in srgb,var(--fsx-c,var(--bc-grad-a)) 12%,var(--surface));}
.fsx-acard-ic svg{width:24px;height:24px;fill:color-mix(in srgb,var(--fsx-c,var(--bc-grad-a)) 22%,transparent);}
.fsx-acard-id{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1;padding-top:2px;}
.fsx-acard-t{font-size:15px;font-weight:600;letter-spacing:-.012em;overflow-wrap:anywhere;line-height:1.3;}
.fsx-acard-d{font-size:12px;color:var(--text-mute);line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.fsx-acard-d i{color:var(--text-dim);font-style:normal;}
.fsx-acard-more{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;flex:none;margin:-4px -6px 0 0;border:0;border-radius:7px;background:transparent;color:var(--text-mute);cursor:pointer;opacity:0;transition:opacity .15s,background .12s;}
.fsx-acard:hover .fsx-acard-more,.fsx-acard:focus-within .fsx-acard-more{opacity:1;}
.fsx-acard-more:hover{background:var(--surface-3);color:var(--text);}
.fsx-acard-more svg{width:16px;height:16px;}
.fsx-acard-m{display:flex;flex-wrap:wrap;gap:4px 12px;font-size:12px;color:var(--text-mute);}
.fsx-acard-m span{display:inline-flex;align-items:center;gap:5px;}
.fsx-acard-m svg{width:13px;height:13px;color:var(--text-dim);}
.fsx-acard-f{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:auto;padding-top:10px;border-top:1px solid var(--line);}
.fsx-acard-go{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:600;color:var(--brand-blue);opacity:0;transform:translateX(-4px);transition:opacity .15s,transform .15s;}
.fsx-acard-go svg{width:13px;height:13px;}
.fsx-acard:hover .fsx-acard-go,.fsx-acard:focus-visible .fsx-acard-go{opacity:1;transform:none;}
.fsx-acard.new{border-style:dashed;align-items:center;justify-content:center;text-align:center;color:var(--text-mute);gap:6px;}
.fsx-acard.new::before{display:none;}
.fsx-acard-plus{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background:var(--accent-glow);color:var(--brand-blue);}
.fsx-acard-plus svg{width:20px;height:20px;}
.fsx-hsec{margin-top:22px;}
.fsx-hsec-h{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px;}
.fsx-hsec-h h4{display:flex;align-items:center;gap:7px;margin:0;font-size:13px;font-weight:600;color:var(--text);}
.fsx-hsec-h h4 svg{width:14px;height:14px;color:var(--text-mute);}
.fsx-hsec-h .acc-link{display:inline-flex;align-items:center;gap:4px;font-size:12px;}
.fsx-hsec-h .acc-link svg{width:12px;height:12px;}
.fsx-hsec-wait,.fsx-hsec-none{display:flex;align-items:center;gap:8px;padding:12px;font-size:12px;color:var(--text-dim);border:1px dashed var(--line);border-radius:10px;}
.fsx-recent{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:4px 12px;}
.fsx-rrow{display:flex;align-items:center;gap:10px;min-height:46px;padding:5px 8px;border:0;border-radius:8px;background:transparent;color:var(--text);font:inherit;text-align:left;cursor:pointer;min-width:0;}
.fsx-rrow:hover{background:var(--surface-2);}
.fsx-rrow:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
.fsx-rrow .fsx-ic.file{width:26px;height:30px;font-size:10px;letter-spacing:0;}
.fsx-rrow-t{display:flex;flex-direction:column;flex:1;min-width:0;}
.fsx-rrow-n{font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-rrow-p{font-size:11px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-rrow-m{font-size:11px;color:var(--text-dim);white-space:nowrap;flex:none;}
/* the command bar */
.fsx-cmd{display:flex;align-items:center;justify-content:space-between;gap:8px 12px;flex-wrap:wrap;padding:10px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);margin-bottom:10px;}
.fsx-cmd-l,.fsx-cmd-r{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.fsx-cmd .btn svg{width:14px;height:14px;}
.fsx-selcount{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--text-mute);margin-left:6px;padding-left:10px;border-left:1px solid var(--line);}
.fsx-filter{position:relative;}
.fsx-filter svg{position:absolute;left:9px;top:50%;transform:translateY(-50%);width:13px;height:13px;color:var(--text-mute);pointer-events:none;}
.fsx-filter input{width:170px;height:32px;padding:0 10px 0 28px;border:1px solid var(--line);border-radius:7px;background:var(--surface);color:var(--text);font:inherit;font-size:13px;}
.fsx-sel{height:32px;padding:0 26px 0 10px;border:1px solid var(--line);border-radius:7px;background:var(--surface);color:var(--text);font:inherit;font-size:13px;max-width:170px;}
.fsx-seg{display:inline-flex;border:1px solid var(--line);border-radius:7px;overflow:hidden;}
.fsx-seg button{display:flex;align-items:center;justify-content:center;width:34px;height:32px;border:0;background:var(--surface);color:var(--text-mute);cursor:pointer;}
.fsx-seg button+button{border-left:1px solid var(--line);}
.fsx-seg button.on{background:var(--accent-glow);color:var(--brand-blue);}
.fsx-seg svg{width:15px;height:15px;}
.fsx-access{display:flex;align-items:center;gap:10px;margin:0 0 12px;padding:8px 12px;border-radius:9px;background:var(--surface-2);font-size:12px;color:var(--text-mute);line-height:1.5;}
.fsx-access > svg{width:15px;height:15px;flex-shrink:0;color:var(--brand-blue);}
.fsx-access > span{flex:1;min-width:0;}
.fsx-access-from{color:var(--text-dim);}
.fsx-lvl{font-size:11px;vertical-align:baseline;}
/* icons */
.fsx-ic{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}
.fsx-ic.folder{width:30px;height:30px;color:#E0A526;}
.fsx-ic.folder svg{width:26px;height:26px;fill:rgba(224,165,38,.22);}
.fsx-ic.folder.area{color:var(--fsx-c,var(--bc-grad-a));}
.fsx-ic.folder.area svg{fill:color-mix(in srgb, var(--fsx-c,var(--bc-grad-a)) 22%, transparent);}
.fsx-ic.folder.limited{opacity:.6;}
.fsx-ic.file{position:relative;width:30px;height:34px;border-radius:5px;font-size:10px;font-weight:700;letter-spacing:.04em;color:#fff;background:#64748B;font-family:var(--font-mono);font-variant-numeric:tabular-nums;box-shadow:inset 0 -2px 0 rgba(0,0,0,.14);}
.fsx-ic.file::after{content:'';position:absolute;top:0;right:0;width:8px;height:8px;background:linear-gradient(225deg,var(--surface) 50%,rgba(255,255,255,.35) 50%);border-radius:0 5px 0 3px;}
.fsx-ic.file.big{width:54px;height:64px;border-radius:8px;font-size:13px;}
.fsx-ic.file.big::after{width:14px;height:14px;border-radius:0 8px 0 5px;}
.fsx-ic.t-pdf{background:#DC2626;} .fsx-ic.t-word{background:#2B579A;} .fsx-ic.t-xls{background:#217346;} .fsx-ic.t-ppt{background:#C43E1C;}
.fsx-ic.t-img{background:#7C4DFF;} .fsx-ic.t-vid{background:#DB2777;} .fsx-ic.t-aud{background:#0D9488;} .fsx-ic.t-zip{background:#92400E;}
.fsx-ic.t-txt{background:#475569;} .fsx-ic.t-cad{background:#0E7490;} .fsx-ic.t-mail{background:var(--bc-blue-v1-deep);}
.fsx-tile-ic .fsx-ic.folder{width:64px;height:64px;}
.fsx-tile-ic .fsx-ic.folder svg{width:56px;height:56px;}
/* the list */
.fsx-table-wrap{overflow-x:auto;margin:0 -4px;padding:0 4px;}
.fsx-table{width:100%;border-collapse:separate;border-spacing:0;font-size:13px;}
.fsx-table th{position:sticky;top:0;z-index:1;background:var(--surface);text-align:left;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);padding:0 8px 8px;border-bottom:1px solid var(--line);white-space:nowrap;}
.fsx-th{display:inline-flex;align-items:center;gap:4px;border:0;background:transparent;font:inherit;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);padding:4px 2px;cursor:pointer;border-radius:4px;}
.fsx-th:hover{color:var(--text);}
.fsx-th.on{color:var(--text);}
.fsx-th svg{width:12px;height:12px;}
.fsx-table td{padding:7px 8px;border-bottom:1px solid var(--line);vertical-align:middle;height:46px;}
.fsx-table tbody tr:last-child td{border-bottom:0;}
.fsx-row{cursor:default;transition:background .1s;}
.fsx-row:hover{background:var(--surface-2);}
.fsx-row.on{background:var(--accent-glow);}
.fsx-row.on td{border-bottom-color:color-mix(in srgb,var(--brand-blue) 18%,var(--line));}
.fsx-row.limited .fsx-link{color:var(--text-mute);}
.fsx-row[draggable="true"]{cursor:grab;}
.fsx-ck{width:34px;}
.fsx-ck input{width:16px;height:16px;cursor:pointer;accent-color:var(--brand-blue);display:block;}
.fsx-name{min-width:240px;}
.fsx-name-in{display:flex;align-items:center;gap:10px;min-width:0;}
.fsx-name-t{display:flex;flex-direction:column;min-width:0;flex:1;}
.fsx-link{border:0;background:transparent;padding:0;font:inherit;font-size:13px;font-weight:500;color:var(--text);text-align:left;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;}
.fsx-link:hover{color:var(--brand-blue);text-decoration:underline;}
.fsx-link.plain{cursor:default;}
.fsx-link.plain:hover{color:var(--text);text-decoration:none;}
.fsx-path{font-size:11px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-own,.fsx-shared{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:6px;flex:none;}
.fsx-own{color:var(--text-dim);}
.fsx-own svg{width:12px;height:12px;}
.fsx-shared{color:var(--brand-blue);background:var(--accent-glow);}
.fsx-shared svg{width:12px;height:12px;}
.fsx-ver{font-size:11px;font-weight:600;color:var(--text-mute);background:var(--surface-3);border-radius:4px;padding:1px 5px;font-variant-numeric:tabular-nums;flex:none;}
.fsx-when,.fsx-by,.fsx-size,.fsx-to{white-space:nowrap;color:var(--text-mute);}
.fsx-when{width:130px;} .fsx-by{width:170px;} .fsx-size{width:120px;}
.fsx-by-in{display:inline-flex;align-items:center;gap:7px;min-width:0;}
.fsx-by-in > span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-more{width:104px;text-align:right;}
.fsx-rowacts{display:inline-flex;align-items:center;justify-content:flex-end;gap:2px;}
.fsx-ra{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:0;border-radius:7px;background:transparent;color:var(--text-mute);cursor:pointer;opacity:0;transition:opacity .12s,background .12s,color .12s;}
.fsx-ra.fsx-morebtn{opacity:1;}
.fsx-row:hover .fsx-ra,.fsx-row.on .fsx-ra,.fsx-row:focus-within .fsx-ra,.fsx-tile:hover .fsx-ra,.fsx-tile.on .fsx-ra,.fsx-tile:focus-within .fsx-ra{opacity:1;}
.fsx-ra:hover{background:var(--surface-3);color:var(--brand-blue);}
.fsx-ra:focus-visible{opacity:1;outline:2px solid var(--brand-blue);outline-offset:-2px;}
.fsx-ra svg{width:15px;height:15px;}
.fsx-morebtn svg{width:16px;height:16px;}
.fsx-path-c{color:var(--text-mute);font-size:12px;max-width:260px;}
.fsx-to{max-width:260px;overflow:hidden;text-overflow:ellipsis;}
.fsx-to i{color:var(--text-dim);font-style:normal;}
.fsx-rb-acts{white-space:nowrap;text-align:right;}
.fsx-rb-acts .btn+.btn{margin-left:6px;}
/* dragging rows onto a folder */
.is-folder.drop-on,.fsx-nav.drop-on,.fsx-crumb.drop-on{background:var(--accent-glow)!important;box-shadow:inset 0 0 0 2px var(--brand-blue);border-radius:8px;}
body.fsx-dragging .fsx-row.is-folder td,body.fsx-dragging .fsx-tile.is-folder{transition:background .1s;}
.fsx-ghost{position:fixed;left:-9999px;top:0;padding:8px 14px;border-radius:999px;background:var(--brand-blue);color:#fff;font:600 13px var(--font-body);box-shadow:var(--shadow-lg);white-space:nowrap;max-width:320px;overflow:hidden;text-overflow:ellipsis;}
/* the tiles */
.fsx-tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(164px,1fr));gap:10px;}
.fsx-tile{position:relative;display:flex;flex-direction:column;align-items:center;gap:6px;padding:14px 10px 12px;border:1px solid var(--line);border-radius:12px;background:var(--surface);text-align:center;transition:border-color .12s,box-shadow .12s;}
.fsx-tile:hover{border-color:color-mix(in srgb,var(--brand-blue) 45%,var(--line));box-shadow:var(--shadow-sm);}
.fsx-tile.on{background:var(--accent-glow);border-color:var(--brand-blue);}
.fsx-tile[draggable="true"]{cursor:grab;}
.fsx-tile-ck{position:absolute;top:8px;left:8px;opacity:0;transition:opacity .12s;}
.fsx-tile:hover .fsx-tile-ck,.fsx-tile.on .fsx-tile-ck,.fsx-tile:focus-within .fsx-tile-ck{opacity:1;}
.fsx-tile-ck input{accent-color:var(--brand-blue);width:16px;height:16px;cursor:pointer;}
.fsx-tile-acts{position:absolute;top:4px;right:4px;}
.fsx-tile-acts .fsx-ra{width:28px;height:28px;}
.fsx-tile-ic{height:78px;width:100%;display:flex;align-items:center;justify-content:center;border-radius:9px;background:var(--surface-2);margin-top:4px;}
.fsx-tile.is-folder .fsx-tile-ic{background:rgba(224,165,38,.08);}
.fsx-tile-t{border:0;background:transparent;font:inherit;font-size:13px;font-weight:500;color:var(--text);cursor:pointer;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow-wrap:anywhere;line-height:1.35;}
.fsx-tile-t:hover{color:var(--brand-blue);}
.fsx-tile-m{font-size:11px;color:var(--text-dim);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-tile-marks{display:flex;gap:4px;align-items:center;}
/* empty states and the drop zone */
.fsx-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:44px 20px;text-align:center;color:var(--text-mute);font-size:13px;line-height:1.55;border:1px dashed var(--line);border-radius:12px;}
.fsx-empty.small{padding:30px 20px;}
.fsx-empty.drop{border-color:color-mix(in srgb, var(--brand-blue) 40%, var(--line));background:color-mix(in srgb, var(--brand-blue) 3%, transparent);}
.fsx-empty > svg{width:44px;height:44px;padding:10px;border-radius:50%;color:var(--brand-blue);background:var(--accent-glow);box-sizing:content-box;}
.fsx-empty b{font-size:15px;font-weight:600;color:var(--text);}
.fsx-empty span{max-width:460px;}
.fsx-empty .btn{margin-top:6px;}
.fsx-empty-acts{display:flex;gap:8px;flex-wrap:wrap;justify-content:center;}
.fsx-empty-acts .btn{margin-top:4px;}
.fsx-drop{position:absolute;inset:0;z-index:5;display:none;align-items:center;justify-content:center;border:2px dashed var(--brand-blue);border-radius:12px;background:color-mix(in srgb, var(--surface) 82%, transparent);backdrop-filter:blur(2px);pointer-events:none;}
.fsx-drop.on{display:flex;}
.fsx-drop > div{display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--brand-blue);font-size:13px;}
.fsx-drop svg{width:40px;height:40px;}
.fsx-drop b{font-size:16px;font-weight:600;}
/* the ... menu */
.fsx-menu{position:fixed;z-index:1200;min-width:210px;padding:6px;border:1px solid var(--line);border-radius:10px;background:var(--surface);box-shadow:var(--shadow-lg);}
.fsx-menu button{display:flex;align-items:center;gap:10px;width:100%;min-height:34px;padding:7px 10px;border:0;border-radius:6px;background:transparent;color:var(--text);font:inherit;font-size:13px;text-align:left;cursor:pointer;}
.fsx-menu button:hover,.fsx-menu button:focus-visible{background:var(--surface-2);outline:none;}
.fsx-menu button svg{width:15px;height:15px;color:var(--text-mute);}
.fsx-menu button.danger{color:var(--err);}
.fsx-menu button.danger svg{color:var(--err);}
.fsx-menu-sep{height:1px;background:var(--line);margin:4px 2px;}
.fsx-menu-sep:first-child,.fsx-menu-sep:last-child,.fsx-menu-sep + .fsx-menu-sep{display:none;}
/* the Details pane */
.fsx-details{position:sticky;top:12px;max-height:calc(100vh - 140px);overflow:auto;padding:0 14px 14px;border:1px solid var(--line);border-radius:12px;background:var(--surface);font-size:13px;box-shadow:var(--shadow-sm);}
.fsx-det-h{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;margin:0 -14px 12px;padding:10px 10px 10px 14px;background:var(--surface);border-bottom:1px solid var(--line);}
.fsx-det-h b{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.fsx-det-h b svg{width:13px;height:13px;}
.fsx-det-x{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:0;border-radius:6px;background:transparent;color:var(--text-mute);cursor:pointer;}
.fsx-det-x:hover{background:var(--surface-3);color:var(--text);}
.fsx-det-x svg{width:15px;height:15px;}
.fsx-det-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:24px 8px;text-align:center;color:var(--text-mute);line-height:1.5;}
.fsx-det-empty svg{width:26px;height:26px;color:var(--text-dim);}
.fsx-det-empty b{color:var(--text);font-size:14px;}
.fsx-det-empty .fsx-det-acts{margin:4px 0 0;}
.fsx-det-top{display:flex;align-items:center;gap:12px;margin-bottom:12px;}
.fsx-det-top > div{min-width:0;}
.fsx-det-name{font-size:15px;font-weight:600;overflow-wrap:anywhere;line-height:1.35;}
.fsx-det-acts{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px;}
.fsx-det-acts .btn svg{width:13px;height:13px;}
.fsx-det-sec{padding:12px 0;border-top:1px solid var(--line);}
.fsx-det-sh{display:flex;align-items:center;gap:6px;margin-bottom:8px;font-size:12px;font-weight:600;color:var(--text);}
.fsx-det-sh svg{width:13px;height:13px;color:var(--text-mute);}
.fsx-det-n{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;margin-left:2px;border-radius:999px;background:var(--surface-3);font-size:11px;font-weight:600;color:var(--text-mute);}
.fsx-det-r{display:flex;justify-content:space-between;gap:10px;padding:3px 0;}
.fsx-det-r span{color:var(--text-mute);flex-shrink:0;}
.fsx-det-r b{font-weight:500;text-align:right;overflow-wrap:anywhere;min-width:0;}
.fsx-det-desc{color:var(--text);line-height:1.55;white-space:pre-wrap;}
.fsx-details textarea{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:7px;background:var(--surface);color:var(--text);font:inherit;font-size:13px;resize:vertical;margin-bottom:6px;}
.fsx-det-people{display:flex;flex-direction:column;gap:6px;margin-top:8px;}
.fsx-det-p{display:flex;align-items:center;gap:8px;}
.fsx-det-pn{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-det-pn i{color:var(--text-dim);font-style:normal;}
.fsx-det-btn{margin-top:10px;}
.fsx-det-shares{display:flex;flex-direction:column;gap:6px;}
.fsx-shr{display:flex;flex-direction:column;gap:3px;padding:8px 10px;border:1px solid var(--line);border-radius:9px;background:var(--surface-2);font-size:12px;}
.fsx-shr.failed{border-color:color-mix(in srgb,var(--warn) 45%,var(--line));}
.fsx-shr-t{display:flex;align-items:center;gap:6px;font-weight:500;color:var(--text);min-width:0;}
.fsx-shr-t svg{width:12px;height:12px;flex:none;color:var(--brand-blue);}
.fsx-shr-t span{overflow-wrap:anywhere;}
.fsx-shr small{font-size:11px;color:var(--text-dim);line-height:1.45;}
.fsx-shr-a{display:flex;gap:12px;flex-wrap:wrap;}
.fsx-shr-a .acc-link{display:inline-flex;align-items:center;gap:4px;font-size:12px;}
.fsx-shr-a .acc-link svg{width:11px;height:11px;}
.acc-link.danger{color:var(--err);}
.fsx-vers{display:flex;flex-direction:column;gap:4px;}
.fsx-ver-r{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px;padding:5px 0;border-bottom:1px dashed var(--line);font-size:12px;}
.fsx-ver-r:last-child{border-bottom:0;}
.fsx-ver-r b{font-variant-numeric:tabular-nums;}
.fsx-ver-r span{flex:1;min-width:120px;color:var(--text-mute);}
.fsx-ver-r em{font-style:normal;font-size:11px;font-weight:600;color:var(--ok,#16A34A);}
.fsx-acts{display:flex;flex-direction:column;gap:7px;}
.fsx-act{display:flex;flex-direction:column;gap:1px;padding-left:12px;position:relative;}
.fsx-act::before{content:'';position:absolute;left:0;top:7px;width:6px;height:6px;border-radius:50%;background:var(--line-2);}
.fsx-act small{font-size:11px;color:var(--text-dim);}
/* the share window */
.fsx-share{padding:16px 18px;}
.fsx-share-file{display:flex;align-items:center;gap:12px;margin-bottom:14px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);}
.fsx-share-file > div{display:flex;flex-direction:column;gap:2px;min-width:0;}
.fsx-share-file b{font-size:14px;font-weight:600;overflow-wrap:anywhere;line-height:1.3;}
.fsx-share-file span{font-size:12px;color:var(--text-mute);}
.fsx-share textarea.lmx-in{resize:vertical;min-height:70px;}
.fsx-share-note{display:flex;gap:8px;align-items:flex-start;margin:4px 0 10px;padding:10px 12px;border-radius:9px;background:var(--accent-soft,var(--bc-accent-soft));font-size:12px;color:var(--text-mute);line-height:1.5;}
.fsx-share-note svg{width:14px;height:14px;flex:none;margin-top:2px;color:var(--brand-blue);}
.fsx-share-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;}
.fsx-share-foot-r{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto;}
.fsx-share-done{display:flex;flex-direction:column;gap:8px;padding:14px;border-radius:10px;border:1px solid color-mix(in srgb,var(--ok) 40%,var(--line));background:color-mix(in srgb,var(--ok) 6%,var(--surface));}
.fsx-share-done.warn{border-color:color-mix(in srgb,var(--warn) 45%,var(--line));background:color-mix(in srgb,var(--warn) 7%,var(--surface));}
.fsx-share-done.err{border-color:color-mix(in srgb,var(--err) 40%,var(--line));background:color-mix(in srgb,var(--err) 6%,var(--surface));}
.fsx-share-done-h{display:flex;align-items:center;gap:8px;font-size:14px;}
.fsx-share-done-h svg{width:18px;height:18px;flex:none;color:var(--ok);}
.fsx-share-done.err .fsx-share-done-h svg,.fsx-share-done.warn .fsx-share-done-h svg{color:var(--warn);}
.fsx-share-done-h b{overflow-wrap:anywhere;}
.fsx-share-fail{font-size:12px;color:var(--err);}
.fsx-share-url{display:flex;gap:6px;align-items:center;}
.fsx-share-url input{flex:1;min-width:0;height:34px;padding:0 10px;border:1px solid var(--line);border-radius:7px;background:var(--surface);color:var(--text);font:inherit;font-size:12px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.fsx-share-url .btn{flex:none;}
.fsx-share-links{margin-top:16px;padding-top:12px;border-top:1px solid var(--line);}
/* the uploads panel */
.fsx-ups{position:fixed;right:18px;bottom:84px;z-index:900;width:340px;max-width:calc(100vw - 24px);max-height:50vh;display:flex;flex-direction:column;border:1px solid var(--line);border-radius:12px;background:var(--surface);box-shadow:var(--shadow-lg);overflow:hidden;}
.fsx-ups-h{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 14px;border-bottom:1px solid var(--line);font-size:13px;}
.fsx-ups-list{overflow:auto;padding:6px 14px 10px;}
.fsx-up{padding:7px 0;border-bottom:1px solid var(--line);font-size:12px;}
.fsx-up:last-child{border-bottom:0;}
.fsx-up-t{display:flex;align-items:center;gap:6px;}
.fsx-up-t span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;}
.fsx-up-x{border:0;background:transparent;color:var(--text-mute);cursor:pointer;display:flex;padding:2px;}
.fsx-up-x svg{width:12px;height:12px;}
.fsx-up-bar{height:4px;margin:5px 0 3px;border-radius:99px;background:var(--surface-3);overflow:hidden;}
.fsx-up-bar i{display:block;height:100%;background:var(--brand-blue);transition:width .2s;}
.fsx-up.ok .fsx-up-bar i{background:var(--ok,#16A34A);}
.fsx-up.err .fsx-up-bar i{background:var(--err);width:100%!important;}
.fsx-up.skip{opacity:.6;}
.fsx-up-m{color:var(--text-mute);}
.fsx-up.err .fsx-up-m{color:var(--err);}
/* the preview */
.fsx-pv-modal{width:min(1100px,96vw)!important;max-width:96vw!important;}
.fsx-pv-head h3{display:flex;align-items:center;gap:10px;min-width:0;}
.fsx-pv-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-pv-acts{display:flex;align-items:center;gap:8px;}
.fsx-pv-acts .close{position:static;}
.fsx-pv{padding:0!important;min-height:200px;background:var(--bg-2);display:flex;align-items:center;justify-content:center;}
.fsx-pv iframe{width:100%;height:78vh;border:0;background:#fff;display:block;}
.fsx-pv img{max-width:100%;max-height:78vh;display:block;margin:auto;}
.fsx-pv video{max-width:100%;max-height:78vh;display:block;margin:auto;background:#000;}
.fsx-pv-none{display:flex;flex-direction:column;align-items:center;gap:10px;padding:40px 20px;text-align:center;color:var(--text-mute);font-size:13px;}
.fsx-pv-none b{font-size:15px;color:var(--text);overflow-wrap:anywhere;}
/* conflict question, move/copy picker, access */
.fsx-ask-p{margin:0 0 12px;font-size:13px;color:var(--text-mute);}
.fsx-ask{display:flex;flex-direction:column;gap:8px;}
.fsx-ask-o{display:flex;flex-direction:column;align-items:flex-start;gap:3px;padding:11px 13px;border:1px solid var(--line);border-radius:9px;background:var(--surface);color:var(--text);font:inherit;text-align:left;cursor:pointer;}
.fsx-ask-o:hover,.fsx-ask-o:focus-visible{border-color:var(--brand-blue);background:var(--accent-glow);outline:none;}
.fsx-ask-o b{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;}
.fsx-ask-o b svg{width:14px;height:14px;}
.fsx-ask-o span{font-size:12px;color:var(--text-mute);}
.fsx-ask-all{margin-top:12px;font-size:13px;}
.fsx-pick{padding:16px 18px;}
.fsx-pick-crumbs{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-bottom:10px;font-size:13px;}
.fsx-pick-crumbs svg{width:11px;height:11px;color:var(--text-dim);}
.fsx-pick-list{display:flex;flex-direction:column;gap:2px;max-height:46vh;min-height:120px;overflow:auto;padding:4px;border:1px solid var(--line);border-radius:9px;}
.fsx-pick-row{display:flex;align-items:center;gap:10px;min-height:40px;padding:6px 8px;border:0;border-radius:6px;background:transparent;color:var(--text);font:inherit;font-size:13px;text-align:left;cursor:pointer;}
.fsx-pick-row:hover{background:var(--surface-2);}
.fsx-pick-row span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-pick-row > svg{width:13px;height:13px;color:var(--text-dim);}
.fsx-pick-none{padding:12px;}
.fsx-pick-why{margin-top:8px;}
.fsx-acc{padding:16px 18px;}
.fsx-acc-item{display:flex;align-items:center;gap:10px;margin-bottom:12px;font-size:14px;}
.fsx-acc-item b{overflow-wrap:anywhere;}
.fsx-acc-h{margin:14px 0 6px;font-size:12px;font-weight:600;color:var(--text-mute);}
.fsx-acc-h2{margin:12px 0 6px;font-size:12px;font-weight:600;color:var(--text-mute);}
.fsx-acc-mode{display:flex;flex-direction:column;gap:8px;margin-bottom:12px;}
.fsx-acc-opt{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line);border-radius:9px;cursor:pointer;}
.fsx-acc-opt.on{border-color:var(--brand-blue);background:var(--accent-glow);}
.fsx-acc-opt input{margin-top:3px;}
.fsx-acc-opt span{display:flex;flex-direction:column;gap:2px;font-size:13px;}
.fsx-acc-opt small{font-size:12px;color:var(--text-mute);line-height:1.5;}
.fsx-acc-box{padding:12px;border:1px solid var(--line);border-radius:9px;background:var(--surface-2,transparent);}
.fsx-acc-row{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.fsx-acc-l{display:flex;flex-direction:column;gap:1px;font-size:13px;}
.fsx-acc-l small{font-size:12px;color:var(--text-mute);}
.fsx-lvlsel{padding:6px 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font:inherit;font-size:13px;}
.fsx-acc-people{display:flex;flex-direction:column;gap:6px;}
.fsx-acc-p{display:flex;align-items:center;gap:9px;padding:6px 8px;border-radius:7px;background:var(--surface);border:1px solid var(--line);}
.fsx-acc-pn{flex:1;min-width:0;display:flex;flex-direction:column;font-size:13px;}
.fsx-acc-pn b{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-acc-pn small{font-size:11px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fsx-acc-x{border:0;background:transparent;color:var(--text-mute);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border-radius:6px;flex-shrink:0;}
.fsx-acc-x:hover{background:var(--surface-2);color:var(--err);}
.fsx-acc-x svg{width:13px;height:13px;}
.fsx-acc-none{padding:4px 2px;}
.fsx-acc-add{display:flex;gap:6px;margin-top:10px;flex-wrap:wrap;}
.fsx-acc-add select:first-child{flex:1;min-width:160px;padding:6px 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font:inherit;font-size:13px;}
.fsx-acc-note{display:flex;gap:6px;align-items:flex-start;margin-top:12px;line-height:1.5;}
.fsx-acc-note svg{width:13px;height:13px;flex-shrink:0;margin-top:2px;}
.fsx-acc-reset{margin-top:10px;font-size:13px;}
.fsx-swatches{display:flex;gap:8px;flex-wrap:wrap;}
.fsx-sw{width:28px;height:28px;border-radius:50%;border:2px solid transparent;background:var(--fsx-c);cursor:pointer;box-shadow:inset 0 0 0 2px var(--surface);}
.fsx-sw.on{border-color:var(--text);}
@media (max-width:1240px){ .fsx{grid-template-columns:212px minmax(0,1fr);} .fsx-by{display:none;} }
/* with the Details pane open on a medium screen the areas become a strip across the top, the list and the pane side by side */
@media (max-width:1440px){
  .fsx.with-details{grid-template-columns:minmax(0,1fr) 300px;}
  .fsx.with-details .fsx-side{grid-column:1/-1;position:static;flex-direction:row;flex-wrap:nowrap;overflow-x:auto;gap:4px;padding:8px;}
  .fsx.with-details .fsx-side-h,.fsx.with-details .fsx-side-sep,.fsx.with-details .fsx-use,.fsx.with-details .fsx-side-empty,.fsx.with-details .fsx-tw,.fsx.with-details .fsx-tn:not(.area){display:none;}
  .fsx.with-details .fsx-areas{flex-direction:row;max-height:none;overflow:visible;gap:4px;margin:0;padding:0;}
  .fsx.with-details .fsx-tn{display:flex;padding-left:0;}
  .fsx.with-details .fsx-nav{width:auto;white-space:nowrap;flex-shrink:0;}
  .fsx.with-details .fsx-nav-t{overflow:visible;}
}
@media (max-width:980px){
  .fsx,.fsx.with-details{grid-template-columns:minmax(0,1fr);}
  .fsx-side{position:static;flex-direction:row;flex-wrap:nowrap;overflow-x:auto;gap:4px;padding:8px;}
  .fsx-side-h,.fsx-side-sep,.fsx-use,.fsx-side-empty,.fsx-tw,.fsx-tn:not(.area){display:none;}
  .fsx-areas{flex-direction:row;max-height:none;overflow:visible;gap:4px;margin:0;padding:0;}
  .fsx-tn{display:flex;padding-left:0;}
  .fsx-nav{width:auto;white-space:nowrap;flex-shrink:0;}
  .fsx-nav-t{overflow:visible;}
  .fsx-details{position:static;max-height:none;}
  .fsx-det-h{position:static;}
  .fsx-stats{grid-template-columns:repeat(3,1fr);}
}
@media (max-width:640px){
  .fsx-main{padding:12px;}
  .fsx-search{flex:1 1 100%;}
  .fsx-filter{flex:1;} .fsx-filter input{width:100%;}
  .fsx-cmd-r{width:100%;}
  .fsx-cmd .btn,.fsx-seg button,.fsx-sel,.fsx-stat.go{min-height:40px;}
  .fsx-sel{height:40px;max-width:none;flex:1 1 110px;min-width:0;}
  .fsx-filter{flex:1 1 100%;}
  .fsx-seg,.fsx-infobtn{flex:none;}
  .fsx-nav{min-height:40px;}
  .fsx-when,.fsx-size,.fsx-path-c{display:none;}
  .fsx-name{min-width:0;}
  .fsx-table td{padding:9px 6px;}
  .fsx-more{width:44px;}
  .fsx-rowacts .fsx-ra:not(.fsx-morebtn){display:none;}
  .fsx-morebtn{width:40px;height:40px;}
  .fsx-ups{left:12px;right:12px;width:auto;bottom:12px;}
  .fsx-infobtn span{display:none;}
  .fsx-pv iframe{height:70vh;}
  .fsx-stats{grid-template-columns:repeat(2,1fr);}
  .fsx-stat{min-height:52px;}
  .fsx-agrid{grid-template-columns:1fr;}
  .fsx-acard-more,.fsx-acard-go{opacity:1;}
  .fsx-acard-more{width:40px;height:40px;}
  .fsx-recent{grid-template-columns:1fr;}
  .fsx-rrow-m{display:none;}
  .fsx-title{font-size:18px!important;}
  .fsx-tile-ck,.fsx-tile-acts .fsx-ra{opacity:1;}
  .fsx-share-foot-r{width:100%;}
  .fsx-share-foot-r .btn{flex:1;min-height:40px;}
  .fsx-share-url{flex-wrap:wrap;} .fsx-share-url .btn{min-height:40px;width:100%;}
  .fsx-shr-a .acc-link,.fsx-hsec-h .acc-link{min-height:40px;}
  /* v1.4.10.492: the list fits the screen (a long name wraps instead of pushing the table wider than the page, the recycle
     bin's buttons stack), and every control takes the tap on the 40px floor */
  .fsx-link,.fsx-path{white-space:normal;overflow-wrap:anywhere;}
  .fsx-table td.fsx-ck,.fsx-table th.fsx-ck{width:40px;min-width:40px;padding:0;text-align:center;cursor:pointer;}
  .fsx-ck input{width:18px;height:18px;margin:11px auto;}
  .fsx-th,.fsx-crumb{min-height:40px;}
  .fsx-crumb{display:inline-flex;align-items:center;}
  .fsx-tile-ck{top:0;left:0;padding:12px;display:flex;}
  .fsx-tile-acts{top:0;right:0;} .fsx-tile-acts .fsx-ra{width:40px;height:40px;}
  .fsx-seg button{width:40px;height:40px;}
  .fsx-infobtn{min-width:40px;}
  .fsx-det-x{width:40px;height:40px;}
  .fsx-details .btn,.fsx-lvlsel,.fsx-acc-add select,.fsx-sw{min-height:40px;}
  .fsx-sw{width:40px;height:40px;}
  .fsx-acc-x{width:40px;height:40px;}
  .fsx-menu button{min-height:44px;}
  .fsx-search-x{right:0;width:40px;height:40px;padding:0;align-items:center;justify-content:center;}
  .fsx-up-x{width:40px;height:40px;align-items:center;justify-content:center;margin:-10px -10px -10px 0;}
  .fsx-ver-r .acc-link,.fsx-selcount .acc-link{display:inline-flex;align-items:center;min-height:40px;padding:0 6px;}
  .fsx-rb-acts{white-space:normal;}
  .fsx-rb-acts .btn{display:flex;width:100%;justify-content:center;min-height:40px;}
  .fsx-rb-acts .btn+.btn{margin:6px 0 0;}
  .fsx-recycle .fsx-name,.fsx-shares .fsx-name{min-width:0;}
  .fsx-to{white-space:normal;max-width:none;}
}
/* (v1.4.10.494: a stray "}" closed nothing here and swallowed the first rule written after it) */
/* ═══ v1.4.10.494 — TASKS WORKSPACE (js/18 tkPageInner / tkRailHtml / tkHeadHtml) ════════════════════════════════════
   A rail beside the board: Tasks / History, the seven views with their counts, the site's lists, the sites in scope,
   the tools. The head says what is on screen and holds the search, the view switch, Filters, Select, More and New
   task; the filter row gains Sort by. A row shows its quick actions as you point at it. On a phone (≤1000px) the rail
   is a strip of the views across the top and the lists and sites are the pickers in the head. Every size is a step of
   the scale; uppercase tracks in em. The old .tk-rail / .tk-tile tile rules above are overridden here for the rail. */
.tk-ws{display:grid;grid-template-columns:236px minmax(0,1fr);gap:16px;align-items:start;}
.tk-main-col{min-width:0;display:flex;flex-direction:column;}
.tk-body{min-width:0;}
.tk-nav{position:sticky;top:12px;display:flex;flex-direction:column;gap:12px;max-height:calc(100vh - 24px);overflow-y:auto;overflow-x:hidden;padding:2px 2px 8px;scrollbar-width:thin;min-width:0;}
.tk-nav-tabs{display:flex;width:100%;}
.tk-nav-tabs .tk-tab{flex:1 1 0;justify-content:center;min-height:36px;}
.tk-nav-views{display:flex;flex-direction:column;gap:2px;background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:6px;box-shadow:var(--shadow-sm);}
.tk-nav-item{display:flex;align-items:center;gap:9px;width:100%;border:0;background:transparent;color:var(--text);font:inherit;font-size:13px;font-weight:500;text-align:left;padding:7px 9px;border-radius:8px;cursor:pointer;min-width:0;transition:background .12s,color .12s;}
.tk-nav-item:hover{background:var(--surface-2);}
.tk-nav-item:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
.tk-nav-item.on{background:var(--brand-blue);color:#fff;font-weight:600;}
.tk-nav-item.on .tk-nav-ico{color:#fff;}
.tk-nav-ico{display:inline-flex;width:18px;justify-content:center;color:var(--text-dim);flex:none;}
.tk-nav-ico svg{width:15px;height:15px;}
.tk-nav-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tk-nav-n{flex:none;min-width:22px;padding:1px 7px;border-radius:999px;background:var(--surface-3);color:var(--text-mute);font-size:11px;font-weight:600;text-align:center;line-height:1.5;}
.tk-nav-item.on .tk-nav-n{background:rgba(255,255,255,.22);color:#fff;}
/* the views keep the .tk-tile hooks (tkFilter, .tk-tile-v, .tk-tile-l) but draw as rail rows, not tiles */
.tk-nav .tk-tile{display:flex;flex-direction:row;align-items:center;gap:9px;background:transparent;border:0;border-radius:8px;padding:7px 9px;box-shadow:none;transform:none;}
.tk-nav .tk-tile:hover{transform:none;box-shadow:none;background:var(--surface-2);}
.tk-nav .tk-tile.on{border-color:transparent;box-shadow:none;background:var(--brand-blue);}
.tk-nav .tk-tile .tk-tile-l{flex:1;min-width:0;font-size:13px;font-weight:500;text-transform:none;letter-spacing:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tk-nav .tk-tile.on .tk-tile-l{font-weight:600;}
.tk-nav .tk-tile .tk-tile-v{font-size:11px;font-weight:600;letter-spacing:0;line-height:1.5;color:var(--text-mute);}
.tk-nav .tk-tile.err .tk-tile-v{background:#FEF2F2;color:var(--err);}
.tk-nav .tk-tile.warn .tk-tile-v{background:#FFF7ED;color:#B45309;}
.tk-nav .tk-tile.ok .tk-tile-v{background:#ECFDF5;color:#047857;}
.tk-nav .tk-tile.on .tk-tile-v,.tk-nav .tk-tile.on.err .tk-tile-v,.tk-nav .tk-tile.on.warn .tk-tile-v,.tk-nav .tk-tile.on.ok .tk-tile-v{background:rgba(255,255,255,.22);color:#fff;}
.tk-nav-sec{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:4px 6px 6px;box-shadow:var(--shadow-sm);}
.tk-nav-h{display:flex;align-items:center;gap:2px;padding:4px 2px 4px 0;}
.tk-nav-ht{flex:1;display:flex;align-items:center;gap:4px;border:0;background:transparent;font:inherit;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);padding:5px 4px;border-radius:6px;cursor:pointer;min-width:0;text-align:left;}
.tk-nav-ht:hover{color:var(--text);background:var(--surface-2);}
.tk-nav-ht .tk-caret{display:inline-grid;}
.tk-nav-ht .tk-caret svg{width:13px;height:13px;}
.tk-nav-h .tk-mini{width:24px;height:24px;}
.tk-nav-sec.folded{padding-bottom:4px;}
.tk-nav-list{display:flex;flex-direction:column;gap:1px;}
.tk-nav-list .tk-nav-item{padding:6px 9px;}
.tk-nav-list .tk-dot{width:10px;height:10px;margin:0 4px;}
.tk-nav-empty{font-size:12px;color:var(--text-mute);line-height:1.5;padding:4px 8px 6px;}
.tk-nav-more{border:0;background:transparent;color:var(--brand-blue);font:inherit;font-size:12px;font-weight:600;padding:6px 9px;border-radius:8px;cursor:pointer;text-align:left;display:flex;align-items:center;gap:4px;}
.tk-nav-more:hover{background:var(--surface-2);}
.tk-nav-more svg{width:13px;height:13px;}
.tk-nav-client{display:flex;flex-direction:column;gap:4px;padding:0 2px;}
.tk-nav-lb{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);padding-left:4px;}
.tk-nav-client .tk-client{width:100%;max-width:none;min-height:36px;}
/* the head */
.tk-head.tk-tb2{margin-bottom:12px;padding:12px 14px;border-radius:12px;}
.tk-head .tk-head-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.tk-head-title{flex:1 1 240px;min-width:0;}
.tk-head-h{margin:0;font-size:16px;font-weight:600;letter-spacing:-.012em;line-height:1.25;color:var(--text);}
.tk-head-sub{font-size:12px;color:var(--text-mute);margin-top:2px;line-height:1.45;}
.tk-head-sub b.err{color:var(--err);font-weight:600;}
.tk-head-list{color:var(--brand-blue);font-weight:600;}
.tk-head-picks{display:none;gap:8px;}
.tk-head.tk-tb2 .tk-search{flex:1 1 200px;max-width:300px;}
.tk-head.tk-tb2 .tk-tb-right{margin-left:0;flex-wrap:wrap;}
.tk-head.tk-tb2 .tk-tb-filters{margin-top:10px;padding-top:10px;}
.tk-tb2 .tk-sort-sel{max-width:200px;}
.tk-tb2 .tk-sort-sel.on{border-color:var(--brand-blue);color:var(--brand-blue);}
/* the quick add reads as the first row of the board */
.tk-listwrap .tk-quick-panel{border-style:dashed;}
.tk-listwrap .tk-quick{padding:11px 16px;}
.tk-listwrap .tk-quick input{font-size:13px;}
/* a row's quick actions: due date, assign, more */
.tk-row-acts{display:inline-flex;align-items:center;gap:2px;flex:none;opacity:0;transition:opacity .12s;}
.tk-row:hover .tk-row-acts,.tk-row:focus-within .tk-row-acts{opacity:1;}
.tk-row-acts .tk-mini{width:28px;height:28px;}
.tk-row-acts .tk-mini svg{width:14px;height:14px;}
.tk-row-acts .tk-mini:hover{background:var(--surface-3);color:var(--brand-blue);}
@media (hover:none){
  .tk-row-acts{opacity:1;}
  .tk-row-acts .tk-mini:not(:last-child){display:none;}
  .tk-row-acts .tk-mini{min-width:40px;min-height:40px;}
}
.tk-menu button .device-meta{margin-left:auto;font-size:11px;}
/* the board's columns, tidied */
.tk-board{padding:2px 2px 10px;}
.tk-col{border-radius:12px;}
.tk-col-head h4{font-size:13px;}
.tk-card{border-radius:8px;}
/* narrower screens: the rail becomes a strip across the top, the pickers come back into the head */
@media (max-width:1000px){
  .tk-ws{display:flex;flex-direction:column;gap:10px;}
  .tk-nav{position:static;max-height:none;overflow:visible;gap:8px;padding:0;width:100%;min-width:0;}
  .tk-nav-tabs{width:100%;}
  .tk-nav-views{flex-direction:row;overflow-x:auto;scrollbar-width:none;padding:4px;gap:4px;border-radius:10px;width:100%;max-width:100%;}
  .tk-nav-views::-webkit-scrollbar{display:none;}
  .tk-nav-views .tk-tile{flex:0 0 auto;width:auto;padding:6px 10px;min-height:40px;}   /* width:auto: the rail row's 100% made each view a whole screen wide */
  .tk-nav-views .tk-tile .tk-tile-l{overflow:visible;}
  .tk-nav-sec,.tk-nav-client{display:none;}
  /* the head is a grid here, never a column flex: in a column the title's and the search's flex-basis became their HEIGHT */
  .tk-head.tk-tb2 .tk-head-row{display:grid;grid-template-columns:1fr 1fr;gap:8px;align-items:stretch;}
  .tk-head.tk-tb2 .tk-head-row > *{grid-column:1 / -1;min-width:0;}
  .tk-head-title,.tk-head.tk-tb2 .tk-search{flex:0 0 auto;}
  .tk-head-picks{display:grid;grid-template-columns:1fr 1fr;gap:8px;width:100%;}
  .tk-head-picks .tk-head-pick{width:100%;max-width:none;min-width:0;min-height:40px;}
  .tk-head-picks .tk-site{grid-column:1 / -1;}
  .tk-head.tk-tb2 .tk-search{max-width:none;min-height:40px;}
  .tk-head.tk-tb2 .tk-tb-right{display:flex;flex-wrap:wrap;gap:8px;width:100%;margin-left:0;}
  .tk-head.tk-tb2 .tk-tb-right .tk-viewtog{flex:1 1 auto;display:flex;}
  .tk-head.tk-tb2 .tk-tb-right .tk-viewtog button{flex:1;justify-content:center;min-height:40px;}
  .tk-head.tk-tb2 .tk-tb-right .btn.sm{min-height:40px;}
  .tk-head.tk-tb2 .tk-tb-right .tk-new{flex:1 1 100%;justify-content:center;}
}
@media (max-width:700px){
  .tk-nav-tabs .tk-tab{min-height:40px;}
  .tk-head.tk-tb2 .tk-tb-right .tk-viewtog button span{display:none;}
}

/* ═══ v1.4.10.494 — ROOMS, RESTRUCTURED (js/08 renderRoomsPage / roomsTilesHtml / roomsCardsHtml / roomCardHtml) ══════
   Six tiles that filter, a bar (search, Building, Level, Sort, Cards · List · Building), and the Cards view: Site ›
   Building › Level, every room a card with its device bar, its assets, its tickets, its licence, Open and Report
   issue. Every size is a step of the scale; uppercase tracks in em. */
.rm-tiles{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;margin-bottom:12px;}
.rm-tile{display:flex;flex-direction:column;align-items:flex-start;gap:2px;text-align:left;background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:11px 14px 10px;cursor:pointer;font:inherit;color:var(--text);position:relative;min-width:0;transition:transform .12s,box-shadow .12s,border-color .12s;}
.rm-tile:hover{transform:translateY(-1px);box-shadow:var(--shadow-sm);}
.rm-tile:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.rm-tile.on{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.rm-tile-ico{position:absolute;top:10px;right:12px;color:var(--text-dim);display:inline-flex;}
.rm-tile-ico svg{width:15px;height:15px;}
.rm-tile.err .rm-tile-ico{color:var(--err);} .rm-tile.warn .rm-tile-ico{color:var(--warn);} .rm-tile.ok .rm-tile-ico{color:var(--ok);}
.rm-tile-v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.05;}
.rm-tile.err .rm-tile-v{color:var(--err);} .rm-tile.warn .rm-tile-v{color:#B45309;} .rm-tile.ok .rm-tile-v{color:#047857;}
.rm-tile-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
.rm-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:14px;}
.rm-bar .rm-search{flex:1 1 240px;max-width:420px;min-width:200px;}
.rm-sel{max-width:220px;min-height:34px;}
.rm-sel.on{border-color:var(--brand-blue);color:var(--brand-blue);}
.rm-clear{min-height:34px;}
.rm-bar .rm-view-toggle{margin-left:auto;}
.rm-bar .rm-view-toggle button{height:30px;gap:5px;}
.rm-bar .rm-view-toggle button svg{width:14px;height:14px;}
/* cards */
.rm-site-body{padding:14px 16px 16px;display:flex;flex-direction:column;gap:14px;}
.rm-bld{display:flex;flex-direction:column;gap:10px;}
.rm-bld-h{display:flex;align-items:center;gap:10px;min-width:0;}
.rm-bld-h .rb-bhead-ico{width:30px;height:30px;}
.rm-bld-t{min-width:0;}
.rm-bld-t b{font-size:15px;font-weight:600;letter-spacing:-.01em;color:var(--text);}
.rm-bld-sub{font-size:12px;color:var(--text-dim);margin-top:1px;}
.rm-bld-sub em,.rm-lvl-sub em{font-style:normal;}
.rm-bld.unfiled .rm-bld-h .rb-bhead-ico{background:var(--surface-3);color:var(--text-mute);}
.rm-lvl{border:1px solid var(--line);border-left:4px solid var(--line-2);border-radius:10px;background:var(--surface);overflow:hidden;}
.rm-lvl.ok{border-left-color:var(--ok);} .rm-lvl.warn{border-left-color:var(--warn);} .rm-lvl.bad{border-left-color:var(--err);}
.rm-lvl-h{display:flex;align-items:center;}
.rm-lvl-t{flex:1;display:flex;align-items:center;gap:8px;min-width:0;border:0;background:var(--surface-2);font:inherit;color:var(--text);text-align:left;padding:8px 12px 8px 10px;cursor:pointer;min-height:40px;}
.rm-lvl-t:hover{background:var(--surface-3);}
.rm-lvl-t b{font-size:13px;font-weight:600;white-space:nowrap;}
.rm-lvl-t .tk-caret{display:inline-grid;color:var(--text-dim);}
.rm-lvl-t .tk-caret svg{width:14px;height:14px;}
.rm-lvl-sub{font-size:12px;color:var(--text-mute);font-weight:400;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rm-lvl.folded .rm-lvl-t{border-bottom:0;}
.rm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,236px),1fr));gap:10px;padding:10px;}
.rm-card{display:flex;flex-direction:column;gap:6px;min-width:0;border:1px solid var(--line);border-top:3px solid var(--line-2);border-radius:10px;background:var(--surface);padding:11px 12px 10px;cursor:pointer;transition:box-shadow .12s,transform .12s,border-color .12s;}
.rm-card:hover{box-shadow:0 8px 20px -10px rgba(12,27,42,.35);transform:translateY(-1px);border-color:var(--line-2);}
.rm-card:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.rm-card.ok{border-top-color:var(--ok);} .rm-card.warn{border-top-color:var(--warn);} .rm-card.bad{border-top-color:var(--err);} .rm-card.none{border-top-color:#C3CEDA;}
.rm-card.is-off{background:repeating-linear-gradient(135deg,#fff 0 10px,#F7F9FC 10px 20px);}
.rm-card-top{display:flex;align-items:center;gap:7px;min-width:0;}
.rm-dot{width:9px;height:9px;border-radius:50%;background:#C3CEDA;flex:none;}
.rm-dot.ok{background:var(--ok);} .rm-dot.warn{background:var(--warn);} .rm-dot.bad{background:var(--err);box-shadow:0 0 0 3px rgba(220,38,38,.15);}
.rm-card-name{flex:1;min-width:0;font-size:13px;font-weight:600;line-height:1.3;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word;}
.rm-card-code{flex:none;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;padding:1px 6px;border-radius:4px;background:var(--surface-2);border:1px solid var(--line);color:var(--text-mute);max-width:84px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rm-card-where{font-size:12px;color:var(--text-mute);margin-top:-2px;}
.rm-card-st{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-mute);}
.rm-card-st.bad{color:var(--err);font-weight:600;} .rm-card-st.warn{color:#B45309;} .rm-card-st.ok{color:#047857;}
.rm-devbar{display:flex;flex:none;width:64px;height:6px;border-radius:3px;overflow:hidden;background:var(--surface-3);gap:1px;}
.rm-devbar i{display:block;height:100%;}
.rm-devbar i.ok{background:var(--ok);} .rm-devbar i.warn{background:var(--warn);} .rm-devbar i.bad{background:var(--err);}
.rm-devbar.none i{flex:1;background:repeating-linear-gradient(90deg,#C3CEDA 0 4px,transparent 4px 8px);}
.rm-card-facts{display:flex;align-items:center;gap:6px 10px;flex-wrap:wrap;font-size:12px;color:var(--text-mute);}
.rm-pill{font-size:11px;padding:2px 7px;}
.rm-card-acts{display:flex;align-items:center;gap:6px;margin-top:2px;padding-top:8px;border-top:1px dashed var(--line);}
.rm-card-acts .btn.xs{min-height:28px;}
.rm-card-acts .rm-report{margin-left:auto;}
.rm-card.is-off .rm-card-st{color:var(--err);}
/* the list rows gain the report button */
.rm-row .rm-row-report{flex:none;min-height:28px;}
.rm-row .rm-row-report span{display:inline;}
@media (max-width:1100px){ .rm-tiles{grid-template-columns:repeat(3,minmax(0,1fr));} }
@media (max-width:760px){
  .rm-tiles{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin-bottom:10px;}
  .rm-tile{padding:9px 10px 8px;border-radius:8px;min-height:40px;}
  .rm-tile-ico{display:none;}
  .rm-tile-v{font-size:18px;}
  .rm-bar{padding:10px;gap:8px;}
  .rm-bar .rm-search{flex:1 1 100%;max-width:none;min-width:0;min-height:40px;padding-top:0;padding-bottom:0;}
  .rm-bar .rm-search input{min-height:40px;font-size:16px;}   /* the 40px floor, and 16px so iOS does not zoom */
  .rm-sel,.rm-clear{flex:1 1 44%;max-width:none;min-width:0;min-height:40px;}
  .rm-bar .rm-view-toggle{margin-left:0;width:100%;display:flex;}
  .rm-bar .rm-view-toggle button{flex:1;height:40px;}
  .rm-site-body{padding:10px;gap:12px;}
  .rm-grid{grid-template-columns:1fr;padding:8px;gap:8px;}
  .rm-card-acts .btn.xs{min-height:40px;flex:1;justify-content:center;}
  .rm-card-acts .rm-report{margin-left:0;}
  .rm-row{flex-wrap:wrap;}
  .rm-row .rm-row-report{min-height:40px;}
  .rm-row .rm-row-report span{display:none;}
  .rm-lvl-t{min-height:44px;}
}
@media (max-width:400px){ .rm-tiles{grid-template-columns:repeat(2,minmax(0,1fr));} }

/* ══════════ INTEGRATOR SUPPORT / CLIENT SUPPORT (v1.4.10.495, js/31) ══════════
   A client's people and their integrator on one conversation. The client's page opens on the integrator's card, three
   tiles and the list; the integrator's on five tiles, a bar and the list; a ticket is a head, a chat-style conversation
   with avatars (yours on the right, theirs on the left, internal notes in amber, events as a line between) and a
   composer, and on the integrator's side the facts beside it. Every size a step of the type scale. */
.cs-head{display:flex;align-items:center;flex-wrap:wrap;gap:12px 22px;padding:14px 18px;margin-bottom:14px;border:1px solid var(--line);border-radius:14px;background:linear-gradient(120deg,color-mix(in srgb, var(--brand-blue) 7%, var(--surface)),color-mix(in srgb, var(--brand-purple) 7%, var(--surface)));}
.cs-head .dmi-id{flex:0 1 auto;}
.cs-head .dmi-name{white-space:normal;}
.cs-head-txt{flex:1 1 260px;min-width:0;font-size:13px;line-height:1.55;color:var(--text-mute);}
.cs-head-txt b{color:var(--text);}
.cs-head-acts{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
.cs-head-acts .btn.primary{min-height:36px;}
.cs-tiles{display:grid;gap:10px;margin-bottom:12px;}
.cs-tiles.three{grid-template-columns:repeat(3,minmax(0,1fr));}
.cs-tiles.five{grid-template-columns:repeat(5,minmax(0,1fr));}
.cs-tile{display:flex;flex-direction:column;align-items:flex-start;gap:2px;text-align:left;background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:11px 14px 10px;cursor:pointer;font:inherit;color:var(--text);position:relative;min-width:0;min-height:40px;transition:transform .12s,box-shadow .12s,border-color .12s;}
.cs-tile:hover{transform:translateY(-1px);box-shadow:var(--shadow-sm);}
.cs-tile:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.cs-tile.on{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.cs-tile-ico{position:absolute;top:10px;right:12px;color:var(--text-dim);display:inline-flex;}
.cs-tile-ico svg{width:15px;height:15px;}
.cs-tile-v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.05;}
.cs-tile-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
.cs-tile.warn .cs-tile-v,.cs-tile.warn .cs-tile-ico{color:#B45309;} .cs-tile.ok .cs-tile-v,.cs-tile.ok .cs-tile-ico{color:#047857;} .cs-tile.info .cs-tile-v,.cs-tile.info .cs-tile-ico{color:var(--brand-purple);} .cs-tile.err .cs-tile-v,.cs-tile.err .cs-tile-ico{color:var(--err);}
.cs-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:8px 10px;margin-bottom:14px;}
.cs-toolbar .sup-q{flex:1 1 220px;max-width:420px;min-width:160px;} .cs-toolbar .sup-q input{width:100%;box-sizing:border-box;}
.cs-toolbar .ex-sel{max-width:240px;}
.cs-toolbar-sp{flex:1;}
/* a row of the list: a status rail, who lodged it, the subject and its facts, the status and when */
.cs-list{display:flex;flex-direction:column;gap:8px;}
.cs-row{display:flex;align-items:center;gap:12px;width:100%;text-align:left;font:inherit;color:inherit;padding:12px 14px 12px 0;border:1px solid var(--line);border-radius:10px;background:var(--surface);cursor:pointer;overflow:hidden;position:relative;transition:border-color .15s,box-shadow .15s;}
.cs-row::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--line);}
.cs-row.st-new::before{background:var(--brand-purple);} .cs-row.st-replied::before{background:var(--ok);} .cs-row.st-waiting::before{background:var(--warn);} .cs-row.st-open::before{background:var(--brand-blue);} .cs-row.st-closed::before{background:var(--line);}
.cs-row:hover,.cs-row:focus-visible{border-color:var(--brand-blue);box-shadow:0 2px 10px rgba(15,23,42,.06);outline:none;}
.cs-row.unread{background:color-mix(in srgb, var(--ok) 4%, var(--surface));}
.cs-row-av{margin-left:14px;}
.cs-av{width:34px;height:34px;flex:none;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700;letter-spacing:.02em;overflow:hidden;}
.cs-av.sm{width:24px;height:24px;font-size:10px;}
.cs-av.note{background:color-mix(in srgb, var(--warn) 18%, var(--surface));color:#B45309;} .cs-av.note svg{width:15px;height:15px;}
.cs-row-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px;}
.cs-row-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;} .cs-row-top b{font-weight:600;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;}
.cs-row-meta{display:flex;flex-wrap:wrap;gap:4px 12px;font-size:12px;color:var(--text-dim);align-items:center;}
.cs-row-meta .cs-who{display:inline-flex;align-items:center;gap:5px;}
.cs-row-side{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex-shrink:0;} .cs-row-when{font-size:12px;color:var(--text-dim);white-space:nowrap;}
.cs-row-chev{color:var(--text-dim);flex:none;display:inline-flex;} .cs-row-chev svg{width:16px;height:16px;}
.cs-unassigned{color:#B45309;font-weight:500;}
.cs-client{display:inline-flex;align-items:center;font-size:11px;font-weight:600;line-height:1;padding:4px 8px;border-radius:999px;background:color-mix(in srgb, var(--brand-blue) 12%, transparent);color:var(--brand-blue);white-space:nowrap;max-width:220px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;}
.cs-group{display:flex;align-items:center;gap:8px;margin:16px 2px 8px;font-size:12px;font-weight:600;color:var(--text-mute);}
.cs-group:first-child{margin-top:2px;} .cs-group svg{width:14px;height:14px;} .cs-group small{font-weight:400;color:var(--text-dim);} .cs-group.you{color:#B45309;}
/* the ticket head */
.cs-thead{display:flex;align-items:flex-start;gap:14px;flex-wrap:wrap;padding:16px 18px;margin-bottom:12px;}
.cs-thead-main{flex:1;min-width:240px;display:flex;flex-direction:column;gap:6px;}
.cs-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.cs-thead h2{margin:2px 0;font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.25;}
.cs-thead-sub{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px;color:var(--text-mute);} .cs-thead-sub b{color:var(--text);}
.cs-thead-ctl{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
/* the conversation */
.cs-conv{display:flex;flex-direction:column;gap:12px;margin:0 0 14px;}
.cs-msg{display:flex;gap:10px;align-items:flex-start;max-width:820px;}
.cs-msg.mine{flex-direction:row-reverse;margin-left:auto;}
.cs-msg.them,.cs-msg.note{margin-right:auto;}
.cs-bubble{min-width:0;flex:1;border:1px solid var(--line);border-radius:14px;background:var(--surface);overflow:hidden;}
.cs-msg.mine .cs-bubble{border-top-right-radius:4px;border-color:color-mix(in srgb, var(--brand-blue) 30%, var(--line));background:color-mix(in srgb, var(--brand-blue) 5%, var(--surface));}
.cs-msg.them .cs-bubble{border-top-left-radius:4px;}
.cs-msg.note .cs-bubble{border:1px dashed color-mix(in srgb, var(--warn) 55%, var(--line));background:color-mix(in srgb, var(--warn) 6%, var(--surface));border-top-left-radius:4px;}
.cs-bubble-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 14px 0;font-size:13px;} .cs-bubble-head b{font-weight:600;} .cs-bubble-head .cs-org{color:var(--text-mute);font-weight:500;}
.cs-when{margin-left:auto;font-size:12px;color:var(--text-dim);white-space:nowrap;}
.cs-via{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-dim);} .cs-via svg{width:12px;height:12px;}
.cs-note-tag{font-size:11px;font-weight:600;color:#B45309;}
.cs-bubble-body{padding:6px 14px 12px;font-size:14px;line-height:1.6;overflow-wrap:anywhere;} .cs-bubble-body p{margin:0 0 8px;}
.cs-event{display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;padding:2px 0;font-size:12px;color:var(--text-mute);text-align:center;}
.cs-event::before{content:'';width:6px;height:6px;border-radius:50%;background:var(--text-dim);flex:none;}
.cs-event .cs-when{margin-left:0;}
/* the composer */
.cs-compose{padding:14px 16px;}
.cs-seg{display:inline-flex;border:1px solid var(--line);border-radius:999px;padding:3px;background:var(--surface-2);margin-bottom:10px;}
.cs-seg button{font:inherit;font-size:12px;font-weight:600;border:0;background:none;color:var(--text-mute);padding:6px 12px;border-radius:999px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;min-height:30px;}
.cs-seg button svg{width:13px;height:13px;}
.cs-seg button.on{background:var(--surface);color:var(--text);box-shadow:0 1px 3px rgba(15,23,42,.10);}
.cs-seg button.on.note{color:#B45309;}
.cs-compose label.cs-lbl{display:block;font-size:12px;font-weight:500;margin-bottom:7px;}
.cs-compose textarea{width:100%;box-sizing:border-box;font:inherit;font-size:13px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--text);resize:vertical;}
.cs-compose textarea:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.cs-compose.noting textarea{border-color:color-mix(in srgb, var(--warn) 55%, var(--line));background:color-mix(in srgb, var(--warn) 5%, var(--surface));}
.cs-compose-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px;} .cs-compose-foot .sup-hint{flex:1;min-width:160px;}
/* the integrator's ticket: the conversation beside the facts */
.cs-ticket{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:16px;align-items:start;}
.cs-ticket-main{min-width:0;}
.cs-ticket-side{display:flex;flex-direction:column;gap:12px;order:2;min-width:0;}
.cs-side{padding:12px 14px;display:flex;flex-direction:column;gap:9px;}
.cs-side-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);}
.cs-side-row{display:flex;align-items:center;gap:10px;font-size:13px;min-width:0;} .cs-side-row > .i{flex:none;color:var(--text-dim);display:inline-flex;width:24px;justify-content:center;} .cs-side-row > .i svg{width:15px;height:15px;}
.cs-side-row .t{min-width:0;flex:1;display:flex;flex-direction:column;line-height:1.3;} .cs-side-row .t b{font-weight:600;overflow:hidden;text-overflow:ellipsis;} .cs-side-row .t small{font-size:12px;color:var(--text-mute);overflow:hidden;text-overflow:ellipsis;}
.cs-side-row a{color:var(--brand-blue);text-decoration:none;} .cs-side-row a:hover{text-decoration:underline;}
.cs-side label{display:flex;flex-direction:column;gap:4px;font-size:12px;font-weight:500;color:var(--text-mute);} .cs-side label .ex-sel{width:100%;max-width:none;}
.cs-side .btn{width:100%;justify-content:center;}
.cs-other{display:flex;flex-direction:column;gap:6px;}
.cs-other a{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text);text-decoration:none;padding:7px 9px;border-radius:8px;border:1px solid var(--line);min-width:0;}
.cs-other a:hover{border-color:var(--brand-blue);background:var(--accent-glow);}
.cs-other a .cm-ref{flex:none;} .cs-other a .s{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .cs-other a .pill{flex:none;}
.cs-empty-ico{color:var(--brand-purple);}
@media (max-width:1000px){ .cs-ticket{grid-template-columns:1fr;} .cs-ticket-side{order:0;} }
@media (max-width:760px){
  .cs-tiles.three,.cs-tiles.five{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;}
  .cs-tile{padding:9px 10px 8px;} .cs-tile-ico{display:none;} .cs-tile-v{font-size:18px;}
  .cs-toolbar .sup-q{max-width:none;flex:1 1 100%;} .cs-toolbar .sup-q input{min-height:40px;font-size:16px;} .cs-toolbar .ex-sel{max-width:none;flex:1 1 100%;min-height:40px;} .cs-toolbar .btn{min-height:40px;flex:1 1 auto;justify-content:center;}
  .cs-row{flex-wrap:wrap;padding-right:12px;} .cs-row-side{flex-direction:row;align-items:center;justify-content:space-between;width:100%;padding-left:14px;} .cs-row-chev{display:none;}
  .cs-msg{max-width:none;} .cs-msg .cs-av{width:28px;height:28px;font-size:10px;}
  .cs-thead{padding:14px;} .cs-thead h2{font-size:18px;} .cs-thead-ctl{width:100%;} .cs-thead-ctl .btn{min-height:40px;flex:1 1 auto;justify-content:center;}
  .cs-side .ex-sel{min-height:40px;} .cs-side .btn{min-height:40px;}
  .cs-seg{display:flex;} .cs-seg button{flex:1;justify-content:center;min-height:40px;}
  .cs-compose textarea{font-size:16px;} .cs-compose-foot .btn{min-height:40px;}
  .cs-head{padding:12px 14px;} .cs-head-acts{width:100%;} .cs-head-acts .btn,.cs-head-acts .btn.primary,.cs-head-acts .dmi-act{flex:1 1 auto;justify-content:center;min-height:40px;}   /* .btn.primary named too: the desktop rule's 36px is more specific than .btn alone */
  .cs-other a{min-height:40px;box-sizing:border-box;}
}
@media (max-width:400px){ .cs-tiles.five{grid-template-columns:repeat(2,minmax(0,1fr));} .cs-tiles.five > :last-child{grid-column:1 / -1;} }   /* the fifth tile (Closed) takes the row rather than sitting alone */

/* ═══ v1.4.10.500 ═════════════════════════════════════════════════════════════
   Five areas laid out again: the Notifications page (.nfp-*), the asset Validation queue (.vq-*), the asset Recent
   activity feed (.aac-cols, .aac-side, .aac-active), a site's Support tab (.sd-sla-*, .sd-rules-tbl, the rule
   editor's .tr-preview) and the new Connectors tab of a site (.sd-conn-*). Sizes follow the TYPE SYSTEM: body 13,
   meta 12, labels 11/600 uppercase .06em, badges 10/700, small KPI 20/600 -.02em, card titles 15/600.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Site › Support: the SLA matrix with Assign to, and the rules list ── */
.sd-sla-sec{margin-top:14px;}
.sd-sla-sec-h{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:0 0 8px;}
.sd-sla-sec-h .help-tip{text-transform:none;letter-spacing:0;}
.sd-sla-sec-x{margin-left:auto;text-transform:none;letter-spacing:0;font-weight:500;}
.sd-sla-n{display:inline-flex;align-items:center;justify-content:center;min-width:19px;height:17px;padding:0 6px;border-radius:999px;background:var(--surface-2);color:var(--text-mute);font-size:10px;font-weight:700;letter-spacing:.04em;}
.sd-sla-tbl td,.sd-rules-tbl td{vertical-align:middle;}
.sd-sla-prw{font-size:12px;}
.sd-sla-asgc{min-width:216px;}   /* v1.4.10.504: room for "Nobody (unassigned)" in the select (175px of text, 122px of box on a phone); the table scrolls inside .cust-table-wrap */
.sd-sla-asg{max-width:230px;min-width:160px;height:34px;padding:0 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface);font:inherit;font-size:12px;color:var(--text);cursor:pointer;}
.sd-sla-asg.on{border-color:var(--brand-blue);color:var(--brand-blue);background:rgba(var(--bc-accent-rgb),.06);font-weight:500;}
.sd-sla-asg:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.sd-sla-asg:disabled{opacity:.6;cursor:wait;}
.sd-rules-tbl tr.is-off td{opacity:.62;}
.sd-rule-name{font-weight:600;font-size:13px;}
.sd-rule-when,.sd-rule-then{font-size:12px;color:var(--text-mute);line-height:1.5;}
.sd-rule-when b,.sd-rule-then b{color:var(--text);font-weight:600;}
/* the rule editors' read-back line (support rules and notification rules) */
.tr-preview{padding:10px 12px;border-radius:8px;background:var(--accent-glow);border:1px solid rgba(var(--bc-accent-rgb),.18);font-size:13px;line-height:1.55;color:var(--text);margin-bottom:12px;}
.tr-preview:empty{display:none;}
.tr-preview b{color:var(--brand-blue);font-weight:600;}

/* ── Site › Connectors ── */
.sd-conn,.sd-conn-host{display:flex;flex-direction:column;gap:14px;min-width:0;}
.sd-conn-head{padding:16px 18px;}
.sd-conn-head-row{display:flex;flex-direction:column;gap:12px;}
.sd-conn-title{display:flex;align-items:flex-start;gap:12px;}
.sd-conn-title > div{flex:1;min-width:0;}
.sd-conn-title h3{margin:0 0 4px;font-size:15px;font-weight:600;letter-spacing:-.01em;}
.sd-conn-title .panel-sub{max-width:960px;line-height:1.55;}
.sd-conn-title .help-tip{margin-top:2px;}
.sd-conn-ico{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;flex:none;border-radius:9px;background:var(--accent-glow);color:var(--brand-blue);}
.sd-conn-ico svg{width:18px;height:18px;}
.sd-conn-head .oauth-summary{margin:0;}
.sd-conn-head #oauth-summary:empty{display:none;}
.sd-conn-sec .panel-body{padding-top:12px;}
.sd-conn-rows{display:flex;flex-direction:column;}
.sd-conn-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-top:1px solid var(--line);}
.sd-conn-row:first-child{border-top:0;padding-top:2px;}
.sd-conn-inc{padding:4px 18px 14px;}
.sd-conn-inc:empty{display:none;}

/* ── Assets › Validation ── */
.vq-head .panel-body{padding-top:12px;}
.vq-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;}
.vq-tile{appearance:none;display:flex;flex-direction:column;align-items:flex-start;gap:2px;text-align:left;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface);cursor:pointer;font:inherit;color:var(--text);transition:border-color .13s,box-shadow .13s,transform .13s;min-width:0;}
.vq-tile:hover{border-color:var(--line-2);box-shadow:var(--shadow-sm);transform:translateY(-1px);}
.vq-tile.sel{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.vq-tile-v{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.1;font-variant-numeric:tabular-nums;}
.vq-tile.warn .vq-tile-v{color:var(--warn);} .vq-tile.ok .vq-tile-v{color:var(--ok);} .vq-tile.muted .vq-tile-v{color:var(--text-mute);} .vq-tile.dim .vq-tile-v{color:var(--text-dim);}
.vq-tile-l{font-size:13px;font-weight:600;}
.vq-tile-s{font-size:12px;color:var(--text-mute);line-height:1.4;}
.vq-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:12px 16px;border-bottom:1px solid var(--line);}
.vq-bar-l{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;flex:1;min-width:0;}
.vq-bar-r{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end;}
.vq-bar-title{display:flex;align-items:center;gap:8px;font-size:13px;margin-right:4px;align-self:center;white-space:nowrap;}
.vq-dot{width:9px;height:9px;border-radius:50%;background:var(--text-dim);display:inline-block;flex:none;}
.vq-dot.warn{background:var(--warn);} .vq-dot.ok{background:var(--ok);} .vq-dot.muted{background:var(--text-mute);} .vq-dot.dim{background:var(--text-dim);}
.vq-f-q{flex:1 1 240px;min-width:200px;max-width:420px;}
.vq-f-src,.vq-f-site{flex:0 1 190px;min-width:150px;}
.vq-chip{display:inline-flex;align-items:center;gap:6px;height:40px;padding:0 12px;border:1px solid var(--line);border-radius:999px;background:var(--surface);font:inherit;font-size:12px;font-weight:500;color:var(--text-mute);cursor:pointer;}
.vq-chip svg{width:14px;height:14px;} .vq-chip b{font-weight:700;}
.vq-chip.on{border-color:var(--ok);color:var(--ok);background:rgba(22,163,74,.08);}
.vq-chipx{border:1px solid var(--line-2);background:var(--surface);color:var(--text-mute);border-radius:999px;padding:0 10px;height:34px;font:inherit;font-size:12px;cursor:pointer;align-self:center;}
.vq-chipx:hover{background:var(--surface-2);color:var(--text);}
.vq-selbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:6px 8px 6px 12px;border-radius:10px;background:var(--accent-glow);border:1px solid rgba(var(--bc-accent-rgb),.2);}
.vq-selbar[hidden]{display:none;}
.vq-sel-n{font-size:12px;font-weight:600;color:var(--brand-blue);}
.vq-panel .panel-body.flush{overflow-x:auto;}
.vq-tbl td{vertical-align:middle;}
.vq-cbc{width:34px;}
.vq-dev-n{font-weight:600;font-size:13px;}
.vq-net{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;}
.vq-when{white-space:nowrap;font-size:12px;}
.vq-acts{text-align:right;white-space:nowrap;}
.vq-acts .btn + .btn{margin-left:6px;}
.vq-more{width:30px;padding:0;justify-content:center;}
.vq-more svg{width:15px;height:15px;}
.vq-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 16px;border-top:1px solid var(--line);}

/* ── Assets › Recent activity ── */
.aac-cols{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:16px;align-items:start;}
.aac-mainc{min-width:0;}
.aac-side{display:grid;gap:16px;min-width:0;}
.aac-side:empty{display:none;}
.aac-sidep{padding:12px 14px;}
.aac-side-h{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:6px;}
.aac-side-h .device-meta{text-transform:none;letter-spacing:0;font-weight:500;}
.aac-sb{appearance:none;display:flex;align-items:center;gap:9px;width:100%;padding:6px;border:1px solid transparent;border-radius:8px;background:none;font:inherit;text-align:left;cursor:pointer;color:var(--text);}
.aac-sb:hover{background:var(--surface-2);}
.aac-sb.on{border-color:var(--brand-blue);background:var(--accent-glow);}
.aac-sb-i{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;flex:none;}
.aac-sb-i svg{width:13px;height:13px;}
.aac-sb-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;}
.aac-sb-l{font-size:12px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.aac-sb-bar{display:block;height:4px;border-radius:2px;background:var(--surface-2);overflow:hidden;}
.aac-sb-bar i{display:block;height:100%;background:var(--brand-blue);border-radius:2px;}
.aac-sb-n{font-size:12px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--text-mute);flex:none;}
.aac-side-clr{margin-top:8px;}
.aac-active{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:0 16px 12px;}
.aac-active:empty{display:none;}
.aac-active-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin-right:2px;}
.aac-achip{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 6px 0 10px;border:1px solid rgba(var(--bc-accent-rgb),.25);border-radius:999px;background:var(--accent-glow);color:var(--brand-blue);font:inherit;font-size:12px;font-weight:500;cursor:pointer;}
.aac-achip-x{display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;border-radius:50%;}
.aac-achip-x svg{width:11px;height:11px;}
.aac-achip:hover .aac-achip-x{background:rgba(var(--bc-accent-rgb),.15);}
.aac-day{display:flex;align-items:center;justify-content:space-between;gap:8px;}
.aac-day-n{font-size:11px;font-weight:500;color:var(--text-dim);text-transform:none;letter-spacing:0;}

/* ── Notifications ── */
.nfp-cols{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(300px,1fr);gap:16px;align-items:start;}
.nfp-cols-plain{grid-template-columns:minmax(0,1.3fr) minmax(300px,1fr);}
.nfp-main,.nfp-side{display:grid;gap:16px;min-width:0;}
.nfp-side .notif-chan-row{grid-template-columns:1fr;}
.nfp-stats{display:flex;gap:10px;flex-wrap:wrap;padding:12px 16px 0;}
.nfp-stat{display:flex;align-items:baseline;gap:6px;padding:8px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface);}
.nfp-stat b{font-size:20px;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums;}
.nfp-stat span{font-size:12px;color:var(--text-mute);}
.nfp-stat.ok b{color:var(--ok);} .nfp-stat.muted b{color:var(--text-dim);}
.nfp-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:12px 16px;border-bottom:1px solid var(--line);}
.nfp-tabs{display:flex;gap:6px;flex-wrap:wrap;}
.nfp-tab{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 12px;border:1px solid var(--line);border-radius:999px;background:var(--surface);font:inherit;font-size:12px;font-weight:500;color:var(--text-mute);cursor:pointer;}
.nfp-tab:hover{color:var(--text);}
.nfp-tab.on{border-color:var(--brand-blue);color:var(--brand-blue);background:var(--accent-glow);}
.nfp-tab-n{font-size:10px;font-weight:700;letter-spacing:.04em;padding:1px 6px;border-radius:999px;background:var(--surface-2);color:var(--text-mute);font-variant-numeric:tabular-nums;}
.nfp-tab.on .nfp-tab-n{background:rgba(var(--bc-accent-rgb),.14);color:var(--brand-blue);}
.nfp-q{flex:0 1 280px;min-width:200px;}
.nfp-rules{padding:4px 16px 16px;}
.nfp-group{margin-top:14px;}
.nfp-group-h{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:0 0 8px;}
.nfp-group-i{display:inline-flex;width:16px;height:16px;color:var(--brand-blue);} .nfp-group-i svg{width:16px;height:16px;}
.nfp-group-n{margin-left:auto;text-transform:none;letter-spacing:0;font-weight:500;}
.nfp-rule{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface);margin-bottom:8px;transition:border-color .13s,box-shadow .13s;}
.nfp-rule:hover{border-color:var(--line-2);box-shadow:var(--shadow-sm);}
.nfp-rule.is-off{background:var(--bg);} .nfp-rule.is-off .nfp-rule-main{opacity:.62;}
.nfp-tog{margin-top:2px;}
.nfp-rule-main{flex:1;min-width:0;}
.nfp-rule-l1{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.nfp-rule-name{font-weight:600;font-size:13px;}
.nfp-owner{font-weight:600;}   /* v1.4.10.504: an organisation's own rule, on an Administrator's list */
.nfp-rule-ev{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text);margin-top:3px;}
.nfp-rule-ev svg{width:14px;height:14px;color:var(--warn);flex:none;}
.nfp-rule-facts{display:flex;gap:18px;flex-wrap:wrap;margin-top:8px;}
.nfp-fact{display:flex;align-items:center;gap:8px;min-width:0;}
.nfp-fact > i{font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);flex:none;}
.nfp-chips{display:flex;gap:4px;flex-wrap:wrap;}
.nfp-chip{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;background:var(--surface-2);color:var(--text-mute);max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.nfp-chip svg{width:12px;height:12px;flex:none;}
.nfp-chip-role{background:var(--accent-glow);color:var(--brand-blue);}
.nfp-chip-none{background:rgba(217,119,6,.12);color:var(--warn);}
.nfp-how,.nfp-when{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--text-mute);}
.nfp-how svg,.nfp-when svg{width:13px;height:13px;}
.nfp-rule-acts{display:flex;align-items:center;gap:6px;flex:none;}
.nfp-feed-row{display:flex;gap:10px;padding:10px 0;border-bottom:1px solid var(--line);}
.nfp-feed-row:last-child{border-bottom:0;}
.nfp-feed-t{font-weight:600;font-size:13px;}
.nfp-skel{display:flex;flex-direction:column;gap:10px;padding:14px 0;}
.nfp-skel-row{height:72px;border-radius:10px;background:linear-gradient(90deg,var(--surface-2),var(--surface-3,var(--surface-2)),var(--surface-2));}

/* ── the same five, narrower ── */
@media (max-width:1000px){
  .nfp-cols,.nfp-cols-plain,.aac-cols{grid-template-columns:1fr;}
}
@media (max-width:900px){
  .vq-tiles{grid-template-columns:repeat(2,minmax(0,1fr));}
}
@media (max-width:760px){
  .vq-bar-l .asb-field{flex:1 1 100%;min-width:0;} .vq-f-q{max-width:none;flex:1 1 100%;} .vq-bar-r{width:100%;justify-content:flex-start;}
  .vq-chipx,.nfp-tab,.aac-achip,.sd-sla-asg{height:40px;} .aac-sb{min-height:40px;}
  .nfp-rule{flex-wrap:wrap;} .nfp-rule-acts{width:100%;justify-content:flex-end;padding-top:6px;border-top:1px dashed var(--line);margin-top:4px;} .nfp-q{flex:1 1 100%;} .nfp-rule-facts{gap:10px;}
  .sd-sla-asg{max-width:none;width:100%;}
}

/* ═══ v1.4.10.501: SALES LEADS — AVDesk's own prospects and the calls made to them (js/32-sales.js) ═══
   Administration > Sales Leads. The page is the intro card, six tiles (open, due today, overdue, unassigned, mine, won),
   a mode bar (List, Pipeline, Team, Call lists, Report) and the body for the mode. A lead opens as its own page: the head
   (who, how to reach them, stage, warmth, who is calling, the next step), the stepper, the quick actions (Log a call first),
   the timeline and the details on the left, the next step, the deal and the record on the right. Sizes follow the TYPE
   SYSTEM: body 13, meta 12 / 11, labels 11/600 uppercase .06em, KPI 20/600 -.02em (tiles 24 as Provisioning's), titles 15/600. */
.sl-intro-acts{display:flex;gap:8px;flex-wrap:wrap;}
.sl-tiles{grid-template-columns:repeat(6,minmax(0,1fr));}
.pv-tile.blue b{color:var(--brand-blue);}
.sl-modebar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:0 0 12px;}
.sl-modebar-r{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.sl-calls-today{margin-right:6px;}
.sl-seg{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--line);border-radius:10px;background:var(--surface);}
.sl-seg-b{appearance:none;border:0;background:transparent;font:inherit;font-size:12px;font-weight:500;color:var(--text-mute);padding:6px 12px;border-radius:7px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;min-height:30px;}
.sl-seg-b:hover{color:var(--text);background:var(--surface-2);}
.sl-seg-b.on{background:var(--brand-blue);color:#fff;font-weight:600;}
.sl-seg-b svg{width:13px;height:13px;}
.sl-chips{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 10px;}
.sl-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:1px solid var(--line);border-radius:999px;background:var(--surface);font:inherit;font-size:12px;font-weight:500;color:var(--text-mute);cursor:pointer;}
.sl-chip b{font-size:10px;font-weight:700;letter-spacing:.04em;padding:1px 6px;border-radius:999px;background:var(--surface-2);color:var(--text-mute);font-variant-numeric:tabular-nums;}
.sl-chip:hover{color:var(--text);}
.sl-chip.on{border-color:var(--brand-blue);color:var(--brand-blue);background:var(--accent-glow);}
.sl-chip.on b{background:rgba(var(--bc-accent-rgb),.14);color:var(--brand-blue);}
.sl-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 10px;}
.sl-toolbar .ex-sel{max-width:190px;min-height:34px;}
.sl-find{display:flex;gap:6px;align-items:center;flex:1 1 260px;max-width:460px;}   /* v1.4.10.544: was .sl-q, a name the call queue's two-column grid also used, so the search box drew as that grid (a 25px field, a 360px button) */
.sl-find input{flex:1;min-width:0;font:inherit;font-size:13px;padding:8px 12px;border:1px solid var(--line-2);border-radius:var(--r-ctl);background:var(--surface);color:var(--text);min-height:34px;}
.sl-selbar{margin:0 0 10px;}
.sl-panel .panel-body.flush{overflow-x:auto;}
.sl-table td{vertical-align:middle;}
.sl-table th{white-space:nowrap;}
.sl-row{cursor:pointer;}
.sl-row:hover td{background:var(--surface-2,rgba(120,130,150,.06));}
.sl-row.sel td{background:var(--accent-glow);}
.sl-row.dnc .sl-lead-n{color:var(--text-mute);}
.sl-lead-cell{display:flex;gap:9px;align-items:flex-start;min-width:200px;}
.sl-lead-cell > .sl-temp{margin-top:4px;}
.sl-lead-n{font-weight:600;font-size:13px;letter-spacing:-.01em;display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.sl-dnc-pill{font-size:10px;padding:2px 7px;}
.sl-sep{color:var(--text-dim);font-weight:400;}
.sl-temp{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;color:var(--text-mute);}
.sl-temp i{width:9px;height:9px;border-radius:50%;display:inline-block;background:var(--warn);flex:none;}
.sl-temp.hot i{background:var(--err);box-shadow:0 0 0 3px rgba(220,38,38,.14);}
.sl-temp.cold i{background:#64B5F6;}
.sl-tags{display:flex;gap:4px;flex-wrap:wrap;margin-top:4px;}
.sl-tag{display:inline-flex;font-size:11px;font-weight:600;padding:2px 8px;border-radius:999px;background:var(--surface-2);color:var(--text-mute);cursor:pointer;}
.sl-tag:hover{background:var(--accent-glow);color:var(--brand-blue);}
.sl-reach{display:flex;flex-direction:column;gap:3px;min-width:150px;}
.sl-tel{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text);text-decoration:none;white-space:nowrap;}
.sl-tel svg{width:13px;height:13px;color:var(--text-dim);flex:none;}
.sl-tel:hover{color:var(--brand-blue);} .sl-tel:hover svg{color:var(--brand-blue);}
.sl-person{display:inline-flex;align-items:center;gap:7px;min-width:0;}
.sl-person-n{font-size:12px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sl-av{width:24px;height:24px;border-radius:7px;background:var(--av-navy,var(--bc-navy));color:#fff;font-size:10px;font-weight:700;letter-spacing:.02em;display:inline-flex;align-items:center;justify-content:center;flex:none;}
.sl-nobody{font-size:12px;color:var(--text-dim);font-style:normal;}
.sl-next{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--text-mute);white-space:nowrap;}
.sl-next svg{width:13px;height:13px;flex:none;}
.sl-next b{font-weight:600;color:var(--text);}
.sl-next small{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;}
.sl-next.due{color:var(--warn);} .sl-next.due b,.sl-next.due svg{color:var(--warn);}
.sl-next.over{color:var(--err);} .sl-next.over b,.sl-next.over svg{color:var(--err);}
.sl-last{display:inline-flex;flex-direction:column;gap:1px;font-size:12px;color:var(--text);}
.sl-last svg{width:12px;height:12px;vertical-align:-2px;margin-right:4px;color:var(--text-dim);}
.sl-last small{font-size:11px;color:var(--text-mute);}
.sl-val{font-variant-numeric:tabular-nums;white-space:nowrap;}
.sl-when{white-space:nowrap;}
.sl-listdot{display:inline-block;width:8px;height:8px;border-radius:3px;margin-right:5px;vertical-align:-1px;}
.sl-listdot.big{width:14px;height:14px;border-radius:5px;margin:3px 0 0;flex:none;}
/* the pipeline board */
.sl-board{display:grid;grid-template-columns:repeat(6,minmax(220px,1fr));gap:10px;align-items:start;overflow-x:auto;padding-bottom:6px;}
.sl-lane{border:1px solid var(--line);border-radius:12px;background:var(--surface);min-width:0;}
.sl-lane-h{display:flex;align-items:center;gap:7px;padding:10px 12px;border-bottom:1px solid var(--line);font-size:13px;}
.sl-lane-h b{font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sl-lane-dot{width:9px;height:9px;border-radius:50%;background:var(--text-dim);flex:none;}
.sl-lane-dot.err{background:var(--err);} .sl-lane-dot.warn{background:var(--warn);} .sl-lane-dot.blue{background:var(--brand-blue);} .sl-lane-dot.info{background:var(--info,var(--bc-purple));} .sl-lane-dot.ok{background:var(--ok);} .sl-lane-dot.muted{background:var(--text-dim);}
.sl-lane-n{font-size:10px;font-weight:700;letter-spacing:.04em;padding:1px 7px;border-radius:999px;background:var(--surface-2);color:var(--text-mute);font-variant-numeric:tabular-nums;}
.sl-lane-val{font-size:11px;color:var(--text-mute);font-variant-numeric:tabular-nums;}
.sl-lane-body{display:flex;flex-direction:column;gap:8px;padding:8px;min-height:80px;max-height:70vh;overflow:auto;}
.sl-lane-empty{font-size:12px;color:var(--text-dim);padding:14px 8px;text-align:center;line-height:1.5;}
.sl-card{border:1px solid var(--line);border-radius:10px;background:var(--surface);padding:10px 10px 8px;cursor:pointer;display:flex;flex-direction:column;gap:6px;transition:border-color .13s,box-shadow .13s;}
.sl-card:hover{border-color:var(--line-2);box-shadow:var(--shadow-sm);}
.sl-card.sel{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.sl-card.due{border-left:3px solid var(--warn);} .sl-card.over{border-left:3px solid var(--err);}
.sl-card-top{display:flex;align-items:center;gap:7px;min-width:0;}
.sl-card-top b{font-size:13px;font-weight:600;letter-spacing:-.01em;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sl-card-top input{margin:0;}
.sl-card-val{font-size:11px;font-weight:600;color:var(--text-mute);font-variant-numeric:tabular-nums;white-space:nowrap;}
.sl-card-row{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0;}
.sl-card-row .sl-av{width:20px;height:20px;font-size:10px;border-radius:6px;}
.sl-card-foot{display:flex;align-items:center;gap:6px;padding-top:6px;border-top:1px dashed var(--line);}
.sl-card-move{flex:1;min-width:0;max-width:none;font-size:11px;padding:4px 6px;min-height:28px;}
.sl-card-foot .btn.xs{min-height:28px;}
/* the team */
.sl-unassigned .panel-body{padding:14px 18px;}
.sl-un-row{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;font-size:13px;}
.sl-un-acts{display:flex;gap:8px;flex-wrap:wrap;}
.sl-num{font-variant-numeric:tabular-nums;font-size:13px;font-weight:600;white-space:nowrap;}
.sl-num a{color:inherit;text-decoration:none;border-bottom:1px dotted var(--line-2);}
.sl-num.warn{color:var(--warn);} .sl-num.err{color:var(--err);} .sl-num.ok{color:var(--ok);}
.sl-num .device-meta{font-weight:400;}
/* call lists */
.sl-listgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;}
.sl-listcard{margin:0;} .sl-listcard.archived{opacity:.7;}
.sl-listcard-top{display:flex;gap:10px;align-items:flex-start;}
.sl-listcard-top h3{margin:0;font-size:15px;font-weight:600;letter-spacing:-.01em;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.sl-listcard-top p{margin:4px 0 0;line-height:1.5;}
.sl-listcard-facts{display:flex;gap:18px;margin:12px 0;}
.sl-listcard-facts div{display:flex;flex-direction:column;}
.sl-listcard-facts b{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.1;font-variant-numeric:tabular-nums;}
.sl-listcard-facts span{font-size:11px;color:var(--text-mute);font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-top:3px;}
.sl-listcard-acts{display:flex;gap:6px;flex-wrap:wrap;}
.sl-colours{display:flex;gap:6px;flex-wrap:wrap;padding-top:4px;}
.sl-colour{width:26px;height:26px;border-radius:8px;border:2px solid transparent;cursor:pointer;padding:0;}
.sl-colour.on{border-color:var(--text);box-shadow:0 0 0 2px var(--surface) inset;}
/* the report */
.sl-kpis{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;margin:0 0 14px;}
.sl-kpi{display:flex;flex-direction:column;gap:2px;padding:12px 14px;border:1px solid var(--line);border-radius:12px;background:var(--surface);}
.sl-kpi b{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.1;font-variant-numeric:tabular-nums;}
.sl-kpi span{font-size:12px;font-weight:500;}
.sl-kpi small{font-size:11px;color:var(--text-mute);}
.sl-kpi.ok b{color:var(--ok);} .sl-kpi.info b{color:var(--brand-purple);} .sl-kpi.blue b{color:var(--brand-blue);} .sl-kpi.muted b{color:var(--text-mute);}
.sl-rep-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-items:start;}
.sl-rep-grid .panel{margin:0;}
.sl-bars{display:flex;flex-direction:column;gap:7px;}
.sl-bar{display:grid;grid-template-columns:minmax(120px,38%) 1fr 44px auto;align-items:center;gap:10px;font-size:12px;}
.sl-bar-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);}
.sl-bar-t{display:block;height:8px;border-radius:4px;background:var(--surface-2);overflow:hidden;}
.sl-bar-t i{display:block;height:100%;background:var(--brand-blue);border-radius:4px;min-width:2px;}
.sl-bar-t i.ok{background:var(--ok);} .sl-bar-t i.muted{background:var(--text-dim);}
.sl-bar b{font-weight:600;font-variant-numeric:tabular-nums;text-align:right;}
.sl-bar small{font-size:11px;color:var(--text-mute);font-variant-numeric:tabular-nums;white-space:nowrap;}
.sl-days{display:flex;align-items:flex-end;gap:3px;height:140px;padding:0 0 4px;border-bottom:1px solid var(--line);margin-bottom:6px;}
.sl-day{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;gap:4px;}
.sl-day i{display:flex;flex-direction:column;justify-content:flex-end;width:100%;max-width:26px;background:rgba(var(--bc-grad-a-rgb),.28);border-radius:4px 4px 0 0;min-height:2px;overflow:hidden;}
.sl-day i em{display:block;width:100%;background:var(--brand-blue);}
.sl-day span{font-size:10px;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap;}
.sl-days .sl-day:nth-child(n+1):not(:nth-child(5n+1)) span{visibility:hidden;}
/* one lead */
.sl-back{display:flex;align-items:center;gap:10px;}
.sl-head .panel-body{display:grid;gap:14px;}
.sl-head-top{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;}
.sl-head-av{width:56px;height:56px;border-radius:14px;display:flex;align-items:center;justify-content:center;background:var(--brand-grad);color:#fff;font-size:18px;font-weight:700;letter-spacing:.02em;flex-shrink:0;box-shadow:var(--brand-glow);}
.sl-head-id{flex:1;min-width:240px;}
.sl-head-id h2{margin:2px 0 4px;font-size:20px;font-weight:600;letter-spacing:-.024em;}
.sl-head-sub{font-size:13px;color:var(--text-mute);line-height:1.55;}
.sl-head-sub b{color:var(--text);font-weight:600;}
.sl-reachrow{display:flex;gap:6px 16px;flex-wrap:wrap;margin-top:8px;}
.sl-reachrow .sl-tel{font-size:13px;}
.sl-head-meta{margin-top:8px;}
.sl-head-ctl{display:flex;flex-direction:column;gap:10px;align-items:flex-end;min-width:220px;}
.sl-head-pills{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end;}
.sl-owner{display:flex;align-items:center;gap:8px;}
.sl-owner .sl-av{width:26px;height:26px;font-size:10px;}
.sl-steps{grid-template-columns:repeat(5,minmax(0,1fr));}
.sl-lost{background:rgba(100,116,139,.1);}
.sl-acts{display:flex;gap:8px;flex-wrap:wrap;align-items:center;padding-top:4px;}
.sl-cols{margin-top:14px;}
.sl-timeline .panel-body{display:flex;flex-direction:column;gap:0;padding-top:8px;padding-bottom:8px;}
.sl-act{display:flex;gap:12px;padding:12px 0;border-bottom:1px solid var(--line);align-items:flex-start;}
.sl-act:last-child{border-bottom:0;}
.sl-act-ico{width:30px;height:30px;border-radius:9px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--text-mute);}
.sl-act-ico svg{width:15px;height:15px;}
.sl-act.k-call .sl-act-ico{background:var(--accent-glow);color:var(--brand-blue);}
.sl-act.k-meeting .sl-act-ico{background:rgba(var(--bc-purple-rgb),.12);color:var(--brand-purple);}
.sl-act.k-email .sl-act-ico,.sl-act.k-sms .sl-act-ico,.sl-act.k-linkedin .sl-act-ico{background:rgba(22,163,74,.1);color:var(--ok);}
.sl-act.sys{padding:8px 0;} .sl-act.sys .sl-act-ico{width:24px;height:24px;border-radius:7px;margin-left:3px;} .sl-act.sys .sl-act-ico svg{width:12px;height:12px;}
.sl-act.sys .sl-act-l1 b{font-weight:500;color:var(--text-mute);}
.sl-act-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px;}
.sl-act-l1{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;}
.sl-act-l1 b{font-weight:600;}
.sl-act-body{font-size:13px;line-height:1.6;color:var(--text);white-space:normal;overflow-wrap:anywhere;}
.sl-act.sys .sl-act-body{font-size:12px;color:var(--text-mute);}
.sl-act-x{opacity:0;transition:opacity .12s;align-self:flex-start;}
.sl-act:hover .sl-act-x,.sl-act-x:focus-visible{opacity:1;}
.sl-savebar{margin:0;border-radius:0 0 var(--radius) var(--radius);border-width:1px 0 0;}
.sl-savebar[hidden]{display:none;}
.sl-nextpanel.due{border-left:4px solid var(--warn);} .sl-nextpanel.over{border-left:4px solid var(--err);}
.sl-next-big{display:flex;flex-direction:column;gap:2px;}
.sl-next-big b{font-size:15px;font-weight:600;letter-spacing:-.01em;}
.sl-next-big span{font-size:13px;color:var(--text-mute);}
.sl-next-big small{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--err);margin-top:2px;}
.sl-nextpanel.due .sl-next-big small{color:var(--warn);}
.sl-next-acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;}
.sl-side-sel{max-width:180px;min-height:32px;font-size:12px;}
.sl-side-inp{width:120px;font:inherit;font-size:12px;padding:5px 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface-2);color:var(--text);text-align:right;min-height:32px;}
.sl-side-inp.wide{width:190px;text-align:left;}
.sl-side-inp:focus,.sl-side-sel:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.sl-check{font-size:12px;color:var(--text-mute);display:inline-flex;align-items:center;gap:6px;cursor:pointer;}
.sl-dupnote,.sl-dupbox,.sl-dncwarn{display:flex;gap:8px;align-items:flex-start;padding:10px 12px;border-radius:10px;font-size:12px;line-height:1.55;margin-top:12px;background:rgba(217,119,6,.1);border:1px solid rgba(217,119,6,.3);color:var(--text);}
.sl-dupnote svg,.sl-dupbox svg,.sl-dncwarn svg{flex:none;margin-top:2px;color:var(--warn);}
.sl-dupbox{margin:0 0 12px;flex-wrap:wrap;} .sl-dupbox[hidden]{display:none;} .sl-dupbox > div:first-of-type{flex:1;min-width:200px;}
.sl-dupbox-acts{display:flex;gap:6px;flex-wrap:wrap;width:100%;}
.sl-dncwarn{margin:0 0 12px;background:rgba(220,38,38,.08);border-color:rgba(220,38,38,.3);} .sl-dncwarn svg{color:var(--err);}
/* logging a touch */
.sl-logbody .field{margin-bottom:12px;}
.sl-kinds{margin-bottom:12px;flex-wrap:wrap;}
.sl-callrow{display:flex;gap:6px 16px;align-items:center;flex-wrap:wrap;padding:8px 12px;margin:0 0 12px;border-radius:9px;background:var(--surface-2);}
.sl-callrow .sl-tel{font-size:13px;font-weight:500;}
.sl-outs{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));}
.sl-outs .sup-pick b{font-size:12px;}
.sl-nextbox{padding:12px;border-radius:10px;border:1px dashed var(--line-2);background:var(--bg);margin:0 0 12px;}
.sl-nextbox .field{margin-bottom:0;}
.sl-nextbox-h{display:flex;align-items:baseline;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:8px;font-size:13px;}
.sl-quick{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;}
.sl-people{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;}
.sl-people[hidden],.sl-import [hidden]{display:none;}
.sl-people.compact{grid-template-columns:repeat(auto-fill,minmax(170px,1fr));}
.sl-pick{flex-direction:row;align-items:center;gap:10px;}
.sl-pick > span:last-child{font-size:12px;color:var(--text-dim);}
.sl-pick .sl-av{width:26px;height:26px;}
.sl-reasons{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));}
.sl-temps .sup-pick{align-items:center;}
/* import */
.sl-import .field{margin-bottom:10px;}
.sl-import-in{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 8px;}
.sl-import textarea{width:100%;box-sizing:border-box;font:inherit;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--text);resize:vertical;}
.sl-im-map{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ok);margin-top:2px;}
.sl-im-map.none{color:var(--text-dim);}
.sl-im-tbl{max-height:220px;overflow:auto;border:1px solid var(--line);border-radius:8px;}
.sl-im-tbl table.dt td,.sl-im-tbl table.dt th{font-size:12px;white-space:nowrap;}
.sl-im-sum{padding:10px 12px;border-radius:10px;font-size:13px;line-height:1.55;margin-top:10px;background:var(--accent-glow);border:1px solid rgba(var(--bc-accent-rgb),.18);}
.sl-im-sum.done{background:rgba(22,163,74,.1);border-color:rgba(22,163,74,.3);}
.sl-im-sum ul{margin:6px 0 0 18px;padding:0;font-size:12px;}
.sl-warnt{color:var(--warn);}
@media (max-width:1200px){ .sl-tiles{grid-template-columns:repeat(3,minmax(0,1fr));} .sl-kpis{grid-template-columns:repeat(3,minmax(0,1fr));} .sl-board{grid-template-columns:repeat(6,240px);} }
@media (max-width:1000px){ .sl-rep-grid{grid-template-columns:1fr;} .sl-steps{grid-template-columns:repeat(3,minmax(0,1fr));} .sl-head-ctl{align-items:flex-start;min-width:0;width:100%;} .sl-head-pills{justify-content:flex-start;} }
@media (max-width:760px){
  .sl-tiles{grid-template-columns:repeat(2,minmax(0,1fr));} .sl-kpis{grid-template-columns:repeat(2,minmax(0,1fr));}
  .sl-seg{width:100%;overflow-x:auto;} .sl-seg-b{min-height:40px;flex:1 1 auto;justify-content:center;}
  .sl-chip{height:40px;} .sl-toolbar .ex-sel{max-width:none;flex:1 1 45%;min-height:40px;} .sl-find{max-width:none;flex:1 1 100%;} .sl-find input{min-height:40px;font-size:16px;}
  .sl-modebar-r{width:100%;} .sl-modebar-r .btn{min-height:40px;flex:1 1 auto;justify-content:center;}
  .sl-intro-acts{width:100%;} .sl-intro-acts .btn{flex:1 1 auto;justify-content:center;min-height:40px;}
  .sl-acts .btn,.sl-next-acts .btn,.sl-listcard-acts .btn,.sl-un-acts .btn,.sl-quick .btn,.sl-dupbox-acts .btn,.sl-selbar .btn{min-height:40px;}
  .sl-steps{grid-template-columns:1fr;}
  .sl-head-av{width:44px;height:44px;font-size:15px;border-radius:11px;}
  .sl-head-id h2{font-size:18px;}
  .sl-side-sel,.sl-side-inp{min-height:40px;} .sl-side-inp{width:110px;} .sl-side-inp.wide{width:100%;}
  .pv-kv .sl-side-inp.wide{flex-basis:100%;}
  .sl-act-x{opacity:1;min-height:40px;min-width:40px;}
  .sl-card-move,.sl-card-foot .btn.xs{min-height:40px;}
  .sl-board{grid-template-columns:repeat(6,82vw);}
  .sl-logbody .grid-2{grid-template-columns:1fr;}
  .sl-bar{grid-template-columns:minmax(90px,36%) 1fr 36px auto;}
}

/* ── v1.4.10.502: Sales Leads, laid out again — the command bar, the first-run guide, the stat strip, the row actions, the
   call queue, the lead's glance strip and folded details; and the AVDesk areas block in the user editor ── */
.sl-cmd{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:0 0 12px;}
.sl-cmd-acts{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.sl-cmd-acts .btn{min-height:36px;}
.sl-iconbtn{padding:0 10px;}
.sl-callbtn{padding-right:12px;}
.sl-callbtn-n{display:inline-flex;align-items:center;margin-left:4px;padding:1px 7px;border-radius:999px;background:rgba(255,255,255,.22);font-size:10px;font-weight:700;letter-spacing:.04em;}
.sl-start .panel-body{display:grid;gap:14px;}
.sl-start-h{display:flex;gap:14px;align-items:flex-start;}
.sl-start-h h3{margin:0 0 4px;font-size:15px;font-weight:600;letter-spacing:-.01em;}
.sl-start-h p{margin:0;line-height:1.55;}
.sl-start-steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;}
.sl-start-step{display:flex;flex-direction:column;gap:6px;padding:14px;border:1px solid var(--line);border-radius:12px;background:var(--bg);}
.sl-start-step > span{width:26px;height:26px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:var(--brand-grad);color:#fff;font-size:12px;font-weight:700;}
.sl-start-step b{font-size:13px;font-weight:600;}
.sl-start-step small{font-size:12px;color:var(--text-mute);line-height:1.55;}
.sl-start-step > div{display:flex;gap:6px;flex-wrap:wrap;margin-top:4px;}
.sl-stats{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 12px;}
.sl-stat{appearance:none;display:inline-flex;align-items:center;gap:9px;padding:7px 12px 7px 10px;border:1px solid var(--line);border-radius:10px;background:var(--surface);font:inherit;color:var(--text);cursor:pointer;text-align:left;min-height:44px;transition:border-color .13s,box-shadow .13s;}
.sl-stat:hover{border-color:var(--line-2);box-shadow:var(--shadow-sm);}
.sl-stat.on{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.sl-stat b{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;font-variant-numeric:tabular-nums;}
.sl-stat span{display:flex;flex-direction:column;gap:1px;font-size:12px;font-weight:500;line-height:1.2;}
.sl-stat small{font-size:11px;color:var(--text-mute);font-weight:400;}
.sl-stat.info b{color:var(--brand-purple);} .sl-stat.warn b{color:var(--warn);} .sl-stat.err b{color:var(--err);} .sl-stat.blue b{color:var(--brand-blue);} .sl-stat.ok b{color:var(--ok);}
.sl-stats-note{margin-left:auto;}
.sl-bar1{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:0 0 8px;}
.sl-bar1 .sl-chips{margin:0;}
.sl-bar1 .sl-find{flex:0 1 320px;}
.sl-toolbar-l{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-right:2px;}
.sl-toolbar-l svg{width:13px;height:13px;}
.sl-subbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:0 0 12px;}
.sl-period{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;}
.sl-stagecell{min-width:150px;}
.sl-owner-line{margin-top:5px;}
.sl-owner-line .sl-av{width:20px;height:20px;font-size:10px;border-radius:6px;}
.sl-rowacts{white-space:nowrap;text-align:right;}
.sl-rowacts .btn{opacity:.35;transition:opacity .12s;} .sl-rowacts .btn + .btn{margin-left:4px;}
.sl-row:hover .sl-rowacts .btn,.sl-rowacts .btn:focus-visible{opacity:1;}
.sl-rowacts-th{width:72px;}
.sl-row.over td:first-child{box-shadow:inset 3px 0 0 var(--err);} .sl-row.due td:first-child{box-shadow:inset 3px 0 0 var(--warn);}
.sl-glance{display:flex;gap:14px 22px;flex-wrap:wrap;margin-top:10px;padding-top:10px;border-top:1px dashed var(--line);}
.sl-glance > div{display:flex;flex-direction:column;gap:2px;min-width:0;}
.sl-glance span{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);}
.sl-glance b{font-size:13px;font-weight:500;}
.sl-details.folded .panel-head{border-bottom:0;}
.sup-pick.tone-good.on{border-color:var(--ok);box-shadow:0 0 0 1px var(--ok) inset;background:rgba(22,163,74,.07);}
.sup-pick.tone-bad.on{border-color:var(--err);box-shadow:0 0 0 1px var(--err) inset;background:rgba(220,38,38,.06);}
.sup-pick.tone-info.on{border-color:var(--brand-purple);box-shadow:0 0 0 1px var(--brand-purple) inset;background:rgba(var(--bc-purple-rgb),.06);}
.sl-outs .sup-pick b svg{width:13px;height:13px;vertical-align:-2px;margin-right:4px;color:var(--text-mute);}
.sl-outs .sup-pick.tone-good b svg{color:var(--ok);} .sl-outs .sup-pick.tone-bad b svg{color:var(--err);} .sl-outs .sup-pick.tone-info b svg{color:var(--brand-purple);}
/* the call queue */
.sl-q{display:grid;grid-template-columns:minmax(0,1fr) minmax(360px,1.15fr);gap:16px;align-items:start;}
.sl-q .panel{margin:0;}
.sl-q-lead .panel-body{display:grid;gap:12px;}
.sl-q-pos{font-size:12px;color:var(--text-mute);} .sl-q-pos b{font-size:13px;color:var(--text);}
.sl-q-who{display:flex;gap:14px;align-items:flex-start;}
.sl-q-who h2{margin:0 0 4px;font-size:20px;font-weight:600;letter-spacing:-.024em;}
.sl-q-who .sl-head-pills{justify-content:flex-start;margin-top:8px;}
.sl-q-calls{display:flex;gap:8px;flex-wrap:wrap;}
.sl-q-call{display:inline-flex;align-items:center;gap:10px;padding:10px 14px;border:1px solid var(--line);border-radius:12px;background:var(--accent-glow);color:var(--text);text-decoration:none;min-height:44px;transition:border-color .13s,box-shadow .13s;}
.sl-q-call:hover{border-color:var(--brand-blue);box-shadow:var(--shadow-sm);}
.sl-q-call svg{width:18px;height:18px;color:var(--brand-blue);flex:none;}
.sl-q-call span{display:flex;flex-direction:column;gap:1px;} .sl-q-call small{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);} .sl-q-call b{font-size:15px;font-weight:600;letter-spacing:-.01em;}
.sl-q-call.alt{background:var(--surface-2);} .sl-q-call.alt svg{color:var(--text-mute);} .sl-q-call.alt b{font-size:13px;font-weight:500;}
.sl-q-due .sl-next{font-size:13px;}
.sl-q-notes{padding:10px 12px;border-radius:10px;background:var(--surface-2);font-size:13px;line-height:1.55;}
.sl-q-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:4px;}
.sl-q-prev{display:grid;grid-template-columns:150px minmax(0,1fr);gap:4px 10px;padding:7px 0;border-top:1px solid var(--line);font-size:12px;align-items:baseline;}
.sl-q-prev-k{font-weight:600;display:inline-flex;align-items:center;gap:5px;} .sl-q-prev-k svg{width:12px;height:12px;color:var(--text-mute);}
.sl-q-prev-t{color:var(--text);line-height:1.5;} .sl-q-prev small{grid-column:2;font-size:11px;color:var(--text-dim);}
.sl-q-leadacts{display:flex;gap:6px;flex-wrap:wrap;padding-top:6px;border-top:1px solid var(--line);}
.sl-q-log .panel-body{display:grid;gap:12px;}
.sl-q-log .field{margin-bottom:0;}
.sl-q-outs{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px;}
.sl-q-out{appearance:none;display:flex;align-items:center;gap:8px;padding:9px 10px;border:1px solid var(--line);border-radius:10px;background:var(--surface);font:inherit;font-size:12px;font-weight:500;color:var(--text);text-align:left;cursor:pointer;min-height:44px;transition:border-color .13s,box-shadow .13s,background .13s;}
.sl-q-out kbd{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10px;font-weight:700;padding:1px 5px;border-radius:5px;background:var(--surface-2);color:var(--text-dim);flex:none;}
.sl-q-out svg{width:14px;height:14px;color:var(--text-mute);flex:none;}
.sl-q-out span{flex:1;min-width:0;line-height:1.3;}
.sl-q-out:hover{border-color:var(--line-2);box-shadow:var(--shadow-sm);}
.sl-q-out.on{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);background:var(--accent-glow);font-weight:600;}
.sl-q-out.tone-good svg{color:var(--ok);} .sl-q-out.tone-good.on{border-color:var(--ok);box-shadow:0 0 0 3px rgba(22,163,74,.16);background:rgba(22,163,74,.07);}
.sl-q-out.tone-bad svg{color:var(--err);} .sl-q-out.tone-bad.on{border-color:var(--err);box-shadow:0 0 0 3px rgba(220,38,38,.14);background:rgba(220,38,38,.06);}
.sl-q-out.tone-info svg{color:var(--brand-purple);} .sl-q-out.tone-info.on{border-color:var(--brand-purple);box-shadow:0 0 0 3px rgba(var(--bc-purple-rgb),.16);background:rgba(var(--bc-purple-rgb),.06);}
.sl-q-log .sl-nextbox{margin:0;}
.sl-q-more{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;}
.sl-q-acts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-top:4px;}
.sl-q-acts kbd{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10px;font-weight:700;padding:1px 5px;border-radius:5px;background:var(--surface-2);color:var(--text-dim);margin-left:4px;}
.sl-q-empty .empty-sub{max-width:460px;}
.sl-q-empty-acts{display:flex;gap:8px;flex-wrap:wrap;justify-content:center;margin-top:14px;}
.sl-dncwarn[hidden]{display:none;}
/* the AVDesk areas block in the user editor */
.ue-staff-areas{display:flex;flex-direction:column;gap:6px;margin-top:10px;padding:12px 12px 6px;border:1px solid var(--line);border-radius:12px;background:var(--bg);}
.ue-staff-areas-h{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin-bottom:2px;}
.ue-staff-areas-h svg{width:13px;height:13px;}
.ua-areas{display:flex;flex-wrap:wrap;gap:2px 4px;}
.ua-areas .gly{vertical-align:-2px;}
@media (max-width:1100px){ .sl-q{grid-template-columns:1fr;} }
@media (max-width:900px){ .sl-start-steps{grid-template-columns:1fr;} }
@media (max-width:760px){
  .sl-cmd-seg{width:100%;} .sl-cmd-acts{width:100%;} .sl-cmd-acts .btn{min-height:40px;flex:1 1 auto;justify-content:center;} .sl-iconbtn{flex:0 0 auto;}
  .sl-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));} .sl-stat{min-height:44px;} .sl-stats-note{grid-column:1 / -1;margin:0;}
  .sl-bar1 .sl-find{flex:1 1 100%;}
  .sl-rowacts .btn{opacity:1;min-height:40px;min-width:40px;}
  .sl-q-outs{grid-template-columns:repeat(2,minmax(0,1fr));} .sl-q-out{min-height:44px;} .sl-q-more{grid-template-columns:1fr;}
  .sl-q-call{flex:1 1 100%;} .sl-q-prev{grid-template-columns:1fr;} .sl-q-prev small{grid-column:1;}
  .sl-q-acts .btn,.sl-q-leadacts .btn,.sl-q-empty-acts .btn,.sl-start-step .btn,.sl-subbar .btn,.sl-period .btn{min-height:40px;}
}

/* ── v1.4.10.503: the chain (how an integrator has been reached), and the call queue's phone / email switch ── */
.sl-chain{display:inline-flex;align-items:center;gap:5px;flex-wrap:wrap;}
.sl-chain-c{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;padding:3px 8px;border-radius:999px;background:var(--surface-2);color:var(--text-mute);white-space:nowrap;}
.sl-chain-c svg{width:12px;height:12px;}
.sl-chain-c.last{background:var(--accent-glow);color:var(--brand-blue);}
.sl-chain.none{font-size:12px;color:var(--text-dim);gap:5px;} .sl-chain.none svg{width:12px;height:12px;}
.sl-chain > small{font-size:11px;color:var(--text-dim);}
.sl-glance .sl-chain-c{font-size:11px;}
.sl-q-kind .sl-seg-b{min-height:32px;padding:4px 10px;}
.sl-q-log .panel-head{flex-wrap:wrap;gap:8px;}
@media (max-width:760px){ .sl-q-kind .sl-seg-b{min-height:40px;} }

/* ══════════ v1.4.10.506 — the Sites area laid out again: the sites list (cards under their client beside a sticky
   map), the trail, the site Overview's Structure and Needs attention panels, the Rooms tab's rail, and the room page
   (its section bar, the Room panel, where the room sits and the rooms beside it) ══════════ */
/* the panel-title icon, 18px in the brand blue, as every panel title in the area draws it */
.sd-pt-ico{display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;color:var(--brand-blue);flex:none;}
.sd-pt-ico svg{width:16px;height:16px;}
.sd-pt-ico.warn{color:var(--warn);} .sd-pt-ico.ok{color:var(--ok);}
.st-warn{color:var(--err);font-weight:600;}

/* ── the sites list ── */
.st-strip{margin-bottom:14px;}
.st-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:10px 12px;margin-bottom:14px;}
.st-bar .st-search{flex:1 1 260px;max-width:460px;min-width:0;}
.st-bar .ex-sel{min-height:34px;max-width:220px;}
.st-bar .sd-viewtog{margin-left:auto;}
.st-bar .sd-viewtog button{min-height:32px;}
.st-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,340px);gap:14px;align-items:start;}
.st-main{min-width:0;}
.st-aside{display:grid;gap:14px;min-width:0;position:sticky;top:12px;}
.st-mappanel{padding:0;overflow:hidden;}
.st-maphead{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 14px;border-bottom:1px solid var(--line);}
.st-maphead-t{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:600;}
.st-map.sites-map{height:300px;border:0;border-radius:0;margin:0;}
.st-maptip{padding:9px 14px;border-top:1px solid var(--line);}
.st-showing{font-size:12px;color:var(--text-mute);margin:0 0 10px;}
.st-client{margin-bottom:18px;}
.st-client-head{display:flex;align-items:center;gap:10px;padding:0 2px 10px;}
.st-client-txt{min-width:0;flex:1;}
.st-client-name{font-size:15px;font-weight:600;letter-spacing:-.01em;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.st-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(300px,100%),1fr));gap:12px;}
.st-card{display:flex;flex-direction:column;gap:10px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px 12px;cursor:pointer;min-width:0;position:relative;transition:border-color .13s,box-shadow .13s,transform .13s;}
.st-card::before{content:'';position:absolute;left:-1px;top:16px;bottom:16px;width:3px;border-radius:0 3px 3px 0;background:var(--line-2);}
.st-card.ok::before{background:var(--ok);} .st-card.warn::before{background:var(--warn);} .st-card.err::before{background:var(--err);}
.st-card:hover{border-color:var(--brand-blue);box-shadow:0 6px 18px rgba(var(--bc-accent-rgb),.12);transform:translateY(-1px);}
.st-card:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.st-card-top{display:flex;align-items:flex-start;gap:11px;min-width:0;}
.st-card-id{flex:1;min-width:0;}
.st-card-name{font-size:15px;font-weight:600;letter-spacing:-.01em;display:flex;align-items:center;gap:7px;flex-wrap:wrap;min-width:0;}
.st-code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;letter-spacing:.04em;color:var(--brand-blue);background:var(--accent-glow);border-radius:5px;padding:2px 6px;}
.st-card-addr{font-size:12px;color:var(--text-mute);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.st-card-ody{flex:none;}
.st-card-shape{display:flex;flex-wrap:wrap;gap:4px 0;font-size:12px;color:var(--text);}
.st-card-shape span:not(:last-child)::after{content:"·";margin:0 7px;color:var(--text-dim);}
.st-card-health{display:grid;gap:6px;}
.st-card-hl{display:flex;align-items:flex-start;gap:7px;font-size:12px;color:var(--text-mute);min-width:0;line-height:1.5;}
.st-card-hl .dot{margin-top:6px;}
.st-card-hl > span:last-child{min-width:0;}
.st-layout.table{grid-template-columns:minmax(0,1fr);}   /* the table takes the full width; the map and the attention list follow it */
.st-layout.table .st-aside{position:static;grid-template-columns:repeat(auto-fit,minmax(min(320px,100%),1fr));align-items:start;}
.st-card-foot{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-top:10px;border-top:1px solid var(--line);margin-top:2px;}
.st-card-intg{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1 1 60px;}
.st-card-acts{display:inline-flex;align-items:center;gap:4px;margin-left:auto;flex-wrap:wrap;justify-content:flex-end;}
.st-attn{padding:12px 14px;}
.st-attn-head,.sd-attn-head{display:flex;align-items:center;gap:8px;font-size:13px;margin-bottom:8px;}
.st-attn-head b,.sd-attn-head b{font-size:15px;font-weight:600;letter-spacing:-.01em;}
.st-attn-head .device-meta,.sd-attn-head .device-meta{margin-left:auto;}
.st-attn-rows,.sd-attn-rows{display:grid;gap:6px;}
.st-attn-row,.sd-attn-row{appearance:none;display:flex;align-items:center;gap:9px;width:100%;text-align:left;cursor:pointer;border:1px solid var(--line);border-radius:8px;background:var(--surface);padding:8px 10px;color:var(--text);font:inherit;min-width:0;transition:border-color .12s,box-shadow .12s;}
.st-attn-row:hover,.sd-attn-row:hover{border-color:var(--brand-blue);box-shadow:0 2px 8px rgba(var(--bc-accent-rgb),.08);}
.st-attn-main,.sd-attn-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;}
.st-attn-name,.sd-attn-main > b{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sd-attn-main > b .lr-code{margin-right:2px;}
.st-attn-go,.sd-attn-go{color:var(--text-dim);display:inline-flex;flex:none;}
.st-attn-go svg,.sd-attn-go svg{width:14px;height:14px;}
.st-table td{vertical-align:middle;}
@media (max-width:1100px){ .st-layout{grid-template-columns:minmax(0,1fr) minmax(240px,300px);} }
@media (max-width:980px){
  .st-layout{grid-template-columns:minmax(0,1fr);}
  .st-aside{position:static;order:-1;}   /* the map above the list, as it stood before */
  .st-map.sites-map{height:220px;}
}
@media (max-width:700px){
  .st-bar > *{flex:1 1 auto;} .st-bar .ex-sel{min-height:40px;max-width:none;} .st-bar .sd-viewtog{margin-left:0;flex:1 1 100%;} .st-bar .sd-viewtog button{flex:1 1 0;justify-content:center;min-height:40px;}
  .st-bar .btn{justify-content:center;min-height:40px;}
  .st-card-acts{margin-left:0;width:100%;justify-content:flex-start;}
  .st-card-acts .btn{min-height:40px;}
  .st-attn-row,.sd-attn-row{min-height:44px;}
}

/* ── the trail: Sites › client › site › building › level › room ── */
.sd-trail{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:0 0 12px;min-width:0;}
.sd-trail-path{display:flex;align-items:center;gap:2px;flex-wrap:wrap;min-width:0;}
.sd-trail-a{appearance:none;display:inline-flex;align-items:center;gap:6px;border:1px solid transparent;background:none;color:var(--text-mute);font:inherit;font-size:12px;font-weight:500;padding:5px 8px;border-radius:6px;cursor:pointer;max-width:260px;min-width:0;}
.sd-trail-a:hover{background:var(--surface);border-color:var(--line);color:var(--text);}
.sd-trail-a.cur{color:var(--text);font-weight:600;cursor:default;}
.sd-trail-a.cur:hover{background:none;border-color:transparent;}
.sd-trail-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
.sd-trail-ico{display:inline-flex;color:var(--text-dim);flex:none;} .sd-trail-ico svg{width:13px;height:13px;}
.sd-trail-a:hover .sd-trail-ico,.sd-trail-a.cur .sd-trail-ico{color:var(--brand-blue);}
.sd-trail-sep{display:inline-flex;color:var(--text-dim);flex:none;} .sd-trail-sep svg{width:12px;height:12px;}
.sd-trail-right{display:flex;align-items:center;gap:8px;flex:none;margin-left:auto;}
.sd-trail-nav{display:inline-flex;align-items:center;gap:6px;}
.sd-trail-nav .btn{gap:4px;} .sd-trail-nav .btn span{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sd-trail-pos{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-dim);white-space:nowrap;}
@media (max-width:1180px){ .sd-tabstrip{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;} .sd-tabstrip::-webkit-scrollbar{display:none;} .sd-tab{padding:9px 12px;} }   /* the seven tabs stay one row; past the edge the strip scrolls (it wrapped to two rows at 1024) */
@media (max-width:700px){ .sd-trail-a{max-width:160px;padding:7px 8px;} .sd-trail-right{margin-left:0;width:100%;} .sd-trail-nav{width:100%;} .sd-trail-nav .btn{flex:1 1 0;justify-content:center;min-height:40px;} }

/* ── the site Overview: Structure (buildings › levels, each a way into the rooms) and Needs attention ── */
.sd-struct .panel-head h3{display:flex;align-items:center;gap:8px;}
.sd-struct-body{padding:6px 16px 14px;}
.sd-st-bldg{padding:10px 0 6px;}
.sd-st-bldg + .sd-st-bldg{border-top:1px solid var(--line);}
.sd-st-bhead{display:flex;align-items:center;gap:9px;min-width:0;margin-bottom:8px;}
.sd-st-bico{display:inline-flex;color:var(--brand-blue);flex:none;} .sd-st-bico svg{width:16px;height:16px;}
.sd-st-bname{appearance:none;border:0;background:none;padding:0;font:inherit;font-size:15px;font-weight:600;letter-spacing:-.01em;color:var(--text);cursor:pointer;display:inline-flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto;text-align:left;}
.sd-st-bname:hover{color:var(--brand-blue);}
.sd-st-bcode{font-size:11px;padding:2px 6px;flex:none;}
.sd-st-bmeta{font-size:12px;color:var(--text-mute);min-width:0;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sd-st-bhead > .pill{flex:none;white-space:nowrap;}
.sd-st-bacts{margin-left:auto;display:inline-flex;gap:2px;flex:none;}
.sd-st-lvls{display:grid;gap:4px;padding-left:25px;}
.sd-st-bldg.single .sd-st-lvls{padding-left:0;}
.sd-st-lvl{appearance:none;display:grid;grid-template-columns:auto minmax(0,1fr) auto auto 14px;align-items:center;gap:9px;width:100%;text-align:left;border:1px solid var(--line);border-radius:7px;background:var(--surface);padding:7px 10px;color:var(--text);font:inherit;cursor:pointer;transition:border-color .12s,box-shadow .12s;}
.sd-st-lvl:hover{border-color:var(--brand-blue);box-shadow:0 2px 8px rgba(var(--bc-accent-rgb),.08);}
.sd-st-lvl.empty .sd-st-lvl-name{color:var(--text-mute);font-weight:500;}
.sd-st-lvl-ico{display:inline-flex;color:var(--text-dim);} .sd-st-lvl-ico svg{width:14px;height:14px;}
.sd-st-lvl:hover .sd-st-lvl-ico{color:var(--brand-blue);}
.sd-st-lvl-name{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
.sd-st-lvl-meta{font-size:12px;color:var(--text-mute);white-space:nowrap;}
.sd-st-go{display:inline-flex;color:var(--text-dim);} .sd-st-go svg{width:14px;height:14px;}
.sd-st-none{padding:4px 0 6px;}
.sd-st-note{margin-top:10px;padding-top:10px;border-top:1px solid var(--line);}
.sd-attn{padding:12px 14px;}
.sd-attn.clear .sd-attn-head{margin-bottom:4px;}
.sd-attn-more{margin-top:8px;}
@media (max-width:700px){
  .sd-st-lvls{padding-left:0;}
  .sd-st-bhead{flex-wrap:wrap;} .sd-st-bmeta{flex-basis:100%;white-space:normal;padding-left:25px;}
  .sd-st-lvl{display:flex;flex-wrap:wrap;gap:6px 9px;min-height:44px;}
  .sd-st-lvl-name{flex:1 1 40%;}
  .sd-st-lvl-meta{flex:1 1 100%;order:5;padding-left:23px;white-space:normal;}
  .sd-st-bacts{margin-left:0;}
}

/* ── the Rooms tab: the rail (buildings and levels with counts) beside the list ── */
.sd-locwrap{display:grid;grid-template-columns:232px minmax(0,1fr);gap:14px;align-items:start;}
.sd-locnav-col{position:sticky;top:12px;min-width:0;}
.sd-loc-main{min-width:0;}
.sd-locnav{display:flex;flex-direction:column;gap:2px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:8px;max-height:calc(100vh - 120px);overflow-y:auto;}
.sd-ln{appearance:none;display:flex;align-items:center;gap:7px;width:100%;text-align:left;border:0;background:none;border-radius:7px;padding:7px 9px;color:var(--text);font:inherit;font-size:13px;font-weight:500;cursor:pointer;min-width:0;}
.sd-ln:hover{background:var(--surface-2);}
.sd-ln.on{background:var(--accent-glow);color:var(--brand-blue);font-weight:600;}
.sd-ln.bldg{margin-top:6px;font-weight:600;}
.sd-ln.lvl{padding-left:30px;font-size:12px;}
.sd-ln.lvl.top{padding-left:9px;font-size:13px;}
.sd-ln.lvl.empty{color:var(--text-dim);}
.sd-ln.flag{color:var(--warn);}
.sd-ln.flag.on{background:rgba(217,119,6,.10);color:var(--warn);}
.sd-ln-ico{display:inline-flex;color:var(--text-dim);flex:none;} .sd-ln-ico svg{width:14px;height:14px;}
.sd-ln.on .sd-ln-ico,.sd-ln.bldg .sd-ln-ico,.sd-ln.flag .sd-ln-ico{color:inherit;}
.sd-ln-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sd-ln-n{flex:none;font-size:11px;font-weight:600;color:var(--text-mute);background:var(--surface-2);border-radius:999px;padding:1px 7px;min-width:22px;text-align:center;}
.sd-ln.on .sd-ln-n{background:#fff;color:var(--brand-blue);}
.sd-ln.flag .sd-ln-n{background:rgba(217,119,6,.12);color:var(--warn);}
.sd-ln-flag{flex:none;width:7px;height:7px;border-radius:50%;background:var(--warn);}
.sd-loctools .sd-pick{display:none;}   /* the Building / Level pickers stand in for the rail where the rail makes way */
@media (max-width:900px){
  .sd-locwrap{grid-template-columns:minmax(0,1fr);}
  .sd-locnav-col{display:none;}
  .sd-loctools .sd-pick{display:inline-block;}
}

/* ── the room page: the section bar, the Room panel (photo beside the facts), where the room sits ── */
.loc-nav{position:sticky;top:0;z-index:5;display:flex;gap:4px;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;background:var(--bg);padding:6px 0 10px;margin:-4px 0 10px;}
.loc-nav::-webkit-scrollbar{display:none;}
.loc-nav-a{appearance:none;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--surface);border-radius:999px;padding:6px 12px;font:inherit;font-size:12px;font-weight:600;color:var(--text-mute);cursor:pointer;white-space:nowrap;}
.loc-nav-a:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
.loc-nav-a .sd-tab-n{height:16px;min-width:16px;}
[id^="loc-sec-"]{scroll-margin-top:60px;}
.loc-cols > .sd-col-main > section,.loc-cols > .sd-col-side > section{min-width:0;}
.loc-room{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);padding:0;overflow:hidden;align-items:stretch;}
.loc-room.nophoto{grid-template-columns:minmax(0,1fr);}
.loc-room-photo{border-right:1px solid var(--line);display:flex;flex-direction:column;min-width:0;background:var(--surface-2);min-height:260px;}
.loc-room-photo .loc-photo{flex:1;position:relative;min-height:220px;display:flex;align-items:center;justify-content:center;}
.loc-room-photo .loc-photo-img{position:absolute;inset:0;width:100%;height:100%;max-height:none;object-fit:cover;}
.loc-room-photo .loc-photo-ph{position:absolute;inset:0;min-height:0;width:100%;height:100%;}
.loc-photo-bar{display:flex;align-items:center;gap:6px;padding:8px 12px;border-top:1px solid var(--line);flex-wrap:wrap;background:var(--surface);}
.loc-photo-bar > .device-meta{flex:1 1 100%;}   /* the hint on its own line, the buttons in a row under it (beside them it was squeezed to a word a line) */
.loc-photo-bar .btn{flex:1 1 auto;justify-content:center;white-space:nowrap;}
.loc-room-about{padding:14px 16px;min-width:0;}
.loc-about-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px;}
.loc-pt{font-weight:600;font-size:15px;letter-spacing:-.012em;display:flex;align-items:center;gap:8px;}
.loc-desc{font-size:13px;line-height:1.65;white-space:pre-wrap;}
.loc-pack-row{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-top:10px;padding-top:10px;border-top:1px solid var(--line);}
.loc-where{padding:14px 16px;}
.loc-where-rows{display:grid;gap:4px;margin:-2px 0 10px;}
.loc-where-row{display:grid;grid-template-columns:18px 64px minmax(0,1fr) auto;align-items:center;gap:8px;border:1px solid transparent;border-radius:7px;padding:6px 8px;font:inherit;font-size:13px;color:var(--text);background:none;text-align:left;min-width:0;width:100%;}
.loc-where-row.go{cursor:pointer;border-color:var(--line);background:var(--surface);transition:border-color .12s,box-shadow .12s;}
.loc-where-row.go:hover{border-color:var(--brand-blue);box-shadow:0 2px 8px rgba(var(--bc-accent-rgb),.08);}
.loc-where-ico{display:inline-flex;color:var(--text-dim);} .loc-where-ico svg{width:14px;height:14px;}
.loc-where-row.go:hover .loc-where-ico{color:var(--brand-blue);}
.loc-where-k{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
.loc-where-v{font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.loc-where-go{display:inline-flex;color:var(--text-dim);} .loc-where-go svg{width:14px;height:14px;}
.loc-sibs-h{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:0 0 6px;}
.loc-sibs-h .device-meta{text-transform:none;letter-spacing:0;font-weight:400;}
.loc-sibs{display:flex;flex-wrap:wrap;gap:6px;}
.loc-sib{appearance:none;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--surface);border-radius:999px;padding:5px 10px;font:inherit;font-size:12px;color:var(--text);cursor:pointer;max-width:100%;min-width:0;}
.loc-sib:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
.loc-sib b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;color:var(--brand-blue);}
.loc-sib span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:180px;}
.loc-sib.is-off{opacity:.7;} .loc-sib.more{color:var(--text-mute);border-style:dashed;}
.loc-sib-flag{width:7px;height:7px;border-radius:50%;background:var(--warn);flex:none;}
@media (max-width:900px){ .loc-room{grid-template-columns:minmax(0,1fr);} .loc-room-photo{border-right:0;border-bottom:1px solid var(--line);} }
@media (max-width:700px){
  .loc-nav-a{min-height:40px;}
  .loc-where-row{grid-template-columns:18px minmax(0,1fr) auto;row-gap:1px;}
  .loc-where-ico{grid-row:1 / span 2;} .loc-where-k{grid-column:2;} .loc-where-v{grid-column:2;white-space:normal;} .loc-where-go{grid-row:1 / span 2;}
  .loc-where-row.go{min-height:44px;} .loc-sib{min-height:40px;} .loc-photo-bar .btn{min-height:40px;} .loc-pack-row .btn{min-height:40px;}
}

/* ═══ v1.4.10.507 — THE SUPPORT DESK: the rail beside the list, the list narrowed to one record, and the ticket's
   Connected and Related cards (js/03-pages.js THE DESK, js/06 tktConnCard / tktRelatedCard) ═══ */
.tkx-desk{display:grid;grid-template-columns:220px minmax(0,1fr);gap:14px;align-items:start;}
.tkx-main{min-width:0;}
.tkx-nav-col{position:sticky;top:12px;min-width:0;}
.tkx-nav{display:flex;flex-direction:column;gap:10px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:8px;max-height:calc(100vh - 120px);overflow-y:auto;}
.tkx-nav-g{display:flex;flex-direction:column;gap:1px;}
.tkx-nav-g + .tkx-nav-g{padding-top:8px;border-top:1px solid var(--line);}
.tkx-nav-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);padding:4px 9px 5px;}
.tkx-nv{appearance:none;display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:0;background:none;border-radius:7px;padding:7px 9px;color:var(--text);font:inherit;font-size:13px;font-weight:500;cursor:pointer;min-width:0;}
.tkx-nv:hover{background:var(--surface-2);}
.tkx-nv:focus-visible,.tkx-sp:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.tkx-nv.on{background:var(--accent-glow);color:var(--brand-blue);font-weight:600;}
.tkx-nv-ico{display:inline-flex;color:var(--text-dim);flex:none;} .tkx-nv-ico svg{width:14px;height:14px;}
.tkx-nv.on .tkx-nv-ico{color:inherit;}
.tkx-nv-dot{width:8px;height:8px;border-radius:50%;flex:none;margin:0 3px;}
.tkx-nv-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tkx-nv-n{flex:none;font-size:11px;font-weight:600;color:var(--text-mute);background:var(--surface-2);border-radius:999px;padding:1px 7px;min-width:22px;text-align:center;font-variant-numeric:tabular-nums;}
.tkx-nv.on .tkx-nv-n{background:var(--surface);color:var(--brand-blue);}
.tkx-nv.tone-warn .tkx-nv-n,.tkx-sp.tone-warn .tkx-nv-n{background:rgba(217,119,6,.12);color:var(--warn);}
.tkx-nv.tone-err .tkx-nv-n,.tkx-sp.tone-err .tkx-nv-n{background:rgba(220,38,38,.10);color:var(--err);}
/* under 1180px: the Queues as one sideways strip above the toolbar (tkxStripHtml); the rail is not drawn */
.tkx-strip{display:none;}
@media (max-width:1179px){
  .tkx-desk{grid-template-columns:minmax(0,1fr);}
  .tkx-nav-col{display:none;}
  .tkx-strip{display:flex;gap:6px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;margin:0 0 10px;padding:1px 1px 2px;}
  .tkx-strip::-webkit-scrollbar{display:none;}
}
.tkx-sp{appearance:none;flex:none;display:inline-flex;align-items:center;gap:7px;border:1px solid var(--line);background:var(--surface);border-radius:999px;padding:6px 12px;font:inherit;font-size:13px;font-weight:500;color:var(--text);cursor:pointer;white-space:nowrap;}
.tkx-sp:hover{border-color:var(--brand-blue);}
.tkx-sp.on{background:var(--accent-glow);border-color:var(--brand-blue);color:var(--brand-blue);font-weight:600;}
.tkx-sp .tkx-nv-ico svg{width:13px;height:13px;}
.tkx-sp.on .tkx-nv-ico{color:inherit;}
.tkx-sp .tkx-nv-t{overflow:visible;}
/* the record the list is narrowed to */
.tkx-ctx{display:flex;align-items:center;gap:10px 14px;flex-wrap:wrap;margin:0 0 12px;padding:10px 14px;border:1px solid var(--brand-blue);border-radius:10px;background:linear-gradient(120deg,rgba(var(--bc-accent-rgb),.07),rgba(var(--bc-accent-rgb),.02));}
.tkx-ctx-ico{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;flex:none;background:var(--surface);color:var(--brand-blue);border:1px solid var(--line);}
.tkx-ctx-ico svg{width:16px;height:16px;}
.tkx-ctx-t{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1 1 220px;}
.tkx-ctx-k{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--brand-blue);}
.tkx-ctx-v{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;min-width:0;}
.tkx-ctx-v b{font-size:15px;font-weight:600;letter-spacing:-.012em;color:var(--text);overflow-wrap:anywhere;}
.tkx-ctx-sub{font-size:12px;color:var(--text-mute);}
.tkx-ctx-n{font-size:12px;font-weight:600;color:var(--text-mute);white-space:nowrap;}
.tkx-ctx-acts{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-left:auto;}
.tkx-empty-acts{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-top:10px;}
/* beside the rail the toolbar has the main column only: Notifications and Export go to their icons (the title says
   which), and the search and the two selects give up some width, so the bar stays one line from 1280px */
@media (min-width:1180px) and (max-width:1599px){
  .tkx-desk .tkx-tb2 .tkx-btn-lbl{display:none;}
  .tkx-desk .tkx-tb2 .tkx-ico-btn{padding:0 10px;min-height:32px;}
}
@media (min-width:1180px){
  .tkx-desk .tkx-tb2 .tkx-search{flex:1 1 200px;min-width:180px;}
  .tkx-desk .tkx-tb2 .tkx-tb-selects .tkx-select{max-width:210px;}
}
/* the reference line: the asset chip and the conversation's length, beside .tkx-refline (which keeps its own text) */
.tkx-refrow{display:flex;align-items:center;min-width:0;}
.tkx-refrow .tkx-refline{flex:0 1 auto;min-width:0;}
.tkx-refrow .tkx-rl-ast,.tkx-refrow .tkx-rl-msgs{flex:none;}
.tkx-rl-ast{display:inline-flex;align-items:center;gap:4px;margin-left:6px;padding:0 6px;border:1px solid var(--line);border-radius:999px;background:var(--surface);color:var(--brand-blue);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;line-height:18px;cursor:pointer;vertical-align:baseline;text-decoration:none;}
.tkx-rl-ast:hover,.tkx-rl-ast:focus-visible{border-color:var(--brand-blue);outline:0;}
.tkx-rl-ast.off{color:var(--text-mute);cursor:default;}
.tkx-rl-ast svg{width:11px;height:11px;}
.tkx-rl-msgs{display:inline-flex;align-items:center;gap:3px;margin-left:6px;color:var(--text-dim);font-size:11px;font-variant-numeric:tabular-nums;}
.tkx-rl-msgs svg{width:11px;height:11px;}
/* the ticket's Connected card */
.tkc-row{display:flex;align-items:center;gap:6px;min-width:0;}
.tkc-row + .tkc-row{margin-top:4px;}
/* the label over the value: the side column is 360px and a room or asset name needs the row's width */
.tkc-go{appearance:none;flex:1;min-width:0;display:grid;grid-template-columns:18px minmax(0,1fr) auto;align-items:center;column-gap:9px;row-gap:1px;border:1px solid var(--line);border-radius:7px;padding:6px 9px;background:var(--surface);font:inherit;font-size:13px;color:var(--text);text-align:left;cursor:pointer;text-decoration:none;transition:border-color .12s,box-shadow .12s;}
.tkc-go:hover{border-color:var(--brand-blue);box-shadow:0 2px 8px rgba(var(--bc-accent-rgb),.08);}
.tkc-go.off{cursor:default;border-color:transparent;background:none;grid-template-columns:18px minmax(0,1fr);}
.tkc-go.off:hover{box-shadow:none;}
.tkc-ico{grid-row:1 / span 2;display:inline-flex;color:var(--text-dim);} .tkc-ico svg{width:14px;height:14px;}
.tkc-go:hover .tkc-ico{color:var(--brand-blue);}
.tkc-k{grid-column:2;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
.tkc-v{grid-column:2;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tkc-sub{display:block;font-size:11px;font-weight:400;color:var(--text-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tkc-sub .dot{margin-right:4px;}
.tkc-chev{grid-row:1 / span 2;grid-column:3;display:inline-flex;color:var(--text-dim);} .tkc-chev svg{width:14px;height:14px;}
.tkc-n{appearance:none;flex:none;border:1px solid var(--line);background:var(--surface-2);color:var(--text-mute);border-radius:999px;padding:3px 9px;font:inherit;font-size:11px;font-weight:600;cursor:pointer;white-space:nowrap;}
.tkc-n:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
.tkc-n.hot{background:rgba(217,119,6,.10);color:var(--warn);border-color:rgba(217,119,6,.3);}
/* the ticket's Related card: grouped */
.rel-grp + .rel-grp{margin-top:10px;padding-top:8px;border-top:1px solid var(--line);}
.rel-grp-h{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:0 0 2px;}
.rel-grp-h span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rel-grp-all{appearance:none;flex:none;display:inline-flex;align-items:center;gap:4px;border:0;background:none;color:var(--brand-blue);font:inherit;font-size:11px;font-weight:600;text-transform:none;letter-spacing:0;cursor:pointer;padding:2px 0;}
.rel-grp-all svg{width:12px;height:12px;}
.rel-grp-all:hover{text-decoration:underline;}
.rel-row .rel-ref{display:block;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:500;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;}
.rel-row:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;border-radius:4px;}
/* the room page's Open tickets head, the asset's Issues tab actions */
.loc-tkt-head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;}
.loc-tkt-acts{display:flex;gap:6px;flex-wrap:wrap;}
.ad-iss-acts{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px;}
@media (max-width:700px){
  .tkx-sp{min-height:40px;}
  .tkx-ctx{padding:10px 12px;}
  .tkx-ctx-acts{margin-left:0;width:100%;}
  .tkx-ctx-acts .btn{min-height:40px;flex:1 1 auto;justify-content:center;}
  .tkx-empty-acts .btn{min-height:40px;}
  .tkc-go{min-height:44px;}
  .tkc-n{min-height:40px;}
  .rel-grp-all{min-height:40px;}
  .loc-tkt-acts .btn,.ad-iss-acts .btn{min-height:40px;}
}

/* ═══ v1.4.10.508 — the ticket's side cards fold (js/06 tkdFold*), the New ticket form in three sections, the Notifications
   page's Recent rows open what they are about ═══ */
.tkd-fold-h{cursor:pointer;user-select:none;}
.tkd-fold-h:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
.tkd-fold-h::after{content:'';flex:none;width:7px;height:7px;margin:0 3px 3px 6px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);opacity:.55;transition:transform .15s;}
.sbx > .tkd-fold-h::after{color:var(--text-mute);}
.tkd-folded > .tkd-fold-h::after{transform:rotate(-45deg);margin-bottom:0;}
.sbx.tkd-folded > :not(.sbx-head){display:none!important;}
.sbx.tkd-folded > .sbx-head{border-bottom:0;}
.ast-card.tkd-folded > .ac-pic,.ast-card.tkd-folded > .ac-body{display:none!important;}
.sbx > .tkd-fold-h:hover h5{color:var(--text);}
@media (max-width:700px){ .tkd-fold-h{min-height:44px;} }
/* the New ticket form: two pickers to a row, then the site, room and space code */
.nt-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:0 12px;align-items:start;}
.nt-grid-3{grid-template-columns:minmax(0,1fr) minmax(0,1.3fr) minmax(0,1fr);}
.nt-opt{color:var(--text-dim);font-weight:400;}
.modal-nt .nt-section .field:last-child{margin-bottom:10px;}
.modal-nt .nt-path:empty{min-height:0;margin:0;}
@media (max-width:700px){ .nt-grid,.nt-grid-3{grid-template-columns:minmax(0,1fr);} }
/* the Notifications page's Recent list */
.nfp-feed-row[role="button"]{cursor:pointer;border-radius:6px;margin:0 -6px;padding-left:6px;padding-right:6px;}
.nfp-feed-row[role="button"]:hover{background:var(--surface-2);}
.nfp-feed-row[role="button"]:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
.nfp-feed-row.unread .nfp-feed-t{font-weight:600;}
@media (max-width:700px){ .nfp-feed-row[role="button"]{min-height:44px;} }

/* ═══ v1.4.10.513 / v1.4.10.514 — THE ASSETS PAGE, LAID OUT AGAIN (renderAssets / renderAssetHead, js/03-pages.js) ═══════
   Jay: "Do a massive restructure of the asset main page, lay it out differently, make it really easy to use for AV
   integrators. Lay it out perfectly." Then (v514): "Still needs to look way nicer, and structured even nicer, easy to use
   and everything makes sense, bug free, mobile friendly." Four bands: the HEAD (one white panel in two columns: the scope's
   mark, name and facts on the left; the actions and, under them, the status mix card on the right), the TABS as an
   underline bar attached under the head in three groups, WHAT NEEDS DOING (a named band of six tiles, every one a filter)
   and the REGISTER (one toolbar, the results bar, the rows). The dark hero, its donut and its Collapse button are gone.
   Every size is a step of the scale (TYPE SYSTEM, top of this sheet). */
/* v1.4.10.515: a grid — row 1 the identity (mark, eyebrow, name, address) and the actions; row 2 the facts and the status
   mix card; each row's two cells centred on each other, the right column as wide as its words need (the mix card wraps its
   legend before it can push past the panel) */
.ast-head{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"id actions" "facts mix";align-items:center;gap:12px 28px;
  background:var(--surface);border:1px solid var(--line);border-bottom:0;border-radius:var(--radius) var(--radius) 0 0;
  padding:16px 18px 14px;box-shadow:var(--shadow-sm);position:relative;}
.ast-head-row{grid-area:id;display:flex;align-items:center;gap:14px;min-width:0;}
.ast-actions{grid-area:actions;}
.ast-facts{grid-area:facts;}
.ast-mix{grid-area:mix;}
.ast-actions-none{display:none;}
.ast-mark{width:46px;height:46px;flex:none;font-size:15px;font-weight:700;letter-spacing:.04em;border-radius:var(--radius);}
.ast-mark.ast-mark-ico svg{width:22px;height:22px;stroke:#fff;}
.ast-id{flex:1 1 0;min-width:0;}
.ast-eyebrow{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-mute);line-height:1.4;max-width:100%;}
.ast-eyebrow svg{width:13px;height:13px;flex:none;color:var(--brand-blue);}
.ast-eyebrow .ah-orgpill{background:var(--surface-2);border:1px solid var(--line);color:var(--text-mute);border-radius:var(--r-ctl);
  font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;padding:1px 6px;margin-left:2px;}
.ast-title{margin:3px 0 0;font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.2;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ast-sub{font-size:12px;color:var(--text-mute);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ast-sub .mono{font-size:11px;}
/* the facts: a row of small figures, each with its word */
.ast-facts{display:flex;align-items:stretch;flex-wrap:wrap;gap:6px 0;margin-top:0;font-size:12px;color:var(--text-mute);min-width:0;}
.ast-fact{display:inline-flex;align-items:baseline;gap:4px;white-space:nowrap;}
.ast-fact b{font-size:15px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;letter-spacing:-.012em;}
.ast-fact + .ast-fact::before{content:"";align-self:center;width:1px;height:14px;background:var(--line-2);margin:0 12px;}
/* the right column: the actions, then the status mix card */
.ast-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:6px;min-width:0;}
.ast-actions .btn.sm{min-height:32px;white-space:nowrap;}
.ast-actions .btn.sm svg{width:14px;height:14px;}
/* two rows by design: the headline and the bar, then the legend under them (one line of four, however big the figures) */
.ast-mix{display:grid;grid-template-columns:auto minmax(120px,1fr);align-items:center;gap:5px 12px;justify-self:end;width:min(100%,520px);min-width:0;padding:8px 12px 9px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface-2);}
.ast-mix .ast-legend{grid-column:1 / -1;}
.ast-mix-head{display:inline-flex;align-items:baseline;gap:5px;flex:none;white-space:nowrap;}
.ast-mix-head b{font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1.25;color:var(--text);font-variant-numeric:tabular-nums;}
.ast-mix-head span{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.ast-bar{flex:1 1 90px;min-width:70px;height:10px;border-radius:5px;overflow:hidden;background:var(--surface-3,#E9EEF6);display:flex;gap:2px;}
.ast-bar > span{display:block;height:100%;min-width:3px;}
.ast-bar > span.ok{background:var(--ok);}
.ast-bar > span.spare{background:#94A3B8;}
.ast-bar > span.warn{background:var(--warn);}
.ast-bar > span.retired{background:var(--text-dim);}
.ast-legend{display:flex;align-items:center;flex-wrap:wrap;gap:4px 12px;flex:0 1 auto;min-width:0;font-size:12px;color:var(--text-mute);}
.ast-legend .lg{display:inline-flex;align-items:center;gap:5px;white-space:nowrap;}
.ast-legend .lg.zero{opacity:.55;}
.ast-legend .sw{width:9px;height:9px;border-radius:3px;flex:none;background:var(--text-dim);}
.ast-legend .lg.ok .sw{background:var(--ok);} .ast-legend .lg.spare .sw{background:#94A3B8;} .ast-legend .lg.warn .sw{background:var(--warn);}
.ast-legend .n{font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;}
/* the tabs: an underline bar attached under the head, three groups with a hairline between */
#content .seg.ast-tabs{display:flex;flex-wrap:wrap;align-items:stretch;gap:0;margin:0 0 16px;padding:0 10px;
  border:1px solid var(--line);border-radius:0 0 var(--radius) var(--radius);background:var(--surface);box-shadow:var(--shadow-sm);}
#content .seg.ast-tabs .seg-btn{position:relative;padding:12px 11px 11px;min-height:42px;border-radius:0;background:transparent;box-shadow:none;
  font-size:13px;font-weight:600;color:var(--text-mute);border-bottom:2px solid transparent;margin-bottom:-1px;}
#content .seg.ast-tabs .seg-btn:hover{color:var(--text);background:transparent;}
#content .seg.ast-tabs .seg-btn.active{color:var(--brand-blue);border-bottom-color:var(--brand-blue);background:transparent;box-shadow:none;}
#content .seg.ast-tabs .seg-btn.seg-help{margin-left:auto;color:var(--text-mute);font-weight:500;}
#content .seg.ast-tabs .seg-btn.seg-help:hover{color:var(--brand-blue);background:transparent;}
.seg-sep{width:1px;align-self:center;height:18px;background:var(--line-2);margin:0 8px;flex:none;}
/* a laptop (1280 to 1399 wide): the twelve tabs fit one row at 12/600 with 8px sides (at 13/600 and 11px Help & guide dropped to a second row) */
@media (max-width:1399px){ #content .seg.ast-tabs .seg-btn{padding:12px 8px 11px;font-size:12px;} .seg-sep{margin:0 5px;} }
.seg-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 6px;border-radius:9px;
  background:var(--warn);color:var(--on-warn,#1b1300);font-size:10px;font-weight:700;letter-spacing:.04em;margin-left:5px;font-variant-numeric:tabular-nums;}
/* the named band above the tiles */
.ast-sec{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 12px;margin:0 2px 8px;}
.ast-sec-t{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.ast-sec-t svg{width:13px;height:13px;color:var(--brand-blue);}
.ast-sec-s{font-size:12px;color:var(--text-dim);}
.ast-sec-link{margin-left:auto;background:none;border:0;padding:0;font-family:inherit;font-size:12px;font-weight:500;color:var(--brand-blue);cursor:pointer;}
.ast-sec-link:hover{text-decoration:underline;}
/* the six tiles */
.akpi-rail.ast-rail .akpi{padding:10px 12px 12px;}
.akpi-rail.ast-rail .akpi.sel .akpi-ico{box-shadow:0 0 0 2px var(--brand-blue) inset;}
/* the toolbar: search, four filters, More filters, Clear all | Sort, the view switch; a second row when opened */
.asset-toolbar.ast-tb{gap:8px;padding:10px 12px;margin-bottom:14px;}
.asset-toolbar.ast-tb .atb-search{flex:1 1 160px;min-width:160px;}
.asset-toolbar.ast-tb .atb-sel select{max-width:150px;width:100%;}
.asset-toolbar.ast-tb .atb-row2 .atb-sel select{max-width:200px;}
.asset-toolbar.ast-tb .atb-clear{padding:8px 4px;}
.asset-toolbar.ast-tb .atb-sel.atb-loc{min-width:150px;max-width:200px;flex:0 1 200px;}
.asset-toolbar.ast-tb .atb-spacer{flex:0 1 24px;}
/* v1.4.10.658 — Jay: "in the asset search bar, make the search bar easier to see". The box was the page's own background
   behind a hairline, the same grey as the four selects beside it, with a dim glass and a dim placeholder: now white on the
   toolbar, a stronger rounded border with a touch of depth, the glass in the brand colour, the placeholder in words
   ("Search assets…"), the widest control on the row (the laptop rule below still narrows it so the row stays one row), and
   a × that clears what was typed (shown while there is a query, the register narrowing as you type as before). */
.asset-toolbar.ast-tb .atb-search{flex:2 1 260px;min-width:240px;}
.asset-toolbar.ast-tb .atb-search input{background:var(--surface);border:1.5px solid var(--line-2);border-radius:8px;font-size:14px;padding-left:38px;box-shadow:inset 0 1px 2px rgba(15,23,42,.06);}
.asset-toolbar.ast-tb .atb-search input::placeholder{color:var(--text-mute);font-weight:500;opacity:1;}
.asset-toolbar.ast-tb .atb-search input:hover{border-color:var(--brand-blue);}
.asset-toolbar.ast-tb .atb-search input:focus{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.asset-toolbar.ast-tb .atb-search > svg{color:var(--brand-blue);width:17px;height:17px;left:13px;}
.asset-toolbar.ast-tb .atb-search .atb-x{position:absolute;right:7px;top:50%;transform:translateY(-50%);display:none;width:26px;height:26px;padding:0;border:0;border-radius:50%;background:var(--surface-2);color:var(--text-mute);cursor:pointer;align-items:center;justify-content:center;}
.asset-toolbar.ast-tb .atb-search .atb-x svg{position:static;transform:none;width:14px;height:14px;color:inherit;}
.asset-toolbar.ast-tb .atb-search .atb-x:hover{background:var(--line);color:var(--text);}
.asset-toolbar.ast-tb .atb-search.has-q .atb-x{display:inline-flex;}
.asset-toolbar.ast-tb .atb-search.has-q input{padding-right:40px;border-color:var(--brand-blue);}
/* a laptop (to 1399 wide): narrower pickers, so the row stays one row (measured at 1280: 1,257px of controls in a 1,196px
   row put the view switch on a second row). After the rules above, which it narrows. */
@media (max-width:1399px){ .asset-toolbar.ast-tb .atb-search{min-width:180px;flex-basis:180px;} .asset-toolbar.ast-tb .atb-sel select{max-width:140px;}
  .asset-toolbar.ast-tb .atb-sel.atb-loc{flex:0 1 150px;max-width:150px;min-width:130px;} .asset-toolbar.ast-tb .atb-more{padding:0 9px;} .asset-toolbar.ast-tb .atb-spacer{flex:0 1 8px;} }
.atb-more{display:inline-flex;align-items:center;gap:6px;padding:0 11px;height:36px;border:1px solid var(--line);border-radius:6px;
  background:var(--bg);color:var(--text-mute);font-family:inherit;font-size:13px;font-weight:500;cursor:pointer;white-space:nowrap;transition:all .14s;}
.atb-more svg{width:14px;height:14px;}
.atb-more:hover{color:var(--text);border-color:var(--line-2);}
.atb-more.on,.atb-more.has{border-color:var(--brand-blue);color:var(--brand-blue);background:var(--accent-glow);}
.atb-more-n{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;
  background:var(--brand-blue);color:#fff;font-size:10px;font-weight:700;font-variant-numeric:tabular-nums;}
.atb-row2{flex:1 1 100%;display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding-top:9px;margin-top:1px;border-top:1px dashed var(--line);}
.atb-row2-l{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);margin-right:2px;}
.atb-row2-l svg{width:13px;height:13px;}
.atb-row2-note{font-size:12px;color:var(--text-dim);}
.asset-toolbar.ast-tb .view-toggle button{gap:5px;padding:0 9px;}
.asset-toolbar.ast-tb .view-toggle button svg{width:15px;height:15px;}
.asset-toolbar.ast-tb .view-toggle .vt-l{font-size:12px;font-weight:600;}
/* the view switch says Grouped / Table / Cards only where the row has room for the words (measured: with them the
   switch is 248px and the row wraps at 1440; without, 110px and the search keeps 250px) */
@media (max-width:1499px){ .asset-toolbar.ast-tb .view-toggle .vt-l{display:none;} .asset-toolbar.ast-tb .view-toggle button{min-width:34px;} }
/* the results bar */
.ast-results{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;margin:0 0 12px;}
.ast-res-n{margin:0;font-size:15px;font-weight:600;letter-spacing:-.012em;color:var(--text);min-width:0;}
.ast-res-scope{font-weight:400;color:var(--text-mute);}
.ast-res-pg{font-weight:400;font-size:12px;color:var(--text-dim);}
.ast-res-val{font-size:12px;color:var(--text-mute);font-variant-numeric:tabular-nums;}
.ast-res-all{margin-left:auto;font-size:13px;}
/* a tablet: the three blocks stack (identity, then the actions and the mix across the width) */
@media (max-width:1099px){
  .ast-head{grid-template-columns:minmax(0,1fr);grid-template-areas:"id" "facts" "actions" "mix";gap:10px;}
  .ast-actions{justify-content:flex-start;}
  .ast-mix{justify-self:stretch;}
  .asset-toolbar.ast-tb .atb-sel select{max-width:160px;}
}
/* a phone: the head stacks, Add asset across the top of a grid of the other actions, the bar takes the width, the tabs scroll */
@media (max-width:700px){
  .ast-head{padding:14px 14px 12px;}
  .ast-mark{width:40px;height:40px;font-size:14px;}
  .ast-title{font-size:18px;white-space:normal;}
  .ast-sub{white-space:normal;}
  .ast-eyebrow{display:inline;white-space:normal;line-height:1.5;}
  .ast-eyebrow svg{vertical-align:-2px;margin-right:4px;}
  .ast-facts{margin-top:7px;gap:4px 0;}
  .ast-fact b{font-size:14px;}
  .ast-fact + .ast-fact::before{margin:0 9px;}
  /* Add asset across the top, the other actions sharing one row however many the role has (two, four…) */
  .ast-actions{display:flex;flex-wrap:wrap;gap:6px;}
  .ast-actions .btn.sm{flex:1 1 calc(25% - 6px);min-width:72px;min-height:40px;justify-content:center;padding:6px 2px;gap:4px;font-size:12px;}   /* v1.4.10.515: "Quick add" spilled 2px at 390 with 4px sides and a 6px gap */
  .ast-actions .btn.sm svg{flex:none;}
  .ast-actions .btn.primary{flex:1 1 100%;order:-1;font-size:13px;}
  /* the headline and the bar share a line, the legend is the line under them */
  .ast-mix{flex-wrap:wrap;gap:7px 10px;padding:8px 10px;}
  .ast-mix-head b{font-size:18px;}
  .ast-bar{flex:1 1 120px;height:12px;}
  .ast-legend{flex:1 1 100%;gap:4px 9px;font-size:11px;}
  .ast-legend .lg{gap:4px;}
  #content .seg.ast-tabs{flex-wrap:nowrap;padding:0 6px;}
  #content .seg.ast-tabs .seg-btn{min-height:44px;padding:12px 10px 11px;}
  #content .seg.ast-tabs .seg-btn.seg-help{margin-left:4px;}
  .seg-sep{display:none;}
  .ast-sec{margin-bottom:8px;}
  .ast-sec-s{display:none;}
  .atb-more{min-height:40px;flex:1 1 calc(50% - 4px);justify-content:center;}
  .atb-row2 .atb-sel{flex:1 1 calc(50% - 4px);min-width:0;}
  .atb-row2 .atb-sel select{width:100%;height:40px;}
  .atb-row2-l{flex:1 1 100%;}
  .asset-toolbar.ast-tb .atb-search{flex:1 1 100%;min-width:0;}   /* the whole width: half of it cut the placeholder (probe: 178 > 113px) */
  .asset-toolbar.ast-tb .atb-sel.atb-loc{flex:1 1 calc(50% - 4px);min-width:0;max-width:none;}
  .asset-toolbar.ast-tb .atb-sel select{max-width:none;}
  .asset-toolbar.ast-tb .atb-sel.atb-sort{flex:1 1 calc(50% - 4px);}
  .asset-toolbar.ast-tb .view-toggle{flex:1 1 100%;order:0;}
  .asset-toolbar.ast-tb .view-toggle button{flex:1;}
  .asset-toolbar.ast-tb .view-toggle .vt-l{display:none;}
  .ast-results{gap:6px 10px;}
  .ast-res-all{margin-left:0;flex:1 1 100%;min-height:40px;}
}

/* ═══ v1.4.10.515 — THE ASSET WINDOW'S HEAD, WHITE AND IN ROWS (asd-hero-v2; openAsset in js/05-assets.js) ═══════════════
   Jay: "the popout window on the asset doesnt look nice, make a nicer popout window". The head was the navy band: a 150px
   photo, white-on-navy pills, a 140px code, five or six buttons wrapping to three rows, 256px tall at a desk and 410px at
   800 wide. It is now the look of the Assets page head: a white panel in rows — the photo, the tag, status and condition,
   the make and model, the type and serial, the place; then ONE row with the facts (connection, values, warranty, assignee)
   on the left and the actions on the right, Edit as the primary; the code to scan in the corner at 96px. About 170px at
   a desk. The band's navy tokens are put back to the page's own here (the band sets them on .ah-head; this is more
   specific), so every pill, button and chip inside follows. The phone rules of v177 / v201 / v438 still apply to
   .ah-head.asd-hero and are kept; what they assumed of the flex row is re-stated for the grid below. */
.ah-head.asd-hero-v2{
  --text:#0C1B2A; --text-mute:#46596B; --text-dim:#75899B; --line:#DEE5EC; --line-2:#C3CEDA;
  --surface:#FFFFFF; --surface-2:#F4F7FA; --surface-3:#E9EEF4; --bg:#F4F7FA; --navy-3:#F4F7FA;
  --brand-blue:var(--bc-accent); --accent:var(--bc-accent); --accent-glow:rgba(var(--bc-accent-rgb),.09); --accent-soft:var(--bc-accent-soft);
  --ok:#16A34A; --warn:#D97706; --err:#DC2626; --on-warn:#1b1300;
  background:var(--brand-grad) top left/100% 3px no-repeat,#FFFFFF;color:var(--text);border-color:var(--line);border-bottom:1px solid var(--line);
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto auto auto auto auto auto;
  column-gap:16px;row-gap:0;align-items:start;padding:18px 18px 14px 20px;position:relative;}
.ah-head.asd-hero-v2 .ah-main{display:contents;}
.ah-head.asd-hero-v2 .ah-thumb.xl{grid-column:1;grid-row:1 / 5;width:96px;height:96px;border-radius:var(--radius);align-self:start;
  background:var(--surface-2);border:1px solid var(--line);box-shadow:none;color:var(--text-dim);}
.ah-head.asd-hero-v2 .ah-thumb.xl:hover{transform:none;box-shadow:var(--shadow-sm);border-color:var(--line-2);}
.ah-head.asd-hero-v2 .ah-thumb.xl svg{width:30px;height:30px;stroke:var(--text-dim);opacity:1;}
.ah-head.asd-hero-v2 .ah-thumb.xl img{width:100%;height:100%;object-fit:contain;border-radius:inherit;background:#fff;}
.ah-head.asd-hero-v2 .ah-thumb-add{color:var(--text-mute);background:var(--surface);border:1px solid var(--line);font-size:10px;}
.ah-head.asd-hero-v2 .ah-tagrow{grid-column:2 / 4;grid-row:1;margin:2px 0 6px;padding-right:120px;}
.ah-head.asd-hero-v2 .ah-tag{background:var(--accent-glow);color:var(--brand-blue);margin:0;}
.ah-head.asd-hero-v2 .ah-statuspill{background:var(--surface-2);border-color:var(--line);color:var(--text);}
.ah-head.asd-hero-v2 .ah-statuspill svg{stroke:currentColor;}
.ah-head.asd-hero-v2 .ah-statuspill.ok{background:rgba(22,163,74,.12);border-color:rgba(22,163,74,.3);color:var(--ok);}
.ah-head.asd-hero-v2 .ah-statuspill.warn{background:rgba(217,119,6,.12);border-color:rgba(217,119,6,.32);color:var(--warn);}
.ah-head.asd-hero-v2 .ah-statuspill.err{background:rgba(220,38,38,.1);border-color:rgba(220,38,38,.3);color:var(--err);}
.ah-head.asd-hero-v2 .ah-condpill{background:var(--surface-2);border:1px solid var(--line);color:var(--text-mute);}
.ah-head.asd-hero-v2 .ah-title{grid-column:2 / 4;grid-row:2;color:var(--text);font-size:20px;letter-spacing:-.024em;line-height:1.2;padding-right:120px;}
.ah-head.asd-hero-v2 .ah-cat-link{border-bottom-color:var(--line-2);}
.ah-head.asd-hero-v2 .ah-cat-link:hover{border-bottom-color:var(--brand-blue);color:var(--brand-blue);}
.ah-head.asd-hero-v2 .ah-mfr-logo{border:1px solid var(--line);}
.ah-head.asd-hero-v2 .ah-sub{grid-column:2 / 4;grid-row:3;color:var(--text-mute);opacity:1;margin-top:4px;padding-right:120px;}
.ah-head.asd-hero-v2 .ah-breadcrumb{grid-column:2 / 4;grid-row:4;color:var(--text-mute);margin-top:6px;padding-right:120px;}
.ah-head.asd-hero-v2 .ah-bc-sep{opacity:.6;}
.ah-head.asd-hero-v2 .ah-bc-code{background:var(--surface-2);border-color:var(--line);color:var(--text-mute);}
/* row 5: the facts and the actions on one line, under a hairline */
.ah-head.asd-hero-v2 .ah-quickstats{grid-column:1 / 4;grid-row:5;display:flex;align-items:stretch;flex-wrap:wrap;gap:8px 0;min-width:0;margin:14px 0 0;padding-top:12px;border-top:1px solid var(--line);align-self:center;}
.ah-head.asd-hero-v2 .ah-qs{padding:0 16px 0 0;margin-right:16px;border-right:1px solid var(--line);}
.ah-head.asd-hero-v2 .ah-qs:last-child{border-right:0;margin-right:0;padding-right:0;}
.ah-head.asd-hero-v2 .ah-qs .v{font-size:16px;font-weight:600;color:var(--text);line-height:1.25;}
.ah-head.asd-hero-v2 .ah-qs .l{color:var(--text-mute);opacity:1;margin-top:2px;}
/* row 6: the actions, left to right under the facts (one line at a desk, wrapping only on a narrow window) */
.ah-head.asd-hero-v2 .ah-actions{grid-column:1 / 4;grid-row:6;justify-content:flex-start;margin:10px 0 0;}
.ah-head.asd-hero-v2 .ah-actions .btn.sm{min-height:32px;white-space:nowrap;}
/* the band's white ghost buttons (.ah-actions .btn, white on navy) were white on white here: the page's own button */
.ah-head.asd-hero-v2 .ah-actions .btn{background:var(--surface);border:1px solid var(--line-2);color:var(--text);box-shadow:var(--shadow-sm);}
.ah-head.asd-hero-v2 .ah-actions .btn:hover{background:var(--surface-2);border-color:var(--line-2);}
.ah-head.asd-hero-v2 .ah-actions .btn svg{stroke:currentColor;}
.ah-head.asd-hero-v2 .ah-actions .btn.primary{background:var(--grad);border:1px solid transparent;background-origin:border-box;color:#fff;font-weight:600;box-shadow:0 1px 2px rgba(var(--bc-accent-rgb),.3);}
.ah-head.asd-hero-v2 .ah-actions .btn.primary svg{stroke:#fff;}

/* the code in the corner, before the close button */
.ah-head.asd-hero-v2 .ah-qr{position:absolute;top:16px;right:62px;align-self:auto;padding:0;gap:4px;}
.ah-head.asd-hero-v2 .ah-qr:hover{transform:translateY(-1px);}
.ah-head.asd-hero-v2 .ah-qr-box{width:92px;height:92px;padding:5px;border:1px solid var(--line);box-shadow:var(--shadow-sm);}
.ah-head.asd-hero-v2 .ah-qr.is-barcode .ah-qr-box{width:200px;min-height:66px;padding:8px 10px;}
.ah-head.asd-hero-v2 .ah-qr-cap{color:var(--text-mute);font-size:10px;}
.ah-head.asd-hero-v2 .ah-qr-cap svg{stroke:var(--text-mute);}
.ah-head.asd-hero-v2 > .close{color:var(--text-mute);}
.ah-head.asd-hero-v2 > .close:hover{color:var(--text);background:var(--surface-2);}
.ah-head.asd-hero-v2 .ah-thumb-zoom{background:rgba(15,23,42,.62);}
/* a phone or a touch screen (the v177/v201/v438 rules on .ah-head.asd-hero still apply: the code is hidden, the actions one
   swipeable row of icons, the title two lines); the grid's columns and rows re-stated for the compact head */
@media (max-width:680px), (hover:none) and (pointer:coarse) and (max-width:1100px){
  .ah-head.asd-hero-v2{grid-template-columns:auto minmax(0,1fr);padding:14px 14px 12px;column-gap:12px;}
  .ah-head.asd-hero-v2 .ah-thumb.xl{width:60px;height:60px;border-radius:8px;}
  .ah-head.asd-hero-v2 .ah-thumb.xl svg{width:22px;height:22px;}
  .ah-head.asd-hero-v2 .ah-tagrow,.ah-head.asd-hero-v2 .ah-title,.ah-head.asd-hero-v2 .ah-sub,.ah-head.asd-hero-v2 .ah-breadcrumb{padding-right:40px;}
  .ah-head.asd-hero-v2 .ah-title{font-size:18px;}
  .ah-head.asd-hero-v2 .ah-quickstats{grid-column:1 / 4;grid-row:5;margin-top:10px;padding-top:10px;}
  .ah-head.asd-hero-v2 .ah-qs .v{font-size:14px;}
  .ah-head.asd-hero-v2 .ah-actions{grid-column:1 / 3;grid-row:6;margin-top:10px;padding-top:0;border-top:0;justify-content:flex-start;}
}

/* ══════════ v1.4.10.516: the Terms and Conditions card on the sign-in stage (#panel-terms; termsGateShow in js/02-editors.js) ══════════
   The public terms page itself (copyright.html?embed=1) in a frame tall enough to read, the tick box, Agree and continue. */
#login .tg-doc{border:1px solid var(--lg-line,#DEE5EC);border-radius:10px;overflow:hidden;background:#fff;height:min(28vh,230px);min-height:150px;margin:0 0 8px;box-shadow:inset 0 1px 3px rgba(12,27,42,.06);}   /* v1.4.10.520: much smaller (was 46vh / 420px): the document scrolls inside it */
#login .tg-doc iframe{display:block;width:100%;height:100%;border:0;background:#fff;}
#login .tg-meta{font-size:12px;color:var(--lg-ink-2,#75899B);margin:0 0 12px;line-height:1.5;}
#login .tg-agree{display:flex;align-items:flex-start;gap:10px;font-size:13px;line-height:1.5;margin:0 0 14px;cursor:pointer;}
#login .tg-agree input{margin-top:3px;flex:none;width:18px;height:18px;}
#login .login-btn:disabled{opacity:.55;cursor:not-allowed;box-shadow:none;}
#login #panel-terms .login-form .sub,#login #panel-terms .sub{margin-bottom:14px;}
@media (max-width:600px){
  #login .tg-doc{height:min(26vh,200px);}   /* v1.4.10.520 */
}
/* v1.4.10.518: the terms accepted, under the role in the Users list (userTermsTag in js/03-pages.js) */
.ua-terms{margin-top:3px;white-space:nowrap;color:var(--text-mute);}
.ua-terms svg{vertical-align:-2px;stroke:var(--ok);}
.ua-terms.off{color:var(--warn);}
.ua-terms.off svg{stroke:var(--warn);}
/* the Terms and Conditions row on the user profile (userTermsRow in js/03-pages.js) */
.up-scope-row.up-terms .up-scope-v{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;}
.up-terms-meta{display:inline-block;max-width:100%;}

/* ══════════ v1.4.10.516: Sender protection (Settings > Email; loadMailDomainCheck in js/04-settings.js) ══════════ */
.sp-intro{margin:0 0 14px;font-size:13px;color:var(--text-mute);line-height:1.7;}
.sp-dom{border:1px solid var(--line);border-radius:10px;margin:0 0 12px;overflow:hidden;background:var(--surface);}
.sp-dom-h{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:12px 14px;background:var(--surface-2);border-bottom:1px solid var(--line);}
.sp-dom-name{font-weight:600;font-size:14px;color:var(--text);}
.sp-row{padding:12px 14px;border-bottom:1px solid var(--line);}
.sp-row:last-child{border-bottom:0;}
.sp-row-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 6px;}
.sp-row-k{font-weight:600;font-size:13px;color:var(--text);min-width:52px;}
.sp-row-cur code{display:block;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;line-height:1.5;padding:7px 10px;background:var(--surface-2);border:1px solid var(--line);border-radius:8px;color:var(--text);word-break:break-all;white-space:pre-wrap;}
.sp-row-cur .muted{font-size:12px;color:var(--text-dim);}
.sp-row-note{margin:6px 0 0;font-size:13px;color:var(--text-mute);line-height:1.6;}
.sp-row-note code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;background:var(--surface-2);border:1px solid var(--line);border-radius:5px;padding:1px 5px;word-break:break-all;}
.sp-rec{margin:10px 0 0;padding:10px 12px;border:1px dashed var(--line-2);border-radius:10px;background:linear-gradient(120deg,rgba(var(--bc-accent-rgb),.04),rgba(var(--bc-purple-rgb),.05));}
.sp-rec-h{font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-mute);margin:0 0 8px;}
.sp-rec-grid{display:grid;grid-template-columns:52px minmax(0,1fr);gap:6px 10px;align-items:start;font-size:12px;color:var(--text-dim);}
.sp-rec-grid code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;line-height:1.5;color:var(--text);word-break:break-all;white-space:pre-wrap;background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:4px 8px;}
.sp-rec-grid span{padding-top:5px;}
.sp-rec-act{display:flex;gap:6px;flex-wrap:wrap;margin:8px 0 0;}
.sp-steps,.sp-inbound{margin:14px 0 0;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface);}
.sp-steps .fs-title,.sp-inbound .fs-title{margin:0 0 8px;}
.sp-steps ol,.sp-inbound ul{margin:0;padding-left:20px;font-size:13px;color:var(--text-mute);line-height:1.65;}
.sp-steps li,.sp-inbound li{margin:4px 0;}
.sp-steps code,.sp-inbound code{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:12px;background:var(--surface-2);border:1px solid var(--line);border-radius:5px;padding:1px 5px;word-break:break-all;}
@media (max-width:600px){
  .sp-rec-grid{grid-template-columns:1fr;gap:2px;}
  .sp-rec-grid span{padding-top:6px;}
}

/* ══════════ v1.4.10.539: THE HEADER ══════════════════════════════════════════════════════════════════════════════
   Jay: "Go over the header area, make sure it looks amazing, for admin / integration / site admins / clients / asset
   library users. Ease of use, make sure its structured well so its easy to navigate to everywhere you need on the site."
   Row 1, the brand bar: the wordmark and the portal's name (one per role: a Site Admin read "Admin Portal", an Asset
   Library account "Client Portal") · search · the SCOPE PATH (the integrator, client and site pickers as one control
   behind a focus glyph, the tier in focus tinted) · Contact integrator (a client's people) · sounds · the bell · the
   ACCOUNT MENU (the avatar, name and role are one button: My profile, Preferences or Settings, Notifications, Help &
   guide, Terms, Sign out; the sign-out button left the bar). Row 2, the nav: the same groups, every menu naming its
   group and saying in a line what each page is for (data-desc, drawn by ::after so a battery reading textContent still
   sees the label alone), rows that take the keyboard, and "+ New" at the right end (a ticket, an asset, a task, a job,
   a client, a user). A phone: the avatar stays on row 1 beside the bell, the pickers take rows 2 and 3 on their own,
   the drawer opens with a Create section. Every id the app and the batteries read is unchanged (js/02-editors.js:
   portalLabel, acctMenuRender, navQuickActions, navDesc). */
/* ── the scope path: three pickers joined behind one glyph ── */
/* The group's floor is its visible pickers' floors (112px each, v1.4.10.473) plus the glyph: a flex item's own minimum would
   be its widest option (514px), and none at all let the bar squeeze the group under its pickers (measured at 915: the
   site picker drawn over the sound button). The glyph goes at 1180px and below, where the brand text goes too, so the
   floor is the three pickers of old. */
.scope-group{display:inline-flex;align-items:center;flex:0 1 auto;--sico:34px;min-width:calc(var(--sico) + 112px);}
.scope-group:has(.cust-picker:not([style*="none"])){min-width:calc(var(--sico) + 223px);}
.scope-group:has(.intg-picker:not([style*="none"])){min-width:calc(var(--sico) + 334px);}
.scope-ico{display:inline-flex;align-items:center;justify-content:center;width:34px;align-self:stretch;flex:none;box-sizing:border-box;
  border:1px solid var(--line-2);border-right:0;border-radius:var(--r-ctl) 0 0 var(--r-ctl);background:var(--surface-2);color:var(--text-dim);transition:color .14s;}
.scope-ico svg{width:15px;height:15px;}
.scope-group .site-picker{border-radius:0;margin-left:-1px;position:relative;-webkit-appearance:none;appearance:none;padding-right:30px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2375899B' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 9px center;background-size:12px 12px;}
.scope-group .site-picker:last-child{border-radius:0 var(--r-ctl) var(--r-ctl) 0;}
@media (hover:hover){ .scope-group .site-picker:hover{border-color:var(--text-dim);z-index:1;} }   /* a mouse only: iOS keeps :hover on the last tapped control */
.scope-group .site-picker:focus{z-index:2;}
.scope-group .site-picker.scoped{z-index:1;background-color:var(--accent-soft);color:var(--brand-blue);border-color:var(--brand-blue);font-weight:600;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231B44C9' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");}
@media (hover:hover){ .scope-group:hover .scope-ico{color:var(--text-mute);} }
.scope-group:focus-within .scope-ico{color:var(--brand-blue);--ico-ac:var(--brand-purple);}
.scope-group:has(.scoped) .scope-ico{color:var(--brand-blue);--ico-ac:var(--brand-purple);}   /* one selector per rule: a browser without :has() (Safari before 15.4) drops a whole list that holds one */
/* 761-1180 (the brand text is gone here too): no glyph, so the group's floor is the three pickers of old; the first picker
   shown takes the rounded left edge the glyph had (after the glyph's own rules above, or they would win the cascade) */
@media(min-width:761px) and (max-width:1180px){
  .scope-ico{display:none;}
  .scope-group{--sico:0px;}
  .scope-group .intg-picker:not([style*="none"]){border-radius:var(--r-ctl) 0 0 var(--r-ctl);margin-left:0;}
  .scope-group:has(.intg-picker[style*="none"]) .cust-picker:not([style*="none"]){border-radius:var(--r-ctl) 0 0 var(--r-ctl);margin-left:0;}
  .scope-group:has(.intg-picker[style*="none"]):has(.cust-picker[style*="none"]) #site-picker{border-radius:var(--r-ctl);margin-left:0;}
}
/* the search's glyph sits on the field's centre line (the span's own line box held the 14px drawing 2.5px high) */
.search-box .search-ico{display:inline-flex;align-items:center;line-height:0;}
a.mnav-row{text-decoration:none;-webkit-tap-highlight-color:transparent;}
/* ── a menu in two parts: a sub-heading (NAV item sub:) before the first row of the second part ── */
.nav-dd-sub{font-family:var(--font-display);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);
  padding:9px 10px 4px;margin-top:5px;border-top:1px solid var(--line);}
.mnav-sub{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);padding:10px 8px 4px;margin-top:4px;border-top:1px solid var(--line);}
/* ── a phone held sideways with a notch (viewport-fit=cover): the header keeps clear of it at every width, as the
      phone's upright rules already do under 600px (the 601-1180 gutters are 20px, the notch is 44-59px) ── */
@supports(padding:max(0px)){
  @media(min-width:601px) and (max-width:1180px){
    .topbrand-inner{padding-left:max(20px,env(safe-area-inset-left));padding-right:max(20px,env(safe-area-inset-right));}
    .topnav{padding-left:max(8px,env(safe-area-inset-left));padding-right:max(8px,env(safe-area-inset-right));}
  }
  @media(min-width:601px) and (max-width:920px){
    .topbrand-inner{padding-left:max(16px,env(safe-area-inset-left));padding-right:max(16px,env(safe-area-inset-right));}
    .topnav{padding-left:max(4px,env(safe-area-inset-left));padding-right:max(4px,env(safe-area-inset-right));}
  }
}
/* ── one header block: the brand bar and the nav share one hairline and a soft edge over the page (the rule between them
      is gone); position:relative paints the edge over the page's own background without a stacking context, so the menus
      keep their place above everything on the page ── */
.topbrand{border-bottom:0;}
.topnav{position:relative;border-bottom:1px solid var(--line);box-shadow:0 10px 22px -18px rgba(12,27,42,.45);}
@media(max-width:760px){ .topbrand{border-bottom:1px solid var(--line);box-shadow:0 10px 22px -18px rgba(12,27,42,.45);} }   /* the nav is the drawer: the brand bar carries the edge */
/* ── the action cluster: Contact, the phone's search, sounds and the bell as one group (8px apart) before the account ── */
.tb-actions{display:inline-flex;align-items:center;gap:8px;flex:none;}
@media(max-width:760px){ .tb-actions{display:contents;} }
/* the 40px floor as a minimum too: Chromium kept the bell's old 36px flex basis when the window crossed 920px with the
   buttons inside the display:contents group (measured 36 x 40 after a resize; the sound button, which had the floor, 40) */
@media(max-width:920px){ .topbrand .icon-btn{min-width:40px;} }
/* ── the menus open with a short rise; none for anyone who asked for less motion ── */
@keyframes avMenuIn{from{opacity:0;transform:translateY(-4px);}to{opacity:1;transform:none;}}
.nav-dd.open .nav-dd-menu,.acct-menu.open{animation:avMenuIn .14s var(--av-ease);}
@media (prefers-reduced-motion:reduce){ .nav-dd.open .nav-dd-menu,.acct-menu.open{animation:none;} }
/* ── touch: no grey flash on a tap, no double-tap zoom on the header's controls ── */
.acct-btn,.acct-item,.mnav-qa-btn,.scope-group .site-picker,.nav-new .nav-dd-trigger{-webkit-tap-highlight-color:transparent;touch-action:manipulation;}
/* 761-880, one row with the search behind its magnifier: the group grows into what the buttons leave (a zero basis, so the
   open search row never makes the avatar wrap; min-width:auto keeps the pickers' 92px floors) */
@media(min-width:761px) and (max-width:880px){
  /* a basis of the pickers' floors (3 x 92 + the glyph), never auto: a select's own minimum is its widest option, which made
     the group 514px and sent the avatar to a second row; the spacer gives its share up, so the pickers take all the room
     between the wordmark and the buttons (measured at 761: the group squeezed to 202px with the spacer growing beside it) */
  .scope-group{flex:1 1 310px;}
  .topbrand .tb-spacer{flex:0 0 0;min-width:0;}
}
@media(min-width:601px) and (max-width:920px){ .acct-btn{height:40px;} }   /* one row height with the 40px buttons beside it */
/* 601-760, the two-row header: the three pickers take the second row together (the group is a wrapping row of its own,
   after the buttons, so the integrator picker no longer rides the first row beside the avatar); a client's Contact
   button keeps row 1 */
@media(min-width:601px) and (max-width:760px){
  .scope-group{display:flex;flex-wrap:wrap;flex:0 0 100%;gap:8px;min-width:0;order:5;}
  .scope-ico{display:none;}
  .scope-group .site-picker,.scope-group .site-picker:last-child{border-radius:var(--r-ctl);margin-left:0;}
  .topbrand .intg-btn{order:0;}
}
@media(max-width:600px){   /* the phone header: each picker on the rows v1.4.10.473 gave it */
  .scope-group{display:contents;}
  .scope-ico{display:none;}
  .scope-group .site-picker,.scope-group .site-picker:last-child{border-radius:var(--r-ctl);margin-left:0;}
  /* row 1 holds the menu, the wordmark, search, sounds, the bell and the avatar at 360px: 8px gaps and a 20px wordmark
     (18 under 400px); measured 378px of 366 with 10px gaps and the 21px mark, which sent the avatar to the pickers' row */
  .topbrand-inner{gap:8px;}
  .topbrand .logo-mark img.av-wordmark{height:20px;}
  /* the site picker keeps a row of its own under the integrator and client pickers (v1.4.10.473 gave it flex:1 1 0
     beside the avatar block, which has left that row: at a zero basis it squeezed into the 68px the other two left) */
  .topbrand .intg-picker:not(:empty):not([style*="none"]) ~ #site-picker{flex:1 1 100%;}
}
@media(max-width:400px){ .topbrand .logo-mark img.av-wordmark{height:18px;} }
/* ── the account button and its menu ── */
.topbrand .user-foot{position:relative;gap:0;}
.acct-btn{display:inline-flex;align-items:center;gap:10px;height:36px;max-width:280px;min-width:0;padding:0 6px 0 0;border:1px solid transparent;border-radius:var(--r-ctl);
  background:transparent;color:var(--text);cursor:pointer;font-family:inherit;font-size:13px;text-align:left;transition:background .14s,border-color .14s;-webkit-appearance:none;appearance:none;}
.acct-btn .user-info .un,.acct-btn .user-info .ur{display:block;}   /* spans (a button holds no div): each its own line */
@media (hover:hover){ .acct-btn:hover{background:var(--surface-2);border-color:var(--line-2);} }   /* a mouse only: a tap that closed the menu left iOS's :hover tint on the button */
.acct-btn[aria-expanded="true"]{background:var(--surface-2);border-color:var(--line-2);}
.acct-btn:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
.acct-btn .avatar{width:34px;height:34px;flex:none;}
.acct-btn .user-info{min-width:0;line-height:1;}
.acct-btn .user-info .un{line-height:20px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.acct-btn .user-info .ur{line-height:14px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.acct-caret{display:inline-flex;width:12px;height:12px;color:var(--text-dim);flex:none;transition:transform .15s;}
.acct-caret svg{width:12px;height:12px;}
.acct-btn[aria-expanded="true"] .acct-caret{transform:rotate(180deg);}
.acct-menu{position:fixed;top:0;left:0;z-index:200;width:292px;max-width:calc(100vw - 16px);max-height:calc(100vh - 76px);max-height:calc(100dvh - 76px);overflow-y:auto;overscroll-behavior:contain;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 18px 44px rgba(12,27,42,.14);padding:6px;display:none;}
.acct-menu.open{display:block;}
.acct-head{display:flex;align-items:center;gap:11px;padding:10px 10px 12px;border-bottom:1px solid var(--line);margin:0 0 6px;}
.acct-head .avatar{width:40px;height:40px;font-size:14px;flex:none;}
.acct-head-t{min-width:0;}
.acct-head-name{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.acct-head-sub{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.acct-head-mail{font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px;}
.acct-item{display:flex;align-items:center;gap:11px;width:100%;box-sizing:border-box;padding:7px 10px;border:0;border-radius:var(--r-ctl);background:transparent;
  color:var(--text);font-family:inherit;font-size:13px;font-weight:500;line-height:1.25;text-align:left;text-decoration:none;cursor:pointer;transition:background .12s;}
.acct-item:hover,.acct-item:focus-visible{background:var(--surface-2);color:var(--text);outline:none;text-decoration:none;}
.acct-ico{width:28px;height:28px;border-radius:6px;background:var(--surface-2);display:inline-flex;align-items:center;justify-content:center;color:var(--text-mute);flex:none;transition:background .12s,color .12s;}
.acct-ico svg{width:16px;height:16px;}
.acct-item:hover .acct-ico,.acct-item:focus-visible .acct-ico{background:var(--accent-soft);color:var(--brand-blue);--ico-ac:var(--brand-purple);}
.acct-l{display:flex;flex-direction:column;min-width:0;}
.acct-l small{font-size:11px;font-weight:400;color:var(--text-mute);margin-top:1px;line-height:1.3;}
.acct-sep{height:1px;background:var(--line);margin:6px 4px;}
.acct-signout:hover,.acct-signout:focus-visible{background:rgba(228,87,76,.08);color:var(--err);}
.acct-signout:hover .acct-ico,.acct-signout:focus-visible .acct-ico{background:rgba(228,87,76,.12);color:var(--err);}
@media(max-width:1360px){ .acct-btn{padding-right:4px;} }
@media(max-width:760px){
  .acct-caret{display:none;}
  .acct-btn{padding:0;border:0;height:auto;gap:0;}
  .acct-btn:hover,.acct-btn[aria-expanded="true"]{background:transparent;}
}
@media(max-width:600px){
  /* the avatar stays on row 1 beside the bell (v1.4.10.473 sent the avatar + sign-out block down beside the site picker:
     sign-out is in the menu now, and the avatar alone fits the first row) */
  .topbrand:has(.intg-picker:not(:empty):not([style*="none"])) .user-foot{order:0;}
}
/* ── the primary nav: text in line with the wordmark, menus that say what each page is for, "+ New" at the right ── */
.topnav{padding:7px 18px;scrollbar-width:none;}   /* the strip scrolls sideways on a tablet with no bar drawn (the ::-webkit rule of old meant this; Chromium 121+ reads scrollbar-width first) */
@media(max-width:1180px){ .topnav{padding:7px 8px;} }
@media(max-width:920px){ .topnav{padding:7px 4px;} }
/* 761-900: the five groups and + New fit a tablet's landscape row: tighter triggers, the New button its plus alone */
@media(min-width:761px) and (max-width:900px){
  .nav-dd-trigger,.nav-item{padding:8px 8px;gap:6px;}
  .nav-new .nav-new-l,.nav-new .nav-dd-caret{display:none;}
  .nav-new .nav-dd-trigger{padding:7px 8px;gap:0;}
}
.nav-item:focus-visible,.nav-dd-trigger:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
.nav-dd-trigger{gap:8px;}
.nav-dd-menu{min-width:284px;max-width:min(372px,calc(100vw - 16px));padding:6px;gap:1px;}
.nav-dd-head{font-family:var(--font-display);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);padding:6px 10px 5px;}
.nav-dd-item{display:grid;grid-template-columns:28px minmax(0,1fr) auto;grid-template-areas:"ico label badge" "ico desc badge";column-gap:11px;row-gap:1px;align-items:center;
  padding:7px 10px;white-space:normal;color:var(--text);}
.nav-dd-item .ico{grid-area:ico;width:28px;height:28px;border-radius:6px;background:var(--surface-2);color:var(--text-mute);display:inline-flex;align-items:center;justify-content:center;transition:background .12s,color .12s;}
.nav-dd-item .ico svg{width:16px;height:16px;}
.nav-dd-item .ndl{grid-area:label;font-size:13px;font-weight:500;line-height:1.2;}
.nav-dd-item .nav-badge{grid-area:badge;margin-left:0;align-self:center;}
.nav-dd-item[data-desc]::after{content:attr(data-desc);grid-area:desc;font-size:11px;font-weight:400;color:var(--text-mute);line-height:1.35;}
.nav-dd-item:hover,.nav-dd-item:focus-visible{background:var(--surface-2);color:var(--text);outline:none;}
.nav-dd-item:hover .ico,.nav-dd-item:focus-visible .ico{background:var(--accent-soft);color:var(--brand-blue);--ico-ac:var(--brand-purple);}
.nav-dd-item.active{background:var(--accent-soft);color:var(--text);}
.nav-dd-item.active .ndl{font-weight:600;color:var(--brand-blue);}
.nav-dd-item.active .ico,.nav-dd-item.active:hover .ico{background:var(--brand-grad);color:#fff;--ico-ac:#fff;}
.nav-spacer{flex:1 1 0;min-width:0;}
.nav-new .nav-dd-trigger{border:1px solid var(--line-2);background:var(--surface);color:var(--text);font-weight:600;padding:7px 10px 7px 9px;gap:6px;}
.nav-new .nav-dd-trigger .ico{color:var(--brand-blue);--ico-ac:var(--brand-purple);}
@media (hover:hover){ .nav-new .nav-dd-trigger:hover{border-color:var(--brand-blue);background:var(--accent-soft);color:var(--brand-blue);} .nav-new .nav-dd-trigger:hover .ico{color:var(--brand-blue);} }
.nav-new.open .nav-dd-trigger{border-color:var(--brand-blue);background:var(--accent-soft);color:var(--brand-blue);}
.nav-new.open .nav-dd-trigger .ico{color:var(--brand-blue);}
/* ── the phone drawer: the portal's name in the head, Create at the top ── */
.mnav-title span{font-family:var(--font-display);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
.mnav-qa{display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:0 4px 4px;}
.mnav-qa-btn{display:inline-flex;align-items:center;gap:8px;min-height:42px;padding:8px 10px;border:1px solid var(--line-2);border-radius:var(--r-ctl);background:var(--surface);
  color:var(--text);font-family:inherit;font-size:13px;font-weight:500;line-height:1.2;text-align:left;cursor:pointer;}
.mnav-qa-btn svg{width:16px;height:16px;color:var(--brand-blue);--ico-ac:var(--brand-purple);flex:none;}
.mnav-qa-btn:active{background:var(--surface-2);}
/* ══════════ end v1.4.10.539 ══════════ */


/* ═══ v1.4.10.543 — INTER FOR EVERY WORD; POPPINS ONLY IN THE WORDMARK ════════
   Jay: "I hate the font we use at avdesk control, i would rather it be a clean font like we use at
   towerdesk. Can we change the whole site to this kind of font (except our logo)."
   --font-brand is Inter now, so every rule that reads --font-body / --font-display changed with it.
   The logo is an image (img/logo-email.png, the marks); the places that SET the name "AVDesk" as
   text keep Poppins through --font-logo. Inter's optical size axis does the display sizes by itself. */
html,body{font-optical-sizing:auto;}
.qr-brand span,.mnav-title b,.wb-logo-txt{font-family:var(--font-logo);}
/* ═══ end v1.4.10.543 ═══ */


/* ═══ v1.4.10.544 — THE INTER PASS: what the crawl found with the new face ═══════════════════════════════════════
   The line box itself is put back in css/fonts.css (Inter's metric overrides: 1.5em, as Poppins drew). These are the
   layout faults the format crawl (every page, tab, drill-down and popup; admin, integrator, client and Site Admin;
   1440 and 390) still found once the face was Inter, most of them older than the face. */
/* the Support desk's filter select cut its own words at 1440 ("Open work (not closed) (12" with the count clipped):
   the two selects keep their natural width and the search gives way (it holds 180px) */
@media (min-width:1180px){
  .tkx-desk .tkx-tb2 .tkx-tb-selects{flex:0 0 auto;}
  .tkx-desk .tkx-tb2 .tkx-tb-selects .tkx-select{max-width:260px;}
}
/* the wallboard's Today strip on the wall: "0 DUE 0 OVERDUE 0 DONE" ran 5px past its tile ("DON") */
.wb-wall .wb-today-h{gap:8px;}
.wb-wall .wb-today-kpis{gap:2px 6px;}
/* a field or select narrower than its words (a placeholder on a phone, a long option) ends in an ellipsis instead of
   a letter cut in half */
input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]),select{text-overflow:ellipsis;}
/* a popup's footer on a phone (Room QR settings and the room-document and File Systems popups): every button shared one
   row, the spacer took a share too, and "Reset to defaults" folded onto two lines in an 88px button. Buttons keep their
   words on one line and wrap to a second row when the row is full; the spacer goes */
@media (max-width:700px){
  .lmx-foot > span:empty{display:none;}
  .lmx-foot .btn{flex:1 1 auto;white-space:nowrap;}
}
/* the Sales Leads search, now that it draws as a search box: its button as tall as its field, and room for the hint */
.sl-find .btn{min-height:34px;}
.sl-bar1 .sl-find{flex:0 1 380px;}
@media (max-width:760px){ .sl-find .btn{min-height:40px;} .sl-bar1 .sl-find{flex:1 1 100%;} }
/* the MIB library (Ody Monitoring ▸ MIB library), found on the production dump: its table ran 120px past the popup, so the
   Where / Rules / Remove buttons sat under a sideways scroll, and the filter was a bare browser field. The buttons stack
   in their column, a rule wraps at its own spaces, and the filter takes the field look */
.mibl-tbl td:last-child{white-space:normal !important;width:1%;}
.mibl-tbl td:last-child .btn{display:flex;width:100%;justify-content:center;margin:0 0 4px;}
.mibl-rule{word-break:normal;overflow-wrap:anywhere;}
.mibl-tbl{width:100%;table-layout:fixed;} .mibl-tbl th:nth-child(1){width:31%;} .mibl-tbl th:nth-child(2){width:29%;} .mibl-tbl th:nth-child(3){width:20%;} .mibl-tbl th:nth-child(4){width:9%;} .mibl-tbl th:nth-child(5){width:11%;}
#mibl-q{min-height:34px;padding:0 12px;font-size:13px;border:1px solid var(--line-2);border-radius:var(--r-ctl);background:var(--surface);color:var(--text);box-sizing:border-box;}
#mibl-q:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow);}
@media (max-width:760px){ #mibl-q{min-height:40px;font-size:16px;} .mibl-tbl{table-layout:auto;} }
/* a site's Monitoring tab: the Ody tab beside "Add Ody" stood 4px taller than the button on the same line */
.mon-ody-switch .mon-ody-add{min-height:36px;}
/* Assets ▸ Lifecycle & budget: the replacement matrix (site × year) ran 2px past its half-width panel at 1440, which
   put a sideways scrollbar under it; its cells keep 12px a side instead of the table's 18 */
.dt.fx-matrix thead th,.dt.fx-matrix tbody td{padding-left:12px;padding-right:12px;}
/* v1.4.10.545 — the same crawl on the production dump (real estate, every account type, 1440 and 390), against v542 for
   what was already there. On a phone: the Add Ody button keeps the 40px touch floor beside its 40px tab; the catalogue
   browser's results fit the popup instead of running 148px out of it (the Add button was off-screen); a user's access line wraps inside the
   profile (it held a 200px floor and ran 10px out); a task's "Add" and the date-range "Search" stand as tall as the
   field beside them */
@media (max-width:760px){
  .mon-ody-switch .mon-ody-add{min-height:40px;}
  #cb-results .dt{min-width:0;width:100%;} #cb-results .dt td{padding-left:10px;padding-right:10px;} #cb-results .dt td:first-child{width:48px;} #cb-results .dt td:last-child{white-space:normal;text-align:right;width:110px;}
  .up-scope-v .ua-acc{min-width:0;}
  .tk-item-add .btn.xs,.ss-custom > .btn{min-height:40px;}
}
/* v1.4.10.546 — codes in Inter. A code set in an input took the code face's line box (JetBrains Mono drew 1.32em; Inter
   draws 1.5em), so the wiki's hex field grew to 36px beside its 32px "Use this" button: it keeps the height it had */
.wk-hexin{line-height:1.25;}
/* ═══ end v1.4.10.544 ═══ */

/* ═══ v1.4.10.547 — THE ASSET AREA, STREAMLINED (js/03-pages.js renderAssets / renderAssetGrouped, js/05-assets.js) ═══════
   Jay: "Asset Management and asset system needs loads of work, structure and way it looks needs to look more streamline
   and easy to understand." Measured on the harness at 1440x900 before this: the register's first row began at 748px, so
   a laptop showed two assets under five bands of chrome. Each band now says its piece once: */

/* What needs doing: one line per tile (icon, figure, word), the hint in the band's tooltip — 69px tiles were 50px of
   padding around two short lines */
.akpi-rail.ast-rail.ast-rail-c{gap:8px;margin-bottom:12px;}
.akpi-rail.ast-rail.ast-rail-c .akpi{padding:8px 12px;min-height:46px;gap:9px;}
.akpi-rail.ast-rail.ast-rail-c .akpi-ico{width:26px;height:26px;}
.akpi-rail.ast-rail.ast-rail-c .akpi-ico svg{width:14px;height:14px;}
.akpi-rail.ast-rail.ast-rail-c .akpi-txt{display:flex;align-items:baseline;gap:7px;min-width:0;}
.akpi-rail.ast-rail.ast-rail-c .akpi .v{font-size:18px;line-height:1.3;flex:none;}
.akpi-rail.ast-rail.ast-rail-c .akpi .l{font-size:12px;margin-top:0;min-width:0;}
.ast-sec{margin-bottom:7px;}
/* the tabs: four groups now, the hairline between them a little wider so the groups read as groups */
#content .seg.ast-tabs .seg-sep{margin:0 10px;}
@media (max-width:1399px){ #content .seg.ast-tabs .seg-sep{margin:0 6px;} }

/* the register's rows: 10px above and below the two lines (13px made a 66px row: two rows and a half on a laptop) */
@media (min-width:761px){
  .asset-dt > tbody > tr > td{padding-top:10px;padding-bottom:10px;}
}
.ar-noroom{color:var(--warn);font-weight:500;}

/* the grouped view: a client with one site is ONE band, the site's, with the client named over it */
.ag-org.ag-org-solo > .ag-site > .ag-site-head{padding:12px 18px;gap:14px;border-bottom:1px solid var(--line);
  background:linear-gradient(120deg,rgba(var(--bc-accent-rgb),.05),rgba(var(--bc-purple-rgb),.04));}
.ag-org.ag-org-solo .ag-site-pin{width:38px;height:38px;border-radius:7px;}
.ag-org.ag-org-solo .ag-site-pin svg{width:18px;height:18px;}
.ag-org.ag-org-solo .ag-site-name{font-size:15px;letter-spacing:-.012em;line-height:1.3;}
.ag-site-id{min-width:0;}
.ag-site-org{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-mute);line-height:1.4;}
.ag-site-org .ag-badge{padding:1px 5px;}
.ag-site-meta .ag-warn{font-weight:600;}
/* a phone: the name and its lines take the row beside the pin, the count goes under them (it squeezed the meta to
   three lines and broke the client's name in two) */
@media (max-width:760px){
  .ag-site-head{flex-wrap:wrap;row-gap:8px;padding:11px 14px;}
  .ag-org.ag-org-solo > .ag-site > .ag-site-head{padding:12px 14px;}
  .ag-site-head > .ag-site-id{flex:1 1 calc(100% - 56px);}
  .ag-site-head > .ag-site-count{margin-left:44px;}
  .ag-org.ag-org-solo .ag-site-head > .ag-site-count{margin-left:52px;}
}

/* Reports: a card's figures say their whole word (the labels were cut: "current val…", "expiring s…", "manufactu…") and
   its four buttons line up — Open report across the card, PDF / Excel / CSV an even row under it (CSV sat on a line of
   its own) */
.rxr-pv span{white-space:normal;overflow:visible;text-overflow:clip;line-height:1.3;}
.rxr-rcard .rpt-actions{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin-top:auto;}
.rxr-rcard .rpt-actions .btn{justify-content:center;white-space:nowrap;min-width:0;}
.rxr-rcard .rpt-actions .btn.primary{grid-column:1 / -1;}
/* ═══ end v1.4.10.547 ═══ */

/* ═══ v1.4.10.548 — the asset window in ten tabs (js/05-assets.js _assetDetailPaint, AD_TAB_HOME) ═══
   A merged tab is a run of sections (Service: plans and jobs, contracts, bookings); each is a scroll target for the
   tab it used to be. A section's own panel keeps its heading; a section with none (Notes) carries one. */
.adt-sec{scroll-margin-top:12px;}
.adt-sec + .adt-sec{margin-top:4px;}
.adt-sec-h{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-mute);margin:2px 0 10px;}
#adt-sec-notes{margin-bottom:18px;}
#adt-sec-notes .anote-list:empty{display:none;}
/* a short screen (a 1280x800 laptop): the rail's ten tabs at 32px, so a monitored, controllable asset's rail fits its
   477px without a scroll (546px at 40px) */
@media (min-width:1101px) and (max-height:880px){
  #modal-inner.modal-asset .adt-tab{padding-top:5px;padding-bottom:5px;}
  #modal-inner.modal-asset .adt-railgroup{padding-top:8px;padding-bottom:3px;}
}
/* the editor's Placement step: a state hint with nothing to say takes no room */
.ae-statehint:empty{display:none;}
.ae-life-hint{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px 12px;}
.ae-life-hint .btn{flex:none;}
/* the register's table: a pill, a condition and a name stay on one line ("In / warranty", "1 – / EXCELLENT" broke in two
   and every row was a different height), and the place under the make and model is one line cut with an ellipsis */
@media (min-width:761px){
  .asset-dt .ar-tag,.asset-dt .ar-life .pill,.asset-dt .ar-warr .pill,.asset-dt .ar-cond > *,.asset-dt .ar-assigned,.asset-dt .ar-value{white-space:nowrap;}
  .asset-dt .ar-equip .device-meta{max-width:min(22vw,320px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  /* eleven columns at 18px a side were ~400px of padding: 12px inside, the panel's 18px at the two outer edges */
  .asset-dt > thead > tr > th,.asset-dt > tbody > tr > td{padding-left:12px;padding-right:12px;}
  .asset-dt > thead > tr > th:first-child,.asset-dt > tbody > tr > td:first-child{padding-left:18px;}
  .asset-dt > thead > tr > th:last-child,.asset-dt > tbody > tr > td:last-child{padding-right:18px;}
}
/* a laptop (761 to 1399 wide): 8px inside and a shorter place line, so the eleven columns fit 1,208px without a sideways scroll */
@media (min-width:761px) and (max-width:1399px){
  .asset-dt > thead > tr > th,.asset-dt > tbody > tr > td{padding-left:8px;padding-right:8px;}
  .asset-dt > thead > tr > th:first-child,.asset-dt > tbody > tr > td:first-child{padding-left:14px;}
  .asset-dt > thead > tr > th:last-child,.asset-dt > tbody > tr > td:last-child{padding-right:14px;}
  .asset-dt .ar-equip .device-meta{max-width:15vw;}
  /* the toolbar's controls summed to 1,185px in a 1,184px row at 1280, so the view switch sat on a line of its own */
  .asset-toolbar.ast-tb .atb-search{min-width:160px;flex-basis:160px;}
}
/* Consumables: Report, Export and Add consumable on the list's own head */
.cn-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end;margin-left:auto;}
@media (max-width:760px){ .cn-actions{width:100%;justify-content:stretch;} .cn-actions .btn{flex:1 1 auto;min-height:40px;justify-content:center;} }
/* ═══ end v1.4.10.548 ═══ */

/* ═══ v1.4.10.549 — the asset window's Overview says what the head does not (js/05-assets.js _assetDetailPaint) ═══ */
.asd-card-h .asd-card-hlink{margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:500;letter-spacing:0;
  text-transform:none;color:var(--brand-blue);cursor:pointer;}
.asd-card-h .asd-card-hlink:hover{text-decoration:underline;}
.asd-card-h .asd-card-hlink svg{width:13px;height:13px;color:currentColor;}
@media (max-width:760px){ .asd-card-h .asd-card-hlink{min-height:40px;} }
.ah-head.asd-hero-v2 .ah-actions .ah-more svg{width:16px;height:16px;}
/* ═══ end v1.4.10.549 ═══ */

/* ═══ v1.4.10.550 — Lifecycle & budget, Lifecycle ops, Reports and Insights (js/03-pages.js, js/05-assets.js) ═══ */
/* the vendor-lifecycle panel: three figures, then its by-model table across the panel, each date and figure on one line */
.fx-kpis.fx-kpis-3{grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));}
.flush-x{overflow-x:auto;-webkit-overflow-scrolling:touch;}
.dt.fx-roll td,.dt.fx-roll th{white-space:nowrap;}
.dt.fx-roll td:first-child{white-space:normal;min-width:180px;}
/* the budget chart's four controls keep their width on a desktop (the subtitle wraps instead; Export PDF fell to a line of its own) */
@media (min-width:1100px){ .head-actions.fx-budget-acts{flex:0 0 auto;} }
/* a year's head may carry two pills now (past end of life, later this year): they wrap with the figures */
.fx-yrhead{flex-wrap:wrap;row-gap:4px;}
/* the Replacement schedule on a phone: each asset a two-line card (tag and status, then the name, then its value bar and
   the replacement figure); its five fixed-width columns were 465px in a 314px panel, a sideways scroll per year */
@media (max-width:760px){
  .fx-yr .dt,.fx-yr .dt tbody{display:block;width:100%;min-width:0 !important;}
  .fx-yr .dt tr{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 10px;padding:10px 4px;border-bottom:1px solid var(--line);}
  .fx-yr .dt td{display:block;width:auto !important;padding:0 !important;border:0 !important;text-align:left !important;}
  .fx-yr .dt td:nth-child(1){grid-column:1;grid-row:1;}
  .fx-yr .dt td:nth-child(5){grid-column:2;grid-row:1;text-align:right !important;}
  .fx-yr .dt td:nth-child(2){grid-column:1 / -1;grid-row:2;}
  .fx-yr .dt td:nth-child(3){grid-column:1;grid-row:3;}
  .fx-yr .dt td:nth-child(4){grid-column:2;grid-row:3;text-align:right !important;align-self:end;}
}
/* Insights: the name column takes the room its names need (130px cut "Video conferencing"), a figure takes its own width,
   and a row that opens the register says so on hover */
.ast-insights .cat-row{grid-template-columns:minmax(120px,34%) minmax(60px,1fr) auto;border-radius:6px;margin:0 -6px;padding:3px 6px;}
.ast-insights .cat-row .cat-name{min-width:0;}
.ast-insights .cat-lab{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ast-insights .cat-row .cat-n{min-width:48px;white-space:nowrap;}
.ast-insights .cond-row{display:flex;align-items:center;gap:10px;font-size:13px;margin:0 -6px 6px;padding:3px 6px;border-radius:6px;}
.ast-insights .cond-n{font-weight:600;color:var(--text-mute);min-width:30px;text-align:right;font-variant-numeric:tabular-nums;}
.ast-insights .is-go{cursor:pointer;}
.ast-insights .is-go:hover,.ast-insights .is-go:focus-visible{background:var(--surface-2);outline:none;}
.ast-insights .is-go:focus-visible{box-shadow:0 0 0 2px var(--brand-blue) inset;}
@media (max-width:760px){ .ast-insights .is-go{min-height:40px;} }
/* Reports: a report's tables fit its page. Every one of the four reports had a table wider than its frame at 1440 (22 to
   134px over, each with a sideways scrollbar): nine columns at 18px a side and text cells up to 320px. 12px inside (the
   outer edges keep 18px), 9px on a laptop, text cut at 240px with the whole of it on hover (24-asset-reports.js). A wide
   matrix (models x device types) still scrolls in its frame, as it must. */
@media (min-width:761px){
  .rxr-dt > thead > tr > th,.rxr-dt > tbody > tr > td,.rxr-dt > tfoot > tr > td{padding-left:12px;padding-right:12px;}
  .rxr-dt > thead > tr > th:first-child,.rxr-dt > tbody > tr > td:first-child,.rxr-dt > tfoot > tr > td:first-child{padding-left:18px;}
  .rxr-dt > thead > tr > th:last-child,.rxr-dt > tbody > tr > td:last-child,.rxr-dt > tfoot > tr > td:last-child{padding-right:18px;}
  .rxr-dt td{max-width:240px;}
  /* a heading may take two lines ("Due for / replacement"): a fourteen-column model table was 300px wider than its frame
     for want of it; the headings sit on the bottom line so a one-line one lines up with its neighbours */
  .rxr-dt > thead > tr > th{white-space:normal;vertical-align:bottom;line-height:1.3;}
  /* a short-text column that may take two lines ({nwrap:true} in 24-asset-reports.js) */
  .rxr-dt td.nw{white-space:normal;min-width:110px;max-width:190px;line-height:1.35;overflow:visible;text-overflow:clip;}
}
@media (min-width:761px) and (max-width:1399px){
  .rxr-dt > thead > tr > th,.rxr-dt > tbody > tr > td,.rxr-dt > tfoot > tr > td{padding-left:9px;padding-right:9px;}
  .rxr-dt td{max-width:200px;}
}
/* ═══ end v1.4.10.550 ═══ */

/* ═══ v1.4.10.551 — the asset editor's steps (js/05-assets.js openAssetEditor) ═══
   One window height for every step: it was its content's, so at 1440x900 the window was 828px on Placement, 493px on
   Monitoring and 610px on Assignment, and Next / Back moved under the pointer from one step to the next. A long step
   scrolls inside the stage as it did. A phone keeps the stacked, natural height. */
@media (min-width:761px){
  .asset-editor.ae-wrap .ae-wiz{flex:none;height:min(720px, calc(100vh - 262px));}
}
/* a second grid in one section (Finance: the purchase and its cover, then who from and the codes) */
.fs-grid.ae-grid-gap{margin-top:16px;}
/* ═══ end v1.4.10.551 ═══ */

/* ═══ v1.4.10.552 — Assets › Settings: the sections on a grouped rail (Catalogue, Register, Places) ═══
   The rail takes the Help guide's look (.hg-item): a quiet list, the open section lifted on a card. It stays in view
   while a long section (Sites & rooms runs 2,100px) scrolls under it. A phone hides it and picks the section from one
   grouped list (.cs-pick), where the ten pills took five rows before the first entry. */
.cs-layout{display:grid;grid-template-columns:212px minmax(0,1fr);gap:18px;align-items:start;}
.cs-rail{position:sticky;top:12px;display:flex;flex-direction:column;gap:14px;padding:12px 10px;
  border:1px solid var(--line);border-radius:10px;background:var(--surface-2);}
.cs-grp{display:flex;flex-direction:column;gap:2px;}
.cs-grp-t{display:flex;flex-direction:column;gap:1px;padding:0 10px 5px;font-size:11px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--text);}
.cs-grp-t span{font-size:11px;font-weight:500;letter-spacing:0;text-transform:none;color:var(--text-mute);}
.cs-item{display:flex;align-items:center;gap:10px;width:100%;min-height:36px;text-align:left;border:1px solid transparent;
  background:transparent;color:var(--text-mute);font-family:inherit;font-size:13px;font-weight:500;
  padding:7px 10px;border-radius:6px;cursor:pointer;transition:color .14s,background .14s,border-color .14s;}
.cs-item .cs-ico{display:inline-flex;flex:none;width:16px;height:16px;}
.cs-item .cs-ico svg{width:16px;height:16px;stroke:currentColor;opacity:.9;}
.cs-item .cs-lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cs-item:hover{color:var(--text);background:var(--surface);}
.cs-item.active{color:var(--brand-blue);background:var(--surface);border-color:var(--line);box-shadow:var(--shadow-sm);font-weight:600;}
.cs-item.active .cs-n{background:var(--brand-blue);color:#fff;}
.cs-item:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.cs-pick{display:none;}
.cs-main{min-width:0;}
.cs-main > .cs-search{margin:0 0 12px;min-width:0;}
/* a figure the row inherits (a model's life from its category, a category's from the estate) */
.cs-inh{color:var(--text-dim,var(--text-mute));font-style:normal;white-space:nowrap;}
/* the Models table holds eleven columns in the narrower pane: 12px inside (9px on a laptop), the outer edges keep 18px,
   as the v550 report tables do; a heading may take two lines */
.dt.cs-models th{white-space:normal;line-height:1.3;}
.dt.cs-models th, .dt.cs-models td{padding-left:12px;padding-right:12px;}
.dt.cs-models th:first-child, .dt.cs-models td:first-child{padding-left:18px;}
.dt.cs-models th:last-child, .dt.cs-models td:last-child{padding-right:18px;}
@media (max-width:1366px){
  .cs-layout{grid-template-columns:200px minmax(0,1fr);gap:14px;}   /* 200: "Manufacturers" and its count whole */
  .cs-item{gap:8px;}
  .dt.cs-models th, .dt.cs-models td{padding-left:9px;padding-right:9px;}
}
@media (max-width:900px){
  .cs-layout{display:block;}
  .cs-rail{display:none;}
  .cs-pick{display:block;width:100%;min-height:44px;margin:0 0 12px;padding:0 12px;font-family:inherit;font-size:16px;font-weight:600;   /* 16px: iOS zooms into a smaller select */
    color:var(--text);background:var(--surface);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow-sm);}
  .cs-pick:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
}
/* Lifecycle defaults: the three assumptions on one row, what each does under it */
.lc-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;max-width:900px;}
.lc-grid .field{margin:0;}
.lc-grid .fs-hint{margin-top:6px;}
.lc-chain{display:flex;gap:9px;align-items:flex-start;max-width:900px;margin:16px 0;padding:11px 13px;border-radius:6px;
  background:var(--surface-2);border:1px solid var(--line);font-size:13px;line-height:1.55;color:var(--text-mute);}
.lc-chain svg{flex:none;width:16px;height:16px;margin-top:2px;stroke:var(--brand-blue);}
.lc-chain b{color:var(--text);font-weight:600;}
.lc-chain a{cursor:pointer;}
.lc-foot{display:flex;align-items:center;gap:16px;flex-wrap:wrap;}
.lc-figs{font-size:13px;color:var(--text-mute);}
.lc-figs b{color:var(--text);}
@media (max-width:760px){ .lc-grid{grid-template-columns:1fr;} }
/* ═══ end v1.4.10.552 ═══ */

/* ═══ v1.4.10.553 — Site assets and the Validation queue ═══ */
/* ── Site assets ── the picker bar's widths as classes (inline, they beat the phone rule's full width) */
.sv-pickbar{display:flex;gap:14px;align-items:center;flex-wrap:wrap;}
.sv-f-client{min-width:210px;flex:0 1 240px;}
.sv-f-site{min-width:230px;flex:0 1 260px;}
.sv-f-q{flex:1;min-width:220px;}
/* the assets with no room, under their own heading */
.svx-floor.svx-floor-unpl{color:var(--warn);}
/* a room with no picture: one line after its assets, still a drop target */
.svx-photo-add{display:flex;align-items:center;gap:8px 10px;flex-wrap:wrap;margin:4px 12px 12px;padding:8px 12px;
  border:1px dashed var(--line-2,var(--line));border-radius:7px;font-size:12px;color:var(--text-mute);transition:border-color .15s,background .15s;}
.svx-photo-add.over{border-color:var(--brand-blue);background:var(--accent-glow,rgba(var(--bc-accent-rgb),.07));}
.svx-photo-add-t{display:inline-flex;align-items:center;gap:7px;flex:1 1 220px;min-width:0;}
.svx-photo-add-t svg{width:15px;height:15px;opacity:.7;flex:none;}
/* the site in figures, at the top of its overview */
.svx-figs{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;margin:4px 0 16px;}
.svx-fig{display:flex;flex-direction:column;gap:2px;min-width:0;padding:10px 12px;border:1px solid var(--line);border-radius:7px;
  background:var(--surface);text-align:left;font:inherit;color:var(--text);}
button.svx-fig{cursor:pointer;transition:border-color .12s,background .12s;}
button.svx-fig:hover{border-color:var(--brand-blue);background:var(--accent-glow,rgba(var(--bc-accent-rgb),.06));}
.svx-fig b{font-size:18px;font-weight:600;letter-spacing:-.02em;line-height:1.15;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.svx-fig span{font-size:11px;color:var(--text-mute);}
.svx-fig.warn b{color:var(--warn);} .svx-fig.muted b{color:var(--text-mute);} .svx-fig.zero b{color:var(--text-dim);}
.svx-ovroom{flex:none;max-width:210px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.svx-ovmore{margin-top:6px;}
@media (max-width:1366px){ .svx-figs{grid-template-columns:repeat(3,minmax(0,1fr));} }
@media (max-width:760px){
  .sv-f-client,.sv-f-site,.sv-f-q{flex:1 1 100%;min-width:0;}
  .sv-mode{display:flex;flex:1 1 100%;}
  .sv-mode button{flex:1;justify-content:center;}
  .svx-figs{grid-template-columns:repeat(2,minmax(0,1fr));}
  button.svx-fig{min-height:40px;}
  .svx-ovroom{display:none;}
  /* a room's asset: the make and model whole, the serial under it ("Samsung …" was all a 390px row had room for) */
  .svx-dbody .sv-arow{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;grid-template-areas:"tag name pill dot" "tag ser pill dot";column-gap:9px;row-gap:1px;min-height:44px;}
  .svx-dbody .sv-arow > .mono-tag{grid-area:tag;align-self:center;}
  .svx-dbody .sv-arow > .sv-aname{grid-area:name;white-space:normal;}
  .svx-dbody .sv-arow > .sv-aser{grid-area:ser;max-width:none;}
  .svx-dbody .sv-arow > .pill{grid-area:pill;align-self:center;}
  .svx-dbody .sv-arow > .dot{grid-area:dot;align-self:center;}
}

/* ── Validation ── the head: actions on one line, each tile its count beside its name */
.vq-head .panel-head .head-actions.vq-head-acts{flex-wrap:nowrap;flex:none;}   /* over .panel-head .head-actions' wrap */
.vq-tile{flex-direction:row;align-items:center;gap:12px;padding:10px 14px;}
.vq-tile-v{min-width:26px;}
.vq-tile-tx{display:flex;flex-direction:column;gap:1px;min-width:0;}
.vq-tile-s{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
/* a match the scan reads as another model: amber, not the green "ready" tint */
tr.pend-mm > td{background:color-mix(in srgb, var(--warn) 7%, transparent);}
tr.pend-mm > td:first-child{box-shadow:inset 3px 0 0 var(--warn);}
.pend-mm-box{display:flex;gap:10px;align-items:flex-start;margin-top:10px;padding:10px 12px;border:1px solid color-mix(in srgb, var(--warn) 45%, transparent);
  background:color-mix(in srgb, var(--warn) 8%, transparent);border-radius:6px;font-size:13px;line-height:1.55;}
.pend-mm-box svg{flex:none;width:18px;height:18px;margin-top:1px;stroke:var(--warn);}
/* the row's box sits in a label that fills its cell */
.vq-cbl{display:inline-flex;align-items:center;justify-content:center;min-width:28px;min-height:28px;margin:0;cursor:pointer;}
.vq-cbl-t{display:none;}
@media (max-width:1100px){ .vq-head .panel-head .head-actions.vq-head-acts{flex-wrap:wrap;flex:0 1 auto;} }
/* a phone: each device a card (the seven-column table was 788px in a 354px frame), a 40px box, Select all over the list */
@media (max-width:760px){
  .vq-cbl{min-width:40px;min-height:40px;}
  .vq-tile{padding:10px 12px;}
  .vq-tile-s{display:none;}
  .vq-panel .panel-body.flush{overflow-x:visible;}
  .vq-panel .panel-body.flush .vq-tbl{min-width:0;}   /* .panel-body.flush .dt holds a table to 680px */
  .vq-tbl, .vq-tbl tbody{display:block;width:100%;}
  .vq-tbl thead{display:block;}
  .vq-tbl thead tr{display:flex;align-items:center;padding:2px 14px;border-bottom:1px solid var(--line);}
  .vq-tbl thead th{display:none;}
  .vq-tbl thead th.vq-cbc{display:block;padding:0;border:0;width:auto;}
  .vq-tbl thead th.vq-cbc .vq-cbl{justify-content:flex-start;}
  .vq-cbl-t{display:inline;margin-left:8px;font-size:12px;font-weight:600;letter-spacing:0;text-transform:none;color:var(--text-mute);}
  .vq-rejected thead, .vq-approved thead{display:none;}
  /* the device across the top, then two facts a line (found by · where, then when · status), then the actions */
  .vq-tbl tbody tr{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 12px;padding:12px 14px;border-bottom:1px solid var(--line);}
  .vq-pending tbody tr, .vq-not_required tbody tr{grid-template-columns:40px repeat(2,minmax(0,1fr));column-gap:10px;}
  .vq-tbl tbody td{display:block;padding:0;border:0;min-width:0;}
  .vq-tbl tbody td:nth-child(1), .vq-tbl tbody td.vq-acts{grid-column:1 / -1;}
  .vq-pending tbody td.vq-cbc, .vq-not_required tbody td.vq-cbc{grid-column:1;grid-row:1 / span 4;width:auto;}
  .vq-pending tbody td:nth-child(2), .vq-not_required tbody td:nth-child(2), .vq-pending tbody td.vq-acts, .vq-not_required tbody td.vq-acts{grid-column:2 / -1;}
  .vq-tbl td.vq-acts{text-align:left;}
  .vq-tbl td.vq-when{white-space:normal;}
  tr.pend-match > td, tr.pend-mm > td{background:transparent;}
  tr.pend-match{background:color-mix(in srgb, var(--ok) 8%, transparent);box-shadow:inset 3px 0 0 var(--ok);}
  tr.pend-mm{background:color-mix(in srgb, var(--warn) 7%, transparent);box-shadow:inset 3px 0 0 var(--warn);}
  tr.pend-match > td:first-child, tr.pend-mm > td:first-child{box-shadow:none;}
}
/* ═══ end v1.4.10.553 ═══ */

/* ═══ v1.4.10.554 — Consumables: the tab, the item's window, its forms and its editor ═══ */
/* the Need reorder tile is a filter (role=button), lit while on */
.akpi-grid.cn-rail .akpi[role="button"]{cursor:pointer;}
.akpi-grid.cn-rail .akpi[role="button"]:hover{border-color:var(--line-2,var(--line));box-shadow:var(--shadow-sm);}
.akpi-grid.cn-rail .akpi[role="button"]:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
/* the item window: the gauge the width of the window with what it shows under it; the actions start at the left (the
   list head's .cn-actions pushed them right, one class for two places) */
.cn-gauge{margin:12px 0 4px;}
.cn-bar.cn-bar-wide{max-width:none;margin-top:0;}
.cn-bar-wide .cn-bar-track{height:8px;}
.cn-bar-cap{display:flex;flex-wrap:wrap;gap:4px 18px;margin-top:8px;font-size:12px;color:var(--text-mute);}
.cn-bar-cap b{color:var(--text);font-weight:600;}
.cn-dacts{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}
/* what an adjustment leaves on the shelf, as it is typed */
.ap-form .cna-prev{grid-column:1 / -1;}
.cna-prev{font-size:12px;color:var(--text-mute);padding:7px 10px;border-radius:6px;background:var(--surface-2);font-variant-numeric:tabular-nums;}
.cna-prev.warn{color:var(--warn);} .cna-prev.err{color:var(--err);}
/* the editor: three groups, three to a row */
.cn-ed-sec{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);margin:14px 0 7px;padding-top:10px;border-top:1px solid var(--line);}
.cn-ed > .cn-ed-sec:first-child{margin-top:0;padding-top:0;border-top:0;}
.cn-ed-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px 14px;}
.cn-ed-grid .fld{margin:0;min-width:0;}
.cn-ed-grid .cn-span2{grid-column:span 2;}
.cn-ed-grid .cn-span3{grid-column:1 / -1;margin:0;}
.cn-ed-alert{display:flex;flex-direction:column;gap:8px;}
.cn-ed-roles{display:flex;gap:6px 18px;flex-wrap:wrap;padding-left:24px;}
/* the alerts and the notes side by side, the last row of the form */
.cn-ed-pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 18px;}
.cn-ed-pair .cn-ed-sec{margin-top:14px;}
textarea.cn-ed-notes{width:100%;box-sizing:border-box;min-height:64px;resize:vertical;padding:10px 12px;background:var(--surface);   /* as .fld textarea */
  border:1px solid var(--line-2);border-radius:6px;font-family:inherit;font-size:13px;color:var(--text);transition:border-color .15s,box-shadow .15s;}
textarea.cn-ed-notes:focus{outline:none;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
/* a phone: each stock item a card: the item across the top, then on hand · status, where · value, levels · assets, and the
   two quick buttons */
@media (max-width:760px){
  .panel-body.flush .dt.cn-tbl{min-width:0;}
  .cn-tbl, .cn-tbl tbody{display:block;width:100%;}
  .cn-tbl thead{display:none;}
  .cn-tbl tbody tr{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 12px;padding:12px 14px;border-bottom:1px solid var(--line);}
  .cn-tbl tbody td{display:block;padding:0;border:0;min-width:0;}
  .cn-tbl tbody td:nth-child(1){grid-column:1 / -1;}
  .cn-tbl tbody td:nth-child(2){grid-column:1;grid-row:2;}
  .cn-tbl tbody td:nth-child(6){grid-column:2;grid-row:2;align-self:start;}
  .cn-tbl tbody td:nth-child(4){grid-column:1;grid-row:3;}
  .cn-tbl tbody td:nth-child(7){grid-column:2;grid-row:3;text-align:left !important;}
  .cn-tbl tbody td:nth-child(3){grid-column:1;grid-row:4;}
  .cn-tbl tbody td:nth-child(5){grid-column:2;grid-row:4;}
  .cn-tbl tbody td:nth-child(8){grid-column:1 / -1;grid-row:5;}
  .cn-tbl tbody td:nth-child(8) > div{justify-content:flex-start !important;}
  .cn-tbl tbody td:nth-child(8) .btn{min-width:44px;min-height:40px;justify-content:center;gap:6px;padding:0 14px;}
  .cn-tbl .cn-bar{max-width:none;}
  .cn-qa-l{display:inline !important;}
}
.cn-qa-l{display:none;}   /* the quick buttons' words, on a phone only (the desktop row has its headings and the hover titles) */
@media (max-width:760px){
  .cn-ed-pair{grid-template-columns:1fr;}
  textarea.cn-ed-notes{font-size:16px;}   /* iOS zooms into smaller text */
  .cn-ed-grid{grid-template-columns:1fr;}
  .cn-ed-grid .cn-span2{grid-column:auto;}
  .cn-ed-roles{padding-left:0;}
  .cn-dacts .btn{flex:1 1 calc(50% - 4px);min-height:40px;justify-content:center;}
}
/* ═══ end v1.4.10.554 ═══ */

/* ═══ v1.4.10.555 — Lifecycle ops: the work list beside the day-to-day lists ═══
   Attention needed is the main column, its list as tall as the screen allows (it scrolls inside); the five smaller lists
   stack beside it, each held to a height so the column stays short. Under 1100px it is one column, the work list first. */
.ops-cols{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:16px;align-items:start;}
.ops-main, .ops-side{display:flex;flex-direction:column;gap:16px;min-width:0;}
.ops-main{position:sticky;top:12px;}   /* the work list stays in view while the lists beside it scroll */
.ops-attn-body{padding:14px 16px;max-height:calc(100vh - 220px);min-height:240px;overflow:auto;}
.ops-side-body{padding:12px 14px;max-height:300px;overflow:auto;}
.ops-side .att-row{padding:8px 10px;}
.ops-head-acts{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end;}
.ops-au-bar{height:4px;border-radius:3px;background:var(--line);margin-top:5px;max-width:220px;overflow:hidden;}
.ops-au-bar span{display:block;height:100%;background:var(--brand-blue);border-radius:3px;}
@media (max-width:1100px){
  .ops-cols{grid-template-columns:minmax(0,1fr);}
  .ops-main{position:static;}
  .ops-attn-body{max-height:520px;}
}
@media (max-width:760px){
  /* a row's words take the width; its pill and button go under them, in line with the words (the row's inline flex:1
     left the words a word to a line beside them) */
  .ops-side .att-row, #ap-ops-attn .att-row{flex-wrap:wrap;row-gap:6px;}
  .ops-side .att-row > div:nth-child(2), #ap-ops-attn .att-row > div:nth-child(2){flex:1 1 calc(100% - 44px) !important;}
  .ops-side .att-row > .pill, #ap-ops-attn .att-row > .pill{margin-left:40px;}
  .ops-side .att-row > .btn, #ap-ops-attn .att-row > .btn{min-height:40px;margin-left:40px;}
  .ops-side .att-row > .pill ~ .btn, #ap-ops-attn .att-row > .pill ~ .btn{margin-left:auto;}
  .ops-side-body{max-height:none;}
}
/* ═══ end v1.4.10.555 ═══ */

/* ═══ v1.4.10.556 — the register on a phone: the filters behind one button ═══
   The search has its line; Filters, the sort and the view switch share the next. The four filters, and the second row,
   show when Filters is open; one that is set stays out either way (.atb-on), so nothing filters from off screen. */
.atb-more-ph{display:none;}
@media (max-width:760px){
  .asset-toolbar.ast-tb:not(.more-open) > .atb-pri:not(.atb-on){display:none;}
  .atb-more-w{display:none;}
  .atb-more-ph{display:inline;}
  /* line one: the search, the view switch beside it (the search keeps 180px, its placeholder whole); line two: Filters,
     then the sort across the rest (each sort's words whole: "Sort: Last updated" is 137px) */
  .asset-toolbar.ast-tb > *{order:2;}
  .asset-toolbar.ast-tb .atb-search{order:0;flex:1 1 0;min-width:180px;}
  .asset-toolbar.ast-tb .view-toggle{flex:0 0 auto;order:1;}
  .asset-toolbar.ast-tb .view-toggle button{flex:0 0 40px;min-width:40px;padding:0;justify-content:center;}
  .asset-toolbar.ast-tb .atb-more{flex:0 0 auto;padding:0 12px;}
  .asset-toolbar.ast-tb .atb-sel.atb-sort{flex:1 1 0;min-width:0;order:3;}
  .asset-toolbar.ast-tb .atb-row2{order:4;}
  .asset-toolbar.ast-tb .atb-spacer{display:none;}
  /* the bulk bar: the count and its close on one line, the actions one strip that scrolls sideways under them (ten
     buttons wrapped into five rows, 294px of a 664px screen over the list being worked) */
  .bulk-bar{justify-content:space-between;padding:8px 10px;gap:8px;}
  .bulk-bar .bb-count{order:0;}
  .bulk-bar .bb-close{order:1;margin-left:auto;}
  .bulk-bar .bb-actions{order:2;flex:1 1 100%;flex-wrap:nowrap;justify-content:flex-start;overflow-x:auto;overscroll-behavior-x:contain;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;}
  .bulk-bar .bb-actions::-webkit-scrollbar{display:none;}
  .bulk-bar .bb-actions button{flex:0 0 auto;white-space:nowrap;}
}
/* ═══ end v1.4.10.556 ═══ */

/* ═══ v1.4.10.557 — the Reports home and the register's column picker ═══ */
/* the head: the title and one line, the data set beside them on one line with what it covers */
.panel.rpt-head{margin-bottom:6px;}
.rpt-head-b{display:flex;align-items:center;justify-content:space-between;gap:12px 24px;flex-wrap:wrap;}
.rpt-head-t{flex:1 1 360px;min-width:0;}
.rpt-head-t h3{margin:0 0 3px;}
.rpt-head-t p{margin:0;font-size:13px;color:var(--text-mute);line-height:1.5;}
.rpt-ds{display:flex;flex-direction:column;gap:5px;flex:0 1 320px;min-width:0;}
.rpt-ds .asb-field.rpt-ds-f{flex:none;min-width:0;}
.rpt-ds-note{font-size:12px;color:var(--text-mute);padding-left:2px;}
/* the two groups' headings */
.rpt-sec-h{display:flex;align-items:baseline;gap:6px 12px;flex-wrap:wrap;margin:18px 2px 10px;}
.rpt-sec-h h4{margin:0;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text);}
.rpt-sec-h span{font-size:12px;color:var(--text-mute);}
/* an export card: the report card's shape (its own class, so .rxr-rcard still counts the four reports), its primary
   action across, the other two under it */
.rpt-xcard .rpt-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin-top:auto;}
.rpt-xcard .rpt-actions .btn{justify-content:center;white-space:nowrap;min-width:0;}
.rpt-xcard .rpt-actions .btn.primary{grid-column:1 / -1;}
.rpt-xcard .rpt-actions > .device-meta{grid-column:1 / -1;}
/* the column picker in groups */
.rpt-colgroups{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px;}
.rpt-colgrp{margin:0;padding:10px 12px 12px;border:1px solid var(--line);border-radius:7px;min-width:0;}
.rpt-colgrp legend{display:flex;align-items:center;gap:6px;padding:0 4px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
.rpt-colgrp legend span{margin-right:4px;}
.rpt-colgrp-b{border:0;background:none;padding:2px 4px;font:inherit;font-size:11px;font-weight:600;letter-spacing:0;text-transform:none;color:var(--brand-blue);cursor:pointer;border-radius:4px;}
.rpt-colgrp-b:hover{background:var(--accent-glow);}
.rpt-colgrp .rpt-colgrid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px 12px;}
.rpt-colfoot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:12px;}
.rpt-colcount{font-size:12px;font-weight:600;color:var(--text-mute);margin-right:auto;}
.rpt-colcount.err{color:var(--err);}
@media (max-width:760px){
  .rpt-colgroups{grid-template-columns:1fr;}
  .rpt-ds{flex:1 1 100%;}
  .rpt-colgrp-b{min-height:40px;padding:0 10px;}
}
/* ═══ end v1.4.10.557 ═══ */

/* ═══ v1.4.10.558 — the Import window: three steps, the sheet checked before it is sent ═══ */
.modal-body.imp{display:flex;flex-direction:column;gap:14px;}
.imp-lead{margin:0;font-size:13px;line-height:1.55;color:var(--text-mute);}
.imp-step{display:flex;gap:12px;align-items:flex-start;}
.imp-n{flex:none;width:24px;height:24px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;margin-top:1px;
  background:var(--accent-glow,rgba(var(--bc-accent-rgb),.1));color:var(--brand-blue);font-size:12px;font-weight:700;}
.imp-sb{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px;}
.imp-st{font-size:13px;font-weight:600;color:var(--text);margin-top:3px;}
.imp-sb .field{margin:0 !important;}
/* the sheet: a drop zone holding the two buttons */
.imp-drop{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 14px;border:2px dashed var(--line-2,var(--line));border-radius:8px;
  background:var(--surface-2);transition:border-color .15s,background .15s;}
.imp-drop > svg{width:20px;height:20px;opacity:.6;flex:none;}
.imp-drop.over{border-color:var(--brand-blue);background:var(--accent-glow,rgba(var(--bc-accent-rgb),.07));}
.imp-drop-t{font-size:13px;color:var(--text-mute);}
.imp-fname{font-size:12px;font-weight:600;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.imp-wait{font-size:13px;color:var(--text-dim);padding:10px 12px;border:1px dashed var(--line);border-radius:7px;}
/* the check: which headings are read, which are left out */
.imp-cols{display:flex;flex-direction:column;gap:6px;margin:8px 0;}
.imp-cols-row{display:flex;align-items:center;gap:5px;flex-wrap:wrap;}
.imp-cols-l{flex:none;width:68px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
.imp-chip{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;font-size:12px;border:1px solid var(--line);background:var(--surface);color:var(--text);}
.imp-chip.ok{border-color:color-mix(in srgb, var(--ok) 40%, transparent);background:color-mix(in srgb, var(--ok) 8%, transparent);}
.imp-chip.x{border-color:color-mix(in srgb, var(--warn) 50%, transparent);background:color-mix(in srgb, var(--warn) 9%, transparent);color:var(--warn);text-decoration:line-through;}
.imp-chip.rep{color:var(--text-mute);border-style:dashed;}
.imp-tbl{overflow-x:auto;border:1px solid var(--line);border-radius:8px;}
.imp-tbl th.imp-th-x, .imp-tbl td.imp-td-x{opacity:.45;text-decoration:line-through;}
.imp-go{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:12px;}
/* the rules, folded */
.imp-rules{border:1px solid var(--line);border-radius:8px;padding:10px 14px;}
.imp-rules summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--text);}
.imp-rules ul{margin:10px 0 8px;padding-left:18px;font-size:13px;line-height:1.55;color:var(--text-mute);}
.imp-rules li{margin:4px 0;} .imp-rules li b{color:var(--text);}
@media (max-width:760px){
  .imp-step{gap:9px;}
  .imp-drop .btn{flex:1 1 calc(50% - 5px);min-height:40px;justify-content:center;white-space:nowrap;padding:0 10px;gap:6px;}
  .imp-drop-t{flex:1 1 calc(100% - 30px);}
  .imp-cols-l{width:100%;}
  .imp-rules summary{min-height:40px;display:flex;align-items:center;}
}
/* ═══ end v1.4.10.558 ═══ */

/* ═══ v1.4.10.559 — labels: the window shows what prints; the sheet prints on the label printer too ═══ */
/* the single label: the preview (and its two buttons) beside the options */
.qlw{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:18px 22px;align-items:start;}
.qlw-prev{display:flex;flex-direction:column;align-items:center;gap:10px;min-width:0;}
.qlw-h{align-self:stretch;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
.qlw-prev .qr-label{align-self:stretch;}
.qlw-acts{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;}
.qlw-enc{font-size:11px;color:var(--text-dim);text-align:center;word-break:break-all;}
.qlw-side{min-width:0;}
/* the die-cut on screen: a 200px square holding the code and its tag line */
.qr-label.is-ql{flex-direction:column;align-items:center;gap:12px;padding:18px;}
.qr-label.is-ql .qr-brand{display:none;}
.qr-label.is-ql .qr-label-side{align-items:center;text-align:center;}
.qr-label.is-ql .qr-tag{font-size:15px;}
.ql-for{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);}
.ql-die{width:200px;height:200px;box-sizing:border-box;padding:6px;border:1.5px dashed var(--line-2,#94a3b8);border-radius:10px;background:#fff;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;box-shadow:var(--shadow-sm);}
.ql-die .qr-box{width:auto;height:auto;padding:0;background:transparent;box-shadow:none;border:0;display:flex;align-items:center;justify-content:center;}
.ql-die.bc .qr-box{width:100%;} .ql-die.bc .qr-box svg{width:100%;height:auto;}
.ql-die-cap{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:700;font-size:13px;letter-spacing:.02em;color:#000;line-height:1.1;
  max-width:100%;overflow:hidden;white-space:nowrap;}
.ql-dim{font-size:12px;color:var(--text-mute);text-align:center;}
.ql-dim b{color:var(--text);}
/* the options panel (shared with the ticket's label window) */
.ql-opts{display:flex;flex-direction:column;gap:12px;}
.modal-body > .ql-opts{margin-top:20px;padding-top:16px;border-top:1px solid var(--line);}   /* the ticket's label window, where the panel runs under the buttons */
.ql-fmt{display:flex;flex-direction:column;gap:6px;}
.ql-l{font-size:12px;font-weight:500;color:var(--text-mute);}
.ql-fmt .view-toggle{align-self:flex-start;}
.ql-fmt .view-toggle button svg{width:14px;height:14px;}
.ql-row{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);gap:12px;}
.ql-row .fld{margin:0;min-width:0;}
.ql-tagline{margin:0;}
.ql-note{font-size:12px;color:var(--text-mute);}
.ql-note > div:first-child{margin-top:0 !important;}
.qlw-side .ql-size{display:none;}   /* the asset window says it under its preview (.ql-dim); the ticket's window keeps it here */
.ql-tips{border:1px solid var(--line);border-radius:8px;padding:9px 12px;}
.ql-tips summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--text);}
.ql-tips p{margin:8px 0 0;font-size:12px;line-height:1.55;color:var(--text-mute);}
.ql-tips p b{color:var(--text);}
.ql-tips .btn{margin-top:10px;}
.ql-card-note{line-height:1.5;}
/* the label sheet: the cards scroll inside the window, three to a row where it is wide; the format beside the scope */
.lbl-body .label-sheet{max-height:calc(100vh - 480px);min-height:200px;overflow-y:auto;overscroll-behavior:contain;padding:2px;}   /* the head, the bar, the note and the foot take ~400px of the window */
.lbl-fmt{flex:none;}
.lbl-fmt button svg{width:14px;height:14px;}
.lbl-qlnote{margin:0 0 10px;}
@media (min-width:1100px){ .lbl-body .label-sheet{grid-template-columns:repeat(3,minmax(0,1fr));} }
@media (max-width:760px){
  .qlw{grid-template-columns:1fr;}
  .ql-row{grid-template-columns:1fr;}
  .ql-fmt .view-toggle, .lbl-fmt{align-self:stretch;width:100%;display:flex;}
  .ql-fmt .view-toggle button, .lbl-fmt button{flex:1;justify-content:center;min-height:40px;}
  .qlw-acts .btn{flex:1 1 calc(50% - 4px);justify-content:center;min-height:40px;}
  .ql-tips summary{min-height:40px;display:flex;align-items:center;}
  .lbl-body .label-sheet{max-height:55vh;}   /* unbounded, 60 cards ran 7,194px and Print sat under all of them */
}
/* ═══ end v1.4.10.559 ═══ */
/* ═══ v1.4.10.560 — scanning and stocktake: the walk's view, the last scan kept, Scan a label ═══ */
/* the head: state, scope and who; the bar with its percentage; the results as filters */
.stk .stk-sub{display:flex;align-items:center;flex-wrap:wrap;gap:6px 8px;margin-top:0;}
.stk-prog{display:flex;align-items:center;gap:10px;margin:10px 0 8px;}
.stk-prog .stk-progress{flex:1;margin:0;}
.stk-prog b{font-size:13px;font-variant-numeric:tabular-nums;min-width:38px;text-align:right;}
.stk-chips .pill{font-size:11px;}
.stk-f{border:1px solid transparent;font-family:inherit;font-weight:600;cursor:pointer;}
.stk-f:hover{border-color:currentColor;}
.stk-f.on{border-color:currentColor;box-shadow:0 0 0 1px currentColor inset;}
/* the last scan, under the camera until the next */
.stk-last{margin-top:10px;}
.stk-last-empty{display:flex;align-items:center;gap:8px;padding:10px 12px;border:1px dashed var(--line-2);border-radius:8px;font-size:12px;color:var(--text-dim);}
.stk-last-empty svg{width:16px;height:16px;flex:none;}
.stk-last-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border:1px solid var(--line);border-left:4px solid var(--ok);border-radius:8px;background:color-mix(in srgb,var(--ok) 7%,var(--surface));}
.stk-last-row.is-warn{border-left-color:var(--warn);background:color-mix(in srgb,var(--warn) 8%,var(--surface));}
.stk-last-row.is-err{border-left-color:var(--err);background:color-mix(in srgb,var(--err) 7%,var(--surface));}
.stk-last-ico{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex:none;color:#fff;background:var(--ok);}
.stk-last-row.is-warn .stk-last-ico{background:var(--warn);}
.stk-last-row.is-err .stk-last-ico{background:var(--err);}
.stk-last-ico svg{width:15px;height:15px;}
.stk-last-main{flex:1;min-width:0;display:flex;flex-direction:column;}
.stk-last-main b{font-family:var(--font-mono);font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.stk-last-main span{font-size:12px;color:var(--text-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.stk-last-word{flex:none;font-size:13px;font-weight:600;color:var(--ok);}
.stk-last-row.is-warn .stk-last-word{color:var(--warn);}
.stk-last-row.is-err .stk-last-word{color:var(--err);}
/* the lists: a search over what is left, each result's mark, Show all at the foot */
.stk-tabs{display:none;}
.stk-find{position:relative;margin:0 0 8px;}
.stk-find svg{position:absolute;left:10px;top:50%;transform:translateY(-50%);width:14px;height:14px;color:var(--text-dim);pointer-events:none;}
.stk-find input{width:100%;padding-left:32px;}
.stk-note{margin:0 0 8px;}
.stk-fnote{font-weight:500;text-transform:none;letter-spacing:0;color:var(--text-dim);}
.stk-fnote button{background:none;border:0;padding:0;margin-left:4px;font:inherit;color:var(--accent);cursor:pointer;text-decoration:underline;}
.stk-ico.ok{color:var(--ok);background:color-mix(in srgb,var(--ok) 12%,transparent);}
.stk-ico.warn{color:var(--warn);background:color-mix(in srgb,var(--warn) 13%,transparent);}
.stk-ico.err{color:var(--err);background:color-mix(in srgb,var(--err) 11%,transparent);}
.stk-row .btn.xs, .stk-row .pill{flex:none;}
.stk-more{width:100%;justify-content:center;margin-top:8px;}
@media (min-width:761px){ .stk-list{max-height:min(340px, calc(100vh - 500px));min-height:160px;} }   /* the foot stays on a 1280x800 screen with the last-scan line and the search added */
/* the new stocktake: what it will expect */
.stk-new-exp{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;margin:2px 0 10px;border-radius:8px;background:var(--accent-soft);font-size:13px;}
.stk-new-exp:empty{display:none;}
.stk-new-exp > svg{width:18px;height:18px;flex:none;color:var(--accent);margin-top:1px;}
.stk-new-exp span{display:block;font-size:12px;color:var(--text-mute);margin-top:2px;}
/* Scan a label: the stocktake's camera in a narrower window */
#modal-inner:has(> .stk-findwin){max-width:560px;}   /* #modal-inner.modal-wide holds every wide window at 760px */
.stk-findwin .stk-cam-wrap{margin-bottom:4px;}
@media (max-width:760px){
  .stk-chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin:0 -18px;padding:0 18px 2px;}   /* one row you swipe, as the Assets page's tiles */
  .stk-chips::-webkit-scrollbar{display:none;}
  .stk-chips .pill{flex:none;display:inline-flex;align-items:center;}
  .stk-f{min-height:40px;padding:0 12px;font-size:12px !important;}
  .stk-tabs{display:flex;width:100%;margin:2px 0 10px;}
  .stk-tabs button{flex:1;justify-content:center;min-height:40px;}
  .stk-tabs button span{opacity:.7;margin-left:4px;}
  .stk-cols.show-out .stk-col-scanned, .stk-cols.show-scanned .stk-col-out{display:none;}
  .stk-col > .asd-h{display:none;}
  .stk-find input{min-height:40px;font-size:16px;}
  .stk-fnote button{min-height:40px;}
  /* Close, Discard and CSV stay at the foot of the screen (they were under both lists, 982px down) */
  .stk .stk-foot{position:sticky;bottom:calc(-1 * max(14px, env(safe-area-inset-bottom)));z-index:2;background:var(--surface);flex-wrap:wrap;}
  .stk-foot .btn{min-height:40px;}
  .stk-findwin .stk-cam-btn{flex:1 1 100%;justify-content:center;}
  .stk-findwin .stk-cam{max-height:56vh;}
  /* the head's actions: Add asset and Scan share the top row */
  .ast-actions .btn.sm.ast-scan{order:-1;flex:1 1 calc(50% - 3px);}
  .ast-actions:has(.ast-scan) .btn.primary{order:-2;flex:1 1 calc(50% - 3px);}
}
/* ═══ end v1.4.10.560 ═══ */
/* ═══ v1.4.10.561 — an asset's history: the glance, the kinds of change, the whole trail ═══ */
.ah-glance{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin:0 0 12px;}
.ah-glance:empty{display:none;}
.ah-fact{display:flex;flex-direction:column;gap:2px;min-width:0;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface);text-align:left;font:inherit;color:inherit;}
button.ah-fact{cursor:pointer;}
button.ah-fact:hover{border-color:var(--line-2);background:var(--surface-2);}
.ah-fact.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset;}
.ah-fact-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
.ah-fact b{font-size:15px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ah-fact-s{font-size:12px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ah-fact.is-warn b, .ah-fact.is-warn .ah-fact-s{color:var(--warn);}
.ah-bar{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0 0 12px;}
.ah-chips{display:flex;flex-wrap:wrap;gap:6px;flex:1 1 100%;}
.ah-chips:empty{display:none;}
.ah-chip{display:inline-flex;align-items:center;gap:6px;min-height:30px;padding:0 10px;border:1px solid var(--line);border-radius:999px;background:var(--surface);font:inherit;font-size:12px;color:var(--text-mute);cursor:pointer;white-space:nowrap;}
.ah-chip:hover{border-color:var(--line-2);}
.ah-chip b{font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;}
.ah-chip.on{border-color:var(--accent);background:var(--accent-soft);color:var(--accent);}
.ah-chip.on b{color:var(--accent);}
.ah-chip-more{border-style:dashed;color:var(--accent);}
.ah-chip-i{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:5px;margin-left:-4px;}
.ah-chip-i svg{width:12px;height:12px;}
.ah-search{flex:1 1 220px;min-width:0;}
.ah-foot{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;margin-top:12px;padding-top:10px;border-top:1px solid var(--line);font-size:12px;color:var(--text-dim);}
.ah-foot:empty{display:none;}
.alog-rep .aac-chg-plain{color:var(--text-mute);}
@media (max-width:1100px){ .ah-glance{grid-template-columns:repeat(2,minmax(0,1fr));} }
@media (max-width:760px){
  .ah-chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin:0 -16px;padding:0 16px 2px;}   /* one row you swipe */
  .ah-chips::-webkit-scrollbar{display:none;}
  .ah-chip{min-height:40px;flex:none;}
  .ah-search input{font-size:16px;min-height:40px;}
  .ah-bar .btn, .ah-foot .btn{min-height:40px;}
  .ah-foot .btn{flex:1 1 100%;justify-content:center;}
  .ah-fact b{font-size:14px;}
}
/* ═══ end v1.4.10.561 ═══ */
/* ═══ v1.4.10.562 — loans and check-out: the loan on the Overview, Loans & bookings, Return and Check out ═══ */
/* the loan on the Overview */
.asd-loan{display:flex;align-items:center;gap:12px;padding:12px 14px;margin:0 0 14px;border:1px solid var(--line);border-left:4px solid var(--warn);border-radius:8px;background:color-mix(in srgb,var(--warn) 7%,var(--surface));}
.asd-loan.is-err{border-left-color:var(--err);background:color-mix(in srgb,var(--err) 6%,var(--surface));}
.asd-loan.is-ok{border-left-color:var(--accent);background:var(--accent-soft);}
.asd-loan-ico{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex:none;color:#fff;background:var(--warn);}
.asd-loan.is-err .asd-loan-ico{background:var(--err);}
.asd-loan.is-ok .asd-loan-ico{background:var(--accent);}
.asd-loan-ico svg{width:16px;height:16px;}
.asd-loan-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;}
.asd-loan-main b{font-size:14px;font-weight:600;color:var(--text);}
.asd-loan.is-err .asd-loan-main b{color:var(--err);}
.asd-loan-main span{font-size:12px;color:var(--text-mute);}
.asd-loan .btn{flex:none;}
/* Loans & bookings: now, booked, the past folded */
.lnb-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:4px 0 6px;}
.lnb-h ~ .lnb-h{margin-top:14px;}
.lnb-row{align-items:center;}
.lnb-main{flex:1;min-width:0;}
.lnb-t{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.lnb-t span{font-weight:400;color:var(--text-mute);}
.lnb-s{font-size:12px;color:var(--text-dim);margin-top:1px;}
.lnb-row.is-err .lnb-s{color:var(--err);}
.lnb-acts{display:flex;align-items:center;gap:6px;flex:none;}
.lnb-row .pill{flex:none;}
.lnb-past{margin-top:14px;}
.lnb-past summary{cursor:pointer;font-size:12px;font-weight:600;color:var(--text-mute);padding:4px 0;}
.lnb-past summary span{font-weight:500;color:var(--text-dim);margin-left:4px;}
.lnb-past .lnb-row{opacity:.85;}
/* the loan named in Return and Check in */
.lnr-loan{display:flex;flex-direction:column;gap:2px;padding:10px 12px;margin:0 0 14px;border-radius:8px;border-left:4px solid var(--warn);background:color-mix(in srgb,var(--warn) 7%,var(--surface));}
.lnr-loan.is-err{border-left-color:var(--err);background:color-mix(in srgb,var(--err) 6%,var(--surface));}
.lnr-loan.is-ok{border-left-color:var(--accent);background:var(--accent-soft);}
.lnr-loan b{font-size:14px;font-weight:600;}
.lnr-loan span{font-size:12px;color:var(--text-mute);}
/* Check out */
.co-sec{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:2px 0 8px;}
.co-sec ~ .co-sec{margin-top:6px;}
.co-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 12px;}
.co-grid [hidden]{display:none !important;}
.co-note{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border-radius:8px;background:var(--surface-2);font-size:12px;color:var(--text-mute);line-height:1.5;}
.co-note svg{width:15px;height:15px;flex:none;margin-top:1px;color:var(--accent);}
.co-note b{color:var(--text);}
.co-clash{margin-top:10px;padding:10px 12px;border-radius:8px;border:1px solid color-mix(in srgb,var(--warn) 45%,var(--line));background:color-mix(in srgb,var(--warn) 8%,var(--surface));font-size:13px;color:var(--text);}
@media (max-width:760px){
  .asd-loan{flex-wrap:wrap;}
  .asd-loan .btn{flex:1 1 100%;justify-content:center;min-height:40px;}
  .lnb-row{flex-wrap:wrap;}
  .lnb-acts{flex:1 1 100%;justify-content:flex-end;}
  .lnb-acts .btn{min-height:40px;}
  .lnb-acts .att-del{min-width:40px;min-height:40px;}
  .lnb-past summary{min-height:40px;display:flex;align-items:center;}
  .co-grid{grid-template-columns:1fr;}
}
/* ═══ end v1.4.10.562 ═══ */
/* ═══ v1.4.10.563 — maintenance and service: the Service tab's glance, plans and contracts in words ═══ */
.svc-glance{margin:0 0 16px;}
.ah-fact.is-err b, .ah-fact.is-err .ah-fact-s{color:var(--err);}
.svc-row{align-items:center;}
.svc-row.is-off{opacity:.72;}
.svc-main{flex:1;min-width:0;}
.svc-t{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.svc-t span{font-weight:400;color:var(--text-mute);}
.svc-s{font-size:12px;color:var(--text-dim);margin-top:1px;}
.svc-row.is-err .svc-s:first-of-type{color:var(--text-mute);}
.svc-acts{display:flex;align-items:center;gap:6px;flex:none;}
.svc-row .pill{flex:none;}
.as-every{font-style:normal;font-weight:500;color:var(--accent);margin-left:6px;}
@media (max-width:760px){
  .svc-row{flex-wrap:wrap;}
  .svc-acts{flex:1 1 100%;justify-content:flex-end;flex-wrap:wrap;}
  .svc-acts .btn{min-height:40px;}
  .svc-acts .att-del{min-width:40px;min-height:40px;}
  .svc-t{white-space:normal;}
}
/* ═══ end v1.4.10.563 ═══ */
/* ═══ v1.4.10.564 — bulk actions: the bar on one row, one window that says what it will do ═══ */
.bulk-bar{flex-wrap:nowrap;gap:10px;padding:8px 10px 8px 12px;}
.bulk-bar .bb-left{display:flex;align-items:center;gap:6px;flex:none;}
.bulk-bar .bb-clear{background:none;border-color:transparent;color:rgba(255,255,255,.78);padding:6px 8px;text-decoration:underline;text-underline-offset:3px;}
.bulk-bar .bb-clear:hover{background:rgba(255,255,255,.1);color:#fff;}
.bulk-bar .bb-actions{flex-wrap:nowrap;align-items:center;}
.bulk-bar .bb-actions button{white-space:nowrap;}
.bb-more{position:relative;}
.bb-more > summary{list-style:none;display:inline-flex;align-items:center;gap:6px;padding:7px 11px;border-radius:6px;cursor:pointer;
  background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.16);font-size:13px;font-weight:500;white-space:nowrap;}
.bb-more > summary::-webkit-details-marker{display:none;}
.bb-more > summary:hover, .bb-more[open] > summary{background:rgba(255,255,255,.2);}
.bb-more > summary svg{width:14px;height:14px;}
.bb-menu{position:absolute;right:0;bottom:calc(100% + 10px);min-width:220px;display:flex;flex-direction:column;gap:4px;padding:6px;
  background:#0F172A;border:1px solid rgba(255,255,255,.14);border-radius:8px;box-shadow:0 18px 40px -12px rgba(0,0,0,.6);z-index:2;}
.bb-menu button{justify-content:flex-start;width:100%;}
/* the window */
.bk-win .fld{margin-bottom:10px;}
.bk-sum{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 10px;padding:10px 12px;margin:0 0 14px;border-radius:8px;background:var(--surface-2);font-size:13px;color:var(--text-mute);}
.bk-sum > b{color:var(--text);font-size:14px;}
.bk-sum > span + span::before{content:'\00b7';margin-right:10px;color:var(--text-dim);}
.bk-tags{flex:1 1 100%;margin-top:4px;}
.bk-tags summary{cursor:pointer;font-size:12px;font-weight:600;color:var(--accent);}
.bk-tags div{margin-top:6px;max-height:120px;overflow:auto;font-family:var(--font-mono);font-size:12px;line-height:1.6;color:var(--text);}
.bk-note{margin:-4px 0 10px;}
.bk-prev{padding:10px 12px;border-radius:8px;background:var(--accent-soft);font-size:13px;line-height:1.5;color:var(--text);}
.bk-prev:empty{display:none;}
.bk-left{margin-top:6px;color:var(--warn);font-size:12px;}
.bk-left b{color:var(--warn);}
.bk-err{margin-top:10px;padding:10px 12px;border-radius:8px;border:1px solid color-mix(in srgb,var(--err) 40%,var(--line));background:color-mix(in srgb,var(--err) 6%,var(--surface));font-size:13px;color:var(--text);}
.bk-err .btn{margin-top:8px;}
.bk-sure{margin:2px 0 12px;}
/* the bar steps aside while a window is open over it (it sat above the backdrop, live, under the bulk window) */
body:has(#modal.active) .bulk-bar.show{opacity:0;pointer-events:none;}
@media (max-width:760px){
  .bk-tags summary{min-height:40px;display:flex;align-items:center;}
  .bulk-bar{flex-wrap:wrap;}
  .bulk-bar .bb-left{order:0;}
  .bulk-bar .bb-clear{min-height:40px;}
  .bb-more > summary{min-height:40px;}
  /* the actions strip scrolls sideways, so the menu is placed against the bar itself (its transform makes it the
     containing block), above it and the width of it */
  .bb-menu{position:fixed;left:0;right:0;bottom:calc(100% + 8px);min-width:0;}
  .bb-menu button{min-height:44px;}
}
/* ═══ end v1.4.10.564 ═══ */
/* ═══ v1.4.10.565 — files and notes: the tab in the order it is used, the files in words, the label as a line ═══ */
.fn-head{padding:14px 16px;display:flex;align-items:center;justify-content:space-between;gap:10px;}
.fn-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);}
.fn-row{align-items:center;}
.fn-main{flex:1;min-width:0;}
.fn-t{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.fn-s{font-size:12px;color:var(--text-dim);margin-top:1px;}
.fn-ico.is-manual{color:var(--accent);background:var(--accent-soft);}
.fn-ico.is-receipt{color:var(--ok);background:color-mix(in srgb,var(--ok) 12%,transparent);}
.fn-ico.is-warranty{color:var(--info);background:color-mix(in srgb,var(--info) 12%,transparent);}
.fn-ico.is-link{color:var(--text-mute);}
.fn-empty{font-size:13px;color:var(--text-dim);padding:4px 0;}
/* one-line drop zones (photos, test & tag) */
.dropzone.fn-drop{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:10px 14px;margin:0 0 12px;text-align:left;font-size:12px;color:var(--text-dim);border-radius:8px;}
.fn-drop-t{display:inline-flex;align-items:center;gap:8px;min-width:0;}
.fn-drop-t svg{width:16px;height:16px;flex:none;color:var(--text-mute);}
.fn-drop b{color:var(--text);font-weight:600;}
.fn-fault{font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;}
/* notes: the newest three */
.anote-list:not(.show-all) .anote-more{display:none;}
.anote-all{margin-top:8px;}
/* the label as one line */
.fn-label-body{display:flex;align-items:center;gap:14px;padding:12px 16px !important;}
.fn-qr{width:96px;min-width:96px;height:96px;margin:0 !important;padding:4px;display:flex;align-items:center;justify-content:center;flex:none;}
.fn-qr svg{width:88px;height:88px;}
.fn-qr.is-bc{width:auto;min-width:0;max-width:240px;height:auto;}
.fn-qr.is-bc svg{width:auto;height:auto;max-width:100%;}
.fn-label-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;}
.fn-label-main b{font-size:14px;}
.fn-label-main span{font-size:12px;color:var(--text-dim);}
#adt-documents .adt-sec + .adt-sec{margin-top:0;}
@media (max-width:760px){
  .fn-head .btn, .anote-all{min-height:40px;}
  .fn-fault{min-height:40px;}
  .fn-label-body{flex-wrap:wrap;}
  .fn-label-body .btn{flex:1 1 100%;justify-content:center;min-height:40px;}
  .fn-t{white-space:normal;}
}
/* ═══ end v1.4.10.565 ═══ */

/* ═══ v1.4.10.566 — asset cards: the facts in words, the category when there is no picture, a phone card on its side ═══ */
.asset-cards{grid-template-columns:repeat(auto-fill,minmax(min(272px,100%),1fr));}
.acard:hover{transform:translateY(-2px);}
.acard:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
.acard-media{height:120px;flex:none;}
/* no picture: the category's icon and name (the picture covers it; it shows again if the picture fails) */
.acard-ph{display:flex;flex-direction:column;align-items:center;gap:6px;padding:0 12px;color:var(--text-mute);font-size:11px;font-weight:600;text-align:center;line-height:1.25;}
.acard-media .acard-ph svg{width:30px;height:30px;opacity:.55;}
.acard-kind{position:absolute;left:8px;bottom:8px;z-index:1;max-width:calc(100% - 16px);padding:2px 7px;border-radius:5px;border:1px solid var(--line);
  background:color-mix(in srgb,var(--surface) 92%,transparent);color:var(--text-mute);font-size:11px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.acard-media.none .acard-kind{display:none;}
.acard-check{top:6px;left:6px;width:34px;height:34px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;
  background:color-mix(in srgb,var(--surface) 88%,transparent);}
.acard-check input{margin:0;}
.acard-body{padding:12px 14px 13px;min-width:0;}
/* the tag, then the status and condition at the right */
.acard-top{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:wrap;margin-bottom:7px;}
.acard-top .acard-tag{margin-bottom:0;}
.acard-state{display:inline-flex;align-items:center;gap:5px;flex-wrap:wrap;margin-left:auto;}
.acard-name{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.acard-sub{margin-bottom:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
/* Warranty · Value now · Life used: one column each, as many as the set has, along the foot of the card */
.acard-facts{display:grid;gap:10px;margin:auto 0 0;padding-top:9px;border-top:1px solid var(--line);}
.acard-fact{min-width:0;}
.acard-fact dt{margin:0 0 2px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.acard-fact dd{margin:0;font-size:12px;font-weight:600;line-height:1.3;color:var(--text);font-variant-numeric:tabular-nums;}
.acard-fact dd.is-ok{color:var(--ok);}
.acard-fact dd.is-warn{color:var(--warn);}
.acard-fact dd.is-err{color:var(--err);}
.acard-fact dd.is-mute{color:var(--text-dim);font-weight:500;}
.acard-life{display:block;height:4px;margin-top:5px;border-radius:3px;background:var(--surface-2);overflow:hidden;}
.acard-life > span{display:block;height:100%;border-radius:3px;background:var(--ok);}
.acard-life.is-warn > span{background:var(--warn);}
.acard-life.is-err > span{background:var(--err);}
.acard-who{display:flex;align-items:center;gap:5px;min-width:0;margin:-6px 0 10px;font-size:12px;color:var(--text-mute);}
.acard-who svg{width:13px;height:13px;flex:none;}
.acard-who span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* retired: the picture greyed, the name quieter */
.acard.is-off .acard-media img{filter:grayscale(1);opacity:.55;}
.acard.is-off .acard-name{color:var(--text-mute);}
@media (max-width:600px){
  /* on its side: the picture at the left, the words beside it */
  .asset-cards{gap:10px;}
  .acard{flex-direction:row;}
  .acard:hover{transform:none;}
  .acard-media{width:84px;height:auto;min-height:104px;border-bottom:0;border-right:1px solid var(--line);}
  .acard-fact dt{letter-spacing:.03em;}
  .acard-ph{padding:0 6px;font-size:10px;}
  .acard-ph > span{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
  .acard-kind{display:none;}
  .acard-check{top:4px;left:4px;width:40px;height:40px;}
  .acard-body{padding:10px 12px 11px;}
  .acard-name{font-size:14px;}
  .acard-sub{margin-bottom:8px;}
  .acard-facts{gap:8px;padding-top:7px;}
}
/* ═══ end v1.4.10.566 ═══ */

/* ═══ v1.4.10.567 — connected & parts: four facts, one row of actions, each link read as a sentence ═══ */
.cn-acts{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 12px;}
.cn-empty .panel-body{padding:14px 16px;font-size:13px;color:var(--text-mute);}
.cn-panel{margin:0 0 12px;}
.cn-body{padding:10px 16px 12px !important;}
.cn-lead{margin-bottom:10px;}
/* the relationship first, then the asset at the other end: "Fed from  AV-1009 Cisco Room Kit Pro" */
.cn-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--line);border-radius:6px;margin-bottom:6px;font-size:13px;cursor:pointer;transition:border-color .12s,background .12s;}
.cn-row:last-child{margin-bottom:0;}
.cn-row:hover{border-color:var(--brand-blue);background:var(--accent-glow);}
.cn-rel{flex:none;width:96px;font-size:12px;font-weight:600;color:var(--text-mute);}
.cn-main{flex:1;min-width:0;}
.cn-t{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cn-t span{font-weight:400;color:var(--text-mute);}
.cn-s{font-size:12px;color:var(--text-dim);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cn-note{font-size:12px;color:var(--text);margin-top:1px;}
.cn-row .pill{flex:none;}
.cn-x{display:inline-flex;align-items:center;justify-content:center;flex:none;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:none;color:var(--text-dim);cursor:pointer;}
.cn-x svg{width:14px;height:14px;}
.cn-x:hover{color:var(--err);background:color-mix(in srgb,var(--err) 10%,transparent);}
.cn-out{flex:none;}
/* the replacement tree: Remove on the steps that touch this asset */
.ap-lin-x{border:0;background:none;padding:0 2px;margin-left:4px;font:inherit;font-size:11px;font-weight:600;color:var(--text-mute);cursor:pointer;text-decoration:underline;text-underline-offset:2px;}
.ap-lin-x:hover{color:var(--err);}
@media (max-width:760px){
  .cn-acts .btn{min-height:40px;flex:1 1 calc(50% - 4px);justify-content:center;}
  /* the relationship as a line above the asset */
  .cn-row{flex-wrap:wrap;row-gap:4px;}
  .cn-rel{flex:1 1 100%;width:auto;font-size:11px;text-transform:uppercase;letter-spacing:.05em;}
  /* a spare: the words beside its icon, then its stock state and the unlink on a line under them */
  .cn-spare .cn-main{flex:1 1 calc(100% - 44px);}
  .cn-spare .pill{margin-left:40px;}
  .cn-spare .cn-x{margin-left:auto;}
  .cn-t, .cn-s{white-space:normal;}
  .cn-x{width:40px;height:40px;}
  .cn-out{min-height:40px;}
  .ap-lin-x{min-height:40px;padding:0 6px;}
}
/* ═══ end v1.4.10.567 ═══ */

/* ═══ v1.4.10.568 — insights: the score said once, a row per problem, a line per optional field, one colour in the bars ═══ */
.dh2 .dhp-hero{gap:20px;padding:0 0 16px;margin-bottom:14px;}
.dh2 .dhp-ring, .dh2 .dhp-ring svg{width:88px;height:88px;}
.dh2 .dhp-ring-v b{font-size:24px;}
.dh2 .dhp-ring-v span{font-size:10px;margin-top:2px;}
.dh2 .dhp-vt{font-size:18px;}
.dh2 .dhp-vs{margin-top:4px;max-width:760px;}
.dh2-h{margin:0 0 8px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.dh2-h span{margin-left:6px;font-weight:400;text-transform:none;letter-spacing:0;color:var(--text-dim);}
.dh2-list + .dh2-h{margin-top:18px;}
/* a problem: its count, what it is and why it matters in a line, Show in register; the row opens its records */
.dh2-list{display:flex;flex-direction:column;gap:8px;}
.dh2-row{border:1px solid var(--line);border-left:3px solid var(--warn);border-radius:10px;background:var(--surface);overflow:hidden;}
.dh2-row.dupe_serial{border-left-color:var(--err);}
.dh2-line{display:flex;align-items:center;gap:10px;padding-right:12px;}
.dh2-main{flex:1;min-width:0;display:flex;align-items:center;gap:12px;padding:10px 12px;border:0;background:transparent;font:inherit;color:var(--text);text-align:left;cursor:pointer;}
.dh2-main:hover .dh2-l{text-decoration:underline;text-underline-offset:2px;}
.dh2 .dh2-main .dhp-ico{width:32px;height:32px;border-radius:8px;}
.dh2 .dh2-main .dhp-ico svg{width:16px;height:16px;}
.dh2-row.dupe_serial .dhp-ico{background:rgba(220,38,38,.1);color:var(--err);}
.dh2-n{min-width:28px;font-family:var(--font-display);font-size:20px;font-weight:600;letter-spacing:-.02em;line-height:1;font-variant-numeric:tabular-nums;}
.dh2-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;}
.dh2-l{font-size:13px;font-weight:600;}
.dh2-why{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dh2-row.open .dh2-why{white-space:normal;}
.dh2-go{flex:none;}
.dh2-row .dh-list{padding:10px 14px 12px;border-top:1px solid var(--line);background:var(--surface-2);}
/* an optional field: its share of the records filled in, how many are blank */
.dh2-cov{display:flex;flex-direction:column;gap:6px;}
.dh2-crow{border:1px solid var(--line);border-radius:8px;background:var(--surface);overflow:hidden;}
.dh2-cmain{display:grid;grid-template-columns:minmax(150px,28%) minmax(60px,1fr) auto 14px;align-items:center;gap:12px;width:100%;padding:9px 12px;border:0;background:transparent;font:inherit;color:var(--text);text-align:left;cursor:pointer;}
.dh2-cmain:hover{background:var(--surface-2);}
.dh2-cl{display:flex;align-items:center;gap:8px;min-width:0;font-size:13px;font-weight:600;}
.dh2-cl svg{width:16px;height:16px;flex:none;color:var(--text-mute);}
.dh2-ctr{height:6px;border-radius:4px;background:var(--surface-3,var(--line));overflow:hidden;}
.dh2-ctr > span{display:block;height:100%;border-radius:4px;background:var(--accent);}
.dh2-cp{white-space:nowrap;font-variant-numeric:tabular-nums;}
.dh2-cp b{font-size:13px;font-weight:600;}
.dh2-cp span{margin-left:6px;font-size:12px;color:var(--text-dim);}
.dh2-cwhy{padding:0 12px 4px;font-size:12px;color:var(--text-mute);}
.dh2-crow .dh-list{padding:4px 12px 10px;}
/* the breakdowns: what they count, a share beside each count, one colour (condition: its rating's) */
.ins-h{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 10px;margin:0 0 10px;}
.ins-h h3{margin:0;font-size:15px;font-weight:600;}
.ins-h span{font-size:12px;color:var(--text-mute);}
.ast-insights .cat-track > span{background:var(--brand-blue);}
.ast-insights .cat-track.is-ok > span{background:var(--ok);}
.ast-insights .cat-track.is-warn > span{background:var(--warn);}
.ast-insights .cat-track.is-err > span{background:var(--err);}
.ast-insights .cat-track.is-mute > span{background:var(--text-dim);}
.ast-insights .cat-n b, .ast-insights .cond-n b{font-weight:700;color:var(--text);}
.ast-insights .cat-n small, .ast-insights .cond-n small{margin-left:6px;font-size:11px;font-weight:500;color:var(--text-dim);}
.ast-insights .cond-n{min-width:64px;white-space:nowrap;}
.ast-insights .cond-row > .cond{flex:none;min-width:104px;justify-content:center;}   /* the bars start in one line */
.ast-insights .ins-more{align-self:flex-start;margin-top:2px;}
@media (max-width:760px){
  /* the ring beside its sentence, not centred over it (230px before the first problem) */
  .dh2 .dhp-hero{flex-direction:row;align-items:center;gap:14px;}
  .dh2 .dhp-ring, .dh2 .dhp-ring svg{width:68px;height:68px;margin:0;}
  .dh2 .dhp-ring-v b{font-size:18px;}
  .dh2 .dhp-verdict{text-align:left;}
  .dh2 .dhp-vt{justify-content:flex-start;}
  .dh2 .dhp-vs{margin-left:0;}
  /* a problem: the count and the words take the width (the icon left them a 150px column), the why two lines at most */
  .dh2 .dh2-main .dhp-ico, .dh2 .dh2-main .dh-chev{display:none;}
  .dh2-line{padding-right:8px;gap:4px;}
  .dh2-main{min-height:40px;}
  .dh2-why{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;white-space:normal;}
  .dh2-row.open .dh2-why{display:block;}
  /* Show in register as a 40px filter button beside the words (on a line of its own it made each problem 133px) */
  .dh2-go{width:40px;height:40px;padding:0;justify-content:center;}
  .dh2-go-t{display:none;}
  .dh2-cmain{grid-template-columns:minmax(0,1fr) auto 14px;row-gap:6px;min-height:40px;}
  .dh2-ctr{grid-column:1 / -1;grid-row:2;}
  .ast-insights .ins-more{min-height:40px;}
  /* a breakdown row: the name and its figure on one line, the bar under them (a 60px bar cut "World’s Best …") */
  .ast-insights .cat-row{grid-template-columns:minmax(0,1fr) auto;row-gap:5px;}
  .ast-insights .cat-row .cat-track{grid-column:1 / -1;grid-row:2;}
  .ast-insights .cat-lab{white-space:normal;}
}
/* ═══ end v1.4.10.568 ═══ */

/* ═══ v1.4.10.569 — monitoring: the availability said once, the alerts under the checks, an uptime as a fact ═══ */
/* a status line as written: "Opened 40m ago · ticket TKT-4821" (capitalize made it "Opened 40m Ago · Ticket TKT-4821") */
.am-prob-s{text-transform:none;}
.am-prob-s::first-letter{text-transform:uppercase;}
.am-none{padding:2px 0 4px;font-size:12px;color:var(--text-dim);}
/* nothing to graph yet: Refresh alone */
.am-ranges.solo .am-refresh{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;color:var(--text);}
/* the alerts the monitoring raised: open ones first in weight, cleared ones quieter */
.am-alert{align-items:center;}
.am-alert .dot{margin-top:0;}
.am-alert .pill{flex:none;font-size:10px;font-weight:700;letter-spacing:.04em;}
.am-alert.is-done .am-prob-t{font-weight:500;color:var(--text-mute);}
.am-alerts .am-ph-sub b{font-weight:600;color:var(--warn);}
/* a connector's Alerts: the line under the title, Check now at the right */
.am-sso-alerts .am-ph{flex-wrap:wrap;gap:6px 10px;}
.am-sso-alerts .am-ph-sub{margin-left:0;}
.am-sso-alerts #am-checknow{margin-left:auto;}
.am-panel .hc-hero:last-child{border-bottom:0;padding-bottom:0;margin-bottom:0;}
@media (max-width:900px){
  /* the banner: its icon beside its words (it took a line of its own), the window buttons under them */
  .am-banner{flex-direction:row;align-items:flex-start;}
  .am-banner-main{min-width:0;flex:1 1 calc(100% - 52px);}
  .am-banner .am-ranges{flex:1 1 100%;}
  .am-banner .am-ranges.solo{flex:0 0 auto;margin-left:48px;}
  .am-banner .am-ranges.solo .am-refresh{min-height:40px;}
}
@media (max-width:760px){
  /* the ring beside its sentence, not centred over it */
  .hc-hero{flex-direction:row;align-items:center;gap:14px;}
  .hc-ring, .hc-ring svg{width:76px;height:76px;margin:0;}
  .hc-ring-v b{font-size:16px;}
  .hc-ring-v span{font-size:10px;margin-top:1px;}
  .hc-text{text-align:left;}
  .hc-vt{justify-content:flex-start;}
  .hc-vs{margin-left:0;}
  .am-sso-alerts #am-checknow{min-height:40px;}
}
/* ═══ end v1.4.10.569 ═══ */

/* ═══ v1.4.10.570 — the Specs tab: what is recorded, the blanks named once, a copy button on the values people paste ═══ */
.spec-cards{grid-template-columns:repeat(auto-fit,minmax(320px,1fr));}
.spec-card .dg-cell .val{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:2px 6px;}
.spec-card .dg-cell .val > .sp-sub{flex:1 1 100%;}
.sp-sub{margin-top:2px;font-size:12px;font-weight:400;color:var(--text-dim);text-align:right;}
.sp-warn{color:var(--warn);}
.sp-copy{display:inline-flex;align-items:center;justify-content:center;flex:none;width:24px;height:24px;padding:0;border:1px solid transparent;border-radius:6px;background:none;color:var(--text-dim);cursor:pointer;}
.sp-copy svg{width:13px;height:13px;}
.sp-copy:hover{color:var(--brand-blue);border-color:var(--line);background:var(--surface-2);}
.sp-copy.ok{color:var(--ok);}
/* the blanks the card should have, once, at its foot */
.sp-miss{display:flex;align-items:center;justify-content:space-between;gap:8px 12px;flex-wrap:wrap;padding:10px 16px;border-top:1px solid var(--line);background:var(--surface-2);font-size:12px;color:var(--text-dim);}
.sp-fill{flex:none;}
@media (max-width:760px){
  .sp-copy{width:40px;height:40px;margin:-8px -8px -8px 0;}
  .sp-fill{min-height:40px;}
}
/* ═══ end v1.4.10.570 ═══ */

/* ═══ v1.4.10.571 — the Control tab: a screen's state said once, its schedule group as a summary, the alerts' choices in a line ═══ */
.dg-t .dg-open{text-transform:none;letter-spacing:0;}
.dg-sum{display:flex;flex-direction:column;gap:6px;padding:12px 14px;border:1px solid var(--line);border-radius:8px;background:var(--surface);}
.dg-sum-t{display:flex;align-items:center;flex-wrap:wrap;gap:6px 10px;font-size:13px;}
.dg-sum-t .dg-state{padding-bottom:0;margin-left:auto;}
.dg-sum-w{font-size:13px;color:var(--text);}
.dg-sum-last{margin-top:-2px;}
.dg-sum-a{margin-top:4px;}
/* the four alert choices in one line under the intro, each a phrase */
.ipol-legend{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:6px;font-size:12px;color:var(--text-dim);}
.ipol-legend b{color:var(--text-mute);font-weight:600;}
@media (max-width:760px){
  .dg-t .dg-open, .dg-sum-a .btn{min-height:40px;}
  .dg-sum-t .dg-state{margin-left:0;width:100%;}
}
/* ═══ end v1.4.10.571 ═══ */

/* ═══ v1.4.10.572 — the Issues tab: open first, each visit under its ticket, how long each fix took ═══ */
.iss-glance{margin:0 0 12px;}
.iss-sec + .iss-sec{margin-top:16px;}
.iss-h{margin:0 0 8px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.iss-h span{margin-left:4px;font-weight:500;color:var(--text-dim);}
.iss-list{display:flex;flex-direction:column;gap:6px;}
.iss-row{padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface);cursor:pointer;transition:border-color .12s,background .12s;}
.iss-row:hover{border-color:var(--brand-blue);background:var(--accent-glow);}
.iss-row.is-open{border-left:3px solid var(--warn);}
.iss-line{display:flex;align-items:center;gap:10px;}
.iss-pri{flex:none;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;}
.iss-pri svg{width:11px;height:11px;}
.iss-main{flex:1;min-width:0;}
.iss-t{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.iss-s{margin-top:1px;font-size:12px;color:var(--text-dim);}
.iss-warn{color:var(--warn);font-weight:600;}
.iss-st{flex:none;font-size:11px;}
/* a visit made for the ticket, under it */
.iss-visit{display:flex;align-items:center;gap:8px;margin-top:8px;padding-top:8px;border-top:1px dashed var(--line);font-size:12px;color:var(--text-mute);}
.iss-visit:hover .iss-visit-t{color:var(--text);}
.iss-visit-ico{display:inline-flex;flex:none;color:var(--brand-blue);}
.iss-visit-ico svg{width:14px;height:14px;}
.iss-visit-t{flex:1;min-width:0;}
.iss-visit .pill{flex:none;}
.iss-cap{margin-top:10px;}
.iss-empty{padding:14px 16px;border:1px solid var(--line);border-radius:8px;background:var(--surface);font-size:13px;color:var(--text-dim);}
@media (max-width:760px){
  .iss-line{flex-wrap:wrap;row-gap:6px;}
  .iss-main{flex:1 1 calc(100% - 96px);}
  .iss-t{white-space:normal;}
  .iss-st{margin-left:auto;}
  .ad-iss-acts .btn{min-height:40px;flex:1 1 calc(50% - 4px);justify-content:center;}
}
/* ═══ end v1.4.10.572 ═══ */

/* ═══ v1.4.10.573 — Value & costs: four tiles, the Costs panel (the cost of ownership by kind over its ledger) ═══ */
.avv-costs .panel-body{display:flex;flex-direction:column;gap:14px;}
.avv-costs .ap-form-slot:empty{display:none;}
.avv-tco-top{display:flex;align-items:baseline;justify-content:space-between;gap:6px 16px;flex-wrap:wrap;margin-bottom:10px;}
.avv-tco-total{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;min-width:0;}
.avv-tco-total b{font-size:24px;font-weight:600;letter-spacing:-.02em;line-height:1.2;color:var(--text);}
.avv-tco-total span{font-size:12px;color:var(--text-dim);}
.avv-tco-pm{font-size:12px;color:var(--text-mute);}
.avv-tco-bar{display:flex;gap:2px;height:10px;border-radius:5px;overflow:hidden;background:var(--surface-3);}
.avv-tco-bar span{display:block;height:100%;min-width:3px;}
.avv-tco-key{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px 18px;margin-top:12px;}
.avv-tco-k{display:flex;align-items:center;gap:8px;min-width:0;font-size:12px;}
.avv-tco-k i{width:10px;height:10px;border-radius:3px;flex:none;}
.avv-tco-k .l{color:var(--text-mute);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.avv-tco-k b{margin-left:auto;font-weight:600;color:var(--text);white-space:nowrap;}
/* Lifecycle position beside Method is half the window: the ring left two 115px columns of facts, wrapped three lines a
   value (527px tall), so the ring and its stage sit in a row above the facts there */
@media (min-width:901px){
  .avv-grid2 .avv-pos{flex-direction:column;align-items:stretch;gap:16px;}
  .avv-grid2 .avv-pos-ring{flex-direction:row;align-items:center;gap:14px;}
}
/* the ledger, under the bar */
/* under the bar a rule parts them; with no costs (no bar) the ledger is the panel's first line and needs none */
.avv-tco ~ #adt-cost-ledger > *{border-top:1px solid var(--line);padding-top:12px;}
.avv-lhead{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:4px;}
.avv-lhead span{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.avv-lhead em{font-style:normal;margin-left:4px;font-weight:500;color:var(--text-dim);}
.avv-lhead b{font-size:13px;font-weight:600;color:var(--text);}
.avv-lrow{display:grid;grid-template-columns:96px minmax(0,1fr) auto;align-items:center;gap:4px 14px;padding:9px 0;border-top:1px solid var(--line);font-size:13px;}
.avv-lhead + .avv-lrow{border-top:0;}
.avv-lrow.has-x{grid-template-columns:96px minmax(0,1fr) auto 32px;}
.avv-ld{font-size:12px;color:var(--text-mute);white-space:nowrap;}
.avv-lw{display:flex;align-items:center;gap:4px 10px;flex-wrap:wrap;min-width:0;}
.avv-lk{display:inline-flex;align-items:center;gap:6px;flex:none;font-size:11px;font-weight:600;color:var(--text-mute);}
.avv-lk i{width:8px;height:8px;border-radius:50%;background:var(--kc);flex:none;}
.avv-lt{min-width:0;color:var(--text);}
.avv-lm{font-size:12px;color:var(--text-dim);}
.avv-lm a{color:var(--brand);font-weight:600;text-decoration:none;}
.avv-lm a:hover{text-decoration:underline;}
.avv-la{font-weight:600;white-space:nowrap;text-align:right;}
.avv-lx{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer;opacity:.6;}
.avv-lx svg{width:14px;height:14px;}
.avv-lx:hover,.avv-lx:focus-visible{opacity:1;color:var(--err);background:rgba(220,38,38,.08);}
.avv-lempty,.avv-ledger-wait{font-size:13px;color:var(--text-dim);line-height:1.5;}
@media (max-width:700px){
  .avv-tco-total b{font-size:20px;}
  .avv-tco-key{grid-template-columns:1fr;gap:6px;}
  .avv-lrow{grid-template-columns:minmax(0,1fr) auto;}
  .avv-lrow.has-x{grid-template-columns:minmax(0,1fr) auto 40px;}
  .avv-ld{grid-column:1 / -1;}
  .avv-lrow .avv-lw{grid-column:1;flex-direction:column;align-items:flex-start;gap:2px;}   /* the kind, what, who in one order on every row */
  .avv-lx{width:40px;height:40px;}
  .avv-lm a{display:inline-block;position:relative;padding:13px 6px;margin:-13px -6px;}   /* a 41px target, the line unmoved */
}
/* ═══ end v1.4.10.573 ═══ */

/* ═══ v1.4.10.574 — the asset window's head: the facts and the actions on one row, facts that open their place, the phone
   head in three rows with its actions named (openAsset in js/05-assets.js) ═══ */
.ah-head.asd-hero-v2 .ah-band{grid-column:1 / 4;grid-row:5;display:flex;align-items:center;flex-wrap:wrap;gap:10px 24px;min-width:0;
  margin:14px 0 0;padding-top:12px;border-top:1px solid var(--line);}
.ah-head.asd-hero-v2 .ah-band .ah-quickstats{flex:1 1 auto;min-width:0;margin:0;padding:0;border:0;}
.ah-head.asd-hero-v2 .ah-band .ah-actions{flex:0 0 auto;margin:0 0 0 auto;}
/* a fact is a button: it opens the tab that explains it */
.ah-head.asd-hero-v2 button.ah-qs{font:inherit;text-align:left;background:none;border-top:0;border-bottom:0;border-left:0;border-radius:0;
  color:inherit;cursor:pointer;align-items:flex-start;}
.ah-head.asd-hero-v2 button.ah-qs:hover .l{color:var(--brand-blue);}
.ah-head.asd-hero-v2 button.ah-qs:focus-visible{outline:2px solid var(--brand-blue);outline-offset:3px;border-radius:4px;}
@media (max-width:680px), (hover:none) and (pointer:coarse) and (max-width:1100px){
  /* the tag, the status and the condition on one line across the top (beside a 60px photo they took two: 70px), the photo
     beside the make and model and the kind (under the corner's close button, so to the edge), then the place across the
     width (beside the photo it wrapped to two lines) */
  .ah-head.asd-hero-v2 .ah-tagrow{grid-column:1 / -1;grid-row:1;margin:0 0 10px;}
  .ah-head.asd-hero-v2 .ah-thumb.xl{grid-row:2 / 4;}
  .ah-head.asd-hero-v2 .ah-title,.ah-head.asd-hero-v2 .ah-sub{grid-column:2 / -1;padding-right:0;}
  .ah-head.asd-hero-v2 .ah-title{grid-row:2;} .ah-head.asd-hero-v2 .ah-sub{grid-row:3;}
  .ah-head.asd-hero-v2 .ah-breadcrumb{grid-column:1 / -1;grid-row:4;padding-right:0;margin-top:10px;}
  .ah-head.asd-hero-v2 .ah-band{grid-column:1 / -1;margin-top:12px;padding-top:12px;gap:10px;}
  .ah-head.asd-hero-v2 .ah-band .ah-quickstats{flex:1 1 100%;}
  /* the actions named under their icons, four equal cells across (they were four 40px icons to guess at) */
  .ah-head.asd-hero-v2 .ah-band .ah-actions{flex:1 1 100%;margin:0;gap:6px;overflow:visible;padding-bottom:0;}
  .ah-head.asd-hero-v2 .ah-actions .btn.sm{flex:1 1 0;min-width:0;width:auto;height:auto;min-height:50px;padding:6px 4px;
    flex-direction:column;justify-content:center;gap:4px;font-size:11px;line-height:1.2;font-weight:600;white-space:nowrap;}
  .ah-head.asd-hero-v2 .ah-actions .btn.sm svg{width:17px;height:17px;}
}
/* ═══ end v1.4.10.574 ═══ */

/* ═══ v1.4.10.575 — the Service tab: one row of actions, Maintenance in one panel, a section only when it has something,
   rows of at most three controls (apServiceBodyHtml / apMaintPanel in js/05-assets.js) ═══ */
.svc-actrow{margin:0 0 14px;}
.svc-panel{margin:0 0 16px;}
.svc-panel .panel-body{padding:14px 16px;}
.lnb-h span{margin-left:4px;font-weight:500;color:var(--text-dim);}
.svc-sub{margin:12px 0 6px;font-size:12px;font-weight:600;color:var(--text-mute);}
.svc-warn{color:var(--warn);font-weight:600;}
.svc-ph{display:inline-flex;align-items:center;gap:3px;margin-left:8px;font-size:11px;font-weight:600;color:var(--text-dim);vertical-align:1px;}
.svc-ph svg{width:12px;height:12px;}
.svc-cap{margin-top:10px;}
/* a quiet remove (the red bin box beside every row read as the row's main action) */
.svc-x{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;flex:none;padding:0;border:0;border-radius:6px;
  background:transparent;color:var(--text-dim);cursor:pointer;opacity:.65;}
.svc-x svg{width:14px;height:14px;}
.svc-x:hover,.svc-x:focus-visible{opacity:1;color:var(--err);background:rgba(220,38,38,.08);}
.svc-glance div.ah-fact{cursor:default;}
@media (max-width:760px){
  /* a row's pill and its controls share the line under its text (the controls took a line of their own and wrapped to a
     second: a plan was 165px); Edit is its icon there (named for a screen reader), so Create job, Edit and the remove fit
     beside the pill in the 290px a row has. A long pill ("12 days overdue") still wraps the controls under it. */
  .svc-panel .panel-body{padding:14px 12px;}
  .svc-row:has(.svc-acts) .svc-main,.lnb-row:has(.lnb-acts) .lnb-main{flex:1 1 calc(100% - 52px);}
  .svc-acts,.lnb-acts{flex:1 1 auto;justify-content:flex-end;flex-wrap:nowrap;gap:4px;}
  .svc-acts .svc-edit{width:40px;padding:0;justify-content:center;gap:0;font-size:0;}
  .svc-acts .svc-edit svg{width:15px;height:15px;margin:0;}
  .svc-x{width:40px;height:40px;}
  .svc-actrow .btn{flex:1 1 calc(50% - 4px);justify-content:center;}
}
/* ═══ end v1.4.10.575 ═══ */

/* ═══ v1.4.10.576 — the Overview: the asset links in the history notice reach the 40px floor on a phone without moving the
   line (they were 16px: "Replaces AV-1029", "Retired · replaced by AV-1001") ═══ */
@media (max-width:760px){
  .asset-lineage .ai-main a{display:inline-block;position:relative;padding:12px 4px;margin:-12px -4px;}
}
/* ═══ end v1.4.10.576 ═══ */

/* ═══ v1.4.10.577 — the asset editor: the save bar stays on screen on a phone, the loan's hold on the holder said ═══ */
.ae-loanlock{display:flex;align-items:flex-start;gap:10px;margin:0 0 12px;padding:10px 12px;border-radius:8px;font-size:13px;line-height:1.5;
  color:var(--text);background:color-mix(in srgb,var(--warn) 8%,var(--surface));border:1px solid color-mix(in srgb,var(--warn) 40%,var(--line));}
.ae-loanlock svg{width:16px;height:16px;flex:none;margin-top:2px;color:var(--warn);stroke:currentColor;}
/* On a phone (the window scrolls whole) Back, Save and Next were the window's last thing, three rows tall, 1,487px under
   Placement's first field: every change meant scrolling past the step to save it. They are one bar stuck to the foot of
   the screen now: Back and Start fresh as their icons (named for a screen reader), Save and Next; Help and the step dots
   step aside (every field keeps its ?, the step strip is at the top) and so does Cancel (the corner × closes). */
/* the guide's numbered steps: the title is the step's own <b>; a bold word inside its text ("the <b>space code</b>",
   "<b>Warranty (months)</b>") took the title's display:block and stood on a line of its own */
.hg-step p b{display:inline;font-size:inherit;margin:0;}
@media (max-width:680px), (hover:none) and (pointer:coarse) and (max-width:1100px){
  #modal-inner.modal-asset .ae-foot{position:sticky;bottom:0;z-index:6;flex-wrap:nowrap;gap:8px;
    padding:10px max(14px, env(safe-area-inset-right)) calc(10px + env(safe-area-inset-bottom)) max(14px, env(safe-area-inset-left));
    box-shadow:0 -6px 18px rgba(12,27,42,.10);}
  #modal-inner.modal-asset .ae-foot-mid,#modal-inner.modal-asset .ae-foot .ae-help,#modal-inner.modal-asset .ae-foot .ae-cancel{display:none;}
  #modal-inner.modal-asset .ae-foot-right{flex:1 1 auto;flex-wrap:nowrap;justify-content:flex-end;gap:8px;min-width:0;}
  #modal-inner.modal-asset .ae-foot-right .btn{flex:0 1 auto;min-height:44px;}
  #modal-inner.modal-asset .ae-foot-right #ae-save{flex:1 1 auto;}
  #modal-inner.modal-asset .ae-foot #ae-back,#modal-inner.modal-asset .ae-foot #ae-clear{flex:none;width:44px;min-height:44px;padding:0;justify-content:center;gap:0;font-size:0;}
  #modal-inner.modal-asset .ae-foot #ae-back svg,#modal-inner.modal-asset .ae-foot #ae-clear svg{width:18px;height:18px;margin:0;}
}
/* ═══ end v1.4.10.577 ═══ */

/* ═══ v1.4.10.578 — the asset's history: who and when on the kind's line, so a change is two lines (it was three, 94px) ═══ */
.alog-tl .alog-by{margin:0;font-size:12px;color:var(--text-dim);min-width:0;}
.alog-tl .alog-tlrow{padding-top:9px;padding-bottom:9px;}
.alog-tl .aac-changes{margin-top:4px;}
/* ═══ end v1.4.10.578 ═══ */

/* ═══ v1.4.10.579 — the asset guide: the rail's chapter names wrap (ten of the seventeen were cut at 226px: "Reading an asset
   re…", "Value, depreciation…"); on a phone the rail is a strip of single-line chips, as before ═══ */
@media (min-width:601px){ .hg-item span{white-space:normal;line-height:1.3;overflow:visible;} }
/* ═══ end v1.4.10.579 ═══ */
/* ═══ v1.4.10.580 — Control > Alerts & tickets on a phone: each alert a card, not a 720px table squeezed to 344 ═══
   The table keeps a 720px floor (.ipol) and scrolls in its wrap; but .panel-body.flush table.ctl-rules{min-width:0}
   outranks it, so on a phone the four fixed columns came out 117 / 52 / 58 / 117px: "4 alerts · no tickets" broke a letter
   a line, the head's "Last 30 days" ran into "Now", and the four choices (nowrap in 58px cells) printed over each other.
   At 700px and under a row is a card: the alert and what it is across the top, its last 30 days and its state on one
   line under it (the head is hidden, so the count says what it counts), the four choices two by two across the width,
   then where its setting comes from. */
@media (max-width:700px){
  .panel-body.flush table.ctl-rules.ipol,.ipol tbody,.ipol tr,.ipol td{display:block;width:auto !important;min-width:0 !important;}
  .ipol thead{display:none;}
  .ipol .ipol-grp td{padding:8px 14px;border-top:1px solid var(--line);}
  .ipol .ipol-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px 12px;align-items:center;padding:12px 14px;border-top:1px solid var(--line);}
  .ipol .ipol-row td{padding:0;border:0;overflow-wrap:normal;background:transparent;}
  .ipol .ipol-row.firing{background:rgba(220,38,38,.04);}
  .ipol .ipol-name,.ipol .ipol-pol{grid-column:1 / -1;}
  .ipol .ipol-name b{font-size:14px;}
  .ipol .ipol-ev{font-size:13px;color:var(--text);white-space:normal;}
  .ipol .ipol-ev::before{content:'Last 30 days: ';color:var(--text-dim);}
  .ipol .ipol-state{text-align:right;}
  .ipol .ipol-state .ctl-tk{margin-top:4px;}
  .ipol .ipol-pol .ipol-seg{max-width:none;}
  .ipol .ipol-pol .ipol-seg .seg-btn{white-space:normal;line-height:1.2;}
}
/* Control > Commands & readings on a phone. The network interfaces table (five columns, 486px) scrolled sideways inside a
   334px card, so an interface's state and what the Ody saw sat off screen: each interface is a card now, its address and
   state across the top and its MAC, what the Ody saw it as and its ports labelled under them. The links in the SNMP line
   (Edit device, Turn SNMP monitoring off, Show SNMP verdict) were 14px tall: 40px targets, the line unmoved. */
@media (max-width:700px){
  .ctl-net-tbl,.ctl-net-tbl tbody,.ctl-net-tbl tr,.ctl-net-tbl td{display:block;}
  .ctl-net-tbl thead{display:none;}
  .ctl-net-tbl tr{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 12px;align-items:center;padding:12px 14px;border-bottom:1px solid var(--line);}
  .ctl-net-tbl tr:last-child{border-bottom:0;}
  .ctl-net-tbl td{padding:0;border:0;min-width:0;overflow-wrap:anywhere;}
  .ctl-net-tbl td:nth-child(1){grid-column:1;grid-row:1;}
  .ctl-net-tbl td:nth-child(3){grid-column:2;grid-row:1;text-align:right;}
  .ctl-net-tbl td:nth-child(2),.ctl-net-tbl td:nth-child(4),.ctl-net-tbl td:nth-child(5){grid-column:1 / -1;position:relative;padding-left:84px;}
  .ctl-net-tbl td:nth-child(2)::before,.ctl-net-tbl td:nth-child(4)::before,.ctl-net-tbl td:nth-child(5)::before{position:absolute;left:0;top:2px;
    font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
  .ctl-net-tbl td:nth-child(2)::before{content:'MAC';}
  .ctl-net-tbl td:nth-child(4)::before{content:'Seen as';}
  .ctl-net-tbl td:nth-child(5)::before{content:'Ports';}
  .ctl-snmp-line a{display:inline-block;position:relative;padding:13px 4px;margin:-13px -4px;}
  /* the MIB rules (six columns, a 220px name and a 150px state) and Recent alerts (five) scrolled sideways the same way:
     a rule is its switch beside its name, severity, what it does, its state and its buttons, one under another; a
     recent alert is its rule across the top, then when, severity, state and ticket in a row that wraps */
  .ctl-rules:not(.ipol),.ctl-rules:not(.ipol) tbody,.ctl-rules:not(.ipol) td{display:block;}
  .panel-body.flush table.ctl-rules:not(.ipol){width:auto;}
  .ctl-rules:not(.ipol) thead{display:none;}
  .ctl-rules tr.ctl-rule{display:grid;grid-template-columns:40px minmax(0,1fr);column-gap:10px;row-gap:6px;padding:12px 14px;border-top:1px solid var(--line);}
  .ctl-rules tr.ctl-rule td{grid-column:2;padding:0;border:0;min-width:0;}
  .ctl-rules tr.ctl-rule td.ctl-rule-on{grid-column:1;grid-row:1 / span 5;padding-top:2px;}
  .ctl-rules tr.ctl-rule td.ctl-rule-tools{text-align:left;}
  .ctl-rules tr.ctl-rule.firing{background:color-mix(in srgb,var(--err) 6%,transparent);}
  .ctl-rules tr.ctl-rule.firing td{background:transparent;}
  table.ctl-rules.ctl-recent tbody tr{display:flex;flex-wrap:wrap;align-items:flex-start;gap:6px 14px;padding:12px 14px;border-top:1px solid var(--line);}
  table.ctl-rules.ctl-recent tbody td{padding:0;border:0;min-width:0;}
  table.ctl-rules.ctl-recent tbody td:nth-child(2){order:-1;flex:1 1 100%;}
  table.ctl-rules.ctl-recent tbody td .device-meta{margin-top:1px;}
  table.ctl-rules.ctl-recent tbody td a,.ctl-panel .ctl-tk{display:inline-block;position:relative;padding:12px 4px;margin:-12px -4px;}   /* ticket links: 40px targets */
}
/* ═══ end v1.4.10.580 ═══ */

/* ═══ v1.4.10.581 — the phone sweep: the reply bar, Users, the room's assets, short tables, small targets; the A4 label card ═══ */
/* The A4 label sheet: its cards shared .lbl-card with the client editor's label-format picker, defined later, which set
   align-items:flex-start, a pointer and a hover border. The tag, model and site sat at the top beside the code, not
   level with it, and every card looked clickable. */
.label-sheet .lbl-card{align-items:center;gap:12px;padding:12px;border-radius:6px;cursor:default;background:var(--surface,#fff);transition:none;}
.label-sheet .lbl-card:hover{border-color:var(--line);}
.label-sheet .lbl-card.bc{align-items:stretch;}
.label-sheet .lbl-card > div:last-child{min-width:0;}
/* The single label's A4 card preview: the 266px code left the tag, model and site a 96px column (the tag broke over two
   lines, the model over three). The preview draws the code at a size that leaves the text its line; the print is
   unchanged (it copies the full-size code). */
@media (min-width:701px){   /* a phone stacks the card (code under the text), where the full-size code fits */
  .qlw-prev .qr-label:not(.is-ql):not(.is-barcode){gap:18px;padding:22px 20px;}
  .qlw-prev .qr-label:not(.is-ql):not(.is-barcode) .qr-box{width:min(180px,46%);padding:8px;}
  .qlw-prev .qr-label:not(.is-ql):not(.is-barcode) .qr-box svg{width:100%;height:auto;}
}
.qr-label:not(.is-ql):not(.is-barcode) .qr-label-side{min-width:0;flex:0 1 auto;}
/* Users: a name beside its YOU badge broke letter by letter ("Admi/n", 36px) — overflow-wrap:anywhere let the name
   shrink below its longest word */
.ua-un{overflow-wrap:break-word;}
@media (max-width:560px){
  /* The reply bar: Attach, Photo, the after-send choice and Send were one 457px row in 354px, Send's choice off the
     edge. With the after-send choice it is two rows of two; without it the row fits as it was. */
  .tkd-composer .cmp-foot:has(.tkt-aftersend){display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;overflow:visible;}
  .tkd-composer .cmp-foot:has(.tkt-aftersend) > .btn{justify-content:center;width:100%;}
  .tkd-composer .cmp-foot:has(.tkt-aftersend) > .btn:not(.primary){order:0;}
  .tkd-composer .cmp-foot:has(.tkt-aftersend) .tkt-aftersend{order:1;width:100%;min-width:0;min-height:40px;}
  .tkd-composer .cmp-foot:has(.tkt-aftersend) > .btn.primary{order:2;}
}
@media (max-width:700px){
  /* Users & access: a card a person (the table was 888px in 314) */
  .tbl-scroll:has(> table.dt tr.ua-row){overflow-x:visible;}
  .tbl-scroll > table.dt:has(tr.ua-row){min-width:0;width:100%;display:block;}
  table.dt:has(tr.ua-row) thead{display:none;}
  table.dt:has(tr.ua-row) tbody,table.dt:has(tr.ua-row) tr.ua-grouphdr,table.dt:has(tr.ua-row) tr.ua-grouphdr > td{display:block;}
  table.dt tr.ua-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px 12px;padding:12px 14px;border-top:1px solid var(--line);}
  table.dt tr.ua-row > td{display:block;padding:0;border:0;min-width:0;}
  table.dt tr.ua-row > td:nth-child(1){grid-column:1;grid-row:1;}
  table.dt tr.ua-row > td:nth-child(6){grid-column:2;grid-row:1;}
  table.dt tr.ua-row > td:nth-child(2),table.dt tr.ua-row > td:nth-child(3),table.dt tr.ua-row > td:nth-child(4){grid-column:1 / -1;}
  table.dt tr.ua-row > td:nth-child(2){font-size:13px;}
  table.dt tr.ua-row > td:nth-child(5){grid-column:1;}
  table.dt tr.ua-row > td:nth-child(5)::before{content:"Last active ";color:var(--text-dim);}
  table.dt tr.ua-row > td:nth-child(7){grid-column:2;justify-self:end;}
  table.dt tr.ua-row > td:nth-child(7):empty{display:none;}
  table.dt tr.ua-row .ua-uttl.is-email{display:none;}
  /* The room page's assets: a card a row (the table scrolled, 354 of 680px shown) */
  .panel-body.flush .tbl-scroll:has(> table.loc-asset-tbl){overflow-x:visible;}
  .panel-body.flush .tbl-scroll table.dt.loc-asset-tbl{min-width:0;width:100%;display:block;}
  table.loc-asset-tbl tbody{display:block;}
  table.loc-asset-tbl tr.loc-asset-row{display:grid;grid-template-columns:52px auto minmax(0,1fr) 18px;align-items:center;gap:2px 10px;padding:10px 14px;border-top:1px solid var(--line);}
  table.loc-asset-tbl tr.loc-asset-row:first-child{border-top:0;}
  table.loc-asset-tbl tr.loc-asset-row > td{display:block;padding:0;border:0;width:auto !important;min-width:0;}
  table.loc-asset-tbl td.la-thumb{grid-column:1;grid-row:1 / span 2;}
  table.loc-asset-tbl td.la-tag{grid-column:2 / 4;grid-row:1;}
  table.loc-asset-tbl td.la-cat{grid-column:2;grid-row:2;}
  table.loc-asset-tbl td.la-cat:empty{display:none;}
  table.loc-asset-tbl td.la-st{grid-column:3;grid-row:2;justify-self:start;}
  table.loc-asset-tbl td.la-cat:empty + td.la-st{grid-column:2 / 4;}
  table.loc-asset-tbl td.la-go{grid-column:4;grid-row:1 / span 2;}
  table.loc-asset-tbl td.la-go svg{width:16px;height:16px;}
  /* A table of three columns or fewer took the 680px (or 500px) floor and scrolled: Settings' Integrators & clients was
     Name, Type and its buttons in 680px */
  .panel-body.flush .dt:has(> thead):not(:has(> thead th:nth-child(4))),
  table.dt:has(> thead):not(:has(> thead th:nth-child(4))){min-width:0;}
  /* small targets the sweep found */
  .btn.sm,.btn.xs{min-width:40px;}
  .wk-side-x{width:40px;height:40px;}
  .tk-prio-pick .tk-pp{min-width:40px;justify-content:center;}
  .tk-due-btn{min-height:40px;}
  .tk-chip.tkt{position:relative;}
  .tk-chip.tkt::after{content:"";position:absolute;inset:-11px -3px;}
  .loc-tkt-row{min-height:40px;}
  /* The Users switch: its 10px hit-area padding sat inside the border, so a phone drew a 46px green slab with the knob
     at its top edge. The label round it is the 40px target (it toggles the switch), so the switch keeps its own shape. */
  .ua-sw{padding:0;box-sizing:border-box;height:22px;min-height:0;background-clip:border-box;}
  label.ua-stat{min-height:40px;}
  .ua-rolelink{min-height:40px;}   /* Users' "Configure what each role can do": 18px */
}
@media (max-width:700px),(hover:none) and (pointer:coarse){
  .af-inner a.af-link{min-height:40px;display:inline-flex;align-items:center;}   /* the footer's company link sits in a span, so the v1.4.10.25x floor (a direct child) missed it: 15px */
}
/* ═══ end v1.4.10.581 ═══ */
/* ═══ v1.4.10.582 — the Support page: the list's columns, the toolbar on one line, the cards' heads ═══ */
/* The SLA cell's two clocks, one over the other (js tkxSlaCell): the column needs the wider pill, not both */
.tkx-slastack{display:inline-flex;flex-direction:column;align-items:flex-start;gap:3px;vertical-align:middle;}
/* The subject and its flags (Priority, Yours, Monitor, SLA): the flags sit beside the subject while it keeps 120px,
   and wrap under it, whole, when it would not. The subject ellipsises within its line. */
.tkx-subjline{display:flex;flex-wrap:wrap;align-items:center;gap:3px 5px;min-width:0;}
.tkx-subjline > .tkx-subj{flex:1 1 120px;min-width:0;max-width:max-content;}   /* grows to its own length, so the flags follow it */
.tkx-subjline > .pill{flex:none;}
/* The fixed columns (assignee, priority, SLA, status, updated) are as wide as their content: 14px a side, not 18, gives
   the subject and the room 40px more */
.tkx-table td.tk-asg,.tkx-table td.tk-pri,.tkx-table td.tk-sla,.tkx-table td.tk-status,.tkx-table td.tk-upd,
.tkx-table th.tk-asg,.tkx-table th.tk-pri,.tkx-table th.tk-sla,.tkx-table th.tk-status,.tkx-table th.tk-upd{padding-left:14px;padding-right:14px;}
/* The reference line: the ref never shrinks; the client beside it and the asset chip give way first */
.tkx-refrow .tkx-refline{display:flex;flex:0 1 auto;min-width:auto;}
.tkx-refline .tkx-ref{flex:none;}
.tkx-refline .tkx-reforg{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:pre;}
.tkx-refrow .tkx-rl-ast{flex:0 1 auto;min-width:24px;overflow:hidden;}
.tkx-rl-ast svg{flex:none;}
.tkx-rl-ast .tkx-rl-t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* The rooms: the width the SLA column gave back goes to the Site cell as well as the subject (13% cut 9 of 31 rooms
   at 1440: "C2.4 Meeting…", "Darling Harbo…") */
@media (min-width:761px){ .tkx-table td.tk-loc{width:18%;} }
/* The toolbar's first line beside the rail (1180-1499px): search, the status and sort choices, List / Board,
   notifications, export and New ticket were 965px of controls in 950 at 1280, so the actions dropped to a line of
   their own. The status choice reads "Open work" (js), and the view switch shows its icons (the names stay on their
   titles), as notifications and export already do here. The choices keep their whole labels (v1.4.10.544). */
@media (min-width:1180px) and (max-width:1499px){
  .tkx-desk .tkx-tb2 .tkx-toggle .tkx-tg-lbl{display:none;}
}
@media (min-width:1180px) and (max-width:1279px){ .tkx-desk .tkx-tb2 .tkx-search{flex-basis:150px;min-width:150px;} }   /* it still grows into what the line leaves */
/* Without the rail (901-1179px) the same line was 1,014px of controls in 1,004 at 1100: the actions go to their icons
   there too, and the search starts from 200px */
@media (min-width:901px) and (max-width:1179px){
  .tkx-tb2 .tkx-search{flex-basis:200px;}
  .tkx-tb2 .tkx-tg-lbl,.tkx-tb2 .tkx-btn-lbl{display:none;}
  .tkx-tb2 .tkx-ico-btn{padding:0 10px;}
}
/* A card's head (the board, and the list on a phone): the ref and priority first, the flags after them wrapping onto
   a second line when they must, the SLA pill at the line's end */
.tkx-card .tc-top{flex-wrap:wrap;row-gap:4px;}
.tkx-card .tc-ref{white-space:nowrap;}
.tkx-card .tc-top .tc-sla{margin-left:auto;}
/* ═══ end v1.4.10.582 ═══ */
/* ═══ v1.4.10.583 — the ticket window: the head's counts and trail, the in-service and SLA cards, the phone's tabs ═══ */
/* the in-service label card: the code (a 120px box, which drawQR sizes it to) beside its note and buttons */
.tkt-svc .tkt-svc-b{display:flex;align-items:center;gap:14px;}
.tkt-svc .tkt-svc-qr{flex:none;width:120px;height:120px;display:flex;align-items:center;justify-content:center;background:#fff;border-radius:6px;}
.tkt-svc-txt{min-width:0;flex:1 1 auto;}
.tkt-svc-acts{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px;}
/* the SLA card's clocks, Response and Resolution, side by side */
.tkd-slaclocks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px;}
.tkd-slaclock{min-width:0;display:flex;flex-direction:column;}
.tkd-slaclock > div:first-child{margin-bottom:8px;}
.tkd-slaclock > .tkd-slabar{margin-top:auto;}   /* the two bars on one line when a note ("Acknowledged by …") makes one column taller */
@media (max-width:700px){
  /* the Conversation / Details switch is the width of the screen while it sticks: at 262px the thread scrolled past
     beside it, the cards' edges showing to its right */
  #modal-inner.modal-tkt .tkd-tabs{display:flex;}
  #modal-inner.modal-tkt .tkd-tabs .tkd-tab{flex:1 1 0;justify-content:center;}
  /* 40px targets: the Acknowledged pill (38px), a short step of the trail ("ICC", 27px) and a Details link (21px) */
  .tkd-actionbar .tkd-ackdone{min-width:40px;justify-content:center;}
  .tkd-details .ex-v a{display:inline-block;min-width:40px;}
  .tkd-head .tkd-sub .tkd-cr a{display:inline-block;min-width:40px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom;}   /* a long room still ends in an ellipsis */
}
/* ═══ end v1.4.10.583 ═══ */
/* ═══ v1.4.10.584 — the New ticket form: what is wrong first, the room after its site, the phone's whole screen ═══ */
.nt-hint{font-size:12px;line-height:1.4;color:var(--text-dim);margin-top:5px;}
.modal-nt input[aria-invalid="true"]{border-color:var(--err);box-shadow:0 0 0 3px color-mix(in srgb,var(--err) 14%,transparent);}
.modal-nt .nt-locq:disabled,.modal-nt #nt-location:disabled,.modal-nt #nt-site:disabled{opacity:.6;cursor:not-allowed;}   /* waiting on the step before */
#nt-att-drop > span{min-width:0;}
@media (max-width:700px){
  /* the form fills the phone, as a ticket does: in a 360px box with its own padding and each section's, a field was 286px
     on a 390px screen */
  .modal-back:has(> #modal-inner.modal-nt){padding:0;align-items:stretch;}
  #modal-inner.modal-nt{max-width:100%;width:100%;max-height:100dvh;height:100dvh;border-radius:0;border:0;}
  #modal-inner.modal-nt > .modal-body{padding:12px;}
  #modal-inner.modal-nt .nt-section{padding:12px 12px 2px;margin-bottom:12px;}
  #modal-inner.modal-nt > .nt-foot{border-radius:0;}
}
/* ═══ end v1.4.10.584 ═══ */
/* ═══ v1.4.10.585 — SLA targets: one matrix shape for the client and the site, targets in units, the global defaults ═══ */
.sla-mx td{vertical-align:middle;}
.sla-mx .sla-pr,.sla-mx .sla-t,.sla-mx .sla-src,.sla-mx .sla-act{white-space:nowrap;}
.sla-mx .sla-pr .pill{margin-right:7px;}
.sla-prw{font-size:12px;color:var(--text-mute);}
.sla-mx .sla-t{font-variant-numeric:tabular-nums;}
.sla-mx .sla-src .sla-clock{display:block;font-size:13px;margin-bottom:3px;}
.sla-mx .sla-act{text-align:right;}
.sla-mx .sla-act .ra-btn + .ra-btn{margin-left:4px;}
.sla-mx .sd-sla-asgc{min-width:180px;}   /* 216 (v1.4.10.504) held the site's matrix 45px past its half-width panel at 1280; "Matt Ward (integrator)" fits in 180 */
.sla-mx .sd-sla-asg{min-width:150px;width:100%;}
.sla-note{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:8px 14px;padding:8px 2px 2px;}
.sla-note > .device-meta{flex:1 1 260px;min-width:0;}
/* a target: a number and its unit */
.sla-dur{display:flex;gap:6px;}
.sla-dur input{flex:1 1 0;min-width:0;}
.sla-dur select{flex:0 0 auto;width:auto;}
/* the global defaults form: one row a priority */
.sla-gl{display:flex;flex-direction:column;gap:8px;margin:12px 0 6px;}
.sla-gl-row{display:grid;grid-template-columns:96px minmax(0,1fr) minmax(0,1fr) 150px;gap:10px 12px;align-items:end;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface-2);}
.sla-gl-row .field{margin:0;}
.sla-gl-pr{display:flex;flex-direction:column;align-items:flex-start;gap:3px;align-self:center;}
.sla-gl-bi{font-size:11px;}
@media (max-width:700px){
  /* the priority and its clock on one line, then each target the full width (side by side, a number box was 45px) */
  .sla-gl-row{grid-template-columns:minmax(0,1fr) minmax(0,1fr);}
  .sla-gl-pr{grid-column:1;grid-row:1;flex-direction:row;align-items:center;gap:8px;}
  .sla-gl-row > .field:last-child{grid-column:2;grid-row:1;}
  .sla-gl-row > .field:nth-child(2),.sla-gl-row > .field:nth-child(3){grid-column:1 / -1;}
  /* the matrices on a phone: a card a priority (the site's was 728px in 322, the client's 515) */
  .cust-table-wrap:has(> table.sla-mx){overflow-x:visible;}
  .cust-table-wrap > table.data-table.sla-mx{min-width:0;width:100%;display:block;}
  table.sla-mx thead{display:none;}
  table.sla-mx tbody{display:block;}
  table.sla-mx tr.sla-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:center;gap:8px 12px;padding:12px 2px;border-top:1px solid var(--line);}
  table.sla-mx tr.sla-row:first-child{border-top:0;}
  table.sla-mx tr.sla-row > td{display:block;padding:0;border:0;min-width:0;}
  .sla-mx .sla-pr{grid-column:1;grid-row:1;}
  .sla-mx .sla-act{grid-column:2;grid-row:1;}
  .sla-mx .sla-t::before,.sla-mx .sd-sla-asgc::before{content:attr(data-l);display:block;font-size:11px;font-weight:500;color:var(--text-dim);margin-bottom:2px;}
  .sla-mx .sla-src{grid-column:1 / -1;display:flex;align-items:center;gap:8px;}
  .sla-mx .sla-src .sla-clock{display:inline;margin:0;}
  .sla-mx .sd-sla-asgc{grid-column:1 / -1;min-width:0;}
  .sla-mx .sla-act .ra-btn{width:40px;height:40px;}
  /* the site's support rules: a card a rule (430px in 322, "Projector" broken in a 42px cell): the name with its buttons,
     where it applies and its order, then When and Then */
  .cust-table-wrap:has(> table.sd-rules-tbl){overflow-x:visible;}
  .cust-table-wrap > table.data-table.sd-rules-tbl{min-width:0;width:100%;display:block;}
  table.sd-rules-tbl thead{display:none;}
  table.sd-rules-tbl tbody{display:block;}
  table.sd-rules-tbl tbody tr{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px 12px;padding:12px 2px;border-top:1px solid var(--line);}
  table.sd-rules-tbl tbody tr:first-child{border-top:0;}
  table.sd-rules-tbl tbody td{display:block;padding:0;border:0;min-width:0;}
  table.sd-rules-tbl tbody td:nth-child(1){grid-column:1;grid-row:1;}
  table.sd-rules-tbl tbody td:nth-child(2){grid-column:1;grid-row:2;}
  table.sd-rules-tbl tbody td:nth-child(5){grid-column:2;grid-row:2;text-align:right;}
  table.sd-rules-tbl tbody td:nth-child(5)::before{content:"Order ";}
  table.sd-rules-tbl tbody td:nth-child(6){grid-column:2;grid-row:1;}
  table.sd-rules-tbl tbody td.sd-rule-when,table.sd-rules-tbl tbody td.sd-rule-then{grid-column:1 / -1;font-size:13px;}
  table.sd-rules-tbl tbody td.sd-rule-when::before{content:"When ";color:var(--text-dim);}
  table.sd-rules-tbl tbody td.sd-rule-then::before{content:"Then ";color:var(--text-dim);}
  table.sd-rules-tbl .ra-btn{width:40px;height:40px;}
}
/* ═══ end v1.4.10.585 ═══ */
/* ═══ v1.4.10.586 — the ticket export: the count and Download in reach, the range said, the phone's shorter page ═══ */
.txp-colacts{margin-left:auto;display:flex;flex-wrap:wrap;gap:6px;}
.txp-quick.on{border-style:solid;border-color:var(--brand-blue);background:rgba(var(--bc-accent-rgb),.07);color:var(--brand-blue);font-weight:600;}
.txp-bad{color:var(--err);font-size:13px;line-height:1.45;}
.txp-seg-note,.txp-dock{display:none;}
@media (max-width:1079px){
  /* the count and Download along the bottom of the screen, once the panel holding them follows the choices */
  .txp-dock{display:flex;align-items:center;gap:12px;position:fixed;left:0;right:0;bottom:0;z-index:40;
    padding:10px 16px calc(10px + env(safe-area-inset-bottom, 0px));background:var(--surface);border-top:1px solid var(--line);box-shadow:0 -6px 18px rgba(15,23,42,.08);}
  .txp-dock-n{flex:1 1 auto;min-width:0;font-size:14px;color:var(--text-mute);}
  .txp-dock-n b{font-size:16px;color:var(--text);}
  .txp-dock .btn{flex:none;min-height:44px;}
  .txp{padding-bottom:76px;}
}
@media (max-width:700px){
  /* the choices a row of names, the chosen one's line under them; a column group's boxes two to a row */
  .txp-segs-2{grid-template-columns:repeat(2,minmax(0,1fr));}
  .txp-segs-3{grid-template-columns:repeat(3,minmax(0,1fr));}
  .txp-segs .txp-seg-s{display:none;}
  .txp-segs .txp-seg{align-items:center;justify-content:center;text-align:center;padding:8px 6px;}
  .txp-seg-note{display:block;margin-top:-4px;font-size:12px;color:var(--text-dim);}
  .txp-fgroup{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 8px;}
  .txp-fgroup-h{grid-column:1 / -1;}
  .txp-chip{min-width:40px;}
}
/* ═══ end v1.4.10.586 ═══ */
/* ═══ v1.4.10.587 — notifications: the site's ticket emails grouped and counted, a rule's facts in line ═══ */
.tkn-site{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:12px;font-weight:600;color:var(--text-mute);}
.tkn-site select{max-width:280px;}
.tkn-count{margin:12px 2px 2px;font-size:13px;color:var(--text-mute);}
.tkn-count b{color:var(--text);}
.tkn-grp{margin-top:12px;}
.tkn-grp-h{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 8px;margin:0 2px 6px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-mute);}
.tkn-grp-n{font-size:12px;font-weight:600;letter-spacing:0;text-transform:none;color:var(--brand-blue);}
.tkn-grp-hint{margin-left:auto;font-size:12px;font-weight:400;letter-spacing:0;text-transform:none;color:var(--text-dim);}
.tkn-rules{color:var(--brand-blue);font-weight:600;cursor:pointer;}
/* a rule card's Who, How and When at the same place on every card: the row wrapped wherever its chips ran out, so How
   and When sat beside Who on one card and under it on the next. Who takes the line (its people in a row: a column of
   its own beside How and When stacked them one a line), How (157px at most) and When (173) are columns under it. */
@media (min-width:701px){
  .nfp-rule-facts{display:grid;grid-template-columns:160px 176px minmax(0,1fr);gap:6px 20px;align-items:center;}
  .nfp-rule-facts > .nfp-fact:first-child{grid-column:1 / -1;}
  .nfp-rule-facts .nfp-chips{min-width:0;}
}
/* ═══ end v1.4.10.587 ═══ */
/* ═══ v1.4.10.588 — Client Support: the conversation first on a phone, the client's name its link, the search as it is typed ═══ */
/* under 1000px the facts (Client, Ticket, their other tickets: 513px on a phone) came before the ticket, so its head
   started 853px down and the conversation 1,097px; the head keeps the status and Close / Reopen, the facts follow */
@media (max-width:1000px){ .cs-ticket-side{order:2;} }
.cs-side-row a.cs-side-link{font-weight:600;}
@media (max-width:700px){
  /* the facts' links and the lodger's email: 40px to the finger, the line unmoved */
  .cs-side-row a,.cs-thead-sub a{display:inline-block;padding:12px 0;margin:-12px 0;}
}
/* ═══ end v1.4.10.588 ═══ */
/* ═══ v1.4.10.592 — Maintenance: the calendar nearer the top (one filter row, the summary in the month bar, a shorter year) ═══ */
/* the client and work chips on one row when they fit (a phone keeps its two strips, the work one swiping) */
@media (min-width:701px){
  .mt-filters{display:flex;flex-wrap:wrap;align-items:center;gap:6px 24px;padding:9px 16px 3px;}
  .mt-filters > .mt-cstrip{padding:0;}
  .mt-filters > .mt-tstrip{margin-top:0;}
}
/* the month's summary inside the month bar: no box of its own, the jumps at the bar's end */
.mtcal-toolbar .mt-msum{margin:0;padding:0;border:0;background:none;flex:1 1 320px;min-width:0;gap:8px 14px;}
.mtcal-toolbar .mt-msum.quiet{background:none;border:0;}
/* the colour key under the grid it explains */
.mtcal-legend.mtcal-legend-under{margin:12px 0 0;justify-content:flex-start;}
/* the year at a glance: its head beside its bars on a desk (117px tall, the head a row above the bars) */
@media (min-width:901px){
  .mtyr{display:grid;grid-template-columns:210px minmax(0,1fr);column-gap:16px;align-items:center;padding:8px 14px;}
  .mtyr-head{margin:0;row-gap:2px;}
  .mtyr-head .mtyr-t,.mtyr-head .mtyr-out{flex:1 1 100%;margin-left:0;}
}
/* on a phone the twelve months six to a row: twelve in one were 21px wide, each a jump to its month */
@media (max-width:700px){ .mtyr-bars{grid-template-columns:repeat(6,minmax(0,1fr));row-gap:6px;} }
/* ═══ end v1.4.10.592 ═══ */
/* ═══ v1.4.10.593 — Maintenance job window: When & who heads the rail; a phone's photos ═══ */
/* the When & who card (mtViewHtml): the time and its length never break at the dash */
.mtv-nw{white-space:nowrap;}
.mtv-facts .tkv-fv{flex-wrap:wrap;}
/* who is on it, under the facts (the last fact's rule above it) */
.mtv-facts-who{display:flex;flex-direction:column;gap:8px;padding:10px 0 2px;}
/* a file's name takes two lines before its ellipsis (a phone showed "ICC Level 2 projector service sign-o…"), the whole
   name on hover */
.mtv-file-n{font-weight:600;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere;}
/* where the rail stacks above the notes (to 920px), the card is a sheet of facts across the width, as the ticket's
   Assignment card is: the date a row of its own, then two (or more) to a row, then who; the status is the hero's pill */
@media (max-width:920px){
  .tkd-side-top .mtv-facts .mtv-f-st{display:none;}
  .tkd-side-top .mtv-facts .sbx-head{padding:6px 12px;min-height:0;}
  .tkd-side-top .mtv-facts .sbx-body{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px 14px;padding:8px 12px 10px;}
  .tkd-side-top .mtv-facts .tkv-fact{flex-direction:column;align-items:flex-start;justify-content:flex-start;gap:2px;padding:0;border:0;min-height:0;}
  .tkd-side-top .mtv-facts .tkv-fact:first-child{grid-column:1/-1;}
  .tkd-side-top .mtv-facts .tkv-fv{justify-content:flex-start;text-align:left;}
  .tkd-side-top .mtv-facts .mtv-facts-who{grid-column:1/-1;gap:6px;padding:0;}
  .tkd-side-top .mtv-facts .mtv-people{flex-direction:row;flex-wrap:wrap;gap:6px 14px;}
}
/* a phone's hero: the kind without "MAINTENANCE ·", so the status and Overdue pills keep to its line */
@media (max-width:700px){
  .mtv-ref-k{display:none;}
  /* three photos to a row (two made each 129px tall, a dozen photos 800px of scrolling) */
  .mtv-photo-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;}
}
/* a touch screen: no drop zone (nothing can be dropped), Take photo and Add photos or files instead, and a 40px delete
   that draws as the 28px disc in its middle (a 40px slab covered a third of a phone's thumbnail) */
@media (hover:none), (pointer:coarse){
  #mt-att-drop{display:none;}
  .mtv-photo .mtv-photo-del{width:40px;height:40px;top:0;right:0;border-radius:0;background:radial-gradient(circle,rgba(15,23,42,.78) 0 14px,transparent 15px);-webkit-backdrop-filter:none;backdrop-filter:none;}
}
/* a client's view of a job with no asset has no buttons: no empty 15px strip under the hero */
.tkd-actionbar.mtv-actionbar:not(:has(*)){display:none;}
/* a mouse: the zone is the browse button, so Add photos or files would be it twice */
@media (hover:hover) and (pointer:fine){
  .mtv-att-add{display:none;}
}
/* ═══ end v1.4.10.593 ═══ */
/* ═══ v1.4.10.594 — Maintenance job editor: the order on a phone, the status by the date, errors by Save ═══ */
/* the message sits left of Cancel / Save (openMaintenanceEditor); it was under the body, which scrolls */
.me-v3 .site-ed-foot{align-items:center;}
.me-v3 .me-error{flex:1 1 220px;min-width:0;color:var(--err);font-size:13px;line-height:1.4;}
.me-v3 .me-error:empty{display:none;}
/* the status rides the When card, under the window (the job card is the title and the type) */
.me-v3 .me-status-f{margin:12px 0 0;}
.me-v3 .me-c-when .me-status-seg{display:flex;flex-wrap:nowrap;}
.me-v3 .me-c-when .me-status-seg .seg-btn{flex:1 1 auto;justify-content:center;padding-left:6px;padding-right:6px;}
.me-v3 .me-type-f{margin-bottom:0;}
/* the length the window matches reads as chosen; "Runs for 2 hrs" a line of its own under them (in the 340px rail it
   wrapped there anyway, as "· runs for 2 hrs") */
.me-v3 #me-window-hint{flex-basis:100%;}
.me-v3 #me-window-hint:empty{display:none;}
.me-durs .btn.on{border-color:var(--brand-blue);color:var(--brand-blue);background:color-mix(in srgb,var(--brand-blue) 8%,var(--surface));}
/* one column (to 920px): the job, when, where, who, then notes & files. The When card was 1,269px down a phone, after
   the notes and the photo zone; the side cards lose the rail's grey once they are interleaved */
@media (max-width:920px){
  .me-cols{display:flex;flex-direction:column;align-items:stretch;gap:0;}
  .me-main,.me-side{display:contents;}
  .me-c-job{order:1;} .me-c-when{order:2;} .me-c-where{order:3;} .me-c-who{order:4;} .me-c-notes{order:5;}
  .me-v3 .me-side .me-card{background:var(--surface);}
}
/* a phone: Cancel and Save stay on screen as the form scrolls (they were 1,800px down), the message above them */
@media (max-width:700px){
  .me-v3 .site-ed-foot{position:sticky;bottom:0;z-index:4;background:var(--surface);padding:10px 14px calc(10px + env(safe-area-inset-bottom, 0px));box-shadow:0 -8px 14px -10px rgba(15,23,42,.25);}
  .me-v3 .site-ed-foot > .btn{flex:1 1 0;min-height:40px;justify-content:center;}
  .me-v3 .me-error{flex-basis:100%;}
  .me-v3 .me-who .tk-mini{min-width:40px;}   /* a person's Remove on the who chip (32x40) */
}
/* a touch screen: Take photo and Add photos or files, no drop zone; a mouse: the zone (its click browses) and Take photo */
@media (hover:none), (pointer:coarse){
  #me-att-drop{display:none;}
}
@media (hover:hover) and (pointer:fine){
  .me-att-add{display:none;}
}
/* ═══ end v1.4.10.594 ═══ */
/* ═══ v1.4.10.595 — Maintenance plans: a plan's own window on the Maintenance page ═══ */
/* the jobs a plan has booked (mtPlanHtml), each opening its job */
.mtv-plan-jobs{display:flex;flex-direction:column;gap:6px;}
.mtv-plan-job{appearance:none;display:flex;align-items:center;gap:12px;width:100%;min-height:44px;padding:8px 12px;border:1px solid var(--line);border-radius:9px;background:var(--surface);color:var(--text);font:inherit;text-align:left;cursor:pointer;}
.mtv-plan-job:hover{border-color:var(--accent);}
.mtv-plan-job-d{flex:none;min-width:96px;font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;}
.mtv-plan-job-t{flex:1;min-width:0;font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.mtv-plan-job-t small{display:block;font-size:12px;font-weight:400;color:var(--text-mute);overflow:hidden;text-overflow:ellipsis;}
@media (max-width:700px){ .mtv-plan-job-d{min-width:78px;} }
/* ═══ end v1.4.10.595 ═══ */
/* ═══ v1.4.10.596 — Lifecycle ops: one row per thing, its action on it; no list inside a list on a phone ═══ */
/* Attention needed's "Show all" is for one column only: beside the lists it scrolls in its own box, as it did */
#ap-ops-attn .ops-more{display:none;}
@media (max-width:1100px){
  /* the first twelve, then the button; the box scrolled 520px inside the page (2,900px tall on a phone) */
  .ops-attn-body{max-height:none;overflow:visible;}
  #ap-ops-attn:not(.show-all) .ops-attn-body > .att-row:nth-child(n+13){display:none;}
  #ap-ops-attn:not(.show-all) .ops-more{display:flex;width:100%;justify-content:center;min-height:40px;margin-top:6px;}
}
/* ═══ end v1.4.10.596 ═══ */
/* ═══ v1.4.10.597 — Stocktakes: the two lists side by side at equal widths, one scroller on a phone ═══ */
/* the window: wider on a desk (#modal-inner.modal-wide holds wide windows at 760px), the find-one window keeps its 560;
   a phone's stays the whole screen */
@media (min-width:761px){ #modal-inner:has(> .stk:not(.stk-findwin)){max-width:1040px;width:min(96vw,1040px);} }
/* the columns share the width: To find (the walk) was 258px beside Scanned's 450 at 1440, the grid's 1fr giving way to the
   scanned rows' unbroken lines */
.stk-cols{grid-template-columns:minmax(0,1fr) minmax(0,1fr);}
@media (max-width:760px){
  .stk-cols{grid-template-columns:minmax(0,1fr);}
  /* one scroller: the list fills what the head, the camera and the tabs leave and scrolls there; the window's body only
     scrolls when the camera is open and there is no room for it (the list scrolled 298px inside a body that scrolled too) */
  .stk .modal-body{display:flex;flex-direction:column;}
  .stk .stk-cols{flex:1 1 0;min-height:200px;display:flex;flex-direction:column;}
  .stk .stk-col{flex:1 1 0;min-height:0;display:flex;flex-direction:column;}
  .stk .stk-col .stk-list{flex:1 1 0;min-height:0;max-height:none;}
  /* the camera button and the tag box share a row ("Scan", "Stop"): two rows took 50px of the list's room */
  .stk:not(.stk-findwin) .stk-controls{flex-wrap:nowrap;gap:8px;}
  .stk:not(.stk-findwin) .stk-manual{min-width:0;}
  .stk:not(.stk-findwin) .stk-cam-w{display:none;}
  /* the head is the state and the scope ("In progress · ICC Sydney" on one line); who started it and when stay on a desk */
  .stk .stk-when{display:none;}
}
/* ═══ end v1.4.10.597 ═══ */
/* ═══ v1.4.10.598 — Contracts & cover: facts that hold together, a length to pick ═══ */
/* a contract row's facts (apContractsPanel): the line breaks between them, never inside a date range or a reference */
.svc-nw{display:inline-block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom;}
/* the form's lengths of cover, under the two dates (apAddContract) */
.ac-lens{grid-column:1 / -1;display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin-top:-4px;}
/* a full-width toggle (Renews automatically on a new contract, Paused on a plan) spans as a .fld.col2 does; it took half a
   row, so the fields after it fell out of their pairs */
.ap-form .ue-toggle.col2{grid-column:1 / -1;}
.ac-lens .device-meta{margin-right:2px;}
.ac-lens .btn.on{border-color:var(--brand-blue);color:var(--brand-blue);background:color-mix(in srgb,var(--brand-blue) 8%,var(--surface));}
@media (max-width:760px){ .ac-lens .btn{min-height:40px;} }
/* ═══ end v1.4.10.598 ═══ */
/* ═══ v1.4.10.600 — Consumables: a phone's filters behind one button ═══ */
/* (renderConsumables) the Filters button is a phone's; a desk keeps the row of filters */
.cn-fbtn{display:none;}
@media (max-width:760px){
  .asset-toolbar.cn-tb:not(.more-open) > .atb-pri:not(.atb-on){display:none;}
  .asset-toolbar.cn-tb .cn-fbtn{display:inline-flex;}
  .asset-toolbar.cn-tb .atb-search{flex:1 1 100%;min-width:0;}
  .asset-toolbar.cn-tb .atb-sel.cn-sort{flex:1 1 calc(50% - 4px);min-width:0;}
  .asset-toolbar.cn-tb .atb-sel.cn-sort select{width:100%;}
}
/* ═══ end v1.4.10.600 ═══ */
/* ═══ v1.4.10.601 — Asset reports: the sections strip stays in reach ═══ */
/* (rxrView) the strip holds at the top of the page as the report scrolls, the section in view marked (rxrNavWatch); Top
   goes back to the figures and the exports. Its own class, so .rxr-nav-i still counts the sections (asset-reports B2b).
   The asset reports only: the client statistics pages (.cs-page) share the view and keep theirs. */
#rxr-view:not(.cs-page) .rxr-nav{position:sticky;top:0;z-index:6;padding:8px 0;margin:-8px 0;background:var(--bg);box-shadow:0 8px 10px -10px rgba(15,23,42,.18);}
#rxr-view:not(.cs-page) .rxr-sec{scroll-margin-top:70px;}
.rxr-nav-top{display:inline-flex;align-items:center;gap:4px;min-height:34px;padding:0 12px 0 8px;border:1px solid var(--line);border-radius:999px;background:var(--surface);font:inherit;font-size:13px;font-weight:500;color:var(--text-mute);cursor:pointer;flex:none;}
.rxr-nav-top svg{width:15px;height:15px;}
.rxr-nav-top:hover{border-color:var(--accent);color:var(--accent-deep);}
.rxr-nav-i.on{border-color:var(--accent);color:var(--accent-deep);background:var(--accent-soft);}
/* a desk: the buttons a little smaller so the strip is one line at 1440 (it wrapped to two, 76px) */
@media (min-width:701px){
  #rxr-view:not(.cs-page) .rxr-nav{gap:6px;}
  #rxr-view:not(.cs-page) .rxr-nav-i{min-height:30px;font-size:12px;padding:0 11px 0 5px;}
  #rxr-view:not(.cs-page) .rxr-nav-top{min-height:30px;font-size:12px;}
}
/* a phone: one line you swipe */
@media (max-width:700px){
  #rxr-view:not(.cs-page) .rxr-nav{flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;}
  #rxr-view:not(.cs-page) .rxr-nav::-webkit-scrollbar{display:none;}
  #rxr-view:not(.cs-page) .rxr-nav-i, #rxr-view:not(.cs-page) .rxr-nav-top{flex:none;white-space:nowrap;min-height:40px;}
}
/* ═══ end v1.4.10.601 ═══ */
/* ═══ v1.4.10.602 — Lifecycle & budget: a phone's taps ═══ */
@media (max-width:760px){
  /* the horizon's 5y was 34px wide */
  .fx-budget-acts .view-toggle button{min-width:40px;justify-content:center;}
  /* a model's name in the vendor-lifecycle table opens its card: a 40px tap, drawn the size of its words */
  .fx-roll td a{display:inline-block;padding:12px 0;margin:-12px 0;}
}
/* ═══ end v1.4.10.602 ═══ */
/* ═══ v1.4.10.603 — Makes & models on a phone: a model's name its own width, an asset's room its own line ═══ */
@media (max-width:760px){
  /* a model's row (renderAssetCatalog): the chevron, the picture, the name and the count on the line; its flags and value
     under the name. The flags took 196px of the line and squeezed the name to 40px, a word to a line (103px tall) */
  .mm-mrow{display:grid;grid-template-columns:14px 36px minmax(0,1fr) auto;column-gap:10px;row-gap:5px;align-items:center;padding:10px 12px;}
  .mm-mchev{grid-column:1;grid-row:1;}
  .mm-mthumb{grid-column:2;grid-row:1;}
  .mm-mname{grid-column:3;grid-row:1;}
  .mm-mcount{grid-column:4;grid-row:1;}
  .mm-mflags{grid-column:3;grid-row:2;}
  .mm-mflags:empty{display:none;}
  .mm-mval{grid-column:4;grid-row:2;text-align:right;}
  /* an asset of the model: its tag, its status and its cost on the line, the room under them (it had 14px of the line) */
  .mm-assets{padding:4px 10px 12px;}
  .mm-arow{display:grid;grid-template-columns:auto minmax(0,1fr) auto;column-gap:8px;row-gap:3px;align-items:center;min-height:40px;padding:8px 10px;}
  .mm-arow .mono-tag{grid-column:1;grid-row:1;}
  .mm-arow > .pill{grid-column:2;grid-row:1;justify-self:start;}
  .mm-arow .mm-aval{grid-column:3;grid-row:1;min-width:0;}
  .mm-arow .mm-aloc{grid-column:1 / 3;grid-row:2;white-space:normal;}
  .mm-arow > .dot{grid-column:3;grid-row:2;justify-self:end;}
  .mm-adetail-foot{flex-wrap:wrap;}
}
/* ═══ end v1.4.10.603 ═══ */
/* ═══ v1.4.10.605 — Validation queue: a phone's filters behind one button ═══ */
/* (renderAssetsPending) Found by and Site fold behind Filters on a phone, a set one staying out; a desk keeps them on the bar */
.vq-fbtn{display:none;}
@media (max-width:760px){
  .vq-bar:not(.f-open) .vq-pri:not(.vq-on){display:none;}
  .vq-bar .vq-fbtn{display:inline-flex;flex:0 0 auto;min-height:40px;}
  .vq-bar .vq-f-q{flex:1 1 0;min-width:0;}
}
/* ═══ end v1.4.10.605 ═══ */
/* ═══ v1.4.10.606 — Recent activity: a phone's filters behind one button; a change in two lines on a desk ═══ */
/* (renderAssetActivity) Filters is a phone's; a desk keeps its row of five */
.aac-fbtn{display:none;}
@media (max-width:760px){
  .aac-filters:not(.f-open) .aac-pri:not(.aac-on){display:none;}
  .aac-filters .aac-fbtn{display:inline-flex;min-height:40px;}
}
/* (aacRowHtml) on a desk who did it and when share the first line with what changed (the tag, the asset, the kind), at its
   end, and the change is the second line: each change was three lines (95px), forty-three of them 5,063px. The feed only (#aac-body): an asset's own timeline keeps its rows */
@media (min-width:901px){
  #aac-body .aac-main{display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:16px;align-items:baseline;}
  #aac-body .aac-main > .aac-line{grid-column:1;grid-row:1;}
  #aac-body .aac-main > .aac-meta{grid-column:2;grid-row:1;margin-top:0;text-align:right;max-width:440px;}
  #aac-body .aac-main > .aac-changes{grid-column:1 / -1;grid-row:2;}
}
/* ═══ end v1.4.10.606 ═══ */
/* ═══ v1.4.10.607 — Asset settings on a phone: each list fits the screen ═══ */
/* (renderCatalogSettings, .cs-main[data-sec]) every list here was held at 680px (Models 956px) in a 354px frame, so a row's
   Edit and Delete were a sideways swipe away. Each fits now, a column the list can spare left off a phone (the site's
   support link, a supplier's contact, a status's scope, a building's code and level count, a level's building (the lists
   are grouped by it), a device type's code); Models keeps its ten columns and its swipe. */
@media (max-width:760px){
  .cs-main[data-sec] .panel-body.flush .dt:not(.cs-models){min-width:0;}
  /* the cells' 18px sides (36px a column) are 8 here, 12 at the row's ends; the row's buttons sit 2px apart */
  .cs-main[data-sec] .dt:not(.cs-models) :is(th,td){padding-left:8px;padding-right:8px;}
  .cs-main[data-sec] .dt:not(.cs-models) :is(th,td):first-child{padding-left:12px;}
  .cs-main[data-sec] .dt:not(.cs-models) :is(th,td):last-child{padding-right:10px;}
  .cs-main[data-sec] .dt:not(.cs-models) td.actions-cell{width:1%;min-width:102px;white-space:normal;text-align:right;}   /* two buttons a line (a third under them), never one a line */
  .cs-main[data-sec] .dt:not(.cs-models) td.actions-cell .ra-btn{margin:1px;}
  /* a name, its pill and its code wrap under one another (one line of the three held a status 166px wide) */
  .cs-main[data-sec] .dt:not(.cs-models) .device-name{flex-wrap:wrap;row-gap:2px;}
  /* a supplier's logo, and a status's "behaves like" (its own line names the base status under it) */
  .cs-main[data-sec="suppliers"] .dt :is(th,td):nth-child(1),
  .cs-main[data-sec="statuses"] .dt :is(th,td):nth-child(2),
  .cs-main[data-sec="spacecodes"] .dt :is(th,td):nth-child(3){display:none;}   /* a space code's room count (its assets stay) */
  .cs-main[data-sec="manufacturers"] .dt :is(th,td):nth-child(3),
  .cs-main[data-sec="suppliers"] .dt :is(th,td):nth-child(3),
  .cs-main[data-sec="statuses"] .dt :is(th,td):nth-child(3),
  .cs-main[data-sec="buildings"] .dt :is(th,td):nth-child(2),
  .cs-main[data-sec="buildings"] .dt :is(th,td):nth-child(3),
  .cs-main[data-sec="floors"] .dt :is(th,td):nth-child(2),
  .cs-main[data-sec="types"] .dt :is(th,td):nth-child(2){display:none;}
  /* a name's link: a 40px tap, drawn the size of its words (the row opens it too) */
  .cs-main[data-sec] .dt td a{display:inline-block;padding:12px 0;margin:-12px 0;}
}
/* ═══ end v1.4.10.607 ═══ */
/* ═══ v1.4.10.608 — the register on a phone: the tag back on the first line ═══ */
/* (the asset table's phone cards) the row's QR button is left off a phone: the row opens the asset, whose window has the
   code in its corner, and the label sheet prints it. With three buttons on the first line the tag took a line of its own
   under 400px (v1.4.10.329) and each asset was 190px; with Edit and Delete the tag fits beside the tick and the picture.
   Someone who may only look keeps it: there it is the cell's only button.
   The serial and who has it share the last line (each had a line of its own, 185px for an assigned asset); a long one
   still wraps the other onto a line of its own, and either ends in an ellipsis before it runs out of the card.
   An empty full-width line keeps them off the status line above when it is short (on a tablet the serial sat after the
   value); flex clamps a negative margin on that line, so the two carry the -6px that cancels its extra row gap. */
@media (max-width:760px){
  table.dt.asset-dt tbody td.ar-act > .ra-btn:first-child:not(:only-child){display:none;}
  table.dt.asset-dt tbody tr::after{content:"";order:10;flex:1 1 100%;height:0;}
  table.dt.asset-dt tbody tr:has(> td.ar-serial[data-empty="1"]):has(> td.ar-assigned[data-empty="1"])::after{display:none;}
  table.dt.asset-dt tbody td.ar-serial{order:11;flex:0 1 auto;margin:-6px 14px 0 0;}
  table.dt.asset-dt tbody td.ar-assigned{order:12;flex:1 1 auto;margin-top:-6px;}
  table.dt.asset-dt tbody td.ar-serial,
  table.dt.asset-dt tbody td.ar-assigned{max-width:100%;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
}
@media (max-width:400px){
  table.dt.asset-dt tbody td.ar-tag{order:3;flex:1 1 0;}
  table.dt.asset-dt tbody td.ar-act{order:4;}
}
/* ═══ end v1.4.10.608 ═══ */
/* ═══ v1.4.10.609 — the Assets head on a phone: one row of actions, the facts' dividers, the results on one line ═══ */
/* The facts' dividers: each fact carries one at its left, in the gap, and the line clips the first of each line. One drawn
   only BETWEEN two facts began the second line when they wrapped ("| $442.3k book value" under the counts on a phone). */
.ast-head .ast-facts{column-gap:25px;overflow:hidden;}
.ast-head .ast-fact{position:relative;}
.ast-head .ast-fact::before,
.ast-head .ast-fact + .ast-fact::before{content:"";position:absolute;left:-13px;top:50%;width:1px;height:14px;margin:-7px 0 0;background:var(--line-2);}
/* the head's More menu (Import, Labels, Export, Quick add) is a phone's; a desk has room for the four as buttons */
.ast-actions .btn.sm.ast-more{display:none;}
@media (max-width:760px){
  .ast-head .ast-facts{column-gap:19px;}
  .ast-head .ast-fact::before,
  .ast-head .ast-fact + .ast-fact::before{left:-10px;}
  /* Add asset, Scan and More on one row (Add asset and Scan were a row, the four others a second) */
  .ast-head .ast-actions > .btn.sm{flex:1 1 0;min-width:0;}
  .ast-head .ast-actions > .btn.sm.ast-act2{display:none;}
  .ast-head .ast-actions > .btn.sm.ast-more{display:inline-flex;flex:0 0 auto;padding:6px 14px;}
  /* the results bar: the count, its value and Select all on one line (three, 93px); its scope is the head's, just above */
  .ast-results .ast-res-scope{display:none;}
  .ast-results .ast-res-all{margin-left:auto;flex:0 0 auto;}
}
/* ═══ end v1.4.10.609 ═══ */
/* ═══ v1.4.10.610 — the asset window on a phone: the tab strip sticks again, each pane opens on its explainer ═══ */
@media (max-width:680px), (hover:none) and (pointer:coarse) and (max-width:1100px){
  /* The tab strip sticks to the top of the window, but the phone rule that lets a box holding a data table scroll sideways
     (.modal-body:has(table.dt)) made .adt-body a scroller of its own once Value & costs drew its "Year by year" table: the
     strip then stuck inside a box that never scrolls and went off the top with the rest. Each table scrolls in its own panel. */
  #modal-inner.modal-asset .adt-body{overflow:visible;}
  /* each pane's head: the strip just above names the tab, so the head is the explainer and its Edit on one line (the title,
     the explainer under it and the Edit were 80 to 98px at 390) */
  #modal-inner.modal-asset .adt-pane-head{align-items:center;gap:12px;margin:0 0 12px;padding:0 0 10px;}
  #modal-inner.modal-asset .adt-pane-intro h4{display:none;}
  #modal-inner.modal-asset .adt-pane-intro p{line-height:1.45;}
  #modal-inner.modal-asset .adt-edit{min-height:40px;padding:0 12px;margin-top:0;}
  /* a 40px tap for the short links: the maker in the title (LG was 22px wide; the gap after the picture takes the rest) and
     the make and model on Specs (20px tall) */
  #modal-inner.modal-asset .ah-title > .ah-cat-link:first-child{padding-left:18px;margin-left:-18px;}
  #modal-inner.modal-asset #adt-specs .val > a{display:inline-block;min-width:40px;padding:10px 0;margin:-10px 0;}
  /* a photo's star (the asset picture) and delete, on Files & notes: 40px square (24px wide), two to a 151px photo */
  #modal-inner.modal-asset .photo-cell .pc-btn{width:40px;height:40px;padding:0;justify-content:center;}
  #modal-inner.modal-asset .photo-cell .pc-btn svg{width:16px;height:16px;}
  #modal-inner.modal-asset .att-del{min-width:40px;justify-content:center;}   /* a file's delete (36px wide) */
}
/* ═══ end v1.4.10.610 ═══ */
/* ═══ v1.4.10.611 — the asset editor: what stops a save is said where the operator looks ═══ */
/* #ae-error keeps the words for a screen reader and the editor tests; aeSayError shows them (the box was squeezed to 6px
   under the footer on a desk, and was the last line of the form on a phone) */
.ae-error-live{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;}
/* the "Still needed" banner: a line a step, the step's name and then its fields, each a press away */
.ae-reqbanner .ae-reqlist{display:flex;flex-direction:column;gap:6px;margin-top:8px;font-weight:600;}
.ae-req-grp{display:flex;flex-wrap:wrap;align-items:center;gap:6px;}
.ae-req-step{padding:0;margin-right:2px;border:0;background:none;font:inherit;font-weight:700;color:var(--text);cursor:pointer;}
.ae-req-step::after{content:":";}
.ae-req-step:hover{color:var(--brand-blue);}
.ae-req-f{display:inline-flex;align-items:center;min-height:28px;padding:0 10px;border:1px solid color-mix(in srgb,var(--err) 45%,transparent);border-radius:999px;
  background:var(--surface);font:inherit;font-size:12px;font-weight:600;color:var(--err);cursor:pointer;}
.ae-req-f:hover{background:color-mix(in srgb,var(--err) 8%,var(--surface));}
/* a refusal under the field it names */
.ae-field-msg{margin-top:6px;font-size:12px;line-height:1.45;font-weight:500;color:var(--err);}
/* the rail: a step with a required field still empty shows its number and the count in red, never the green tick */
.ae-nav-item.need:not(.active) .ae-nav-num{background:var(--surface);border-color:var(--err);color:var(--err);}
.ae-nav-item.need .ae-nav-num .n{opacity:1 !important;}
.ae-nav-item.need .ae-nav-num svg{opacity:0 !important;}
.ae-nav-num[data-need]::after{content:attr(data-need);position:absolute;top:-7px;right:-8px;min-width:17px;height:17px;padding:0 4px;box-sizing:border-box;
  border-radius:999px;background:var(--err);color:#fff;font-size:10px;font-weight:700;line-height:17px;text-align:center;box-shadow:0 0 0 2px var(--surface-2,var(--surface));}
@media (max-width:760px), (hover:none) and (pointer:coarse){
  .ae-req-f{min-height:40px;padding:0 14px;font-size:13px;}
  .ae-req-step{min-height:40px;}
  /* a phone scrolls the list to the top of the window: it stops under the close button floating there */
  .ae-reqbanner{scroll-margin-top:60px;}
}
/* ═══ end v1.4.10.611 ═══ */
/* ═══ v1.4.10.612 — Quick add: the gaps in the form, the device type from the model, the button in reach on a phone ═══ */
#modal-inner .qa-form .fs-hint:empty{display:none;}   /* an empty hint (the room's, the serial's) held a gap under its row */
#modal-inner .qa-form .qa-qty-note{grid-column:1 / -1;margin-top:-6px;}
#qa-msg .qa-need{color:var(--text);}
@media (max-width:760px){
  /* a phone pairs the short ones (serial and quantity, cost and date): nine fields stacked were 1,113px, the button at the end */
  #modal-inner .qa-form{grid-template-columns:minmax(0,1fr) minmax(0,1fr);}
  #modal-inner .qa-form > .fld{grid-column:1 / -1;}
  #modal-inner .qa-form > .fld.qa-pair{grid-column:auto;}
  /* Cancel and Add asset stay at the foot of the screen (-28px: the backdrop's own bottom padding, which the form showed
     through under them) */
  #modal-inner:has(#qa-save) > .modal-foot{position:sticky;bottom:-28px;z-index:3;background:var(--surface);border-radius:0 0 var(--radius) var(--radius);
    padding-bottom:max(13px, env(safe-area-inset-bottom));}
}
/* ═══ end v1.4.10.612 ═══ */
/* ═══ v1.4.10.613 — Asset import: Import within reach, the preview on one line a row, a near-miss heading named ═══ */
/* the footer stays on the screen while the sheet's check scrolls (-20px / -28px: the backdrop's own bottom padding) */
#modal-inner .imp-foot{position:sticky;bottom:-20px;z-index:3;display:flex;align-items:center;gap:8px;background:var(--surface);
  border-radius:0 0 var(--radius) var(--radius);}
#modal-inner .imp-foot-note{flex:1 1 auto;min-width:0;font-size:12px;color:var(--text-mute);}
/* a preview row is one line: a 55" room name wrapped to three in a squeezed column; the table already scrolls sideways */
#modal-inner .imp-tbl :is(th,td){white-space:nowrap;}
/* "Serail → serial?" */
/* only the heading is struck through: on the whole chip the line ran through the fix as well */
#modal-inner .imp-chip.x.has-near{text-decoration:none;gap:5px;}
#modal-inner .imp-chip .imp-near{font-weight:600;color:var(--text);}
@media (max-width:600px){
  #modal-inner .imp-foot{bottom:-28px;padding-bottom:max(13px, env(safe-area-inset-bottom));}
  #modal-inner .imp-foot-note{display:none;}   /* the Left out chips say it, above */
  #modal-inner .imp-foot .btn{flex:1 1 0;justify-content:center;min-height:44px;}
  #modal-inner .imp-foot #csv-actions{display:contents;}
  #modal-inner .imp-foot #csv-actions:empty{display:none;}
}
/* a phone or tablet does not drop files: "Drop a CSV here, or" goes, Choose CSV leads */
@media (hover:none) and (pointer:coarse){
  #modal-inner .imp-drop .imp-drop-t{display:none;}
}
/* ═══ end v1.4.10.613 ═══ */
/* ═══ v1.4.10.614 — the label sheet: Print within reach on a phone, the pager says where it goes, what is left after a print ═══ */
/* Close and Print stay at the foot of the screen (on a phone the window was 896px and Print sat at 855px of 664) */
#modal-inner:has(#lbl-print) > .modal-foot{position:sticky;bottom:0;z-index:3;background:var(--surface);border-radius:0 0 var(--radius) var(--radius);}
@media (max-width:600px){
  #modal-inner:has(#lbl-print) > .modal-foot{padding-bottom:max(13px, env(safe-area-inset-bottom));}
  #modal-inner:has(#lbl-print) > .modal-foot .btn{flex:1 1 0;justify-content:center;min-height:44px;}
}
/* The three windows whose foot sticks (Quick add, Import, this sheet): the backdrop keeps no bottom padding and the window
   carries that space as its own margin, so `bottom:0` is the screen's edge at every width. v1.4.10.612 and 613 set the
   foot to minus the backdrop's padding (-20px, -28px), which holds only while that padding is the one assumed: it is
   calc(28px + the safe area) on a phone with a home bar (the 7150 and 10326 rules), and there the foot stopped short. */
.modal-back:has(#qa-save, #lbl-print, .imp-foot){padding-bottom:0;}
.modal-back:has(#qa-save, #lbl-print, .imp-foot) > #modal-inner{margin-bottom:20px;}
#modal-inner:has(#qa-save) > .modal-foot, #modal-inner .imp-foot{bottom:0;}
@media (max-width:600px){ .modal-back:has(#qa-save, #lbl-print, .imp-foot) > #modal-inner{margin-bottom:calc(28px + env(safe-area-inset-bottom));} }
/* "Sent 1–60 to print. 36 more to go: 61–96 →" */
.lbl-prog.done{color:var(--text);font-size:13px;min-height:0;margin:0 0 10px;padding:8px 12px;border-radius:var(--radius);background:var(--surface-2);border:1px solid var(--line);}
.lbl-next-link{display:inline-flex;align-items:center;gap:4px;margin-left:4px;padding:0;border:0;background:none;font:inherit;font-weight:600;color:var(--brand-blue);cursor:pointer;}
.lbl-next-link svg{width:14px;height:14px;}
@media (max-width:760px), (hover:none) and (pointer:coarse){ .lbl-next-link{min-height:40px;} }
/* ═══ end v1.4.10.614 ═══ */
/* ═══ v1.4.10.615 — Scan: a near miss answered, the camera's refusal said in the window ═══ */
/* the assets a part of a tag could mean, each a press to open */
.sf-near{display:flex;flex-direction:column;gap:6px;margin-top:8px;}
.sf-near-b{display:flex;flex-direction:column;align-items:flex-start;gap:1px;width:100%;min-height:44px;padding:7px 12px;text-align:left;
  border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);font:inherit;color:var(--text);cursor:pointer;}
.sf-near-b:hover{border-color:var(--brand-blue);}
.sf-near-b b{font-family:var(--mono);font-size:13px;letter-spacing:.02em;}
.sf-near-b span{font-size:12px;color:var(--text-mute);}
/* why the camera is not running (a toast alone went in seconds) */
.stk-cam-err{margin:8px 0 0;padding:9px 12px;border-radius:var(--radius);font-size:13px;line-height:1.45;color:var(--text);
  background:color-mix(in srgb,var(--warn) 10%,transparent);border:1px solid color-mix(in srgb,var(--warn) 40%,transparent);}
.stk-cam-err[hidden]{display:none;}
/* ═══ end v1.4.10.615 ═══ */
/* ═══ v1.4.10.616 — bulk actions: four tiles on a phone, a choice to make in each window ═══ */
.bb-menu .bb-narrow{display:none;}   /* Export and Labels are on a desk's bar; a phone's More holds them */
@media (max-width:600px){
  /* the actions are four tiles, Set status, Move, Assign and More, side by side: the six buttons were a 552px strip in 348px,
     scrolled sideways, with More (and in it Retire and Delete) last and out of sight */
  .bulk-bar .bb-actions{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;overflow:visible;}
  .bulk-bar .bb-actions > .bb-wide{display:none;}
  .bulk-bar .bb-actions > button,
  .bulk-bar .bb-actions > .bb-more > summary{flex-direction:column;justify-content:center;gap:3px;width:100%;min-height:52px;padding:6px 2px;
    font-size:12px;line-height:1.15;white-space:normal;text-align:center;}
  .bulk-bar .bb-actions > .bb-more{display:block;min-width:0;}
  .bb-menu .bb-narrow{display:flex;}
  /* Clear beside the count does what the × did */
  .bulk-bar .bb-close{display:none;}
}
/* ═══ end v1.4.10.616 ═══ */
/* ═══ v1.4.10.617 — the cards view: the room never cut off its card ═══ */
/* where it is: up to two lines, so the room shows ("ICC Sydney · Ground · DHT Darl…" cut it on a 292px desk card, and on
   ten of the 96 cards on a phone); the facts stay at the card's foot, so a row still lines up */
.asset-cards .acard-sub{white-space:normal;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;
  text-overflow:clip;line-height:1.45;overflow-wrap:anywhere;}
.acard-life.is-none{visibility:hidden;}   /* the bar's room on a card with no life to count, so the row's facts line up */
/* a 360px phone: the picture's column gives 20px to the words (at 84px the warranty wrapped to two lines on 48 cards, "Value
   now" was cut to "VALUE N…", and the status pills fell under the tag) */
@media (max-width:380px){
  .asset-cards .acard-media{width:64px;}
  .asset-cards .acard-body{padding-left:11px;padding-right:11px;}
  .asset-cards .acard-facts{gap:8px;}
  .asset-cards .acard-fact dd{font-size:11px;}   /* "Ended Aug 2025" in its 96px column (11px: the type scale's step under 12) */
}
/* ═══ end v1.4.10.617 ═══ */
/* ═══ v1.4.10.618 — the grouped view: a site's band and its headings stay at the top while its rows scroll ═══ */
@media (min-width:761px){
  /* clip, not hidden: the band keeps its rounded corners without becoming a scroller of its own, which held every sticky
     thing inside it to a box that never scrolls */
  .asset-groups .ag-org{overflow:clip;}
  .asset-groups .ag-site > .ag-site-head{position:sticky;top:0;z-index:4;}
  /* a one-site client's band is a faint tint over nothing: the surface goes under it, or the rows showed through */
  .asset-groups .ag-org.ag-org-solo > .ag-site > .ag-site-head{background-color:var(--surface);}
  .asset-groups .ag-site table.dt.asset-dt thead th{position:sticky;top:var(--ag-hh, 64px);z-index:3;background:var(--surface-2);
    box-shadow:inset 0 -1px 0 var(--line);}
}
/* between 761 and 1180px the table scrolls sideways in its own box (v1.4.10.329 scrolled the whole site, band and all, and a
   box that scrolls holds what sticks inside it: there the band sticks and the headings, inside that box, do not) */
@media (min-width:761px) and (max-width:1180px){
  .asset-groups .ag-tbl{overflow-x:auto;-webkit-overflow-scrolling:touch;}
}
/* ═══ end v1.4.10.618 ═══ */
/* ═══ v1.4.10.619 — the register's filters: a phone folds them by the person's choice, Clear all beside the chips ═══ */
.fchip-clear{display:none;}
@media (max-width:760px){
  /* a filter set behind Filters no longer holds the fold open: it shows on its own (atb-on), the others stay folded until
     Filters is pressed (a condition set held all seven controls open, the toolbar 434px of a 664px screen) */
  .asset-toolbar.ast-tb.more-open:not(.more-user) > .atb-pri:not(.atb-on){display:none;}
  .asset-toolbar.ast-tb:not(.more-user) .atb-row2 > .atb-sel:not(.atb-on),
  .asset-toolbar.ast-tb:not(.more-user) .atb-row2 > .atb-row2-note,
  .asset-toolbar.ast-tb:not(.more-user) .atb-row2 > .atb-row2-l{display:none;}
  .asset-toolbar.ast-tb:not(.more-user) .atb-row2{border-top:0;padding-top:0;margin-top:0;}
  /* the filters come after the line of Filters and the sort (a set one beside them squeezed the sort to 22px) */
  .asset-toolbar.ast-tb > .atb-pri{order:4;}
  .asset-toolbar.ast-tb .atb-row2{order:5;}
  .asset-toolbar.ast-tb .atb-sel.atb-sort{min-width:150px;}   /* its 0 basis let a filter share its line and squeeze it */
  /* the supplier box fills its line (it stopped at 200px with its arrow at the line's far end) */
  .asset-toolbar.ast-tb .atb-row2 .atb-sel select{max-width:none;width:100%;}
  /* Clear all goes to the chips' end: in the toolbar it was a line of its own */
  .asset-toolbar.ast-tb .atb-clear{display:none;}
  .filter-chips .fchip-clear{display:inline-flex;align-items:center;min-height:40px;padding:0 12px;border:0;background:none;
    font:inherit;font-size:13px;font-weight:600;color:var(--brand-blue);cursor:pointer;}
}
/* ═══ end v1.4.10.619 ═══ */
/* ═══ v1.4.10.620 — What needs doing: each tile counts what pressing it lists ═══ */
/* "within the filters below": with a register filter set, the tiles count inside it */
.ast-sec .ast-sec-f{font-size:12px;color:var(--text-dim);}
.ast-sec .ast-sec-fn{display:none;}
@media (max-width:760px){   /* a phone's line keeps Data health & score beside it */
  .ast-sec .ast-sec-fw{display:none;}
  .ast-sec .ast-sec-fn{display:inline;}
}
/* ═══ end v1.4.10.620 ═══ */
/* ═══ v1.4.10.621 — Data health: each blank counted once, a record in three lines on a phone ═══ */
@media (max-width:760px){
  /* the tag and the name, then the site, then the serial, with Fix at the right (each was a line of its own: 114px a record) */
  .dh-arow{display:grid;grid-template-columns:auto minmax(0,1fr) auto;column-gap:8px;row-gap:1px;align-items:center;}
  .dh-arow > .mono-tag{grid-area:1 / 1;}
  .dh-arow > .dh-aname{grid-area:1 / 2;}
  .dh-arow > .dh-asite{grid-area:2 / 1 / 3 / 3;min-width:0;overflow-wrap:anywhere;}   /* wraps, never cuts the room (v1.4.10.617's rule) */
  .dh-arow > .dh-aser{grid-area:3 / 1 / 4 / 3;}
  .dh-arow > .btn{grid-area:1 / 3 / 4 / 4;}
}
/* ═══ end v1.4.10.621 ═══ */
/* ═══ v1.4.10.622 — Insights: like beside like, one row shape, every row pressable that the register can show ═══ */
/* the condition mix across the top, then two pairs (the counts, then the money) in the site-stats pair grid, .ins-grid-2 */
.ast-insights .ins-grid-2 > .panel:only-child{grid-column:1 / -1;}
/* the condition mix: one bar, a part a rating, the ratings under it as the press targets (ins-ck*, since .ins-legend and
   .ins-leg are the dashboard donuts' legend) */
.ast-insights .ins-stack{display:flex;gap:2px;height:12px;border-radius:6px;overflow:hidden;background:var(--surface-2);}
.ast-insights .ins-stack > span{display:block;height:100%;min-width:4px;}
.ast-insights .is-ok:is(.ins-stack > span, .ins-dot){background:var(--ok);}
.ast-insights .is-blue:is(.ins-stack > span, .ins-dot){background:var(--brand-blue);}
.ast-insights .is-warn:is(.ins-stack > span, .ins-dot){background:var(--warn);}
.ast-insights .is-err:is(.ins-stack > span, .ins-dot){background:var(--err);}
.ast-insights .is-deep:is(.ins-stack > span, .ins-dot){background:color-mix(in srgb,var(--err) 60%,#000);}
.ast-insights .is-mute:is(.ins-stack > span, .ins-dot){background:var(--text-dim);}
.ast-insights .ins-ckeys{display:flex;flex-wrap:wrap;gap:4px 6px;margin:10px -8px 0;}
.ast-insights .ins-ck{display:inline-flex;align-items:center;gap:8px;min-height:32px;padding:4px 8px;border-radius:6px;font-size:13px;white-space:nowrap;}
.ast-insights .ins-dot{width:10px;height:10px;border-radius:3px;flex:none;}
.ast-insights .ins-ck-l{font-weight:500;color:var(--text);}
.ast-insights .ins-ck-n{font-variant-numeric:tabular-nums;}
.ast-insights .ins-ck-n b{font-weight:700;color:var(--text);}
.ast-insights .ins-ck-n small{margin-left:6px;font-size:11px;font-weight:500;color:var(--text-dim);}
/* a list's rows share one set of columns (each row its own grid sized its own figure, so in the money lists a longer
   figure moved that row's bar), and every row is one height (41px with an icon, 35px a make, 33px a condition) */
.ast-insights .cat-bars{display:grid;grid-template-columns:minmax(110px,220px) minmax(60px,1fr) auto;column-gap:12px;row-gap:8px;}
.ast-insights .cat-bars > *{grid-column:1 / -1;}
.ast-insights .cat-bars > .ins-more{justify-self:start;}
.ast-insights .cat-row{grid-template-columns:subgrid;min-height:32px;}
@media (max-width:760px){
  .ast-insights .cat-bars{grid-template-columns:minmax(0,1fr) auto;row-gap:6px;}
  .ast-insights .cat-row.is-go{min-height:40px;}   /* the 32px row above undid the v550 40px floor (a make's row was 38px) */
  /* the ratings one a line, the figure at the end (two a line, "1 – Excellent 17 18%" broke over two) */
  .ast-insights .ins-ckeys{flex-direction:column;flex-wrap:nowrap;gap:2px;}
  .ast-insights .ins-ck{display:flex;min-height:40px;}
  .ast-insights .ins-ck-n{margin-left:auto;}
}
/* ═══ end v1.4.10.622 ═══ */
/* ═══ v1.4.10.623 — asset reports: the data set named, an empty one said once, a row's name kept in view on a phone ═══ */
/* an empty data set: why, and the ways out, under the report's name (rxrView) */
.rxr-empty{margin-top:14px;}
.rxr-empty .empty-sub{max-width:560px;margin-left:auto;margin-right:auto;}
.rxr-empty-a{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:14px;}
/* the Reports home: four across, two across, one; never three, which left End of life alone on a row (1280: 3 + 1) */
.rpt-grid.rxr-rgrid{grid-template-columns:repeat(4,minmax(0,1fr));}
@media (max-width:1399px){ .rpt-grid.rxr-rgrid{grid-template-columns:repeat(2,minmax(0,1fr));} }
@media (max-width:760px){ .rpt-grid.rxr-rgrid{grid-template-columns:minmax(0,1fr);} }
/* the sections strip is one line on a desk too, scrolling when it is longer than the page (v601's smaller buttons kept the
   Financial summary's eight on two lines at 1440, 82px held at the top), with a thin scrollbar for a mouse */
@media (min-width:701px){
  #rxr-view:not(.cs-page) .rxr-nav{flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:thin;}
  #rxr-view:not(.cs-page) .rxr-nav-i, #rxr-view:not(.cs-page) .rxr-nav-top{flex:none;white-space:nowrap;}
}
@media (max-width:760px){
  /* a wide table scrolls sideways under its first column, so each row keeps its name in view (Every model is 1,794px in a
     328px frame, and its makes went off the left with the first swipe) */
  .rxr-tbl-wrap > .rxr-dt > thead > tr > th:first-child,
  .rxr-tbl-wrap > .rxr-dt > tbody > tr > td:first-child,
  .rxr-tbl-wrap > .rxr-dt > tfoot > tr > td:first-child{position:sticky;left:0;z-index:1;max-width:150px;}
  .rxr-tbl-wrap > .rxr-dt > tbody > tr > td:first-child{background:var(--surface);}
  .rxr-tbl-wrap > .rxr-dt > tbody > tr.rxr-click:hover > td:first-child{background:linear-gradient(var(--accent-soft),var(--accent-soft)),var(--surface);}
  .rxr-tbl-wrap > .rxr-dt > * > tr > :first-child::after{content:'';position:absolute;top:0;bottom:0;right:0;width:1px;background:var(--line);box-shadow:2px 0 6px rgba(15,23,42,.12);pointer-events:none;}
  .rxr-empty-a .btn{min-height:40px;}
}
/* ═══ end v1.4.10.623 ═══ */
/* ═══ v1.4.10.624 — Lifecycle & budget: due now as the reports count it, a phone's charts readable ═══ */
/* a year axis of seven or more in a plot under 440px keeps every other year (fxThinCls); thirteen or more drop the bar figures */
.ins-area.fx-thin .ins-area-plot{container-type:inline-size;}
@container (max-width:440px){
  .fx-thin .fx-odd{display:none;}
  .fx-dense .fx-val{display:none;}
}
/* thirteen years or more thin out under 640px (the half-width value curve at 1280 is 590px: its 15 years met at the end) */
@container (max-width:640px){
  .fx-dense .fx-odd{display:none;}
  /* the curve's last year sits right-aligned at the end, so on an odd count it met the one two before it */
  .fx-area.fx-dense .ins-area-x span:nth-last-child(3){display:none;}
}
@container (max-width:440px){ .fx-area.fx-dense .ins-area-x span:nth-child(3){display:none;} }   /* and "Now", left-aligned at the start, met the next */
@media (max-width:760px){
  /* the four figures two by two (one a row took 450px of the first screen) */
  .fx-kpis.fx-kpis-4{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;}
  .fx-kpis.fx-kpis-4 .fx-kpi{padding:12px;}
  /* the budget's controls on two full lines, the two switches then the two buttons (the switches wanted 319px of 314, so
     they took three ragged lines, the first right-aligned on its own) */
  .head-actions.fx-budget-acts{width:100%;justify-content:stretch;}
  .fx-budget-acts > *{flex:1 1 auto;}
  .fx-budget-acts .view-toggle button{flex:1 1 auto;padding-left:7px;padding-right:7px;}
}
/* ═══ end v1.4.10.624 ═══ */
/* ═══ v1.4.10.626 — Makes & models: the asset its model's "past end of life" counts ═══ */
.mm-arow.is-eol{box-shadow:inset 3px 0 0 var(--err);}
/* ═══ end v1.4.10.626 ═══ */
/* ═══ v1.4.10.627 — Consumables: the re-order in money ═══ */
/* a phone's item card says nothing where no asset uses the item (a bare "—" sat beside the levels, unlabelled) */
@media (max-width:760px){ .cn-tbl .cn-noassets{display:none;} }
/* ═══ end v1.4.10.627 ═══ */
/* ═══ v1.4.10.628 — Site assets: the way back to the overview, a phone's pickers on three lines ═══ */
.svx-crumb{padding:10px 14px 0;}
.svx-crumb .btn{color:var(--text-mute);}
.svx-crumb .btn svg{width:14px;height:14px;}
@media (max-width:760px){
  /* Client beside Site, the filter beside Print site sheet (each a line of its own: 342px of pickers above the rooms); alone,
     Site or the filter takes the line */
  .sv-pickbar{gap:10px 8px;}
  .sv-f-client,.sv-f-site{flex:1 1 calc(50% - 4px);}
  .sv-f-q{flex:1 1 0;}
  .sv-pickbar > .btn{flex:none;}
  .svx-crumb .btn{min-height:40px;}
}
/* ═══ end v1.4.10.628 ═══ */
/* ═══ v1.4.10.629 — Validation: a phone's search the width of the bar ═══ */
/* the list's name and Ready to deploy on the first line, the search and Filters on the second (the search shared a line with
   the name and Filters: 98px, "Sear…"); the open filters and Clear after them */
@media (max-width:760px){
  .vq-bar-l .vq-bar-title{order:1;}
  .vq-bar-l .vq-chip{order:2;}
  .vq-bar .vq-f-q{order:3;flex:1 1 200px;min-width:0;}
  .vq-bar .vq-fbtn{order:4;}
  .vq-bar-l .asb-field{order:5;}
  .vq-bar-l .vq-chipx{order:6;}
}
/* ═══ end v1.4.10.629 ═══ */
/* ═══ v1.4.10.630 — Recent activity: the breakdown stays in view on a desk; Show older ═══ */
/* (aacSideHtml) on a desk the rail (what changed, who) stays beside the feed as it scrolls: it was left behind 600px into a
   4,117px feed of 43 changes. Held to the scroller's height, it scrolls on its own when an estate has many kinds of change. */
@media (min-width:1001px){
  .aac-side{position:sticky;top:12px;max-height:calc(100vh - 136px);overflow-y:auto;scrollbar-width:thin;padding:2px;margin:-2px;}
}
/* below 1001px it was drawn under the whole feed and its pager, 7,174px down at 390: nobody reached it. The Change and Who
   pickers in the filter bar list the same kinds and people with the same counts. */
@media (max-width:1000px){
  .aac-side{display:none;}
}
/* (aacFootHtml) "The newest 60 of 84 changes" and Show older, as an asset's own history ends; on a phone the two need 324 of
   322px, so the button takes its own line, the width of the feed */
.aac-foot{justify-content:space-between;flex-wrap:wrap;}
@media (max-width:760px){
  .aac-foot .aac-older{flex:1 1 100%;justify-content:center;}
}
/* ═══ end v1.4.10.630 ═══ */
/* ═══ v1.4.10.631 — Asset settings: the Statuses site picker drawn as the app's pickers ═══ */
/* (renderAssetStatusPanel) in the panel's head, at the height of the buttons beside it; on a phone .asb-field takes the line */
.astat-site{flex:0 0 auto;min-width:180px;gap:0;}
.astat-site select{padding-top:7px;padding-bottom:7px;}
/* ═══ end v1.4.10.631 ═══ */
/* ═══ v1.4.10.632 — Asset window: the life ring's words inside the ring; the life band without a cost ═══ */
/* (avvRing) "of life used" was 71px wide in the Overview's 92px ring, whose opening is 64px: it ran into the ring. It wraps
   inside the opening now ("of life / used"); the 116 and 124px rings keep it on one line. */
.avv-ring-c span{max-width:calc(100% - 26px);line-height:1.2;}
/* (avvOverviewHtml) the ring and two figures with no book-value curve beside them (no purchase cost) */
.avv-ov.avv-ov-life{grid-template-columns:auto;justify-content:start;}
/* ═══ end v1.4.10.632 ═══ */
/* ═══ v1.4.10.633 — Asset register: a row the keyboard reaches shows where it is ═══ */
/* (assetTableRow) table and grouped rows take Tab and Enter now, as the cards do; drawn as the support table's rows are */
.asset-dt tbody tr:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
/* ═══ end v1.4.10.633 ═══ */
/* ═══ v1.4.10.634 — Asset editor: a value that cannot be right, said in the Finance preview ═══ */
/* (aeValuePreview / aeValuesProblem) the preview's line reads as a fault, not as the quiet "enter a cost" prompt it replaces */
.ae-vp-empty.ae-vp-bad{color:var(--err);font-weight:500;line-height:1.45;}
/* ═══ end v1.4.10.634 ═══ */
/* ═══ v1.4.10.636 — Billing › Invoices: one action and More, the number opens it, a card a row on a phone; Payment received in a window ═══ */
/* (blRenderInvoices / blInvActions) the invoice number is the way in; one button and a More menu per row (the actions cell
   was 686px of up to eight buttons, past the panel's edge on a desk) */
.bl-inv-no{appearance:none;background:none;border:0;padding:0;margin:0;font:inherit;font-weight:700;color:var(--text);cursor:pointer;text-align:left;text-decoration:none;}
.bl-inv-no:hover{color:var(--brand-blue);text-decoration:underline;text-underline-offset:2px;}
.bl-inv-no:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;border-radius:3px;}
.bl-itable td.bl-i-act{width:1%;white-space:nowrap;}
.bl-i-acts{display:inline-flex;align-items:center;justify-content:flex-end;gap:6px;}
.bl-inv-more{width:30px;padding:0;justify-content:center;}
.bl-inv-more svg{width:15px;height:15px;}
/* (blRenderMarkPaidModal) how it was paid, as three choices */
.bl-mp-what{font-size:13px;color:var(--text-mute);line-height:1.65;margin:0 0 14px;}
.bl-mp-opts{display:grid;gap:8px;margin-bottom:16px;}
.bl-mp-opt{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;cursor:pointer;background:var(--surface);}
.bl-mp-opt:hover{border-color:var(--line-2);}
.bl-mp-opt.on{border-color:var(--brand-blue);background:var(--accent-glow);}
.bl-mp-opt input{margin-top:3px;flex:none;}
.bl-mp-opt > span{display:flex;flex-direction:column;gap:2px;}
.bl-mp-acts{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;}
/* a phone: each invoice a card (the table was 1,393px, 1,675px for an administrator, in a 354px frame): the number and its
   state, the month and who, the three figures, then the action and More, each 40px */
@media (max-width:760px){
  .bl-itable thead{display:none;}
  .bl-itable,.bl-itable tbody{display:block;width:100%;}
  .panel-body.flush .bl-itable.dt,.tbl-scroll .bl-itable.dt{min-width:0;}   /* the flush panel's 680px table floor kept the cards 680px wide */
  .bl-itable tr.bl-irow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 10px;padding:14px;border-bottom:1px solid var(--line);}
  .bl-itable tr.bl-irow > td{display:block;padding:0;border:0;min-width:0;text-align:left !important;white-space:normal;width:auto;}
  .bl-itable td.bl-i-no{grid-column:1 / -1;}
  /* the state on a line of its own, its note beside it ("Payment on its way", 123px, overran a third of the card) */
  .bl-itable td.bl-i-st{grid-column:1 / -1;display:flex !important;align-items:center;gap:4px 8px;flex-wrap:wrap;}
  .bl-itable td.bl-i-st .device-meta{margin:0;}
  .bl-itable td.bl-i-per,.bl-itable td.bl-i-org{grid-column:1 / -1;font-size:13px;color:var(--text-mute);}
  .bl-itable td.bl-i-tot,.bl-itable td.bl-i-due,.bl-itable td.bl-i-date{padding:7px 10px;border-radius:6px;background:var(--surface-2);}
  .bl-itable td.bl-i-tot::before,.bl-itable td.bl-i-due::before,.bl-itable td.bl-i-date::before{content:attr(data-l);display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim,var(--text-mute));margin-bottom:2px;}
  .bl-itable td.bl-i-act{grid-column:1 / -1;}
  .bl-itable .bl-i-acts{display:flex;width:100%;}
  .bl-itable .bl-i-acts .btn{min-height:40px;}
  .bl-itable .bl-i-acts .btn:not(.bl-inv-more){flex:1;justify-content:center;}
  .bl-itable .bl-inv-more{width:40px;flex:none;}
  .bl-itable td.bl-i-no .bl-inv-no{display:inline-flex;align-items:center;min-height:40px;}   /* (.dt a:not(.btn) sets a link's to 0) */
}
/* ═══ end v1.4.10.636 ═══ */
/* ═══ v1.4.10.637 — Billing › Overview: pay in one press and More, the accounts address on a line, the clients as cards on a phone ═══ */
/* (blPayActs) the banner's two buttons and More */
.bl-pay-acts .bl-inv-more{flex:none;}
/* (blSubscriptionHero) the accounts address: its label, box and Save on one line, what it is for under them */
.bl-mailto{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:6px 12px;}
.bl-mailto-l{font-size:13px;font-weight:600;white-space:nowrap;}
.bl-mailto .bl-mailto-form{flex:none;}
.bl-mailto .bl-mailto-form input{flex:1 1 auto;min-width:0;max-width:440px;}
.bl-mailto-h{grid-column:1 / -1;line-height:1.5;}
@media (max-width:560px){
  .bl-mailto{grid-template-columns:minmax(0,1fr);}
  .bl-pay-acts .bl-inv-more{width:40px;flex:0 0 40px;}
  /* the next invoice's figure is a link: a 40px tap (it was 30px) */
  .bl-tile-v a{display:inline-flex;align-items:center;min-height:40px;}
}
/* (blRenderOverview) Room Packs by client: on a phone each client a card, its name, then assigned, in use and spare as
   three labelled figures, its use as a bar, and Manage (a 680px table in a 354px frame) */
@media (max-width:760px){
  .bl-glance thead{display:none;}
  .bl-glance,.bl-glance tbody{display:block;width:100%;}
  .panel-body.flush .bl-glance.dt,.tbl-scroll .bl-glance.dt{min-width:0;}
  .bl-glance tr.bl-grow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 10px;padding:14px;border-bottom:1px solid var(--line);}
  .bl-glance tr.bl-grow > td{display:block;padding:0;border:0;min-width:0;text-align:left !important;}
  .bl-glance td.bl-g-name,.bl-glance td.bl-g-org,.bl-glance td.bl-glance-meter,.bl-glance td.bl-g-act{grid-column:1 / -1;}
  .bl-glance td.bl-g-org{font-size:13px;color:var(--text-mute);}
  .bl-glance td.bl-g-n{padding:7px 10px;border-radius:6px;background:var(--surface-2);}
  .bl-glance td.bl-g-n::before{content:attr(data-l);display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim,var(--text-mute));margin-bottom:2px;}
  .bl-glance td.bl-glance-meter{min-width:0;}
  .bl-glance td.bl-g-act .btn{width:100%;min-height:40px;justify-content:center;}
}
/* (blSubscriptionHero) the notice rules behind a line that opens them */
details.bl-foot > summary{cursor:pointer;font-weight:600;color:var(--text-mute);list-style-position:inside;padding:4px 0;}
details.bl-foot > summary:hover{color:var(--text);}
details.bl-foot[open] > summary{margin-bottom:4px;}
@media (max-width:760px){ details.bl-foot > summary{min-height:40px;display:flex;align-items:center;gap:6px;} details.bl-foot > summary::before{content:'\25B8';font-size:11px;} details.bl-foot[open] > summary::before{content:'\25BE';} details.bl-foot > summary::-webkit-details-marker{display:none;} details.bl-foot > summary{list-style:none;} }
/* (blPayActs) on a phone the two buttons share the line with More (More fell to a line of its own); the headline's icon
   rides in its first line (it stood alone above a wrapped headline) */
.bl-pay-h{display:block;}
.bl-pay-h > svg{vertical-align:-3px;margin-right:2px;}
@media (max-width:560px){
  .bl-pay-acts{flex-wrap:nowrap;}
  .bl-pay-acts .btn:not(.bl-inv-more){flex:1 1 0;min-width:0;white-space:normal;line-height:1.25;text-align:center;}
}
/* ═══ end v1.4.10.637 ═══ */
/* ═══ v1.4.10.638 — Billing › Room Packs: the client's name a 40px tap on a phone, a site's buttons whole ═══ */
/* (blRpDetailHtml) a site's Buy for this site and Hand back… each on one line ("Buy for this / site" broke in two beside the count) */
.bl-cd-kv .bl-row-acts{flex-wrap:wrap;gap:6px;}
.bl-cd-kv .bl-row-acts .btn{white-space:nowrap;}
@media (max-width:760px){
  /* (blRpRowHtml) the client's name opens its sites and rooms: a 16px-tall link on a phone */
  .bl-ctable td a.bl-c-link{display:inline-flex;align-items:center;min-height:40px;}   /* (.dt a:not(.btn) sets a link's to 0) */
}
/* ═══ end v1.4.10.638 ═══ */
/* ═══ v1.4.10.639 — Billing › Billing settings: six sections on a rail, a Save bar that stays in view ═══
   The rail and the phone's section list are Assets › Settings' (.cs-rail, .cs-item, .cs-pick, v1.4.10.552). A section not
   shown is hidden, not left out, so Save still reads every field. */
.bcs-main{min-width:0;}
.bcs-sec[hidden], .bcs-discard[hidden]{display:none !important;}
.bcs-sec > .panel{margin-bottom:0;}
.bcs-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--text-mute);}
.bcs-dot.ok{background:var(--ok);}
.bcs-dot.warn{background:var(--warn);}
/* a section with unsaved changes */
.cs-item.dirty::after{content:'';flex:none;width:7px;height:7px;border-radius:50%;background:var(--brand-blue);box-shadow:0 0 0 2px rgba(var(--bc-blue-v1-rgb),.18);}
.bcs-bar{position:sticky;bottom:0;z-index:5;display:flex;align-items:center;gap:10px;margin-top:14px;padding:10px 12px 10px 16px;
  background:var(--surface);border:1px solid var(--line);border-radius:10px;box-shadow:0 -4px 16px rgba(15,23,42,.06),var(--shadow-sm);}
.bcs-bar-s{flex:1;min-width:0;font-size:13px;color:var(--text-mute);line-height:1.45;}
.bcs-bar.dirty{border-color:var(--brand-blue);}
.bcs-bar.dirty .bcs-bar-s b{color:var(--text);}
.bcs-bar .btn{white-space:nowrap;}
/* fields in twos and threes */
.bcs-row2, .bcs-row3{display:grid;gap:0 14px;align-items:end;}   /* a label on two lines keeps its box level with the others */
.bcs-row2{grid-template-columns:repeat(2,minmax(0,1fr));}
.bcs-row3{grid-template-columns:repeat(3,minmax(0,1fr));}
.bcs-hint{font-size:12px;color:var(--text-mute);line-height:1.5;margin:-4px 0 12px;}
.bcs-card > .bcs-hint:last-child{margin-bottom:0;}
.bcs-sub-h{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:10px 0 8px;}
.bcs-sub-h h4{margin:0;font-size:14px;}
.bcs-h4{margin:20px 0 8px;font-size:14px;}
.bcs-xstate + .bcs-h4{margin-top:4px;}
/* cards: a product, a way to pay, the invoice */
.bcs-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-items:start;}
.bcs-card{min-width:0;padding:14px 16px;border:1px solid var(--line);border-radius:10px;background:var(--surface);}
.bcs-card > .field:last-child, .bcs-card .bcs-row2:last-child .field, .bcs-card .bcs-row3:last-child .field{margin-bottom:0;}
.bcs-card-h{display:flex;align-items:center;gap:10px;margin-bottom:12px;}
.bcs-card-h > svg{flex:none;width:18px;height:18px;color:var(--brand-blue);stroke:currentColor;}
.bcs-card-h > div{display:flex;flex-direction:column;min-width:0;}
.bcs-card-h b{font-size:14px;color:var(--text);}
.bcs-card-h span{font-size:12px;color:var(--text-mute);}
/* a rule the section keeps to (licensing, suspension by hand) */
.bcs-rule{display:flex;gap:10px;align-items:flex-start;margin-top:16px;padding:11px 13px;border-radius:8px;background:var(--surface-2);
  border:1px solid var(--line);font-size:13px;line-height:1.55;color:var(--text-mute);}
.bcs-rule .pill{flex:none;margin-top:1px;}
.bcs-rule b{color:var(--text);font-weight:600;}
.bcs-warn{display:flex;gap:10px;align-items:flex-start;margin-bottom:14px;padding:11px 13px;border-radius:8px;border:1px solid var(--warn);
  background:rgba(217,119,6,.07);font-size:13px;line-height:1.6;}
.bcs-warn > svg{flex:none;width:16px;height:16px;margin-top:3px;color:var(--warn);stroke:currentColor;}
/* the pricing tiers: two inputs, the range each covers, the rate after the discount */
.dt.bcs-tiers{width:100%;}
.dt.bcs-tiers td{vertical-align:middle;padding-top:7px;padding-bottom:7px;}
#bl-tiers td > input{width:100%;max-width:130px;}
.bcs-t-cov, .bcs-t-net{white-space:nowrap;font-variant-numeric:tabular-nums;color:var(--text-mute);}
.bcs-t-net{color:var(--text);font-weight:600;}
.dt.bcs-tiers th:last-child, .bcs-t-x{width:52px;text-align:right;}
/* when a September invoice's dates fall */
.bcs-tl-wrap{margin-top:14px;padding:12px 14px;border-radius:8px;background:var(--surface-2);border:1px solid var(--line);}
.bcs-tl-h{font-size:12px;font-weight:600;color:var(--text);}
.bcs-tl{list-style:none;margin:10px 0 0;padding:0;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;}
.bcs-tl li{position:relative;display:flex;flex-direction:column;gap:1px;min-width:0;padding-top:14px;}
.bcs-tl li::before{content:'';position:absolute;top:0;left:0;width:8px;height:8px;border-radius:50%;background:var(--brand-blue);}
.bcs-tl li::after{content:'';position:absolute;top:3px;left:14px;right:-2px;height:2px;border-radius:1px;background:var(--line-2,var(--line));}
.bcs-tl li:last-child::after{display:none;}
.bcs-tl-l{font-size:11px;font-weight:600;color:var(--text-mute);line-height:1.3;}
.bcs-tl li b{font-size:14px;color:var(--text);font-variant-numeric:tabular-nums;}
.bcs-tl-s{font-size:11px;color:var(--text-mute);line-height:1.35;}
.bcs-tl li.bad::before{background:var(--err);}
.bcs-tl li.bad b, .bcs-tl li.bad .bcs-tl-s{color:var(--err);}
/* the email templates: the placeholders, then each template folded */
.bcs-ph{margin-bottom:14px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);}
.bcs-ph-t{margin-bottom:8px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text);}
.bcs-ph dl{margin:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px 20px;}
.bcs-ph dl > div{display:flex;gap:8px;align-items:baseline;min-width:0;font-size:12px;line-height:1.45;}
.bcs-ph dt{flex:none;font-family:var(--font-mono);font-size:12px;color:var(--brand-blue);user-select:all;}
.bcs-ph dd{margin:0;min-width:0;color:var(--text-mute);}
.bcs-tpl{margin-bottom:10px;border:1px solid var(--line);border-radius:10px;background:var(--surface);overflow:hidden;}
.bcs-tpl > summary{display:flex;align-items:center;gap:12px;min-height:44px;padding:10px 14px;cursor:pointer;list-style:none;}
.bcs-tpl > summary::-webkit-details-marker{display:none;}
.bcs-tpl > summary:hover{background:var(--surface-2);}
.bcs-tpl > summary:focus-visible{outline:2px solid var(--brand-blue);outline-offset:-2px;}
.bcs-tpl-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;}
.bcs-tpl-t b{font-size:13px;color:var(--text);}
.bcs-tpl-t span{font-size:12px;color:var(--text-mute);line-height:1.45;}
.bcs-tpl-c{flex:none;display:inline-flex;color:var(--text-dim,var(--text-mute));transition:transform .15s;}
.bcs-tpl[open] .bcs-tpl-c{transform:rotate(180deg);}
.bcs-tpl-b{padding:12px 14px 14px;border-top:1px solid var(--line);}
.bcs-tpl-b textarea{resize:vertical;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:13px;}
/* Xero */
.bcs-xstate{margin-bottom:14px;padding:9px 13px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);font-size:13px;line-height:1.7;}
.bcs-xstate.sm{margin:0;font-size:12px;line-height:1.6;}
.bcs-how{margin:0 0 12px;font-size:12px;color:var(--text-mute);}
.bcs-how > summary{display:inline-flex;align-items:center;min-height:28px;cursor:pointer;font-weight:600;color:var(--brand-blue);}
.bcs-how > div{margin-top:4px;line-height:1.6;}
/* the field Save stopped at */
.bcs-bad{border-color:var(--err) !important;box-shadow:0 0 0 3px rgba(220,38,38,.14) !important;}
@media (max-width:1100px){
  .bcs-cards{grid-template-columns:1fr;}
}
@media (max-width:760px){
  .bcs-row2{grid-template-columns:1fr;}
  .bcs-row3{grid-template-columns:repeat(2,minmax(0,1fr));gap:0 10px;}   /* currency and GST side by side, the discount under them */
  .bcs-row3 > .field:last-child{grid-column:1 / -1;}
  .bcs-card .bcs-row3 > .field:last-child{grid-column:auto;}
  .bcs-card .bcs-row3{grid-template-columns:repeat(3,minmax(0,1fr));gap:0 10px;}   /* the three day counts stay on one line */
  .bcs-card .bcs-row2 .field{margin-bottom:14px;}
  .bcs-card{padding:12px 14px;}
  .bcs-sub-h .btn{min-height:40px;}
  .bcs-bar{flex-wrap:wrap;padding:10px 12px;gap:8px 10px;}
  .bcs-bar.dirty .bcs-bar-s{flex-basis:100%;}   /* clean, the line and Save share one row */
  .bcs-bar .btn{flex:1 1 0;min-height:44px;justify-content:center;}
  .bcs-tl{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 10px;}
  .bcs-tl li::after{display:none;}
  .bcs-ph dl{grid-template-columns:1fr;}
  .bcs-how > summary{min-height:40px;}
  .bcs-whstate > label{display:none;}
  /* a tier is a card: its two figures side by side, the range and the rate under them */
  #bl-tiers thead{display:none;}
  #bl-tiers, #bl-tiers tbody{display:block;min-width:0;}   /* .dt holds 500px on a phone */
  #bl-tiers tr{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) 44px;gap:4px 10px;align-items:end;padding:10px 0;border-bottom:1px solid var(--line);}
  #bl-tiers td{display:block;padding:0;border:0;}
  #bl-tiers td > input{max-width:none;}
  #bl-tiers td[data-l]::before{content:attr(data-l);display:block;margin-bottom:3px;font-size:11px;font-weight:600;color:var(--text-mute);}
  #bl-tiers .bcs-t-cov, #bl-tiers .bcs-t-net{font-size:13px;white-space:normal;}
  .bcs-rule{flex-direction:column;gap:6px;}
  #bl-tiers .bcs-t-x{grid-column:3;grid-row:1;width:auto;}
  #bl-tiers .bcs-t-x .btn{min-width:44px;min-height:40px;}
}
/* ═══ end v1.4.10.639 ═══ */

/* ═══ v1.4.10.640 — Billing › Accounts: a closed card on one line, the facts as a list with their own changes, phone cards ═══ */
.bl-acct-head{align-items:center;gap:8px 12px;}
.bl-acct-head .bl-caret{margin-top:0;}
.bl-acct-id{flex:1 1 260px;}
.bl-acct-nm{min-width:0;overflow-wrap:anywhere;}
.bl-acct-head .bl-acct-acts{display:flex;align-items:center;gap:6px;flex:none;flex-wrap:nowrap;width:auto;margin-left:auto;}
.bl-acct-acts .bl-inv-more{width:32px;}
.bl-acct .panel-body > .bl-okline{margin-bottom:2px;}
/* the account's facts: two columns of label, value and its own change */
.bl-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 28px;margin:16px 0 0;padding:0;border-top:1px solid var(--line);}
.bl-fact{display:grid;grid-template-columns:118px minmax(0,1fr);gap:10px;align-items:center;min-height:40px;padding:5px 0;border-bottom:1px solid var(--line);}
.bl-fact dt{font-size:12px;font-weight:600;color:var(--text-mute);}
.bl-fact dd{display:flex;align-items:center;gap:10px;min-width:0;margin:0;font-size:13px;color:var(--text);}
.bl-fact-v{flex:1;min-width:0;line-height:1.4;}
.bl-fact-v small{display:block;margin-top:1px;font-size:12px;color:var(--text-mute);}
.bl-fact-a{display:flex;gap:6px;flex:none;}
.bl-acct-mail{margin:16px 0 0;}
.bl-acct-noc{margin-top:14px;}
/* (blRenderIntSettingsModal) its two tabs keep their height when the window is taller than the screen (they shrank to 28px) */
.bl-pane .modal-backdrop .panel > .set-tabs{flex:none;}
/* a choice's own field sits under it, in line with its words (it was an inline style; a phone takes it to the edge) */
.bl-int-sub{margin:-4px 0 0 34px;}
/* its own rates: compact, so the table fits its column (at .dt's 18px a side it widened the column and pushed What it would pay off the window) */
.dt.bl-intt thead th, .dt.bl-intt tbody td{padding:6px 10px 6px 0;}
/* what it would pay: its headings may take two lines, so the two columns share the window */
.bl-int-grid .dt.bl-intq thead th, .bl-int-grid .dt.bl-intq tbody td{padding:9px 10px;white-space:normal;}
/* unpaid invoices and clients */
.dt.bl-ainv, .dt.bl-acl{width:100%;}
.bl-ainv td.bl-ai-act{text-align:right;white-space:nowrap;}
.bl-ainv td.bl-ai-st{line-height:1.6;}
.bl-ainv td.bl-ai-due{white-space:nowrap;}
@media (max-width:1100px){
  .bl-facts{grid-template-columns:1fr;}
}
@media (max-width:760px){
  .bl-acct-head{padding:12px 14px;}
  .bl-acct-id{flex-basis:190px;}
  .bl-acct-acts .btn{min-height:40px;}
  .bl-acct-acts .bl-inv-more{width:40px;}
  /* each fact's change is under the card's More too: a phone lists the facts alone */
  .bl-fact{grid-template-columns:96px minmax(0,1fr);align-items:baseline;min-height:0;padding:8px 0;}
  .bl-fact-a{display:none;}
  .bl-acct-mail .bl-mailto-form{flex-wrap:nowrap;}   /* the box and Save on one line */
  .bl-acct-mail .bl-mailto-form input{flex:1 1 auto;}
  .bl-acct-mail .bl-mailto-form .btn{flex:none;min-height:40px;}
  /* an unpaid invoice is a card: its number and what it owes, the month, when it was due, its notice stage, then its actions */
  .bl-ainv thead, .bl-acl thead{display:none;}
  .dt.bl-ainv, .bl-ainv tbody, .dt.bl-acl, .bl-acl tbody{display:block;min-width:0;}   /* .dt holds 500px on a phone */
  .bl-ainv tr{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:3px 10px;padding:12px 0;border-bottom:1px solid var(--line);}
  .dt.bl-ainv tbody td{display:block;padding:0;border:0;font-size:13px;}   /* over .dt tbody td's 13px 18px */
  .bl-ainv td.bl-ai-no{grid-column:1;font-weight:600;}
  .bl-ainv td.bl-ai-amt{grid-column:2;grid-row:1;text-align:right;}
  .bl-ainv td.bl-ai-per, .bl-ainv td.bl-ai-due, .bl-ainv td.bl-ai-st{grid-column:1 / -1;white-space:normal;}
  .bl-ainv td.bl-ai-per{color:var(--text-mute);}
  .bl-ainv td.bl-ai-due::before, .bl-ainv td.bl-ai-st::before{content:attr(data-l) ': ';color:var(--text-mute);}
  .bl-ainv td.bl-ai-act{grid-column:1 / -1;margin-top:8px;text-align:left;}
  .bl-ai-act .bl-i-acts{display:flex;width:100%;}
  .bl-ai-act .bl-i-acts .btn{min-height:40px;}
  .bl-ai-act .bl-i-acts .btn:not(.bl-inv-more){flex:1;justify-content:center;}
  .bl-ai-act .bl-inv-more{width:40px;flex:none;}
  /* a client is a card: its name, five labelled figures, its add-ons */
  .bl-acl tr{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;padding:12px 0;border-bottom:1px solid var(--line);}
  .dt.bl-acl tbody td{display:block;padding:0;border:0;text-align:left;}
  .bl-acl td.bl-acl-n{grid-column:1 / -1;font-size:14px;}
  .bl-acl td.num{font-size:14px;font-weight:600;font-variant-numeric:tabular-nums;}
  .bl-acl td.num::before{content:attr(data-l);display:block;margin-bottom:1px;font-size:11px;font-weight:600;color:var(--text-mute);}
  .bl-acl td.bl-acl-ad{grid-column:1 / -1;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  .bl-acl td.bl-acl-ad .btn{min-height:40px;margin-left:auto;}
  /* (blRenderIntSettingsModal) the Pricing & emails window: one column, its tables to the screen (.dt holds 500px on a phone) */
  .bl-int-grid{grid-template-columns:minmax(0,1fr) !important;}
  .bl-int-grid > *{min-width:0;}
  .dt.bl-intq, .dt.bl-intt{min-width:0;width:100%;}
  .bl-int-grid .dt.bl-intq thead th, .bl-int-grid .dt.bl-intq tbody td{padding:8px 6px;font-size:12px;}
  .bl-int-grid .dt.bl-intq thead th:first-child, .bl-int-grid .dt.bl-intq tbody td:first-child{padding-left:0;}
  .dt.bl-intq th:nth-child(2), .dt.bl-intq td:nth-child(2){display:none;}   /* List: their rate carries the discount off it */
  .bl-int-sub{margin-left:0;}
  .bl-int-grid > div{grid-template-columns:minmax(0,1fr);}
  .dt.bl-intt td:first-child input{width:72px !important;}   /* (inline 80px and 100px) */
  .dt.bl-intt td:nth-child(2) input{width:88px !important;}
}
/* ═══ end v1.4.10.640 ═══ */

/* ═══ v1.4.10.641 — Billing › Buy Room Packs: the form, and the order beside it with the money told once ═══ */
@media (min-width:901px){
  .bl-buy{grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);}
  .bl-buy-price{position:sticky;top:12px;}   /* the button stays beside the form while it scrolls */
}
/* the form */
.bl-buy-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 14px;align-items:end;}
.bl-buy-warn{margin:-6px 0 12px;color:var(--warn);}
.bl-buy-site{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 16px;padding:8px 12px;border-radius:8px;background:var(--surface-2);font-size:12px;line-height:1.5;}
.bl-buy-site > svg{flex:none;color:var(--brand-blue);}
.bl-buy-site > span{flex:1 1 220px;min-width:0;}
.bl-nudge{display:flex;align-items:flex-start;gap:8px;flex-wrap:wrap;}
.bl-nudge > svg{flex:none;margin-top:3px;}
.bl-nudge > span{flex:1 1 240px;min-width:0;}
.bl-nudge .btn{margin-left:0;}
.bl-buy-notes{margin-bottom:0;}
/* the order: the figures, on account, the term, the button, then the site's rate by what it holds */
.bl-buy-wait{display:flex;align-items:center;gap:8px;margin-bottom:14px;padding:12px 14px;border:1px dashed var(--line-2);border-radius:8px;font-size:13px;line-height:1.5;color:var(--text-mute);}
.bl-buy-wait > svg{flex:none;}
.bl-buy-wait.err{color:var(--err);border-color:var(--err);}
.bl-buy-price .bl-calc{margin-top:0;padding-top:0;border-top:0;}
.bl-calc-now{font-weight:600;}
.bl-calc-site{padding-top:7px;border-top:1px dashed var(--line);}
.bl-buy-acct{margin:12px 0;font-size:13px;line-height:1.6;color:var(--text-mute);}
.bl-buy-acct b{color:var(--text);}
.bl-buy-price .bl-term-note{margin:0 0 12px;}
.bl-buy-price .bl-cta{width:100%;min-height:44px;margin-top:0;justify-content:center;}
.bl-cta-sub{margin-top:6px;text-align:center;font-size:12px;color:var(--text-mute);font-variant-numeric:tabular-nums;}
.bl-buy-after{margin-top:10px;line-height:1.5;}
.bl-buy-th{margin-top:22px;}
.bl-buy-why{margin-top:8px;line-height:1.5;}
@media (max-width:760px){
  .bl-buy-row{grid-template-columns:1fr;}
  .bl-buy-site .btn, .bl-nudge .btn{min-height:40px;}
  .bl-buy-price .bl-calc-total{font-size:15px;}   /* the two totals on one line each */
  .bl-buy-price .bl-calc > div > span{min-width:0;}
  /* the rate table to the screen (.dt holds 500px on a phone) */
  .bl-buy-price .dt.bl-tiers{min-width:0;width:100%;}
  .bl-buy-price .dt.bl-tiers thead th, .bl-buy-price .dt.bl-tiers tbody td{padding:9px 8px;}
  .bl-buy-price .dt.bl-tiers thead th:first-child, .bl-buy-price .dt.bl-tiers tbody td:first-child{padding-left:0;}
  .bl-buy-price .dt.bl-tiers thead th:last-child, .bl-buy-price .dt.bl-tiers tbody td:last-child{padding-right:0;}
}
/* ═══ end v1.4.10.641 ═══ */

/* ═══ v1.4.10.642 — Billing › Add-ons: the two products side by side, each add-on a card on a phone, the add window ═══ */
/* the products (the cards keep .bl-addon-card, which addons-392 counts) */
.bl-aprods{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;}
.bl-aprod.bl-addon-card{display:flex;flex-direction:column;align-items:stretch;flex-wrap:nowrap;gap:10px;padding:16px;border-radius:10px;}
.bl-aprod-h{display:flex;align-items:center;gap:12px;}
.bl-aprod-h .bl-addon-ico{width:44px;height:44px;border-radius:10px;}
.bl-aprod-h > div{display:flex;flex-direction:column;min-width:0;}
.bl-aprod-h b{font-size:15px;font-weight:600;letter-spacing:-.012em;color:var(--text);}
.bl-aprod-h span{font-size:12px;color:var(--text-mute);}
.bl-aprod-blurb{margin:0;font-size:13px;line-height:1.55;color:var(--text);}
.bl-aprod-foot{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:auto;padding-top:12px;border-top:1px solid var(--line);}
.bl-aprod-price{display:flex;flex-direction:column;gap:1px;font-size:13px;color:var(--text-mute);}
.bl-aprod-price b{font-size:18px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;}
.bl-aprod-price span{font-size:12px;}
.bl-aprod-amt{white-space:nowrap;}
.bl-aprod-price .bl-aprod-free{color:var(--ok);font-weight:500;}
/* the list */
.bl-addon-table td.bl-a-site{font-weight:600;min-width:130px;}
.bl-addon-table td.bl-a-added, .bl-addon-table td.bl-a-serial{white-space:nowrap;}
.bl-a-sub{margin-top:1px;font-size:12px;color:var(--text-mute);}
.bl-addon-table td.bl-a-act{white-space:nowrap;}
.bl-a-acts{display:flex;justify-content:flex-end;gap:6px;}
/* the add window */
.bl-aform{border-left:4px solid var(--brand-blue);}
.bl-aform-grid{align-items:start;gap:16px;}
.bl-aform-grid > *{min-width:0;}
.bl-aform-picks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:14px;}
.bl-aform-gift{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer;}
.bl-aform-gift > svg{flex:none;}
.bl-aq{padding:12px 14px;border:1px solid var(--line);border-radius:10px;}
.bl-aq > .bl-sec-h{margin:0 0 8px;}
.bl-aq-note{margin:0 0 10px;}
.bl-aq .bl-calc{margin-top:0;padding-top:0;border-top:0;}
.bl-aq .bl-calc-total{font-size:15px;}
.bl-aq-meta{margin-top:8px;line-height:1.5;}
.bl-aq-block{display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:12px 14px;border:1px solid rgba(220,38,38,.35);border-radius:10px;background:rgba(220,38,38,.05);font-size:13px;line-height:1.55;}
.bl-aq-block p{margin:0;}
.bl-aq-block.warn{border-color:rgba(217,119,6,.35);background:rgba(217,119,6,.08);}
.bl-aform-go{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px;}
@media (max-width:760px){
  .bl-aprods, .bl-aform-picks{grid-template-columns:1fr;}
  .bl-aprod-foot .btn{width:100%;min-height:40px;justify-content:center;}
  .bl-aform-go .btn{flex:1 1 auto;min-height:44px;justify-content:center;}
  /* each add-on a card: its site and product, what it costs, when it was added, its serial, where it stands, then its two
     buttons across the card (.panel-body.flush .dt holds 680px, .dt 500px on a phone) */
  .panel-body.flush .dt.bl-addon-table, .bl-addon-table tbody{display:block;min-width:0;}
  .bl-addon-table thead{display:none;}
  .bl-addon-table tr.bl-addon-group{display:block;}
  .bl-addon-table tr.bl-addon-group td{display:block;padding:8px 14px;}
  .bl-addon-table tr.bl-arow{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px;padding:12px 14px;border-bottom:1px solid var(--line);}
  .dt.bl-addon-table tbody tr.bl-arow td{display:block;min-width:0;padding:0;border:0;font-size:13px;white-space:normal;}
  .bl-addon-table td.bl-a-site{font-size:14px;align-self:center;}
  .bl-addon-table td.bl-a-prod{text-align:right;align-self:center;}
  /* charge beside status, added beside serial, each under its own label */
  .bl-addon-table td.bl-a-charge::before, .bl-addon-table td.bl-a-status::before, .bl-addon-table td.bl-a-added::before, .bl-addon-table td.bl-a-serial::before{content:attr(data-l);display:block;margin-bottom:2px;font-size:11px;font-weight:600;color:var(--text-mute);}
  .bl-addon-table td.bl-a-act{grid-column:1 / -1;}
  .bl-addon-table td.bl-a-prod .bl-tag{max-width:none;}   /* the product's whole name (.bl-tag stops at 140px on a phone) */
  .bl-addon-table td.bl-a-act:empty{display:none;}
  .bl-a-acts .btn{flex:1 1 0;min-height:40px;justify-content:center;}
  .dt .bl-prov a:not(.btn){display:inline-flex;align-items:center;min-height:40px;}   /* the Provisioning link was 14px tall (over .dt a:not(.btn)) */
  /* a product: a little tighter */
  .bl-aprod.bl-addon-card{padding:14px;gap:8px;}
  .bl-aprod-h .bl-addon-ico{width:36px;height:36px;}
  .bl-aprod-foot{padding-top:10px;gap:10px;}
}
/* ═══ end v1.4.10.642 ═══ */

/* ═══ v1.4.10.643 — Billing › Orders: seven columns, each order a card on a phone ═══ */
.dt.bl-otable{width:100%;}
.bl-o-sub{margin-top:1px;font-size:12px;font-weight:400;color:var(--text-mute);}
.bl-otable td.bl-o-ref .mono{font-weight:600;}
.bl-otable td.bl-o-date, .bl-otable td.bl-o-ref .mono, .bl-otable td.bl-o-total b{white-space:nowrap;}
.bl-otable td.bl-o-ref{min-width:150px;}
.bl-otable td.bl-o-for{min-width:150px;}
.bl-otable td.bl-o-prov{min-width:140px;}
.bl-otable td.bl-o-for .bl-o-sub{white-space:nowrap;}
.bl-otable td.bl-o-act{text-align:right;white-space:nowrap;}
.bl-o-acts{display:inline-flex;gap:6px;}
.bl-otable tr.bl-o-off td{color:var(--text-mute);}
@media (max-width:1366px){   /* 12px inside on a laptop, the outer edges keep 18px */
  .dt.bl-otable thead th, .dt.bl-otable tbody td{padding-left:12px;padding-right:12px;}
  .dt.bl-otable thead th:first-child, .dt.bl-otable tbody td:first-child{padding-left:18px;}
  .dt.bl-otable thead th:last-child, .dt.bl-otable tbody td:last-child{padding-right:18px;}
}
@media (max-width:760px){
  /* an order is a card: its number and total, what it bought and where it stands, who it is for, when, then its buttons
     (.panel-body.flush .dt holds 680px, .dt 500px on a phone) */
  .panel-body.flush .dt.bl-otable, .bl-otable tbody{display:block;min-width:0;}
  .bl-otable thead{display:none;}
  .bl-otable tr.bl-orow{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 12px;padding:12px 14px;border-bottom:1px solid var(--line);}
  .dt.bl-otable tbody tr.bl-orow td{display:block;min-width:0;padding:0;border:0;font-size:13px;white-space:normal;}
  .bl-otable td.bl-o-ref{grid-column:1;grid-row:1;}
  .bl-otable td.bl-o-total{grid-column:2;grid-row:1;text-align:right;}
  .bl-otable td.bl-o-what{grid-column:1;grid-row:2;}
  .bl-otable td.bl-o-st{grid-column:2;grid-row:2;text-align:right;}
  .bl-otable td.bl-o-for, .bl-otable td.bl-o-date, .bl-otable td.bl-o-prov{grid-column:1 / -1;}
  .bl-otable td.bl-o-for::before, .bl-otable td.bl-o-date::before, .bl-otable td.bl-o-prov::before{content:attr(data-l) ': ';color:var(--text-mute);}
  .bl-otable td.bl-o-for .bl-o-sub, .bl-otable td.bl-o-date .bl-o-sub{display:inline;margin:0;font-size:13px;}
  .bl-otable td.bl-o-for .bl-o-sub::before, .bl-otable td.bl-o-date .bl-o-sub::before{content:' · ';}
  .bl-otable td.bl-o-what .bl-tag{max-width:none;}   /* the product's whole name (.bl-tag stops at 140px on a phone) */
  .bl-otable td.bl-o-act{grid-column:1 / -1;text-align:left;white-space:normal;}
  .bl-otable td.bl-o-act:empty{display:none;}
  .bl-o-acts{display:flex;width:100%;}
  .bl-o-acts .btn{flex:1 1 0;min-height:40px;justify-content:center;}
}
/* ═══ end v1.4.10.643 ═══ */

/* ═══ v1.4.10.644 — Billing › Insights: five tiles on one row, the tables to a phone ═══ */
@media (max-width:760px){
  .bl-ins-tiles > :last-child:nth-child(odd){grid-column:1 / -1;}   /* the fifth tile the width of the two above it */
  /* the three tables to the screen (.panel-body.flush .dt holds 680px, .dt 500px on a phone) */
  .panel-body.flush .dt.bl-ins-table{min-width:0;width:100%;}
  .dt.bl-ins-table thead th, .dt.bl-ins-table tbody td{padding:9px 6px;font-size:12px;}
  .dt.bl-ins-table thead th{white-space:normal;letter-spacing:.02em;}   /* a heading may take two lines */
  .dt.bl-ins-table .bl-ins-util{display:none;}   /* Util. is In use over Packs; the Utilisation tile has the whole book's */
  /* (over .bl-pane .grid-2 > .panel > .panel-body.flush > .dt :is(th, td)'s 12px a side) */
  .bl-pane .grid-2 > .panel > .panel-body.flush > .dt.bl-ins-table :is(th, td){padding-left:6px;padding-right:6px;}
  .bl-pane .grid-2 > .panel > .panel-body.flush > .dt.bl-ins-table :is(th, td):first-child{padding-left:14px;}
  .bl-pane .grid-2 > .panel > .panel-body.flush > .dt.bl-ins-table :is(th, td):last-child{padding-right:14px;}
}
/* ═══ end v1.4.10.644 ═══ */

/* ═══ v1.4.10.645 — Billing › Records: chips, a search that says what it finds, each record a card on a phone; Insights' bought and gifted packs apart ═══ */
/* (Insights) the legend under Room Packs bought by month */
.bl-ins-legend{display:flex;flex-wrap:wrap;gap:6px 16px;margin-top:8px;font-size:12px;color:var(--text-mute);}
.bl-ins-legend span{display:inline-flex;align-items:center;gap:6px;}
.bl-ins-legend i{width:10px;height:10px;border-radius:3px;background:linear-gradient(180deg,var(--bc-grad-a),var(--bc-purple));}
.bl-ins-legend i.g{background:var(--text-mute);opacity:.35;}
/* Records: three chips and the search on the toolbar */
.fin-rtools .bl-chips{flex:none;}
.bl-search #fin-rec-q{min-height:36px;padding:0;border:0;background:transparent;box-shadow:none;}   /* (over #fin-rec-q's own box: the search box is the label) */
.bl-search #fin-rec-q:focus{box-shadow:none;}
.dt.fin-rtable{width:100%;}
.fin-rtable td.fin-r-act{text-align:right;white-space:nowrap;}
.fin-rtable td.fin-r-date{white-space:nowrap;}
@media (max-width:760px){
  .bl-search #fin-rec-q{min-height:40px;}
  .dt.bl-ins-table .bl-ins-spare{display:none;}   /* (Insights) Spare is bought and gifted less in use; with Gifted the book had six columns */
  /* a record is a card: its number (or name) and amount, its status, a labelled line for each detail, then its button
     (.panel-body.flush .dt holds 680px, .dt 500px on a phone) */
  .panel-body.flush .dt.fin-rtable, .fin-rtable tbody{display:block;min-width:0;}
  .fin-rtable thead{display:none;}
  .fin-rtable tr.fin-rrow{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 12px;padding:12px 14px;border-bottom:1px solid var(--line);}
  .dt.fin-rtable tbody tr.fin-rrow td{display:block;min-width:0;padding:0;border:0;font-size:13px;text-align:left;white-space:normal;}
  .fin-rtable td.fin-r-main{grid-column:1;grid-row:1;font-weight:600;}
  .fin-rtable td.fin-r-amt{grid-column:2;grid-row:1;text-align:right !important;font-weight:600;}
  .fin-rtable td.fin-r-st{grid-column:2;grid-row:2;text-align:right !important;}
  .fin-rtable td.fin-r-line{grid-column:1;}
  .fin-rtable td.fin-r-line::before{content:attr(data-l) ': ';color:var(--text-mute);}
  .fin-rtable td.fin-r-act{grid-column:1 / -1;margin-top:6px;}
  .fin-rtable td.fin-r-act .btn{width:100%;min-height:40px;justify-content:center;}
  .fin-rtable tr.fin-r-none, .fin-rtable tr.fin-r-none td{display:block;}
}
/* ═══ end v1.4.10.645 ═══ */

/* ═══ v1.4.10.646 — Billing › Next run: each integrator opens on its own button, the money in with what it comes to, cards on a phone ═══ */
.fin-run-tiles{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));margin-bottom:14px;}
.dt.fin-run-table, .dt.fin-rc-table{width:100%;}
.fin-run-table tr.fin-run-row{cursor:pointer;}
.fin-run-table tr.fin-run-row:hover > td{background:var(--surface-2);}
.fin-run-table td.fin-rn-name{white-space:nowrap;}
.fin-run-tog{display:inline-flex;margin:0 10px 0 0;vertical-align:middle;}   /* (.bl-caret, Room Packs' row toggle) */
.fin-run-row.open .fin-run-tog{transform:rotate(90deg);color:var(--brand-blue);}
.fin-run-tog:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.fin-th-sub{display:block;margin-top:1px;font-size:11px;font-weight:500;letter-spacing:0;text-transform:none;color:var(--text-mute);}
.fin-warn{color:var(--warn);}
.fin-run-note{margin:6px 0 16px;}
.fin-rc-table td.fin-rc-by{white-space:nowrap;}
.fin-rc-table tr.fin-rc-total td{border-top:1px solid var(--line-2);color:var(--text);}
@media (max-width:760px){
  /* an integrator is a card: its name (and the button that opens its clients), then its figures two by two, each labelled
     (.dt holds 500px on a phone) */
  .dt.fin-run-table, .fin-run-table tbody, .dt.fin-rc-table, .fin-rc-table tbody{display:block;min-width:0;}
  .fin-run-table thead, .fin-rc-table thead{display:none;}
  .fin-run-table tr.fin-run-row, .fin-run-table tr.fin-run-total{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 12px;padding:12px 0;border-bottom:1px solid var(--line);}
  .dt.fin-run-table tbody tr td{display:block;min-width:0;padding:0;border:0;text-align:left;font-size:13px;white-space:normal;background:transparent;}
  .fin-run-table td.fin-rn-name, .fin-run-table tr.fin-run-total > td:first-child{grid-column:1 / -1;font-size:14px;}
  .fin-run-table td.num{text-align:left !important;}   /* (over the numeric columns' right edge) */
  .fin-run-table td.fin-rn-n::before, .fin-run-table td.fin-rn-total::before{content:attr(data-l);display:block;margin-bottom:1px;font-size:11px;font-weight:600;color:var(--text-mute);}
  .fin-run-tog{width:40px;height:40px;margin-right:8px;}
  .fin-run-table tr.fin-run-detail{display:block;}
  .dt.fin-run-table tbody tr.fin-run-detail td{padding:0 0 12px;}
  /* the money in: when and how much, what under them */
  .fin-rc-table tr.fin-rc-row, .fin-rc-table tr.fin-rc-total{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 12px;padding:10px 0;border-bottom:1px solid var(--line);}
  .dt.fin-rc-table tbody tr td{display:block;min-width:0;padding:0;border:0;font-size:13px;}
  .fin-rc-table td.fin-rc-by{grid-column:1;grid-row:1;}
  .fin-rc-table td.fin-rc-amt{grid-column:2;grid-row:1;text-align:right;}
  .fin-rc-table td.fin-rc-what{grid-column:1 / -1;}
}
/* ═══ end v1.4.10.646 ═══ */

/* ═══ v1.4.10.647 — Billing › Overview: invoice chips that fill their row and read as a list on a phone, each attention row naming its integrator, gifted packs marked ═══ */
.bl-inv-strip{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));}   /* (auto-fill left two empty tracks at 1440) */
.bl-inv-chip{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;column-gap:8px;row-gap:3px;}
.bl-inv-chip > span{min-width:0;}
.bl-inv-chip-p, .bl-inv-chip-o, .bl-inv-chip-n{grid-column:1 / -1;}
.bl-inv-chip-o{font-size:12px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bl-inv-chip-st{justify-self:start;}
.bl-inv-chip:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.bl-attn-org{display:inline-block;margin-left:6px;font-size:12px;font-weight:500;color:var(--text-mute);}
.bl-g-gift{display:block;font-size:11px;font-weight:500;color:var(--text-mute);}
@media (max-width:760px){
  /* an invoice is a line: the month and the amount, the integrator, then its number and status (beside the integrator a
     "Pending suspension · 46d" cut its name short) */
  .bl-inv-strip{grid-template-columns:1fr;gap:8px;}
  .bl-inv-chip{grid-template-columns:minmax(0,1fr) auto;grid-auto-flow:row dense;padding:10px 12px;}
  .bl-inv-chip-p{grid-column:1;grid-row:1;}
  .bl-inv-chip-v{grid-column:2;grid-row:1;justify-self:end;font-size:16px;}
  .bl-inv-chip-o{grid-column:1 / -1;grid-row:2;}
  .bl-inv-chip-n{grid-column:1;}
  .bl-inv-chip-st{grid-column:2;justify-self:end;}
  /* the icon beside the title (the title took the whole line and left the icon on one of its own) */
  .bl-attn-row{align-items:flex-start;}
  .bl-attn-main{flex:1 1 calc(100% - 50px);}
  .bl-attn-org{display:block;margin:1px 0 0;}
  /* See whose: a 40px tap that leaves the tile's line where it was */
  .bl-tile-s .bl-link{display:inline-block;padding:11px 0;margin:-11px 0;}
}
/* ═══ end v1.4.10.647 ═══ */
/* ═══ v1.4.10.648 — Add a client, pushed: a standout button in the dashboard hero, a "Grow your estate" banner under the figures, the menus' Add a client lit, a card for the next client on Clients, and the Add a client page's own hero ═══ */
/* the dashboard hero's Add a client: white on the navy, with a slow ring, ahead of the gradient quick actions */
.dh-v2 .dh-qa.dh-grow{background:#fff;color:var(--bc-navy);font-weight:600;animation:ncGrowPulse 2.8s ease-out infinite;}
.dh-v2 .dh-qa.dh-grow svg{color:var(--bc-grad-b);--ico-ac:var(--bc-purple);}
.dh-v2 .dh-qa.dh-grow:hover{background:#fff;color:var(--bc-navy);filter:none;transform:translateY(-1px);}
.dh-v2 .dh-qa.dh-grow:focus-visible{outline:2px solid #fff;outline-offset:2px;}
@keyframes ncGrowPulse{0%{box-shadow:0 0 0 0 rgba(var(--bc-purple-rgb),.6),0 10px 26px -10px rgba(var(--bc-grad-b-rgb),.9)}70%{box-shadow:0 0 0 9px rgba(var(--bc-purple-rgb),0),0 10px 26px -10px rgba(var(--bc-grad-b-rgb),.9)}100%{box-shadow:0 0 0 0 rgba(var(--bc-purple-rgb),0),0 10px 26px -10px rgba(var(--bc-grad-b-rgb),.9)}}
/* the banner under the figures */
.nc-grow{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto 220px;align-items:center;gap:10px 28px;margin-bottom:var(--dv-gap,16px);padding:22px 26px;border-radius:16px;overflow:hidden;
  border:1px solid color-mix(in srgb,var(--brand-blue) 24%,var(--line));
  background:radial-gradient(520px 260px at 100% 0%,color-mix(in srgb,var(--bc-purple) 14%,transparent),transparent 70%),radial-gradient(440px 240px at 0% 100%,color-mix(in srgb,var(--bc-grad-a) 10%,transparent),transparent 70%),var(--surface);
  box-shadow:0 18px 40px -30px rgba(var(--bc-grad-a-rgb),.6);}
.nc-grow::before{content:'';position:absolute;left:0;top:0;right:0;height:3px;background:var(--brand-grad);}
.nc-grow-text{min-width:0;}
.nc-grow-eyebrow{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--brand-blue);}
.nc-grow-eyebrow svg{color:var(--brand-purple);}
.nc-grow h3{margin:6px 0 4px;font-size:20px;font-weight:600;letter-spacing:-.024em;line-height:1.2;background:var(--brand-grad);-webkit-background-clip:text;background-clip:text;color:transparent;}
.nc-grow p{margin:0;max-width:640px;font-size:13px;line-height:1.55;color:var(--text-mute);}
.nc-grow-steps{list-style:none;display:flex;flex-wrap:wrap;gap:6px;margin:12px 0 0;padding:0;}
.nc-grow-steps li{display:inline-flex;align-items:center;gap:6px;padding:4px 10px 4px 4px;border-radius:999px;background:var(--surface-2);font-size:12px;font-weight:500;color:var(--text);}
.nc-grow-steps i{font-style:normal;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:var(--brand-grad);color:#fff;font-size:10px;font-weight:600;}
.nc-grow-act{display:flex;align-items:center;}
.btn.primary.nc-grow-btn{box-shadow:0 12px 26px -12px rgba(var(--bc-grad-b-rgb),.95);}
.nc-grow .nc-grow-btn{min-height:44px;padding:0 22px;font-size:14px;border-radius:12px;gap:8px;white-space:nowrap;}
.nc-grow .nc-grow-btn svg{width:16px;height:16px;}
.nc-grow-art .ncg{display:block;width:220px;height:160px;}
/* the picture: the company, a dot for each client, the next one dashed */
.ncg .ncg-l{stroke:var(--line-2);stroke-width:1.5;}
.ncg .ncg-next-l{stroke:var(--bc-grad-b);stroke-width:1.6;stroke-dasharray:4 4;opacity:.75;animation:ncgDash 1.6s linear infinite;}
.ncg .ncg-c circle{fill:var(--surface);stroke:color-mix(in srgb,var(--brand-blue) 55%,var(--line));stroke-width:1.5;}
.ncg .ncg-c rect{fill:var(--brand-blue);opacity:.8;}
.ncg .ncg-ring{fill:none;stroke:var(--bc-purple);stroke-width:2;transform-box:fill-box;transform-origin:center;animation:ncgRing 2.4s ease-out infinite;}
@keyframes ncgDash{to{stroke-dashoffset:-16;}}
@keyframes ncgRing{0%{transform:scale(1);opacity:.6}100%{transform:scale(1.6);opacity:0}}
/* the menus: Add a client lit */
.nav-dd-item.nav-grow{background:color-mix(in srgb,var(--brand-blue) 6%,transparent);}
.nav-dd-item.nav-grow .ico,.nav-dd-item.nav-grow:hover .ico{background:var(--brand-grad);color:#fff;--ico-ac:#fff;}
.nav-dd-item.nav-grow .ndl{font-weight:600;color:var(--brand-blue);}
.mnav-row.nav-grow{color:var(--brand-blue);font-weight:600;}
.mnav-row.nav-grow .ico{color:var(--brand-purple);}
.mnav-qa-btn.nav-grow{grid-column:1 / -1;justify-content:center;border-color:transparent;background:var(--brand-grad);color:#fff;font-weight:600;}
.mnav-qa-btn.nav-grow svg{color:#fff;--ico-ac:#fff;}
/* Clients: the card for the next client, at the end of the integrator's grid */
.cgrid-add{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-height:140px;padding:18px;border:1.5px dashed color-mix(in srgb,var(--brand-blue) 45%,var(--line));border-radius:7px;
  background:color-mix(in srgb,var(--brand-blue) 4%,var(--surface));color:var(--text);font:inherit;text-align:center;cursor:pointer;transition:border-color .15s,background .15s,transform .15s;}
.cgrid-add:hover{border-color:var(--brand-blue);background:var(--accent-soft);transform:translateY(-1px);}
.cgrid-add:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;}
.cga-ico{width:40px;height:40px;border-radius:12px;display:inline-flex;align-items:center;justify-content:center;background:var(--brand-grad);color:#fff;box-shadow:0 10px 22px -12px rgba(var(--bc-grad-a-rgb),.95);}
.cga-ico svg{width:18px;height:18px;}
.cgrid-add b{font-size:14px;font-weight:600;}
.cga-s{font-size:12px;color:var(--text-mute);}
/* the Add a client page's hero (in place of the generic page hero and the plain intro panel) */
.nc-intro.nc-hero{position:relative;display:grid;grid-template-columns:minmax(0,1fr) 200px 270px;grid-template-areas:"main art side" "track track track";align-items:center;gap:20px 24px;padding:26px 28px 22px;margin-bottom:14px;border:0;border-radius:16px;overflow:hidden;color:#fff;
  background:var(--brand-grad) top left/100% 3px no-repeat,radial-gradient(680px 340px at 96% -30%,rgba(var(--bc-grad-a-rgb),.46),transparent 70%),radial-gradient(520px 300px at -6% 135%,rgba(var(--bc-purple-rgb),.32),transparent 70%),var(--bc-navy);
  box-shadow:0 24px 50px -30px rgba(var(--bc-navy-rgb),.75);}
.nc-hero-main{grid-area:main;min-width:0;}
.nc-hero-art{grid-area:art;}
.nc-hero-track{grid-area:track;min-width:0;padding-top:16px;border-top:1px solid rgba(255,255,255,.1);}
.nc-hero-art .ncg{display:block;width:200px;height:auto;}
.nc-hero-side{grid-area:side;padding:16px 18px;border-radius:14px;border:1px solid rgba(255,255,255,.12);background:linear-gradient(160deg,rgba(255,255,255,.08),rgba(255,255,255,.02));}
.nc-hero-eyebrow{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#9FB6D6;}
.nc-hero-led{width:8px;height:8px;border-radius:50%;flex:none;background:var(--av-led,#3ED27C);animation:avLed 2.6s var(--av-ease,ease-out) infinite;}
.nc-hero-t{margin:10px 0 0;font-size:24px;font-weight:600;letter-spacing:-.026em;line-height:1.15;color:#fff;}
.nc-intro.nc-hero .nc-hero-s{margin-top:8px;max-width:640px;color:#C3D0DE;}
/* the journey as a stepper across the hero: each connector stretches to the step it leads to */
.nc-hero .nc-journey{flex-wrap:nowrap;gap:0;margin-top:0;}
.nc-hero .nc-journey span + span{flex:1 1 0;min-width:0;}
.nc-hero .nc-journey span{gap:8px;padding:0;background:transparent;color:#9FB6D6;font-weight:500;}
.nc-hero .nc-journey span + span::before{content:'';flex:1 1 auto;min-width:12px;height:2px;margin:0 2px 0 10px;border-radius:2px;background:rgba(255,255,255,.18);}
.nc-hero .nc-journey span i{width:22px;height:22px;font-size:11px;font-weight:600;background:rgba(255,255,255,.08);color:#DCE6F5;border:1px solid rgba(255,255,255,.22);}
.nc-hero .nc-journey span.on{color:#fff;font-weight:600;}
.nc-hero .nc-journey span.on i{background:var(--brand-grad);border-color:transparent;color:#fff;box-shadow:0 0 0 4px rgba(var(--bc-grad-b-rgb),.3);}
.nc-hero .nc-journey span.done{color:#DCE6F5;}
.nc-hero .nc-journey span.done i{background:rgba(62,210,124,.18);border-color:rgba(62,210,124,.55);color:#86EBB0;}
.nc-hero .nc-journey span.done + span::before{background:rgba(62,210,124,.55);}
.nc-hero-figs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;}
.nc-hero-figs b{display:block;font-size:24px;font-weight:600;line-height:1.1;letter-spacing:-.02em;color:#fff;font-variant-numeric:tabular-nums;}
.nc-hero-figs span{font-size:11px;color:#9FB6D6;}
.nc-hero-next{margin-top:10px;padding-top:10px;border-top:1px solid rgba(255,255,255,.12);font-size:13px;color:#DCE6F5;}
.nc-hero-next b{background:linear-gradient(112deg,#8FB2FF,#C29BFF);-webkit-background-clip:text;background-clip:text;color:transparent;font-weight:600;}
.nc-hero-promise{list-style:none;display:flex;flex-direction:column;gap:6px;margin:12px 0 0;padding:0;}
.nc-hero-side > .nc-hero-promise:first-child{margin-top:0;}
.nc-hero-promise li{display:flex;align-items:flex-start;gap:8px;font-size:12px;line-height:1.4;color:#C3D0DE;}
.nc-hero-promise svg{flex:none;margin-top:1px;color:#86EBB0;}
.nc-hero .ncg .ncg-l{stroke:rgba(255,255,255,.2);}
.nc-hero .ncg .ncg-c circle{fill:#11223B;stroke:rgba(143,178,255,.6);}
.nc-hero .ncg .ncg-c rect{fill:#8FB2FF;}
.nc-hero .ncg .ncg-next-l{stroke:#8FB2FF;}
.nc-hero .ncg .ncg-ring{stroke:#C29BFF;}
/* the set-up itself: the brand's stripe across its top, the step you are on lit in it */
.bl-wiz.bl-wiz-page::before{content:'';display:block;height:3px;background:var(--brand-grad);}
.bl-wiz-page .bl-wiz-steps .bl-wiz-step.on .bl-wiz-step-i{background:var(--brand-grad);box-shadow:0 0 0 3px color-mix(in srgb,var(--bc-grad-b) 22%,transparent);}
@media (prefers-reduced-motion:reduce){ .dh-v2 .dh-qa.dh-grow,.ncg .ncg-ring,.ncg .ncg-next-l,.nc-hero-led{animation:none;} }
@media (max-width:1180px){
  .nc-intro.nc-hero{grid-template-columns:minmax(0,1fr) 260px;grid-template-areas:"main side" "track track";}
  .nc-hero-art{display:none;}
}
@media (max-width:1100px){
  .nc-grow{grid-template-columns:minmax(0,1fr) auto;}
  .nc-grow-art{display:none;}
}
@media (max-width:760px){
  .nc-intro.nc-hero{grid-template-columns:minmax(0,1fr);grid-template-areas:"main" "track" "side";gap:16px;padding:18px 16px;border-radius:14px;}
  .nc-hero-t{font-size:20px;}
  /* the promises are the set-up's own subtitle just below; the figures smaller (the hero was 457px, the form under the fold) */
  .nc-hero-side{padding:12px 14px;}
  .nc-hero-figs b{font-size:20px;}
  .nc-hero-promise{display:none;}
  /* the journey as numbers, the step you are on named (six names wrapped over three lines) */
  .nc-hero .nc-journey span:not(.on){font-size:0;gap:0;}
  .nc-hero .nc-journey span + span::before{margin-left:6px;}
  .nc-hero .nc-journey span.on + span::before{margin-left:8px;}
  .nc-hero .nc-journey span.on{flex:0 0 auto;}
  .nc-grow{grid-template-columns:minmax(0,1fr);gap:14px;padding:18px 16px;border-radius:14px;}
  .nc-grow h3{font-size:18px;}
  .nc-grow .nc-grow-btn{width:100%;justify-content:center;}
  .nc-grow-act{display:block;}
  .cgrid-add{min-height:120px;}
  /* the quick actions two to a row: Add a client across the top, and a lone last one across both (v1.4.10.473's rule, shifted by one) */
  .dh-v2 .dh-quick > .dh-qa.dh-grow{grid-column:1 / -1;}
  .dh-v2 .dh-quick > .dh-grow ~ .dh-qa:last-child:nth-child(odd){grid-column:auto;}
  .dh-v2 .dh-quick > .dh-grow ~ .dh-qa:last-child:nth-child(even){grid-column:1 / -1;}
}
/* ═══ end v1.4.10.648 ═══ */
/* ═══ v1.4.10.649 — the Grow banner's Not now: under Add a client, quiet, a week away ═══ */
.nc-grow-act{flex-direction:column;align-items:stretch;gap:4px;}
.nc-grow-later{align-self:center;padding:5px 10px;border:0;border-radius:6px;background:none;font:inherit;font-size:12px;font-weight:500;color:var(--text-mute);cursor:pointer;}
.nc-grow-later:hover{color:var(--text);text-decoration:underline;text-underline-offset:2px;}
.nc-grow-later:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
@media (max-width:760px){
  .nc-grow-act{display:flex;}   /* (v1.4.10.648 made it a block on a phone) */
  .nc-grow-later{align-self:stretch;min-height:40px;}
}
/* ═══ end v1.4.10.649 ═══ */
/* ═══ v1.4.10.650 — layout fixes found by sweeping every Billing tab at 1440, 1280, 1024, 768 and 390: a hidden label that widened the page, and the wide tables at the width of a tablet or a small laptop ═══ */
/* a screen-reader label (.sr-only) sits where it falls in the flow; in a table that scrolls sideways that is past the right
   edge, and the scroll box (not positioned) did not hold it, so the page itself scrolled sideways (Invoices' hidden "Actions"
   heading: 301px at 768, 59px at 1024) */
.sr-only{top:0;left:0;}
/* a laptop: 12px inside the cells of Invoices and Add-ons, the outer edges keep 18px, as Orders already does (the
   administrator's invoice table was 1,222px in 1,208 at 1280); narrower, the tables are cards (below) */
@media (min-width:1280px) and (max-width:1366px){
  .dt.bl-itable thead th, .dt.bl-itable tbody td, .dt.bl-addon-table thead th, .dt.bl-addon-table tbody td{padding-left:12px;padding-right:12px;}
  .dt.bl-itable thead th:first-child, .dt.bl-itable tbody td:first-child, .dt.bl-addon-table thead th:first-child, .dt.bl-addon-table tbody td:first-child{padding-left:18px;}
  .dt.bl-itable thead th:last-child, .dt.bl-itable tbody td:last-child, .dt.bl-addon-table thead th:last-child, .dt.bl-addon-table tbody td:last-child{padding-right:18px;}
}
/* a tablet or a small laptop: Invoices, Add-ons and Orders as cards that use the width. The tables were 1,096 to 1,222px wide,
   their buttons out of sight past a sideways scroll (and a few px over even at 1200). Each card is two rows of labelled cells,
   its buttons at the end. */
@media (min-width:761px) and (max-width:1279px){
  .bl-itable thead, .bl-addon-table thead, .bl-otable thead{display:none;}
  .bl-itable tbody, .bl-addon-table tbody, .bl-otable tbody{display:block;width:100%;}
  .panel-body.flush .bl-itable.dt, .tbl-scroll .bl-itable.dt, .panel-body.flush .dt.bl-addon-table, .panel-body.flush .dt.bl-otable{display:block;min-width:0;width:100%;}
  .bl-itable tr.bl-irow, .bl-addon-table tr.bl-arow, .bl-otable tr.bl-orow{display:grid;grid-template-columns:minmax(0,1.4fr) repeat(3,minmax(0,1fr));gap:10px 16px;align-items:start;padding:14px 18px;border-bottom:1px solid var(--line);}
  .dt.bl-itable tbody tr.bl-irow > td, .dt.bl-addon-table tbody tr.bl-arow td, .dt.bl-otable tbody tr.bl-orow td{display:block;min-width:0;width:auto;padding:0;border:0;white-space:normal;text-align:left !important;}
  .bl-itable td[data-l]::before, .bl-addon-table td.bl-a-charge::before, .bl-addon-table td.bl-a-status::before, .bl-addon-table td.bl-a-added::before, .bl-addon-table td.bl-a-serial::before,
  .bl-otable td.bl-o-date::before, .bl-otable td.bl-o-prov::before, .bl-otable td.bl-o-for::before, .bl-otable td.bl-o-what::before, .bl-otable td.bl-o-total::before, .bl-otable td.bl-o-st::before{
    content:attr(data-l);display:block;margin-bottom:3px;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-mute);}
  .bl-i-acts, .bl-a-acts, .bl-o-acts{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:6px;}
  .bl-i-acts .btn, .bl-a-acts .btn, .bl-o-acts .btn{min-height:36px;}
  /* Invoices: the number, total, amount due and due date; then the month, the integrator, where it stands and its buttons */
  .bl-itable tr.bl-irow{grid-template-areas:"no tot due date" "per org st act";}
  .bl-itable td.bl-i-no{grid-area:no;} .bl-itable td.bl-i-tot{grid-area:tot;} .bl-itable td.bl-i-due{grid-area:due;} .bl-itable td.bl-i-date{grid-area:date;}
  .bl-itable td.bl-i-per{grid-area:per;font-size:13px;color:var(--text-mute);}
  .bl-itable td.bl-i-org{grid-area:org;font-size:13px;color:var(--text-mute);}
  .bl-itable td.bl-i-st{grid-area:st;display:flex !important;flex-wrap:wrap;align-items:center;gap:4px 8px;}
  .bl-itable td.bl-i-st .device-meta{margin:0;}
  .bl-itable td.bl-i-act{grid-area:act;justify-self:end;}
  .bl-itable .bl-inv-more{width:36px;}
  /* Add-ons: the site, product, charge and status; then when it was added, its serial and its buttons */
  .bl-addon-table tr.bl-addon-group{display:block;}
  .dt.bl-addon-table tbody tr.bl-addon-group td{display:block;padding:8px 18px;}
  .bl-addon-table tr.bl-arow{grid-template-areas:"site prod charge status" "added serial serial act";}
  .bl-addon-table td.bl-a-site{grid-area:site;font-size:14px;} .bl-addon-table td.bl-a-prod{grid-area:prod;}
  .bl-addon-table td.bl-a-charge{grid-area:charge;} .bl-addon-table td.bl-a-status{grid-area:status;}
  .bl-addon-table td.bl-a-added{grid-area:added;} .bl-addon-table td.bl-a-serial{grid-area:serial;}
  .bl-addon-table td.bl-a-act{grid-area:act;justify-self:end;align-self:end;}
  .bl-addon-table td.bl-a-act:empty{display:none;}
  /* Orders: the order, what, for whom and its total; then when, the integrator, where it stands and its buttons */
  .bl-otable tr.bl-orow{grid-template-areas:"ref what for total" "date prov st act";}
  .bl-otable td.bl-o-ref{grid-area:ref;} .bl-otable td.bl-o-what{grid-area:what;} .bl-otable td.bl-o-for{grid-area:for;} .bl-otable td.bl-o-total{grid-area:total;}
  .bl-otable td.bl-o-date{grid-area:date;} .bl-otable td.bl-o-prov{grid-area:prov;} .bl-otable td.bl-o-st{grid-area:st;}
  .bl-otable td.bl-o-act{grid-area:act;justify-self:end;align-self:end;}
  .bl-otable td .bl-o-sub{white-space:normal;}
  .bl-otable td.bl-o-act:empty{display:none;}
  /* Insights: the integrator book and top clients one above the other (side by side the book was 591px in 467) */
  .bl-pane .grid-2:has(.bl-ins-table){grid-template-columns:minmax(0,1fr);}
}
/* a tablet held upright: Room Packs' clients and the Overview's Room Packs by client as the phone's cards (898px and 728px
   in 724) */
@media (min-width:761px) and (max-width:900px){
  .tbl-scroll table.dt.bl-ctable, table.dt.bl-ctable{min-width:0;}
  .bl-ctable thead{display:none;}
  .bl-ctable, .bl-ctable tbody{display:block;width:100%;}
  .bl-ctable tr.bl-crow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:14px;border-bottom:1px solid var(--line);}
  .bl-ctable tr.bl-crow > td{display:block;padding:0;border:0;min-width:0;background:transparent !important;}
  .bl-ctable tr.bl-crow.open{background:var(--accent-soft,var(--bc-accent-soft));border-bottom-color:transparent;}
  .bl-ctable td.bl-c-name, .bl-ctable td.bl-c-sites, .bl-ctable td.bl-c-give, .bl-ctable td.bl-addon-cell{grid-column:1 / -1;}
  .bl-ctable td.num{text-align:left !important;padding:7px 10px !important;border-radius:6px;background:var(--surface-2) !important;}
  .bl-ctable td.num::before{content:attr(data-l);display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim,var(--text-mute));margin-bottom:2px;}
  .bl-ctable tr.bl-cdetail{display:block;}
  .bl-ctable tr.bl-cdetail > td{display:block;padding:0 14px 14px;}
  .bl-ctable tr.bl-nomatch{display:block;} .bl-ctable tr.bl-nomatch > td{display:block;}
  .bl-glance thead{display:none;}
  .bl-glance, .bl-glance tbody{display:block;width:100%;}
  .panel-body.flush .bl-glance.dt, .tbl-scroll .bl-glance.dt{min-width:0;}
  .bl-glance tr.bl-grow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 10px;padding:14px;border-bottom:1px solid var(--line);}
  .bl-glance tr.bl-grow > td{display:block;padding:0;border:0;min-width:0;text-align:left !important;}
  .bl-glance td.bl-g-name, .bl-glance td.bl-g-org, .bl-glance td.bl-glance-meter, .bl-glance td.bl-g-act{grid-column:1 / -1;}
  .bl-glance td.bl-g-org{font-size:13px;color:var(--text-mute);}
  .bl-glance td.bl-g-n{padding:7px 10px;border-radius:6px;background:var(--surface-2);}
  .bl-glance td.bl-g-n::before{content:attr(data-l);display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim,var(--text-mute));margin-bottom:2px;}
  .bl-glance td.bl-glance-meter{min-width:0;}
}
/* the set-up's Room Packs step: its two boxes one above the other until the column has room for the site table beside the
   rate ladder (at 1024 the table's first column was 45px and broke "month's" across two lines) */
@media (max-width:1199px){ .bl-wiz-two{grid-template-columns:minmax(0,1fr);} }
/* its tables' headings take the 6px a side their cells take (they kept the table's 18px: the site table was 328px in a 314px box
   on a phone) */
.bl-wiz-box .dt thead th{padding-left:6px;padding-right:6px;}
/* the set-up up to 900px: the progress strip above the step says "Step 3 of 6", so the step's own heading does not say it again */
@media (max-width:900px){ .bl-wiz-sh-n{display:none;} }
/* ═══ end v1.4.10.650 ═══ */
/* ═══ v1.4.10.651 — prices ex GST by default: the switch above the prices it changes ═══ */
.bl-gst-bar{display:flex;justify-content:flex-end;margin:-4px 0 10px;}
.bl-gst-switch{display:inline-flex;align-items:center;gap:2px;padding:3px;border:1px solid var(--line-2);border-radius:999px;background:var(--surface);}
.bl-gst-l{padding:0 8px 0 9px;font-size:12px;font-weight:500;color:var(--text-mute);}
.bl-gst-switch button{min-height:28px;padding:0 12px;border:0;border-radius:999px;background:transparent;font:inherit;font-size:12px;font-weight:600;color:var(--text-mute);cursor:pointer;}
.bl-gst-switch button:hover{color:var(--text);}
.bl-gst-switch button.on{background:var(--brand-grad);color:#fff;box-shadow:0 6px 14px -8px rgba(var(--bc-grad-b-rgb),.9);}
.bl-gst-switch button:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
@media (max-width:760px){
  .bl-gst-bar{margin:0 0 10px;}
  .bl-gst-switch{width:100%;}
  .bl-gst-l{flex:1 1 auto;}
  .bl-gst-switch button{min-height:40px;flex:0 0 auto;padding:0 16px;font-size:13px;}
}
/* ═══ end v1.4.10.651 ═══ */
/* ═══ v1.4.10.652 — bug check: tables that scrolled sideways on a tablet held upright, and the map's zoom buttons on a phone ═══ */
/* the dashboard's Active issues (906px in 724 at 768) and Users & access (870 in 694): the phone's cards up to 999px, where
   the tables fit again (at 961 they were still 17 and 21px over) */
@media (min-width:761px) and (max-width:999px){
  table.dt.dash-issues thead{display:none;}
  table.dt.dash-issues, table.dt.dash-issues tbody{display:block;width:100%;min-width:0;}
  .panel-body.flush table.dt.dash-issues{min-width:0;}
  table.dt.dash-issues tbody tr{display:flex;flex-wrap:wrap;align-items:center;gap:3px 10px;padding:12px 12px;border-bottom:1px solid var(--line);cursor:pointer;}
  table.dt.dash-issues tbody td{display:block;border:0;background:none;padding:0;}
  table.dt.dash-issues tbody td.di-subj{flex:1 1 100%;order:1;font-weight:600;}
  table.dt.dash-issues tbody td.di-ref{order:2;font-size:12px;}
  table.dt.dash-issues tbody td.di-loc{order:3;font-size:12px;color:var(--text-mute);}
  table.dt.dash-issues tbody td.di-pri{order:4;}
  table.dt.dash-issues tbody td.di-status{order:5;}
  table.dt.dash-issues tbody td.di-sla{order:6;flex:1 1 100%;white-space:normal!important;margin-top:2px;}
  table.dt.dash-issues tbody td[colspan]{flex:1 1 100%;}
}
@media (min-width:701px) and (max-width:999px){
  .tbl-scroll:has(> table.dt tr.ua-row){overflow-x:visible;}
  .tbl-scroll > table.dt:has(tr.ua-row){min-width:0;width:100%;display:block;}
  table.dt:has(tr.ua-row) thead{display:none;}
  table.dt:has(tr.ua-row) tbody,table.dt:has(tr.ua-row) tr.ua-grouphdr,table.dt:has(tr.ua-row) tr.ua-grouphdr > td{display:block;}
  table.dt tr.ua-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px 12px;padding:12px 14px;border-top:1px solid var(--line);}
  table.dt tr.ua-row > td{display:block;padding:0;border:0;min-width:0;}
  table.dt tr.ua-row > td:nth-child(1){grid-column:1;grid-row:1;}
  table.dt tr.ua-row > td:nth-child(6){grid-column:2;grid-row:1;}
  table.dt tr.ua-row > td:nth-child(2),table.dt tr.ua-row > td:nth-child(3),table.dt tr.ua-row > td:nth-child(4){grid-column:1 / -1;}
  table.dt tr.ua-row > td:nth-child(2){font-size:13px;}
  table.dt tr.ua-row > td:nth-child(5){grid-column:1;}
  table.dt tr.ua-row > td:nth-child(5)::before{content:"Last active ";color:var(--text-dim);}
  table.dt tr.ua-row > td:nth-child(7){grid-column:2;justify-self:end;}
  table.dt tr.ua-row > td:nth-child(7):empty{display:none;}
  table.dt tr.ua-row .ua-uttl.is-email{display:none;}
}
/* every map's zoom buttons: 40px square on a phone (they were 32 wide beside the touch floor's 40 tall) */
@media (max-width:760px){
  .leaflet-control-zoom a{width:40px !important;height:40px !important;line-height:40px !important;}
}
/* ═══ end v1.4.10.652 ═══ */

/* ═══ v1.4.10.656 — THE SUPPORT DESK AND THE TICKET WINDOW, REBUILT ═══════════════════════════════════════════════════
   Jay: "I hate how the support area looks, even opening the support ticket its messy, its not new age … should be
   fresh, easy to use. Hard to see when new tickets come in, and the latest … structure it way better."
   One pass over every surface of the desk (js/03-pages.js WHAT IS NEW ON THE DESK, js/06 THE TICKET WINDOW, REBUILT),
   as the later block that wins: the rail, the toolbar, the rows, the cards, the ticket's head, its action row, thread,
   composer and side column, and the New ticket form. The class names stay (the batteries and the repaints read them);
   the ticket's rules are scoped under .tkw, so the Task and Job views, which share the .tkd-* shell, keep their look.
   Every size is a step of the scale (TYPE SYSTEM, top of this sheet); every uppercase label tracks in em. ═══ */

/* ── the desk: the rail ── */
@media (min-width:1180px){ .tkx-desk{grid-template-columns:232px minmax(0,1fr);gap:18px;} }   /* under it the rail is not drawn (v507) and the list has the row */
.tkx-nav{gap:6px;padding:10px;border-radius:12px;box-shadow:var(--shadow-sm);}
.tkx-nav-g + .tkx-nav-g{padding-top:10px;margin-top:4px;}
.tkx-nav-h{color:var(--text-dim);padding:2px 10px 6px;}
.tkx-nv{position:relative;padding:7px 10px;border-radius:8px;min-height:34px;transition:background .12s,color .12s;}
.tkx-nv.on{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);}
.tkx-nv.on::before{content:"";position:absolute;left:0;top:8px;bottom:8px;width:3px;border-radius:3px;background:var(--brand-blue);}
/* a plain count sits beside its word in the nav look (13/500, 600 when lit); one that needs attention is a count badge
   (10/700 .04em) in its colour */
.tkx-nv-n{background:transparent;color:var(--text-dim);font-size:13px;font-weight:500;padding:0 2px;min-width:0;}
.tkx-nv.on .tkx-nv-n{background:transparent;color:var(--brand-blue);font-weight:600;}
.tkx-nv.tone-warn .tkx-nv-n,.tkx-sp.tone-warn .tkx-nv-n,.tkx-nv.tone-err .tkx-nv-n,.tkx-sp.tone-err .tkx-nv-n,.tkx-nv.tone-info .tkx-nv-n,.tkx-sp.tone-info .tkx-nv-n{
  font-size:10px;font-weight:700;letter-spacing:.04em;padding:2px 8px;border-radius:999px;line-height:14px;}
.tkx-nv.tone-warn .tkx-nv-n,.tkx-sp.tone-warn .tkx-nv-n{background:rgba(217,119,6,.12);color:var(--warn);}
.tkx-nv.tone-err .tkx-nv-n,.tkx-sp.tone-err .tkx-nv-n{background:rgba(220,38,38,.10);color:var(--err);}
.tkx-nv.tone-info .tkx-nv-n,.tkx-sp.tone-info .tkx-nv-n{background:rgba(var(--bc-accent-rgb),.10);color:var(--brand-blue);}
.tkx-nv.tone-info .tkx-nv-ico,.tkx-sp.tone-info .tkx-nv-ico{color:var(--brand-blue);}
.tkx-sp{min-height:34px;border-radius:999px;}
.tkx-sp.tone-info{border-color:rgba(var(--bc-accent-rgb),.35);}
/* when the desk last checked for changes */
.tkx-live{display:flex;align-items:center;gap:8px;margin-top:4px;padding:10px 10px 4px;border-top:1px solid var(--line);font-size:11px;color:var(--text-dim);}
.tkx-live-dot{width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px rgba(22,163,74,.16);flex:none;}
@keyframes tkxPulse{0%,100%{box-shadow:0 0 0 3px rgba(22,163,74,.16);}50%{box-shadow:0 0 0 6px rgba(22,163,74,.05);}}
@media (prefers-reduced-motion:no-preference){ .tkx-live-dot{animation:tkxPulse 2.6s ease-in-out infinite;} }

/* ── the toolbar: one quiet bar ── */
.tkx-toolbar.tkx-tb2{border-radius:12px;padding:10px 12px;box-shadow:var(--shadow-sm);}
.tkx-tb2 .tkx-search input{height:36px;padding-top:0;padding-bottom:0;border-radius:8px;}
.tkx-tb2 .tkx-select{height:36px;padding-top:0;padding-bottom:0;border-radius:8px;}
.tkx-tb2 .tkx-select.on{border-color:rgba(var(--bc-accent-rgb),.4);color:var(--brand-blue);}
.tkx-tb2 .tkx-toggle{border-radius:8px;min-height:36px;box-sizing:border-box;}   /* min, not fixed: on a phone its buttons are 40 (the touch floor) and it grows with them */
.tkx-tb2 .tkx-toggle button{border-radius:6px;}
.tkx-tb2 .tkx-tb-acts .btn.sm{min-height:36px;border-radius:8px;}
.tkx-tb2 .tkx-tb-acts .btn.sm.primary{padding:0 14px;}
.tkx-tb2 .tkx-tb-filters{border-top:1px solid var(--line);margin-top:10px;padding-top:10px;}
.tkx-tb2 .tkx-chipset{background:transparent;border:0;padding:0;gap:6px;}
.tkx-tb2 .tkx-chip{border:1px solid var(--line);background:var(--surface);color:var(--text-mute);border-radius:999px;padding:0 11px;min-height:28px;font-size:12px;font-weight:500;}
.tkx-tb2 .tkx-chip:hover{border-color:var(--line-2);color:var(--text);}
.tkx-tb2 .tkx-chip.on{background:var(--accent-soft,var(--bc-accent-soft));border-color:rgba(var(--bc-accent-rgb),.32);color:var(--brand-blue);font-weight:600;box-shadow:none;}
.tkx-tb2 .tkx-chip .cn{color:inherit;opacity:.7;}
.tkx-tb2 .tkx-chip-flag svg{width:12px;height:12px;}
.tkx-tb2 .tkx-chip-flag.on{background:rgba(220,38,38,.08);border-color:rgba(220,38,38,.3);color:var(--err);}
.tkx-tb2 .tkx-tb-count{font-size:12px;}
/* the line over the table */
.tkx-colnote{margin:0 2px 10px;gap:8px 12px;}
.tkx-colnote .tkc-mine{display:inline-flex;align-items:center;gap:6px;color:var(--brand-blue);font-weight:500;}
.tkx-colnote .tkc-mine::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--brand-blue);}
.tkx-colnote .tkc-toggle{border-radius:999px;padding:4px 11px;}
.tkx-colnote .tkc-seen{display:inline-flex;align-items:center;gap:5px;color:var(--brand-blue);border-color:rgba(var(--bc-accent-rgb),.28);background:var(--accent-soft,var(--bc-accent-soft));font-weight:600;}
.tkx-colnote .tkc-seen svg{width:12px;height:12px;}
.tkx-colnote .tkc-seen:hover{color:var(--brand-blue);border-color:var(--brand-blue);}
/* tickets that landed while the desk was open */
@keyframes tkxDrop{from{opacity:0;transform:translateY(-6px);}to{opacity:1;transform:none;}}
.tkx-arrivals{display:flex;align-items:center;gap:10px;margin:0 0 12px;padding:8px 10px 8px 14px;border-radius:10px;background:var(--accent-soft,var(--bc-accent-soft));border:1px solid rgba(var(--bc-accent-rgb),.24);color:var(--text);font-size:13px;}
@media (prefers-reduced-motion:no-preference){ .tkx-arrivals{animation:tkxDrop .25s var(--av-ease,ease);} }   /* no fill: a tab in the background may never run it, and the banner must still read */
.tkx-arr-dot{width:8px;height:8px;border-radius:50%;background:var(--brand-blue);box-shadow:0 0 0 3px rgba(var(--bc-accent-rgb),.16);flex:none;}
.tkx-arr-t{min-width:0;flex:1 1 auto;}
.tkx-arr-t b{font-weight:600;color:var(--brand-blue);}
.tkx-arr-show{appearance:none;flex:none;border:0;border-radius:999px;background:var(--brand-blue);color:#fff;font:inherit;font-size:12px;font-weight:600;padding:0 14px;min-height:30px;cursor:pointer;}
.tkx-arr-show:hover{background:var(--accent-deep,var(--bc-accent-deep));}
.tkx-arr-x{appearance:none;flex:none;border:0;background:transparent;color:var(--text-mute);width:30px;height:30px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;}
.tkx-arr-x:hover{background:rgba(var(--bc-accent-rgb),.1);color:var(--text);}
.tkx-arr-x svg{width:14px;height:14px;}

/* ── the list ── */
.tkx-listbody{border-radius:12px;}
.tkx-table th.tkx-th{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);padding:10px 14px;background:var(--surface);border-bottom:1px solid var(--line);}
.tkx-table th.tkx-th.on{color:var(--brand-blue);}
.tkx-table tbody td{padding:11px 14px;border-bottom:1px solid var(--line);vertical-align:middle;}
.tkx-table tbody tr:last-child td{border-bottom:0;}
.tkx-table tbody tr:hover{background:var(--surface-2);}
.tkx-table tbody tr:hover .tkx-subj{color:var(--brand-blue);}
.tkx-table td.tk-subj{padding-left:12px;}
.tkx-pbar{height:34px;margin-right:10px;opacity:.9;}
.tkx-subj{font-size:13px;font-weight:500;color:var(--text);letter-spacing:0;}
.tkx-refline{font-size:12px;color:var(--text-dim);margin-top:2px;}
.tkx-ref{font-weight:600;color:var(--text-mute);}
.tkx-rl-ast{border-radius:6px;line-height:18px;}
/* new since this person last looked (a filled dot), or opened and changed since (a ring); the subject is bold either way */
.tkx-fresh{display:inline-block;flex:none;width:8px;height:8px;border-radius:50%;background:var(--brand-blue);box-shadow:0 0 0 3px rgba(var(--bc-accent-rgb),.14);margin-right:3px;box-sizing:border-box;}
.tkx-fresh-updated{background:var(--surface);border:2px solid var(--brand-blue);box-shadow:none;}
.tkx-unseen .tkx-subj,.tkx-card.tkx-unseen .tc-subj{font-weight:600;}
.tkx-table tbody tr.tkx-unseen{background:linear-gradient(90deg,rgba(var(--bc-accent-rgb),.045),rgba(var(--bc-accent-rgb),0) 55%);}
.tkx-table tbody tr.tkx-unseen:hover{background:var(--surface-2);}
.tkx-table tbody tr.tkx-mine.tkx-unseen{background:var(--accent-glow);}
/* the flags beside the subject: small, quiet badges (10/700 uppercase .04em) */
.tkx-subjline > .pill{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:1px 6px;border-radius:4px;line-height:16px;border:0;}
.tkx-subjline > .pill svg{width:10px;height:10px;}
.tkx-subjline > .tkx-mineflag{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);}
.tkx-subjline > .tkx-autoflag{background:rgba(15,118,110,.1);color:#0F766E;}
.tkx-subjline > .tkx-prioflag{background:rgba(220,38,38,.09);color:var(--err);}
.tkx-subjline > .tkx-slaflag{background:var(--err);color:#fff;}
/* the priority square, as the ticket window draws it, small */
.tkx-pri{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:22px;padding:0 6px;border-radius:6px;
  background:color-mix(in srgb,var(--pc,#5A6B85) 12%,transparent);color:var(--pc,#5A6B85);border:1px solid color-mix(in srgb,var(--pc,#5A6B85) 28%,transparent);
  font-size:11px;font-weight:700;letter-spacing:.02em;font-variant-numeric:tabular-nums;white-space:nowrap;}
/* the status pill with its dot */
.pill.tkx-st{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:3px 9px 3px 8px;border-radius:999px;white-space:nowrap;}
.pill.tkx-st::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--sc,currentColor);flex:none;}
/* one SLA clock: the figure, then its word */
.tkx-slac{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;font-size:12px;color:var(--text-mute);}
.tkx-slac i{width:8px;height:8px;border-radius:50%;background:var(--text-dim);flex:none;}
.tkx-slac b{font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;}
.tkx-slac small{font-size:11px;color:var(--text-dim);}
.tkx-slac.ok i{background:var(--ok);} .tkx-slac.ok b{color:#0F7B3A;}
.tkx-slac.warn i{background:var(--warn);} .tkx-slac.warn b{color:#9A5B00;}
.tkx-slac.err i{background:var(--err);} .tkx-slac.err b,.tkx-slac.err small{color:var(--err);} .tkx-slac.err small{font-weight:600;}
.tkx-slac.done i{background:var(--ok);} .tkx-slac.done.err i{background:var(--err);}
.tkx-slac.done b{font-weight:500;color:var(--text-mute);}
.tkx-slac.paused svg{width:12px;height:12px;color:var(--text-dim);flex:none;} .tkx-slac.paused b{font-weight:500;color:var(--text-mute);}
/* a small laptop (the rail gone, every column still drawn): the clock keeps its figure and dot, its word reads on the hover, and
   the Site cell gives the subject 40px back */
@media (max-width:1279px){
  .tkx-table .tkx-slac small{display:none;}
  .tkx-table td.tk-loc{width:14%;}
}
/* a tablet (701-1023): tighter cells, and the Yours badge gives way (the row's blue keel, its tint and the line over the
   table already say it), so a subject is one line and its reference the next, not three ragged lines */
@media (min-width:701px) and (max-width:1023px){
  .tkx-table tbody td{padding:10px 12px;}
  .tkx-table th.tkx-th{padding:9px 12px;}
  .tkx-table .tkx-subjline > .tkx-mineflag{display:none;}
  .tkx-table td.tk-loc{width:12%;}
}
/* Latest: "4m ago", blue while the ticket is new to this person */
.tkx-ago{font-size:12px;color:var(--text-mute);font-variant-numeric:tabular-nums;white-space:nowrap;}
.tkx-unseen .tkx-ago{color:var(--brand-blue);font-weight:600;}
/* who has it */
.tkx-asg{gap:8px;}
.tkx-asg > span{font-size:13px;}
.tkx-unasg{font-style:normal;color:var(--text-dim);display:inline-flex;align-items:center;gap:8px;}
.tkx-unasg:not(.sm)::before{content:"";width:22px;height:22px;border-radius:50%;border:1px dashed var(--line-2);flex:none;box-sizing:border-box;}
.tkx-table tbody tr.tkx-mine{box-shadow:inset 3px 0 0 var(--brand-blue);}
/* the pager */
.tkx-pager{margin:12px 4px 4px;}
.tkx-pg{border-radius:8px;}
/* the board and the phone's cards */
.tkx-card{border-radius:10px;padding:12px 13px;}
.tkx-card .tc-top{gap:6px;}
.tkx-card .tc-top .tkx-fresh{margin-right:0;}
.tkx-card.tkx-unseen{box-shadow:0 0 0 1px rgba(var(--bc-accent-rgb),.2),var(--shadow-sm);}
.tkx-card .tc-top > .tkx-mineflag{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);border:0;}
.tkx-card .tc-top > .tkx-autoflag{background:rgba(15,118,110,.1);color:#0F766E;border:0;}
.tkx-card .tc-top > .tkx-prioflag{background:rgba(220,38,38,.09);color:var(--err);border:0;}
.tkx-col{border-radius:12px;background:var(--surface-2);}
/* the empty state */
.tkx-listwrap .empty,#tkx-listwrap .empty{padding:48px 20px;}
@media (max-width:700px){
  .tkx-tb2 .tkx-chip{min-height:40px;}
  .tkx-arrivals{padding:6px 6px 6px 12px;font-size:12px;gap:8px;}
  .tkx-arr-sub{display:none;}   /* "2 new tickets · Show": one line on a phone */
  .tkx-arr-show,.tkx-arr-x{min-height:40px;min-width:40px;}
  .tkx-colnote .tkc-seen{min-height:40px;}
  .tkx-live{display:none;}
}

/* ── the ticket window (.tkw) ── */
#modal-inner.modal-tkt > .tkw{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0;}
.tkw > .tkd-head{flex-shrink:0;}
.tkw > .tkd-body{flex:1;min-height:0;}
@media (min-width:701px){ #modal-inner.modal-tkt:has(> .tkw){border-radius:14px;box-shadow:var(--shadow-lg);} }
/* the head: light, the priority as its square and a thin edge at the top */
.tkw .tkd-head.tkd-hero{background:var(--surface);border-bottom:1px solid var(--line);border-radius:14px 14px 0 0;}
.tkw .tkd-hero .tkd-hero-top{background:var(--surface);color:var(--text);box-shadow:none;padding:16px 20px 4px;border-top:4px solid var(--tkd-p,var(--brand-blue));border-radius:14px 14px 0 0;}
.tkw .tkd-hero .tkd-hero-top:not(:has(> .tkd-hero-chips)){padding-bottom:12px;}
.tkw .tkd-hero .tkd-hero-top::before,.tkw .tkd-hero .tkd-hero-top::after{content:none;}
.tkw .tkd-hero .tkd-row1{gap:14px;align-items:flex-start;}
.tkw .tkd-hero .tkd-pchip{width:40px;height:40px;border-radius:10px;font-size:13px;box-shadow:none;border:0;margin-top:2px;}
/* the asset's picture: a 48px tile beside the priority square (96x72 made the head a band again) */
.tkw .tkd-hero .tkd-hero-pic{width:48px;height:48px;border-radius:10px;border:1px solid var(--line);box-shadow:none;background:#fff;}
.tkw .tkd-hero .tkd-hero-pic:hover{border-color:var(--brand-blue);}
.tkw .tkd-hero .tkd-hero-pic img{padding:2px;}
.tkw .tkd-hero .tkd-ref{color:var(--text-mute);font-size:12px;letter-spacing:.02em;}
.tkw .tkd-hero .tkd-statepill{background:var(--surface-2);color:var(--text-mute);border:1px solid var(--line);font-weight:600;}
.tkw .tkd-hero .tkd-statepill.tkd-st{background:color-mix(in srgb,var(--sc,#5A6B85) 10%,transparent);color:var(--sc,#5A6B85);border-color:color-mix(in srgb,var(--sc,#5A6B85) 32%,transparent);}
.tkw .tkd-hero .tkd-st::before{box-shadow:none;}
.tkw .tkd-hero .tkd-statepill.err{background:rgba(220,38,38,.08);color:var(--err);border-color:rgba(220,38,38,.3);}
.tkw .tkd-hero .tkd-statepill.muted{background:var(--surface-2);color:var(--text-mute);}
.tkw .tkd-hero .tkd-statepill.blue{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);border-color:rgba(var(--bc-accent-rgb),.2);}
.tkw .tkd-hero .tkd-statepill.tkx-prioflag{background:rgba(220,38,38,.08);color:var(--err);border-color:rgba(220,38,38,.3);}
.tkw .tkd-hero .tkd-viamail{color:var(--text-mute);font-weight:400;}
.tkw .tkd-hero h3{color:var(--text);text-shadow:none;}
.tkw .tkd-hero .tkd-subjrow h3.editable:hover{background:var(--surface-2);box-shadow:none;}
.tkw .tkd-hero .tkd-subj-edit{color:var(--text-dim);}
.tkw .tkd-hero .tkd-subj-edit:hover{color:var(--brand-blue);background:var(--accent-soft,var(--bc-accent-soft));}
.tkw .tkd-hero .tkd-subj-input{background:var(--surface);color:var(--text);border:1px solid var(--line-2);}
.tkw .tkd-hero .tkd-sub{color:var(--text-mute);}
.tkw .tkd-hero .tkd-sub a{color:var(--brand-blue);text-decoration:none;}
.tkw .tkd-hero .tkd-sub a:hover{text-decoration:underline;text-decoration-color:currentColor;}
.tkw .tkd-hero .tkd-loc-sep,.tkw .tkd-hero .tkd-sub-sep{color:var(--text-dim);}
.tkw .tkd-hero .tkd-opened b{color:var(--text);}
.tkw .tkd-hero .tkd-row1 .close{color:var(--text-mute);background:transparent;border-color:transparent;margin-left:0;}
.tkw .tkd-hero .tkd-row1 .close:hover{background:var(--surface-2);border-color:var(--line);color:var(--text);}
/* the tools beside the X: ‹ n of N › through the list, the client's integrator */
.tkw-tools{margin-left:auto;display:flex;align-items:center;gap:8px;flex:0 1 auto;min-width:0;align-self:flex-start;}
/* the client's integrator, as a light tile with its name whole (inside the tools the v469 40% cap read as 40% of the tools
   and cut "Nuvo Group" to "Nu"); its "Supported by" label goes, the tile says it */
.tkw-tools .tkd-intg{margin-top:0;align-self:center;flex:0 1 auto;min-width:0;max-width:240px;}
.tkw-tools .tkd-intg .intg-chip-l{display:none;}
.tkw-tools .tkd-intg .intg-chip-tile{box-shadow:none;border:1px solid var(--line);padding:4px 9px;border-radius:8px;}
.tkw-tools .tkd-intg .intg-chip-tile b{max-width:170px;font-size:12px;}
.tkw-tools .tkd-intg .intg-chip-logo img{max-height:18px;max-width:72px;}
.tkw-nav{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--line);border-radius:8px;padding:2px;background:var(--surface);}
.tkw-nav-btn{appearance:none;border:0;background:transparent;width:28px;height:28px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-mute);cursor:pointer;}
.tkw-nav-btn svg{width:14px;height:14px;}
.tkw-nav-btn:hover:not(:disabled){background:var(--surface-2);color:var(--text);}
.tkw-nav-btn:disabled{opacity:.35;cursor:default;}
.tkw-nav-btn:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.tkw-nav-n{font-size:11px;color:var(--text-dim);padding:0 6px;font-variant-numeric:tabular-nums;white-space:nowrap;}
/* the facts: one quiet line (age · messages · the clock · who) */
.tkw .tkd-hero-chips{margin-top:12px;padding:10px 0;border-top:1px solid var(--line);gap:6px 20px;}
.tkw .tkd-hero-chips .ph-chip{padding:0;border:0;background:transparent;border-radius:0;box-shadow:none;display:inline-flex;align-items:center;gap:7px;color:var(--text-mute);min-height:0;}
.tkw .tkd-hero-chips .ph-chip .ph-cdot{width:7px;height:7px;border-radius:50%;background:var(--text-dim);box-shadow:none;}
.tkw .tkd-hero-chips .ph-chip .ph-cv{font-size:13px;font-weight:600;color:var(--text);line-height:1.3;}
.tkw .tkd-hero-chips .ph-chip .ph-cl{font-size:12px;font-weight:400;color:var(--text-mute);letter-spacing:0;text-transform:none;}
.tkw .tkd-hero-chips .ph-chip.tone-ok .ph-cdot{background:var(--ok);}
.tkw .tkd-hero-chips .ph-chip.tone-warn .ph-cdot{background:var(--warn);}
.tkw .tkd-hero-chips .ph-chip.tone-err .ph-cdot{background:var(--err);}
.tkw .tkd-hero-chips .ph-chip.tone-info .ph-cdot{background:var(--brand-blue);}
.tkw .tkd-hero-chips .ph-chip.tone-err .ph-cv,.tkw .tkd-hero-chips .tkd-flagchip .ph-cv{color:var(--err);}
.tkw .tkd-hero-chips .ph-chip.tone-warn .ph-cv{color:#9A5B00;}
.tkw .tkd-hero-chips .ph-chip.tone-ok .ph-cv{color:#0F7B3A;}
.tkw .tkd-hero-chips .tkd-flagchip .ph-cv svg{width:12px;height:12px;}
.tkw .tkd-hero-chips .ph-chip .tkd-hc-av{margin-right:2px;}
/* the actions: what you do on the left (Acknowledge, Reply), what you set on the right (Status, Priority), and the rest
   (the device, the asset, Flag, Call-out, Add to a task, PDF, Delete) behind one More menu at every width, as the phone has
   had since v291 (on a desktop the eight of them sat in one row with the selects, and Delete alone at its end) */
.tkw .tkd-hero .tkd-actionbar{position:relative;background:var(--surface-2);border-top:1px solid var(--line);padding:9px 20px;}
.tkw .tkd-actionbar #tkd-more-btn{display:inline-flex;}
.tkw .tkd-actionbar .tkd-ab-more{display:none;position:absolute;right:0;top:calc(100% + 6px);z-index:40;flex-direction:column;align-items:stretch;gap:2px;
  min-width:224px;padding:6px;border:1px solid var(--line);border-radius:10px;background:var(--surface);box-shadow:var(--shadow-lg);}
.tkw .tkd-actionbar.more-open .tkd-ab-more{display:flex;}
.tkw .tkd-actionbar .tkd-ab-more .btn{justify-content:flex-start;width:100%;min-height:38px;border-radius:8px;border-color:transparent;background:transparent;box-shadow:none;}
.tkw .tkd-actionbar .tkd-ab-more .btn:hover{background:var(--surface-2);border-color:transparent;}
.tkw .tkd-actionbar .tkd-ab-more .btn.danger{color:var(--err);}
.tkw .tkd-actionbar .tkd-ab-more .btn.danger:hover{background:rgba(220,38,38,.08);}
.tkw .tkd-actionbar .tkd-ab-more .tkd-flagbtn.on{color:var(--err);background:rgba(220,38,38,.06);}
.tkw .tkd-actionbar .tkd-ab-more .tkd-del{margin-left:0;order:0;margin-top:4px;border-top:1px solid var(--line);border-radius:0 0 8px 8px;padding-top:4px;}
.tkw .tkd-actionbar .tkd-ab-more .tkd-ab-t{display:inline;}
/* the iPad-portrait window is 560px wide (v203): the two selects drop their caps and the row stays one line, Status,
   Priority and More together at its end (with the caps, Priority and More wrapped to a second line on the left) */
@media (min-width:761px) and (max-width:920px){
  .tkw .tkd-actionbar .tkd-ctl > span{display:none;}
  .tkw .tkd-actionbar .tkd-ctl > select{max-width:150px;}
  .tkw .tkd-actionbar > .btn.sm{padding-left:12px;padding-right:12px;}
}
@media (min-width:761px){
  .tkw .tkd-actionbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  .tkw .tkd-actionbar > .tkd-ctl:first-of-type{margin-left:auto;}
  .tkw .tkd-actionbar > .btn.sm{min-height:34px;border-radius:8px;}
  .tkw .tkd-actionbar .tkd-ctl{border-radius:8px;min-height:34px;}
  .tkw .tkd-actionbar .tkd-ctl > span{font-size:11px;letter-spacing:.06em;}
  .tkw .tkd-actionbar .tkd-ackdone{display:inline-flex;align-items:center;gap:6px;min-height:34px;padding:0 12px;border-radius:8px;}   /* the Acknowledged pill the row's height (it was 22 beside 34) */
  .tkw .tkd-actionbar #tkd-more-btn{min-height:34px;border-radius:8px;}
}
/* the body: the conversation, the tabs as a line, the side column on a tint */
.tkw .tkd-main{padding:14px 22px 22px;border-right:0;}
.tkw .tkd-side{background:var(--surface-2);padding:16px;border-left:1px solid var(--line);}
.tkw .tkd-tabs{display:flex;gap:0;background:transparent;border:0;border-bottom:1px solid var(--line);border-radius:0;padding:0;margin:0 0 16px;}
.tkw .tkd-tab{position:relative;padding:9px 14px;border-radius:0;color:var(--text-mute);}
.tkw .tkd-tab:hover{color:var(--text);}
.tkw .tkd-tab.on{background:transparent;color:var(--text);box-shadow:none;}
.tkw .tkd-tab.on::after{content:"";position:absolute;left:8px;right:8px;bottom:-1px;height:2px;border-radius:2px;background:var(--brand-blue);}
.tkw .tkd-tab .tb-n{background:var(--surface-2);border:1px solid var(--line);}
.tkw .tkd-tab.on .tb-n{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);border-color:rgba(var(--bc-accent-rgb),.2);}
/* the thread */
.tkw .conv-thread .conv-item .cv-bubble{border-radius:12px;box-shadow:none;border:1px solid var(--line);background:var(--surface);padding:12px 15px;}
.tkw .conv-thread .conv-item.cv-agent:not(.note):not(.control) .cv-bubble{background:var(--accent-soft,var(--bc-accent-soft));border-color:rgba(var(--bc-accent-rgb),.16);box-shadow:none;}
.tkw .conv-thread .conv-item.note .cv-bubble{background:#FFF8EA;border-color:rgba(217,119,6,.32);border-style:dashed;box-shadow:none;}
.tkw .conv-thread .conv-item.note .cv-role{background:rgba(217,119,6,.14);color:#9A5B00;}
.tkw .conv-thread .conv-item.control .cv-bubble{box-shadow:none;background:rgba(22,163,74,.06);border-color:rgba(22,163,74,.24);}
.tkw .conv-thread .conv-item > .cv-av{border-radius:50%;box-shadow:0 0 0 4px var(--surface);}
.tkw .conv-thread .conv-day span{background:var(--surface-2);}
.tkw .cv-acttog{border-radius:999px;}
/* the composer: a raised card at the foot of the conversation (Reply in the action row scrolls to it) */
.tkw .tkd-composer{margin-top:14px;border-radius:12px;border:1px solid var(--line-2);box-shadow:var(--shadow-md);background:var(--surface);}
.tkw .tkd-composer .cmp-tabs{padding:8px 10px 0;gap:4px;border-bottom:0;}
.tkw .tkd-composer .cmp-tab{border:1px solid transparent;border-radius:8px;padding:6px 11px;font-size:13px;font-weight:600;color:var(--text-mute);min-height:30px;}
.tkw .tkd-composer .cmp-tab svg{width:13px;height:13px;}
.tkw .tkd-composer .cmp-tab:hover{color:var(--text);background:var(--surface-2);}
.tkw .tkd-composer .cmp-tab.on{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);border-color:rgba(var(--bc-accent-rgb),.18);}
.tkw .tkd-composer .cmp-tab.note.on{background:#FFF8EA;color:#9A5B00;border-color:rgba(217,119,6,.32);}
.tkw .tkd-composer textarea{min-height:92px;line-height:1.55;padding:10px 14px 12px;}   /* 13/400, the field size (16 on a phone, v455) */
.tkw .tkd-composer.note-mode{background:#FFFCF5;border-color:rgba(217,119,6,.4);}
.tkw .tkd-composer.drag{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);}
.tkw .cmp-foot{padding:8px 10px;border-top:1px solid var(--line);background:var(--surface-2);border-radius:0 0 12px 12px;}
.tkw .cmp-foot .btn.sm{min-height:32px;border-radius:8px;}
.tkw .cmp-foot .btn.primary{padding:0 16px;}
.tkw .cmp-foot .ex-sel{border-radius:8px;}
.tkw .cmp-draft{border-radius:0;}
.tkw .cmp-sealed{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 14px;font-size:13px;color:var(--text-mute);}
/* the Details tab */
.tkw .tkd-dsec{border-radius:12px;}
.tkw .tkd-dsec-h{background:transparent;border-bottom:1px solid var(--line);padding:10px 14px;color:var(--text-dim);}
.tkw .tkd-dsec-b{padding:4px 14px 8px;}
/* the side column: three groups, the cards flat on the tint */
.tkw .tkd-side .sbx{border-radius:12px;box-shadow:none;border:1px solid var(--line);margin-bottom:10px;}
.tkw .tkd-side .sbx-head{padding:10px 14px;}
.tkw .tkd-side .sbx-head h5{color:var(--text-mute);}
.tkw .tkd-side .sbx-head .sx-ico{width:22px;height:22px;border-radius:6px;}
.tkw .tkd-side .sbx-head .sx-ico svg{width:12px;height:12px;}
.tkw .tkd-side .ast-card{border-radius:12px;box-shadow:none;border:1px solid var(--line);}
/* its banner light like the rest of the window (the navy gradient was the one dark block in it); the light tokens are put
   back under it, as .asd-hero-v2 does, because the brand layer re-points them to navy on every .ac-banner */
.tkw .ast-card .ac-banner{background:var(--bc-accent-soft);--text:#0C1B2A;--text-mute:#46596B;--text-dim:#75899B;--line:#DEE5EC;--line-2:#C3CEDA;
  --surface:#FFFFFF;--surface-2:#F4F7FA;--surface-3:#E9EEF4;--accent:var(--bc-accent);--brand-blue:var(--bc-accent);--accent-soft:var(--bc-accent-soft);--accent-glow:rgba(var(--bc-accent-rgb),.09);
  --ok:#16A34A;--warn:#D97706;--err:#DC2626;color:var(--text);border-bottom:1px solid var(--line);}
.tkw .ast-card .ac-thumb{background:var(--surface);border-color:var(--line);}
.tkw .ast-card .ac-tag{background:rgba(var(--bc-accent-rgb),.12);color:var(--brand-blue);}
.tkw .ast-card .ac-banner .btn.ghost{color:var(--brand-blue);border-color:rgba(var(--bc-accent-rgb),.3);background:var(--surface);}
.tkw .ast-card .ac-banner .btn.ghost:hover{background:var(--accent-soft,var(--bc-accent-soft));}
.tkw-sec{margin-top:6px;}
.tkw-sec + .tkw-sec{margin-top:16px;}
.tkw-sec-h{display:flex;align-items:center;gap:10px;padding:0 2px 8px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);}
.tkw-sec-h::after{content:"";flex:1;height:1px;background:var(--line);}
.tkw-sec:not(:has(> :not(.tkw-sec-h))){display:none;}
.tkw .tkd-side-top .sbx{margin-bottom:0;}
.tkw .tkd-side-top .sbx-head .btn.xs{border-radius:6px;}
/* the Connected card: the count pill is as tall as the two-line record button beside it (52 against 40 on a phone) */
.tkw .tkc-row{align-items:stretch;}
.tkw .tkc-n{display:inline-flex;align-items:center;border-radius:9px;}
/* a phone: the head keeps its budget (v455), the stepper goes, the side groups read under Details */
@media (max-width:920px){
  .tkw .tkd-side-top{padding:12px 16px 0;}
  .tkw .tkd-side-rest{padding:16px;}
  .tkw .tkd-main{padding:14px 16px 18px;}
}
@media (max-width:760px){
  .tkw .tkd-hero .tkd-actionbar{padding:8px 14px 10px;}
}
@media (max-width:700px){
  .tkw .tkd-hero .tkd-hero-top{padding:10px 12px 8px;border-top-width:3px;border-radius:0;}
  .tkw .tkd-head.tkd-hero{border-radius:0;}
  .tkw .tkd-hero .tkd-row1{gap:9px;}
  .tkw .tkd-hero .tkd-pchip{width:30px;height:30px;font-size:12px;border-radius:8px;margin-top:0;}
  .tkw-nav{display:none;}
  .tkw .tkd-hero .tkd-actionbar{padding:6px 10px 8px;}
  .tkw .tkd-main{padding:14px 12px 16px;}
  .tkw .tkd-side-top{padding:10px 12px 0;}
  .tkw .tkd-side-rest{padding:12px;}
  .tkw .tkd-composer{margin-top:12px;}
  .tkw .cmp-foot .btn.sm{min-height:40px;}
  .tkw .tkd-composer .cmp-tab{min-height:40px;}
  .tkw .tkd-actionbar .tkd-ab-more .btn{min-height:44px;}   /* the More menu's rows keep the phone floor (v291) */
  .tkw-sec-h{padding-bottom:6px;}
}

/* ── files staged with the reply (js/06 FILES GO WITH THE REPLY): chips under the text, a picture showing itself, and a strip
   that says where to drop; the whole composer lights while a file is dragged over it ── */
.tkw .cmp-stage{display:flex;flex-wrap:wrap;gap:6px;padding:0 12px 10px;}
.tkw .cmp-stage[hidden]{display:none;}
.tkw .cmp-chip{display:inline-flex;align-items:center;gap:7px;max-width:100%;min-height:32px;background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:3px 3px 3px 9px;font-size:12px;}
.tkw .cmp-chip.img{padding-left:3px;}
.tkw .cmp-chip img{width:26px;height:26px;border-radius:5px;object-fit:cover;flex:none;background:var(--surface-3);}
.tkw .cmp-chip-ico{display:inline-flex;color:var(--text-dim);flex:none;}
.tkw .cmp-chip-ico svg{width:14px;height:14px;}
.tkw .cmp-chip-n{max-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:500;color:var(--text);}
.tkw .cmp-chip-s{font-size:11px;color:var(--text-dim);white-space:nowrap;}
.tkw .cmp-chip-x{appearance:none;border:0;background:transparent;color:var(--text-dim);width:24px;height:24px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex:none;}
.tkw .cmp-chip-x svg{width:12px;height:12px;}
.tkw .cmp-chip-x:hover{background:rgba(220,38,38,.1);color:var(--err);}
.tkw .cmp-dropstrip{display:flex;align-items:center;gap:8px;margin:0 12px 10px;padding:7px 10px;border:1px dashed var(--line-2);border-radius:8px;font-size:12px;color:var(--text-dim);background:var(--surface);}
.tkw .cmp-dropstrip svg{width:13px;height:13px;flex:none;}
.tkw .cmp-dropstrip[hidden]{display:none;}
.tkw .tkd-composer.note-mode .cmp-dropstrip{border-color:rgba(217,119,6,.4);}
.tkw .tkd-composer.drag{outline:0;border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);background:var(--accent-soft,var(--bc-accent-soft));}
.tkw .tkd-composer.drag .cmp-dropstrip{border-color:var(--brand-blue);color:var(--brand-blue);background:var(--surface);}
@media (max-width:700px){
  .tkw .cmp-dropstrip{display:none;}   /* nothing to drag on a phone: Attach and Photo stand */
  .tkw .cmp-chip{min-height:40px;}
  .tkw .cmp-chip-x{width:36px;height:36px;}
}

/* ── THE MENUS: the brand's own navy stage ── Jay: "Remove in the menu, explaining what every area is, no need, make the menu
   look amazing" … "menu system needs to look way more amazing". The v539 data-desc lines are no longer written (js/02
   buildNav): each row is its glyph tile, its name and its count. The panel is the navy the heroes and the sign-in stage are
   drawn on, with their blue and purple blooms, their faint drafting grid fading toward the rows and the brand's edge along
   the top; the open trigger turns navy so the panel hangs from it; a row is a 44px glass tile that lights under the pointer,
   the page you are on carries the gradient tile with a glow, and the rows rise in one after another. The phone drawer and
   the account menu are the same stage. */
.nav-dd-menu{min-width:272px;max-width:min(344px,calc(100vw - 16px));padding:10px;gap:3px;border-radius:14px;isolation:isolate;   /* position stays fixed (the base rule): positionNavMenu places it from its trigger */
  background:
    radial-gradient(420px 220px at 100% -40%,rgba(var(--bc-grad-a-rgb),.38),transparent 70%),
    radial-gradient(360px 200px at -10% 120%,rgba(var(--bc-purple-rgb),.26),transparent 70%),
    var(--bc-navy);
  border:1px solid rgba(var(--bc-accent-lite-rgb),.18);color:#fff;overflow:hidden;
  box-shadow:0 30px 60px -18px rgba(var(--bc-navy-rgb),.6),0 0 0 1px rgba(var(--bc-navy-rgb),.35),inset 0 1px 0 rgba(255,255,255,.06);}
.nav-dd-menu::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;display:block;height:auto;margin:0;
  background-image:linear-gradient(rgba(255,255,255,.05) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.05) 1px,transparent 1px);
  background-size:22px 22px;-webkit-mask-image:linear-gradient(180deg,#000,transparent 65%);mask-image:linear-gradient(180deg,#000,transparent 65%);}
.nav-dd-menu::after{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:var(--brand-grad);pointer-events:none;}
.nav-dd-head{display:flex;align-items:center;gap:10px;padding:4px 8px 8px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#8FA6C4;}
.nav-dd-head::after{content:"";flex:1;height:1px;background:rgba(255,255,255,.09);}
.nav-dd-sub{padding:10px 8px 6px;margin-top:6px;border-top:1px solid rgba(255,255,255,.09);color:#8FA6C4;}
.nav-dd-item{display:flex;align-items:center;gap:12px;padding:6px 9px;min-height:44px;border-radius:10px;font-size:13px;font-weight:500;color:#DCE5F2;
  border:1px solid transparent;transition:background .14s,border-color .14s,color .14s;}
.nav-dd-item::after{content:none;}
.nav-dd-item .ico{width:32px;height:32px;border-radius:9px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.09);color:#C3D0DE;--ico-ac:var(--bc-accent-lite);
  flex:none;display:inline-flex;align-items:center;justify-content:center;transition:background .14s,border-color .14s,color .14s,box-shadow .14s;}
.nav-dd-item .ico svg{width:17px;height:17px;}
.nav-dd-item .ndl{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:1.2;color:inherit;}
.nav-dd-item .nav-badge{margin-left:auto;flex:none;border-radius:999px;padding:1px 7px;background:#FF6B5E;color:#fff;}
.nav-dd-item:hover,.nav-dd-item:focus-visible{background:rgba(255,255,255,.07);border-color:rgba(255,255,255,.1);color:#fff;outline:none;}
.nav-dd-item:focus-visible{border-color:var(--bc-accent-lite);}
.nav-dd-item:hover .ico,.nav-dd-item:focus-visible .ico{background:rgba(var(--bc-accent-lite-rgb),.18);border-color:rgba(var(--bc-accent-lite-rgb),.36);color:#fff;--ico-ac:#fff;}
.nav-dd-item.active{background:linear-gradient(135deg,rgba(var(--bc-grad-a-rgb),.26),rgba(var(--bc-purple-rgb),.2));border-color:rgba(var(--bc-accent-lite-rgb),.42);color:#fff;}
.nav-dd-item.active .ndl{color:#fff;font-weight:600;}
.nav-dd-item.active .ico,.nav-dd-item.active:hover .ico{background:var(--brand-grad);border-color:transparent;color:#fff;--ico-ac:#fff;box-shadow:0 6px 16px -6px rgba(var(--bc-grad-a-rgb),.85);}
.nav-dd-item.nav-grow{background:rgba(var(--bc-accent-lite-rgb),.1);border-color:rgba(var(--bc-accent-lite-rgb),.25);}
.nav-dd-item.nav-grow .ndl{color:#fff;font-weight:600;}
.nav-dd-item.nav-grow .ico,.nav-dd-item.nav-grow:hover .ico{background:var(--brand-grad);border-color:transparent;color:#fff;--ico-ac:#fff;}
/* the open trigger is the panel's tab */
.nav-dd.open .nav-dd-trigger{background:var(--bc-navy);color:#fff;border-radius:8px;}
.nav-dd.open .nav-dd-trigger .ico{color:var(--bc-accent-lite);--ico-ac:#fff;}
.nav-dd.open .nav-dd-trigger .nav-badge{background:#FF6B5E;}
.nav-dd.open .nav-dd-caret{opacity:1;}
.nav-new.open .nav-dd-trigger{background:var(--bc-navy);border-color:var(--bc-navy);color:#fff;}
.nav-new.open .nav-dd-trigger .ico{color:var(--bc-accent-lite);--ico-ac:#fff;}
.nav-dd-trigger .nav-badge,.nav-item .nav-badge{border-radius:999px;padding:1px 7px;}
/* the rows rise in, one after another (none for anyone who asked for less motion) */
@keyframes avRowIn{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}}
@media (prefers-reduced-motion:no-preference){
  .nav-dd.open .nav-dd-item{animation:avRowIn .24s var(--av-ease) both;}
  .nav-dd.open .nav-dd-item:nth-child(3){animation-delay:.025s;}
  .nav-dd.open .nav-dd-item:nth-child(4){animation-delay:.05s;}
  .nav-dd.open .nav-dd-item:nth-child(5){animation-delay:.075s;}
  .nav-dd.open .nav-dd-item:nth-child(6){animation-delay:.1s;}
  .nav-dd.open .nav-dd-item:nth-child(7){animation-delay:.125s;}
  .nav-dd.open .nav-dd-item:nth-child(8){animation-delay:.15s;}
  .nav-dd.open .nav-dd-item:nth-child(9){animation-delay:.175s;}
  .nav-dd.open .nav-dd-item:nth-child(10){animation-delay:.2s;}
  .nav-dd.open .nav-dd-item:nth-child(n+11){animation-delay:.22s;}
}
@media (max-width:760px){ .nav-dd-menu{min-width:240px;} }
/* ── the phone drawer: the same stage, the rows the same tiles, Create as glass buttons ── */
.mnav-back{background:rgba(var(--bc-navy-rgb),.55);}
.mnav-panel{color:#fff;border-right:1px solid rgba(var(--bc-accent-lite-rgb),.14);box-shadow:0 0 60px rgba(var(--bc-navy-rgb),.55);
  background:
    radial-gradient(520px 260px at 100% -10%,rgba(var(--bc-grad-a-rgb),.34),transparent 70%),
    radial-gradient(420px 240px at -20% 110%,rgba(var(--bc-purple-rgb),.24),transparent 70%),
    var(--bc-navy);}
.mnav-head{border-bottom:1px solid rgba(255,255,255,.09);}
.mnav-title b{color:#fff;}
.mnav-title span{color:#8FA6C4;}
.mnav-close{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.12);color:#DCE5F2;border-radius:10px;}
.mnav-sec-t{color:#8FA6C4;}
.mnav-sub{color:#8FA6C4;border-top-color:rgba(255,255,255,.09);}
.mnav-row{color:#DCE5F2;border-radius:10px;gap:12px;min-height:48px;padding:7px 9px;}
.mnav-row .ico{width:32px;height:32px;border-radius:9px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.09);color:#C3D0DE;--ico-ac:var(--bc-accent-lite);}
.mnav-row .ico svg{width:17px;height:17px;}
.mnav-row:active{background:rgba(255,255,255,.08);}
.mnav-row.active{background:linear-gradient(135deg,rgba(var(--bc-grad-a-rgb),.26),rgba(var(--bc-purple-rgb),.2));color:#fff;box-shadow:inset 0 0 0 1px rgba(var(--bc-accent-lite-rgb),.42);}
.mnav-row.active .ico{background:var(--brand-grad);border-color:transparent;color:#fff;--ico-ac:#fff;box-shadow:0 6px 16px -6px rgba(var(--bc-grad-a-rgb),.85);}
.mnav-row .nav-badge{background:#FF6B5E;border-radius:999px;}
.mnav-row.nav-grow{color:#fff;}
.mnav-row.nav-grow .ico{background:var(--brand-grad);border-color:transparent;color:#fff;--ico-ac:#fff;}
.mnav-qa-btn{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.12);color:#fff;border-radius:10px;}
.mnav-qa-btn svg{color:var(--bc-accent-lite);--ico-ac:#fff;}
.mnav-qa-btn:active{background:rgba(255,255,255,.12);}
.mnav-qa-btn.nav-grow{background:var(--brand-grad);border-color:transparent;}
.mnav-foot{border-top:1px solid rgba(255,255,255,.09);}
.mnav-foot-id b{color:#fff;}
.mnav-foot-id span{color:#8FA6C4;}
.mnav-foot .icon-btn{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.12);color:#DCE5F2;}
/* ── the account menu: the same stage ── */
.acct-menu{width:300px;padding:10px;border-radius:14px;color:#fff;border:1px solid rgba(var(--bc-accent-lite-rgb),.18);position:fixed;isolation:isolate;overflow:hidden auto;
  background:
    radial-gradient(420px 220px at 100% -40%,rgba(var(--bc-grad-a-rgb),.38),transparent 70%),
    radial-gradient(360px 200px at -10% 120%,rgba(var(--bc-purple-rgb),.26),transparent 70%),
    var(--bc-navy);
  box-shadow:0 30px 60px -18px rgba(var(--bc-navy-rgb),.6),0 0 0 1px rgba(var(--bc-navy-rgb),.35),inset 0 1px 0 rgba(255,255,255,.06);}
.acct-menu::after{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:var(--brand-grad);pointer-events:none;}
.acct-head{border-bottom:1px solid rgba(255,255,255,.09);padding:6px 8px 12px;margin-bottom:8px;}
.acct-head .avatar{box-shadow:0 0 0 2px rgba(var(--bc-accent-lite-rgb),.35);}
.acct-head-name{color:#fff;}
.acct-head-sub{color:#C3D0DE;}
.acct-head-mail{color:#8FA6C4;}
.acct-item{color:#DCE5F2;border-radius:10px;min-height:44px;padding:6px 9px;gap:12px;border:1px solid transparent;}
.acct-item:hover,.acct-item:focus-visible{background:rgba(255,255,255,.07);border-color:rgba(255,255,255,.1);color:#fff;}
.acct-item:focus-visible{border-color:var(--bc-accent-lite);}
.acct-ico{width:32px;height:32px;border-radius:9px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.09);color:#C3D0DE;--ico-ac:var(--bc-accent-lite);}
.acct-ico svg{width:17px;height:17px;}
.acct-item:hover .acct-ico,.acct-item:focus-visible .acct-ico{background:rgba(var(--bc-accent-lite-rgb),.18);border-color:rgba(var(--bc-accent-lite-rgb),.36);color:#fff;--ico-ac:#fff;}
.acct-l small{color:#8FA6C4;}
.acct-sep{background:rgba(255,255,255,.09);margin:8px 4px;}
.acct-signout:hover,.acct-signout:focus-visible{background:rgba(255,107,94,.12);border-color:rgba(255,107,94,.3);color:#FFB4AC;}
.acct-signout:hover .acct-ico,.acct-signout:focus-visible .acct-ico{background:rgba(255,107,94,.18);border-color:rgba(255,107,94,.4);color:#FFB4AC;--ico-ac:#FFB4AC;}
.acct-btn[aria-expanded="true"]{background:var(--bc-navy);border-color:var(--bc-navy);color:#fff;}
.acct-btn[aria-expanded="true"] .user-info .ur{color:#8FA6C4;}
.acct-btn[aria-expanded="true"] .acct-caret{color:var(--bc-accent-lite);}
@media(max-width:760px){ .acct-btn[aria-expanded="true"]{background:transparent;} }

/* ── the New ticket form: three cards, the priority as four tiles ── */
.modal-nt .nt-section{border:1px solid var(--line);border-radius:12px;background:var(--surface);}
.modal-nt .nt-sec-label{color:var(--text-dim);}
.modal-nt .nt-prio label{border-radius:10px;}
.modal-nt .nt-prio label:has(input:checked){background:var(--accent-soft,var(--bc-accent-soft));border-color:var(--brand-blue);box-shadow:inset 0 0 0 1px var(--brand-blue);}
.modal-nt .nt-foot .btn{min-height:38px;border-radius:8px;}   /* Cancel and Create ticket one height */

/* ── TASKS ── Jay: "Massively go over the tasks, fix any bugs, also look for better layouts and better structures." The task
   window (#tk-drawer, js/18 tkDrawerPaint) is a .tkw now: it shares the ticket's head classes, so the light head, the facts
   line, the action row and the tinted side column above are its too; these lines are what the task needs on top. The
   workspace's rail and head take the support desk's look (the rail rows lit soft with a keel, the toned counts as badges, the
   36px bar), so the two desks read as one app. Every size is a step of the scale; uppercase tracks in em. */
/* the window: the title dark on the light head */
.tkw-task .tkv-hero .tk-dr-title{color:var(--text);text-shadow:none;margin-top:3px;}
.tkw-task .tkv-hero .tk-dr-title[contenteditable]:hover{background:var(--surface-2);}
.tkw-task .tkv-hero .tk-dr-title[contenteditable]:focus{background:var(--surface);color:var(--text);box-shadow:0 0 0 3px var(--accent-glow);border:1px solid var(--line-2);margin-left:-7px;}
.tkw-task .tkv-hero .tkv-pchip{margin-top:2px;}
.tkw-task.done .tkv-hero .tk-dr-title{text-decoration:line-through;color:var(--text-mute);opacity:1;}
.tkw-task .tkd-hero .tkd-refrow .tkv-list i{width:7px;height:7px;}
/* the facts line: the avatars on a light ground */
.tkw-task .tkd-hero-chips .tk-av{border-color:var(--surface);}
.tkw-task .tkd-hero-chips .tk-av.all,.tkw-task .tkd-hero-chips .tkd-hc-av{background:var(--brand-purple);color:#fff;}
.tkw-task .tkd-hero-chips .ph-chip .ph-cv .tk-avs{margin-right:2px;}
/* the action row on a phone: Mark done keeps its word (the one thing a task is for), Add me moves under More (js/18
   tkMoreMenu), and the two selects share what is left: measured at 390, with Add me in the row the Status select had 31px
   for "In progress" */
@media (max-width:760px){
  .tkw-task .tkd-actionbar > .tkv-done > .tkd-ab-t{display:inline;}
  .tkw-task .tkd-actionbar > .tkv-done{flex:0 0 auto;}
  .tkw-task .tkd-actionbar > .tkv-addme{display:none;}
  .tkw-task .tkd-actionbar{gap:5px;}
  .tkw-task .tkd-actionbar > .tkv-done{padding-left:10px;padding-right:10px;}
  .tkw-task .tkd-actionbar > .tkv-more{min-width:40px;padding-left:9px;padding-right:9px;}
  .tkw-task .tkd-actionbar > .tkd-ctl:first-of-type{flex-grow:2;}   /* a status name is longer than a priority's */
}
/* the head's words have the room to stay on their lines beside the search (at 1440 the facts wrapped "unassigned" alone) */
.tk-head.tk-tb2 .tk-head-title{flex:2 1 320px;}
.tk-head.tk-tb2 .tk-search{flex:1 1 220px;}
/* a phone's rows: the title and its chips take the flag square's room (the keel on the left already says urgent / high), and
   a group's facts (overdue · today · progress) sit on their own line under its name instead of wrapping beside it */
@media (max-width:700px){
  .tk-listwrap .tk-row > .tk-prio{display:none;}
  .tk-listwrap .tk-row .tk-chip.rep{display:none;}   /* the repeat glyph alone wrapped a row's chips onto a second line; the window says the schedule */
  .tk-listwrap > .tk-group > .tk-group-head,.tk-sub-head{flex-wrap:wrap;row-gap:4px;}
  .tk-listwrap > .tk-group > .tk-group-head h4,.tk-sub-head h5{flex:1 1 auto;min-width:0;}
  .tk-group-head .tk-ghead-facts,.tk-sub-head .tk-ghead-facts{flex:1 0 100%;order:9;margin-left:0;justify-content:flex-start;padding-left:24px;}
  .tk-group-head .tk-ghead-facts:empty,.tk-sub-head .tk-ghead-facts:empty{display:none;}
  .tk-group-head .tk-ghead-facts + .tk-mini,.tk-sub-head .tk-ghead-facts + .tk-mini{margin-left:auto;}
}
/* the side column: 380px, enough for the pickers' shorter placeholders, and the window's halves closer to the ticket's */
@media (min-width:921px){ .tk-view.tkw-task .tkd-body.tkv-body{grid-template-columns:minmax(0,1fr) 380px;} }
.tkw-task .tkd-side .tkv-card{box-shadow:none;}
.tkw-task .tkv-card .sbx-head .sx-ico{background:var(--accent-soft,var(--bc-accent-soft));}
.tkw-task .tk-dr-banner{border-radius:10px;}
.tkw-task .tk-desc[contenteditable]{border-radius:10px;}
.tkw-task .tk-comment-box textarea{border-radius:10px;}
.tkw-task .tk-ev.comment{border-radius:10px;}
.tkw-task .tk-drop{border-radius:10px;}
.tkw-task .tk-file-row{border-radius:10px;}
/* the menu under More and under a row's ⋯ : the ticket menu's shape */
.tk-menu{border-radius:10px;padding:6px;box-shadow:var(--shadow-lg);min-width:220px;}
.tk-menu button{border-radius:8px;min-height:36px;}
.tk-menu button svg{width:15px;height:15px;flex:none;color:var(--text-dim);}
.tk-menu button.danger svg{color:var(--err);}
.tk-menu button.danger:hover{background:rgba(220,38,38,.08);}
@media (max-width:700px){ .tk-menu button{min-height:44px;} }
/* ── the workspace: the rail as the support desk's ── */
.tk-nav-views{padding:8px;border-radius:12px;gap:2px;}
.tk-nav-sec{padding:6px 8px 8px;border-radius:12px;}
.tk-nav .tk-tile,.tk-nav-item{position:relative;min-height:34px;border-radius:8px;}
.tk-nav .tk-tile.on,.tk-nav-item.on{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);}
.tk-nav .tk-tile.on::before,.tk-nav-item.on::before{content:"";position:absolute;left:0;top:8px;bottom:8px;width:3px;border-radius:3px;background:var(--brand-blue);}
.tk-nav .tk-tile.on .tk-tile-l,.tk-nav-item.on .tk-nav-t{color:var(--brand-blue);font-weight:600;}
.tk-nav .tk-tile.on .tk-nav-ico,.tk-nav-item.on .tk-nav-ico{color:var(--brand-blue);}
/* a plain count sits beside its word in the nav look (13/500, 600 when lit); one that needs attention is a count badge
   (10/700 .04em) in its colour, lit or not */
.tk-nav .tk-tile .tk-tile-v,.tk-nav-n{background:transparent;color:var(--text-dim);font-size:13px;font-weight:500;padding:0 2px;min-width:0;line-height:1.5;}
.tk-nav .tk-tile.on .tk-tile-v,.tk-nav-item.on .tk-nav-n{background:transparent;color:var(--brand-blue);font-weight:600;}
.tk-nav .tk-tile.err .tk-tile-v,.tk-nav .tk-tile.warn .tk-tile-v,.tk-nav .tk-tile.ok .tk-tile-v{font-size:10px;font-weight:700;letter-spacing:.04em;padding:2px 8px;border-radius:999px;line-height:14px;}
.tk-nav .tk-tile.err .tk-tile-v,.tk-nav .tk-tile.on.err .tk-tile-v{background:rgba(220,38,38,.10);color:var(--err);}
.tk-nav .tk-tile.warn .tk-tile-v,.tk-nav .tk-tile.on.warn .tk-tile-v{background:rgba(217,119,6,.12);color:var(--warn);}
.tk-nav .tk-tile.ok .tk-tile-v,.tk-nav .tk-tile.on.ok .tk-tile-v{background:rgba(22,163,74,.10);color:#0F7B3A;}
.tk-nav .tk-tile.err .tk-nav-ico{color:var(--err);} .tk-nav .tk-tile.warn .tk-nav-ico{color:var(--warn);}
.tk-nav-tabs .tk-tab{border-radius:8px;}
.tk-nav-tabs{border-radius:10px;}
/* the head: one quiet bar, 36px controls with the same corners */
.tk-head.tk-tb2{box-shadow:var(--shadow-sm);}
.tk-head.tk-tb2 .tk-search{border-radius:8px;min-height:36px;}
.tk-head.tk-tb2 .tk-search input{padding:8px 0;}
.tk-head.tk-tb2 .tk-viewtog{border-radius:8px;min-height:36px;box-sizing:border-box;}
.tk-head.tk-tb2 .tk-viewtog button{border-radius:6px;min-height:34px;}
.tk-head.tk-tb2 .tk-viewtog button.on{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);}
.tk-head.tk-tb2 .tk-tb-right .btn.sm{min-height:36px;border-radius:8px;}
.tk-head.tk-tb2 .tk-tb-right .btn.sm.primary{padding:0 14px;}
.tk-head.tk-tb2 .btn.on{background:var(--accent-soft,var(--bc-accent-soft));color:var(--brand-blue);border-color:rgba(var(--bc-accent-rgb),.32);}
.tk-head.tk-tb2 .tk-fsel,.tk-head.tk-tb2 .tk-head-pick{border-radius:8px;min-height:36px;}
.tk-head.tk-tb2 .tk-fsel.on{border-color:rgba(var(--bc-accent-rgb),.4);}
.tk-head.tk-tb2 .tk-tb-filters{border-top-style:solid;}
.tk-head.tk-tb2 .tk-tb-ftog .tk-tb-fn{background:var(--brand-blue);}
/* the board's cards and the quick add share the corners */
.tk-listwrap .tk-quick-panel{border-radius:12px;}
.tk-listwrap > .tk-group > .tk-group-head{background:var(--surface);}
.tk-bulkbar{border-radius:12px;background:var(--accent-soft,var(--bc-accent-soft));border-color:rgba(var(--bc-accent-rgb),.3);}
/* a small laptop and a tablet (701-1000px): the rail's Tools section is not drawn there, so the head's More button (the day
   email, the export, the lists, the settings) is: it was only drawn from 700px down, and between the two nothing reached them */
@media (max-width:1000px){
  .tk-head.tk-tb2 .tk-tb-right .tk-tb-more{display:inline-flex;align-items:center;justify-content:center;gap:5px;flex:0 0 auto;min-height:40px;min-width:40px;}
  .tk-nav-views .tk-tile.on::before{content:none;}   /* the strip across the top: no keel on a row that is not a row */
}
/* ═══ end v1.4.10.656 ═══ */

/* ═══ v1.4.10.657 — THE DASHBOARD, STRUCTURED (js/03 renderDashboard) ═══════════════════════════════════════════════════
   Jay: "Structure the Dashboard even nicer." Measured at 390x844 the hero alone was 940px (the gauge spanned the width and
   its four factors stacked under it), the six tiles 250px each two to a row, and the attention band's fourteen items one to
   a row: 8,137px of page, the first panel two screens down. The phone now keeps the gauge beside its factors (two by two),
   the tiles a third shorter, the attention items two to a row; the section words read in ink; a small pill is a class
   (.pill.xs), not an inline style. Every size is a step of the scale; uppercase tracks in em. */
.dash-v2 .pill.xs{flex-shrink:0;}
.dash-v2 .dash-sec > span{font-size:12px;color:var(--text);}
.dash-v2 table.dash-issues td.di-sla{white-space:nowrap;}
@media (max-width:760px){
  .dash-hero.dh-v2{padding:16px 14px 14px;gap:12px;}
  .dh-v2 .dh-right{padding:10px 12px;}
  .dh-v2 .dh-health{display:flex;flex-wrap:nowrap;align-items:center;justify-content:flex-start;gap:12px;}
  .dh-v2 .dh-gauge{flex:0 0 104px;max-width:104px;min-width:0;}
  .dh-v2 .dh-gauge .ins-gauge-svg{width:100%;height:auto;display:block;}
  .dh-v2 .dh-facs{flex:1 1 auto;min-width:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 12px;}
  .dh-v2 .dh-fac .ff{font-size:11px;margin-bottom:3px;}
  .dh-v2 .dh-statusrow{margin-top:12px;gap:8px;}
  /* the tiles: two to a row, each a third shorter (the icon, the figure and the words closer together) */
  .dash-v2 .dash-kpis{gap:8px;}
  .dash-v2 .dk{padding:11px 12px 10px;}
  .dash-v2 .dk-head{gap:8px;}
  .dash-v2 .dk-i{width:26px;height:26px;border-radius:8px;}
  .dash-v2 .dk-i svg{width:14px;height:14px;}
  .dash-v2 .dk-v{font-size:20px;margin:6px 0 2px;}
  .dash-v2 .dk-s{font-size:11px;}
  /* the attention band's items two to a row (they were one each, 56px apiece: fourteen of them a screen and a half) */
  .dash-v2 .da-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;padding:10px 12px 12px;}
  .dash-v2 .da-item{column-gap:8px;padding:8px 10px;}
  .dash-v2 .da-item-i{width:28px;height:28px;border-radius:8px;}
  .dash-v2 .da-item-i svg{width:14px;height:14px;}
  .dash-v2 .da-item-v{font-size:18px;}
  .dash-v2 .da-item-l{font-size:11px;}
  .dash-v2 .da-item-go{display:none;}
  .dash-v2 .dash-sec{margin:20px 0 10px;}
  .dash-v2 .dash-quietbox{margin-bottom:12px;}
}
/* ── Reports & export: five report cards in the row on a wide screen (the Test & tag report joins the four, js/24 rxrCardsHtml);
   the stats and the four buttons wrap inside a narrower card ── */
@media (min-width:1400px){
  .rpt-grid.rxr-rgrid{grid-template-columns:repeat(5,minmax(0,1fr));}
  .rxr-rcard .rpt-actions{flex-wrap:wrap;}
}
/* ── NETGEAR (js/05 swRender): a port whose PoE the switch's REST API reports in fault (a short, an overload, power denied)
   wears a red ring in the port grid; its tip says which ── */
.swp.poe-bad{box-shadow:inset 0 0 0 2px var(--err);}
.swp.poe-bad .swp-poe{background:var(--err);}
/* v1.4.10.657: the site page's Switches panel — a NETGEAR row's second line now carries firmware, uptime, temperature and
   the REST sign-in beside its alerts, so it wraps instead of clipping the alert off the end (the dashboard's rows already did) */
[id^="site-switches-"] .dsr-name .dsr-meta{white-space:normal;line-height:1.4;}
/* ═══ end v1.4.10.657 ═══ */

/* ═══ v1.4.10.658: THE TOP OF THE DASHBOARD — the KPI rail and the Needs attention band ═══════════════════════════════
   Jay: "this area in the dashboard is really ugly, make it look way nicer", then of a first pass with tinted washes and
   coloured borders: "i hate the gradient colours, needs to look more professional and not ai". So: flat and typographic.
   White tiles behind one neutral hairline, no wash, no glow, no coloured edge; the icon in a quiet grey tile; the label
   small and muted; the number in ink at 30/600; the sub line pinned to every tile's foot (the sparkline above it), opened
   by a 6px status dot — the one place the tone shows, red for a number that is red. The band is the same panel: a neutral
   border, the head a plain row (a grey badge with the glyph in the band's tone, the title, the counts, a hairline under),
   and each thing to look at a plain card: grey icon tile with the glyph in its tone, the count in that tone, the label in
   ink, a hover that only deepens the border. Sizes sit under min-width 761, so the phone rules above keep theirs. */
.dash-v2 .dk{border:1px solid var(--line);background:var(--surface);box-shadow:none;}
.dash-v2 .dk:hover{transform:none;border-color:var(--line-2);box-shadow:var(--dv-shadow);}
.dash-v2 .dk-i{background:var(--surface-2);color:var(--text-mute);box-shadow:none;}
.dash-v2 .dk.err .dk-i{color:var(--err);}
.dash-v2 .dk-head{order:0;} .dash-v2 .dk-v{order:1;font-weight:600;}
.dash-v2 .dk-spark{order:2;margin-top:8px;padding-top:0;}
.dash-v2 .dk-s{order:3;margin-top:auto;padding-top:8px;display:flex;align-items:flex-start;gap:7px;min-width:0;color:var(--text-mute);}
.dash-v2 .dk-s::before{content:'';width:6px;height:6px;border-radius:50%;margin-top:6px;background:var(--dk-c);flex:none;}
.dash-v2 .dk.muted .dk-s::before{background:var(--text-dim);}
.dash-v2 .dash-attn{border:1px solid var(--line);background:var(--surface);box-shadow:none;}
.dash-v2 .dash-attn.has-err{border-color:var(--line);}
.dash-v2 .dash-attn .da-head{background:none;border-bottom:1px solid var(--line);}
.dash-v2 .dash-attn .da-ico{background:var(--surface-2);color:#B45309;box-shadow:none;}
.dash-v2 .dash-attn.has-err .da-ico{background:var(--surface-2);color:var(--err);}
.dash-v2 .da-pills .pill{font-weight:600;}
.dash-v2 .da-item{border:1px solid var(--line);border-left:1px solid var(--line);background:var(--surface);box-shadow:none;border-radius:10px;}
.dash-v2 .da-item:hover,.dash-v2 .da-item:focus-visible{transform:none;box-shadow:none;border-color:var(--line-2);border-left-color:var(--line-2);background:var(--surface-2);}
.dash-v2 .da-item-i{background:var(--surface-2);color:var(--da-c);box-shadow:none;}
.dash-v2 .da-item-v{font-family:var(--font-display);font-weight:600;}
.dash-v2 .da-item-l{color:var(--text);}
.dash-v2 .da-item-go{color:var(--text-dim);}
@media(min-width:761px){
  .dash-v2 .dk{min-height:146px;}
  .dash-v2 .dk-i{width:32px;height:32px;border-radius:8px;}
  .dash-v2 .dk-v{font-size:30px;margin:12px 0 2px;}
  .dash-v2 .dash-attn .da-head{padding:13px 18px 11px;gap:12px;}
  .dash-v2 .dash-attn .da-ico{width:32px;height:32px;border-radius:8px;}
  .dash-v2 .dash-attn .da-ico svg{width:16px;height:16px;}
  .dash-v2 .da-ttl h3{font-size:15px;}
  .dash-v2 .da-pills{gap:8px;}
  .dash-v2 .da-grid{padding:14px 18px 16px;gap:10px;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));}
  .dash-v2 .da-item{padding:11px 13px;min-height:60px;column-gap:11px;}
  .dash-v2 .da-item-i{width:32px;height:32px;border-radius:8px;} .dash-v2 .da-item-i svg{width:16px;height:16px;}
  .dash-v2 .da-item-v{font-size:21px;} .dash-v2 .da-item-l{font-size:12.5px;}
}
/* Your work — Jay: "same as your work area, needs to look more professional": the same flat treatment. The lanes lose
   their grey heads and coloured icon tiles (a grey tile with a muted glyph, a hairline under the head); the rows lose the
   coloured stripe down their left; the date box is a quiet grey block whose second line alone carries the tone (Overdue
   red, Today amber, In progress blue), no tinted fill; a maintenance type is a muted uppercase word with a dot of its
   colour, not a tinted pill; the tags are neutral pills with the word in its tone; a checklist's progress fills in ink.
   Hover tints the row grey, as before; nothing about the rows' contents or clicks changed. */
.dash-v2 .dyw-lane{border:1px solid var(--line);border-radius:10px;background:var(--surface);}
.dash-v2 .dyw-lane-h{background:var(--surface);border-bottom:1px solid var(--line);padding:10px 12px;}
.dash-v2 .dyw-lane-ico,.dash-v2 .dyw-lane.maint .dyw-lane-ico,.dash-v2 .dyw-lane.items .dyw-lane-ico{background:var(--surface-2);color:var(--text-mute);width:24px;height:24px;border-radius:7px;}
.dash-v2 .dyw-lane-ico svg{width:13px;height:13px;}
.dash-v2 .dyw-lane-h h4{font-size:13px;font-weight:600;}
.dash-v2 .dyw-n{background:var(--surface-2);border-color:var(--line);color:var(--text-mute);}
.dash-v2 .dyw-row{border-left:1px solid transparent;border-radius:8px;}
.dash-v2 .dyw-row.dyw-job,.dash-v2 .dyw-row.dyw-task{border-left-color:transparent;}
.dash-v2 .dyw-row:hover,.dash-v2 .dyw-row.over:hover{background:var(--surface-2);}
.dash-v2 .dyw-when,.dash-v2 .dyw-when.over,.dash-v2 .dyw-when.today,.dash-v2 .dyw-when.busy{background:var(--surface-2);border:1px solid var(--line);color:var(--text);}
.dash-v2 .dyw-when .t{color:var(--text-mute);font-weight:600;}
.dash-v2 .dyw-when.over .t{color:var(--err);} .dash-v2 .dyw-when.today .t{color:#B45309;} .dash-v2 .dyw-when.busy .t{color:var(--brand-blue);}
.dash-v2 .dyw-type{background:none;padding:0;color:var(--text-mute);display:inline-flex;align-items:center;gap:5px;}
.dash-v2 .dyw-type::before{content:'';width:6px;height:6px;border-radius:50%;background:var(--c,var(--text-dim));flex:none;}
.dash-v2 .dyw-tag,.dash-v2 .dyw-tag.over,.dash-v2 .dyw-tag.today,.dash-v2 .dyw-tag.busy,.dash-v2 .dyw-tag.all,.dash-v2 .dyw-tag.prio{background:var(--surface);border:1px solid var(--line);color:var(--text-mute);}
.dash-v2 .dyw-tag.over{color:var(--err);} .dash-v2 .dyw-tag.today{color:#B45309;} .dash-v2 .dyw-tag.busy{color:var(--brand-blue);} .dash-v2 .dyw-tag.all{color:var(--brand-purple);} .dash-v2 .dyw-tag.prio{color:var(--c);}
.dash-v2 .dyw-bar{background:var(--surface-3);} .dash-v2 .dyw-bar div{background:var(--text);}
/* the tickets list under the lanes is a lane of its own (a bordered box with its head on a hairline), not a boxed head
   with the rows floating under it */
.dash-v2 .dyw-other{margin:10px 16px 14px;padding:0 0 6px;border:1px solid var(--line);border-radius:10px;background:var(--surface);overflow:hidden;}
.dash-v2 .dyw-other .dyw-lane-h{background:var(--surface);border:0;border-bottom:1px solid var(--line);border-radius:0;margin-bottom:6px;}
.dash-v2 .dyw-other .dmw-row{margin-left:6px;margin-right:6px;}
.dash-v2 .dyw-other .dash-more{margin:0 6px;}
.dash-v2 .dyw .panel-head h3 svg{color:var(--text-mute);}
.dash-v2 .dmw-row{border-radius:8px;}
/* Upcoming maintenance — Jay: "Yes, match it": the list beside Your work takes the same flat treatment. Its date box is
   the same quiet grey block, the time line alone turning red when the job is overdue (the box was tinted red edge to edge,
   the day in red); the status pill is a neutral pill with the word in its tone (overdue red, scheduled blue, in progress
   amber, done green). The rows keep their hairlines and their grey hover. The same neutral pill names a ticket in Your
   work's tickets list, so the two panels read as one. The pills in a panel's head (2 overdue, 2 due today) are the
   dashboard's own and stay as they are. */
.dash-v2 .dmt-date,.dash-v2 .dmt-date.over{background:var(--surface-2);border:1px solid var(--line);}
.dash-v2 .dmt-date .d,.dash-v2 .dmt-date.over .d{color:var(--text);}
.dash-v2 .dmt-date .t{color:var(--text-mute);font-weight:600;}
.dash-v2 .dmt-date.over .t{color:var(--err);}
.dash-v2 .dmt-row{border-radius:8px;} .dash-v2 .dmt-row:hover{background:var(--surface-2);}
.dash-v2 .dash-maint .pill,.dash-v2 .dyw-other .dmw-row > .pill{background:var(--surface);border:1px solid var(--line);color:var(--text-mute);}
.dash-v2 .dash-maint .pill.err,.dash-v2 .dyw-other .dmw-row > .pill.err{color:var(--err);}
.dash-v2 .dash-maint .pill.blue,.dash-v2 .dyw-other .dmw-row > .pill.blue{color:var(--brand-blue);}
.dash-v2 .dash-maint .pill.warn{color:var(--warn);} .dash-v2 .dash-maint .pill.ok{color:var(--ok);}
.dash-v2 .dyw-other .dmw-row > .pill.purple{color:var(--brand-purple);}

/* ── The room layout, several per room (v1.4.10.658) — Jay: "also make the room layout look even nicer" ─────────────
   The layouts sit in a row of tabs over the picture; the pins are numbered dots with a white ring that name their tag
   on hover; the tray under an edited layout is a grid of cards (picture, tag, make and model) dragged onto the plan;
   the legend is the same card, numbered. Flat, as the dashboard: hairlines, grey tiles, the brand blue on what is chosen. */
.loc-lay .panel-head{border-bottom:1px solid var(--line);}
.loc-lay-count{font-size:11px;font-weight:600;color:var(--text-mute);background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:2px 8px;margin-left:8px;vertical-align:middle;}
.loc-ltabs{display:flex;gap:6px;flex-wrap:wrap;align-items:center;padding:10px 14px;border-bottom:1px solid var(--line);background:var(--surface);}
.loc-ltab{display:inline-flex;align-items:center;gap:7px;padding:6px 11px;border:1px solid var(--line);border-radius:8px;background:var(--surface);font-size:12.5px;font-weight:600;color:var(--text);cursor:pointer;line-height:1.1;max-width:260px;}
.loc-ltab span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.loc-ltab b{font-size:10.5px;font-weight:700;color:var(--text-mute);background:var(--surface-2);border-radius:999px;padding:2px 6px;min-width:18px;text-align:center;}
.loc-ltab:hover{border-color:var(--line-2);background:var(--surface-2);}
.loc-ltab.on{border-color:var(--brand-blue);color:var(--brand-blue);background:var(--accent-glow);} .loc-ltab.on b{background:var(--brand-blue);color:#fff;}
.loc-ltab-pic{display:inline-flex;color:var(--text-mute);} .loc-ltab-pic svg{width:12px;height:12px;} .loc-ltab.on .loc-ltab-pic{color:var(--brand-blue);}
.loc-ltab.add{border-style:dashed;color:var(--text-mute);font-weight:500;} .loc-ltab.add svg{width:12px;height:12px;} .loc-ltab.add:hover{color:var(--brand-blue);border-color:var(--brand-blue);background:var(--surface);}
.loc-layout-canvas.editing{outline:2px dashed transparent;outline-offset:-2px;transition:outline-color .12s,box-shadow .12s;}
.loc-layout-canvas.drop-ready{outline-color:var(--line-2);}
.loc-layout-canvas.over{outline-color:var(--brand-blue);box-shadow:inset 0 0 0 9999px rgba(var(--bc-accent-rgb),.07);}
.loc-layout-empty{flex-direction:column;gap:8px;font-size:13px;color:var(--text-mute);}
.loc-layout-empty-ico{width:40px;height:40px;border-radius:12px;background:var(--surface);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;color:var(--text-mute);} .loc-layout-empty-ico svg{width:18px;height:18px;}
.loc-layout-tag{position:absolute;left:12px;bottom:12px;background:rgba(12,27,42,.74);color:#fff;font-size:11px;font-weight:600;letter-spacing:.02em;padding:4px 9px;border-radius:6px;pointer-events:none;}
.loc-pin{width:30px;height:30px;margin:-15px 0 0 -15px;font-size:12.5px;box-shadow:0 2px 6px rgba(15,23,42,.28), 0 0 0 3px #fff;}
.loc-pin::after{content:attr(data-label);position:absolute;left:calc(100% + 8px);top:50%;transform:translateY(-50%);background:#0C1B2A;color:#fff;font-size:11px;font-weight:600;padding:3px 7px;border-radius:5px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .12s;}
.loc-pin:hover::after,.loc-pin.hi::after{opacity:1;}
.loc-pin.hi{transform:scale(1.18);z-index:4;box-shadow:0 2px 10px rgba(var(--bc-accent-rgb),.45), 0 0 0 3px #fff, 0 0 0 6px rgba(var(--bc-accent-rgb),.25);}
.loc-pin.new{animation:locPinIn .45s cubic-bezier(.2,.9,.3,1.3);}
@keyframes locPinIn{0%{transform:scale(.3);opacity:0;}60%{transform:scale(1.25);opacity:1;}100%{transform:scale(1);}}
.loc-legend-row.hi{background:var(--accent-glow);}
.loc-legend-row.hi .loc-legend-n{background:#0C1B2A;}
.loc-legend-x{flex:none;width:22px;height:22px;border-radius:50%;border:1px solid var(--line);background:var(--surface);color:var(--text-mute);font-size:11px;font-weight:700;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;}
.loc-legend-x:hover{border-color:var(--err);color:var(--err);}
.loc-layout-cta{margin-top:4px;}
/* v1.4.10.659: Add asset — the picture under a crosshair while a spot is being chosen, the dashed "?" pin on the spot, the
   banner that says what to do, and the picker's rows (the tray's card, as a button) */
.loc-layout-canvas.placing{cursor:crosshair;outline:2px solid var(--brand-blue);outline-offset:-2px;}
.loc-layout-canvas.placing .loc-pin{cursor:crosshair;}
.loc-pin.ghost{background:#fff;color:var(--brand-blue);border:2px dashed var(--brand-blue);box-shadow:0 2px 8px rgba(15,23,42,.2);animation:locGhost 1.1s ease-in-out infinite;pointer-events:none;} .loc-pin.ghost::after{display:none;}
@keyframes locGhost{0%,100%{transform:scale(1);}50%{transform:scale(1.12);}}
.loc-placing{display:flex;align-items:center;gap:10px;padding:10px 14px;border-top:1px solid var(--line);background:var(--accent-glow);font-size:12.5px;color:var(--text);flex-wrap:wrap;}
.loc-placing-ico{flex:none;width:28px;height:28px;border-radius:8px;background:var(--brand-blue);color:#fff;display:flex;align-items:center;justify-content:center;} .loc-placing-ico svg{width:14px;height:14px;}
.loc-placing-t{flex:1 1 240px;min-width:0;line-height:1.45;}
.loc-pick-q{width:100%;height:38px;border:1px solid var(--line);border-radius:8px;padding:0 12px;font-size:14px;background:var(--surface);color:var(--text);margin-bottom:8px;} .loc-pick-q:focus{outline:none;border-color:var(--brand-blue);}
.loc-pick-list{max-height:min(60vh,520px);overflow:auto;display:flex;flex-direction:column;gap:6px;padding:2px;}
.loc-pick-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-mute);margin:8px 0 2px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.loc-pick-h span{background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:1px 7px;font-size:10.5px;} .loc-pick-h i{font-style:normal;text-transform:none;letter-spacing:0;font-weight:500;}
.loc-pick-row{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:1px solid var(--line);background:var(--surface);border-radius:10px;padding:8px 10px;cursor:pointer;color:var(--text);font:inherit;min-height:52px;}
.loc-pick-row:hover,.loc-pick-row:focus-visible{border-color:var(--brand-blue);outline:none;background:var(--accent-glow);}
.loc-pick-row.hidden{display:none;}
.loc-pick-row svg{width:18px;height:18px;}
.loc-pick-go{flex:none;font-size:12px;font-weight:600;color:var(--brand-blue);display:inline-flex;align-items:center;gap:4px;white-space:nowrap;} .loc-pick-go svg{width:14px;height:14px;}
.loc-pick-row.moved .loc-pick-go{color:var(--text-mute);}
.loc-pick-row.off{cursor:not-allowed;background:var(--surface-2);opacity:.6;} .loc-pick-row.off:hover{border-color:var(--line);background:var(--surface-2);} .loc-pick-row.off .loc-pick-go{color:var(--text-mute);}
/* v1.4.10.659: a manual or video guide's own QR-page tick */
.loc-media-pub{display:inline-flex;align-items:center;gap:6px;margin-top:4px;font-size:11px;font-weight:600;color:var(--text-mute);cursor:pointer;user-select:none;}
.loc-media-pub input{width:14px;height:14px;margin:0;accent-color:var(--brand-blue);cursor:pointer;}
.loc-media-pub.on{color:var(--brand-blue);} .loc-media-pub i{display:inline-flex;color:var(--warn);} .loc-media-pub i svg{width:12px;height:12px;}
.loc-media-pub.off{cursor:default;background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:1px 7px;} .loc-media-pub.off svg{width:11px;height:11px;}
.loc-media-row.private .loc-media-ico{opacity:.7;}
.lmx-pub{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);cursor:pointer;margin-top:4px;}
.lmx-pub input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--brand-blue);flex:none;cursor:pointer;}
.lmx-pub span{display:flex;flex-direction:column;gap:2px;line-height:1.4;} .lmx-pub b{font-size:13px;font-weight:600;} .lmx-pub small{font-size:12px;color:var(--text-mute);}
/* v1.4.10.659: a room's other pictures, a strip under the main one */
.loc-pics{padding:10px 12px 12px;border-top:1px solid var(--line);background:var(--surface);}
.loc-pics-head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-bottom:8px;}
.loc-pics-t{font-size:12.5px;color:var(--text);} .loc-pics-t .pill{font-size:11px;vertical-align:1px;margin-left:4px;}
.loc-pics-btns{display:flex;gap:6px;flex-wrap:wrap;}
.loc-pics-strip{display:flex;gap:8px;overflow-x:auto;padding:2px 2px 6px;scrollbar-width:thin;scroll-snap-type:x proximity;}
.loc-pics-item{flex:none;width:164px;margin:0;position:relative;scroll-snap-align:start;}
.loc-pics-img{display:block;width:164px;height:110px;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--surface-2);padding:0;cursor:zoom-in;position:relative;}
.loc-pics-img img{width:100%;height:100%;object-fit:cover;display:block;}
.loc-pics-none{position:absolute;inset:0;display:none;align-items:center;justify-content:center;color:var(--text-dim);} .loc-pics-none svg{width:22px;height:22px;}
.loc-pics-item.none .loc-pics-none{display:flex;}
.loc-pics-img:hover{border-color:var(--brand-blue);}
.loc-pics-item figcaption{font-size:11px;color:var(--text-mute);margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.loc-pics-acts{position:absolute;top:6px;right:6px;display:flex;gap:4px;opacity:0;transition:opacity .12s;}
.loc-pics-item:hover .loc-pics-acts,.loc-pics-item:focus-within .loc-pics-acts{opacity:1;}
.loc-pics-a{height:24px;min-width:24px;padding:0 7px;border:1px solid rgba(255,255,255,.6);border-radius:6px;background:rgba(12,27,42,.7);color:#fff;font-size:11px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:4px;}
.loc-pics-a svg{width:12px;height:12px;} .loc-pics-a:hover{background:var(--brand-blue);border-color:var(--brand-blue);} .loc-pics-a.danger:hover{background:var(--err);border-color:var(--err);}
@media (pointer:coarse){ .loc-pics-acts{opacity:1;} }
/* v1.4.10.659: the layout bigger, in a popup: the picture as large as the window allows, its pins where they are, the
   legend under it; the panel's picture says it opens (a zoom cursor and an Enlarge button in its corner) */
.loc-layout-canvas.zoomable{cursor:zoom-in;}
.loc-layout-zoom{position:absolute;top:10px;right:10px;display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border:1px solid rgba(255,255,255,.6);border-radius:7px;background:rgba(12,27,42,.62);color:#fff;font-size:11.5px;font-weight:600;cursor:pointer;opacity:.85;transition:opacity .12s;}
.loc-layout-zoom svg{width:12px;height:12px;} .loc-layout-canvas:hover .loc-layout-zoom,.loc-layout-zoom:focus-visible{opacity:1;}
.loc-lb{position:fixed;inset:0;z-index:1200;background:rgba(12,27,42,.8);display:flex;align-items:center;justify-content:center;padding:20px;opacity:0;transition:opacity .15s;}
.loc-lb.on{opacity:1;}
html.loc-lb-open,html.loc-lb-open body{overflow:hidden;}
.loc-lb-box{background:var(--surface);border-radius:14px;width:min(100%,1500px);height:calc(100vh - 40px);display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,.4);}
.loc-lb-head{display:flex;align-items:center;gap:10px;padding:10px 12px 10px 14px;border-bottom:1px solid var(--line);}
.loc-lb-ico{flex:none;width:28px;height:28px;border-radius:8px;background:var(--surface-2);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;color:var(--text-mute);} .loc-lb-ico svg{width:14px;height:14px;}
.loc-lb-t{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.25;} .loc-lb-t b{font-size:14px;} .loc-lb-t span{font-size:12px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.loc-lb-x{flex:none;width:34px;height:34px;border-radius:50%;border:1px solid var(--line);background:var(--surface);color:var(--text-mute);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:16px;} .loc-lb-x svg{width:16px;height:16px;} .loc-lb-x:hover{color:var(--text);border-color:var(--line-2);}
.loc-lb-body{flex:1 1 auto;min-height:0;overflow:auto;background:var(--surface-3);display:flex;align-items:center;justify-content:center;padding:12px;}
.loc-lb-pic{position:relative;display:block;line-height:0;max-width:100%;width:100%;}   /* its width is set by locLayoutZoom's fit(): as large as the body allows, the picture's shape kept */
.loc-lb-pic img{display:block;width:100%;height:auto;border-radius:6px;}
.loc-lb-pic.photo{aspect-ratio:16/9;background:linear-gradient(140deg,var(--surface-2),var(--surface-3)) center/cover;border-radius:6px;}
.loc-lb-pic .loc-pin{width:34px;height:34px;margin:-17px 0 0 -17px;font-size:13px;}
.loc-lb-legend{flex:none;display:flex;gap:6px;overflow-x:auto;padding:10px 12px;border-top:1px solid var(--line);scrollbar-width:thin;}
.loc-lb-leg{flex:none;display:inline-flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:8px;background:var(--surface);padding:5px 10px 5px 6px;cursor:pointer;color:var(--text);font:inherit;max-width:260px;}
.loc-lb-leg:hover,.loc-lb-leg.hi{border-color:var(--brand-blue);background:var(--accent-glow);}
.loc-lb-leg-t{display:flex;flex-direction:column;line-height:1.2;min-width:0;text-align:left;} .loc-lb-leg-t b{font-size:12px;} .loc-lb-leg-t span{font-size:11px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
@media (max-width:700px){ .loc-lb{padding:0;} .loc-lb-box{border-radius:0;height:100%;height:100dvh;} .loc-lb-body{padding:8px;} }
.loc-layout-canvas.has-plan .loc-layout-empty{position:absolute;inset:auto 0 0 0;background:linear-gradient(to top,rgba(255,255,255,.92),rgba(255,255,255,0));padding:40px 14px 16px;}
.loc-layout-hint{flex:1 1 100% !important;line-height:1.5;} .loc-layout-hint svg{width:13px;height:13px;vertical-align:-2px;}   /* the hint takes its own line; squeezed beside six buttons it ran nine lines deep */
.loc-tray{border-top:1px solid var(--line);background:var(--surface-2);padding:10px 14px 14px;}
.loc-tray-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:10px;}
.loc-tray-t{font-size:12.5px;color:var(--text-mute);} .loc-tray-t b{color:var(--text);} .loc-tray-n{color:var(--text-mute);}
.loc-tray-q{flex:0 1 300px;min-width:180px;height:32px;border:1px solid var(--line);border-radius:8px;padding:0 10px;font-size:13px;background:var(--surface);color:var(--text);}
.loc-tray-q:focus{outline:none;border-color:var(--brand-blue);}
.loc-tray-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px;max-height:340px;overflow:auto;padding:2px;}
.loc-unplaced{display:none;}
.loc-chip{display:flex;align-items:center;gap:10px;border:1px solid var(--line);background:var(--surface);border-radius:10px;padding:7px 9px;cursor:grab;color:var(--text);font-size:12px;font-weight:500;min-width:0;transition:border-color .12s,box-shadow .12s,transform .12s;}
.loc-chip:hover{border-color:var(--brand-blue);color:var(--text);box-shadow:0 2px 8px rgba(15,23,42,.08);} .loc-chip:hover .loc-chip-add{background:var(--brand-blue);color:#fff;border-color:var(--brand-blue);}
.loc-chip:active,.loc-chip.dragging{cursor:grabbing;opacity:.55;transform:scale(.98);}
.loc-chip.hidden{display:none;}
.loc-chip svg{width:18px;height:18px;}
.loc-chip-pic{flex:none;width:46px;height:46px;border-radius:8px;background:var(--surface-2);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;overflow:hidden;color:var(--text-dim);}
.loc-chip-pic img{width:100%;height:100%;object-fit:cover;display:block;}
.loc-chip-pic.has svg{display:none;} .loc-chip-pic.none img{display:none;} .loc-chip-pic.has.none svg{display:block;}
.loc-chip-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;line-height:1.25;}
.loc-chip-t b{font-size:12.5px;font-weight:700;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.loc-chip-t span{font-size:12px;color:var(--text);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.loc-chip-t small{font-size:11px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.loc-chip-add{flex:none;width:24px;height:24px;border-radius:50%;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;color:var(--text-mute);} .loc-chip-add svg{width:12px;height:12px;}
.loc-legend{grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:6px 12px;}
.loc-legend-row{gap:9px;padding:5px 6px;border-radius:8px;font-size:12px;} .loc-legend-row[role=button]{cursor:pointer;} .loc-legend-row[role=button]:hover{background:var(--surface-2);}
.loc-legend-n{width:22px;height:22px;font-size:11px;}
.loc-legend-pic{flex:none;width:34px;height:34px;border-radius:7px;background:var(--surface-2);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;overflow:hidden;color:var(--text-dim);}
.loc-legend-pic svg{width:14px;height:14px;} .loc-legend-pic img{width:100%;height:100%;object-fit:cover;display:block;} .loc-legend-pic.has svg{display:none;} .loc-legend-pic.none img{display:none;} .loc-legend-pic.has.none svg{display:block;}
.loc-legend-t{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.25;} .loc-legend-t strong{font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .loc-legend-t span{font-size:11.5px;color:var(--text-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
/* the closed tickets under the room's open ones */
.loc-tkt-closed{display:flex;align-items:center;gap:10px;margin-top:10px;padding:9px 11px;border:1px solid var(--line);border-radius:8px;background:var(--surface);}
.loc-tkt-closed[role=button]{cursor:pointer;} .loc-tkt-closed[role=button]:hover{border-color:var(--brand-blue);} .loc-tkt-closed.none{background:var(--surface-2);}
.loc-tkt-closed-ico{flex:none;width:28px;height:28px;border-radius:8px;background:var(--surface-2);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;color:var(--ok);} .loc-tkt-closed.none .loc-tkt-closed-ico{color:var(--text-mute);} .loc-tkt-closed-ico svg{width:14px;height:14px;}
.loc-tkt-closed-t{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.25;} .loc-tkt-closed-t b{font-size:13px;} .loc-tkt-closed-t span{font-size:11.5px;color:var(--text-mute);}
.loc-tkt-closed-go{font-size:12px;font-weight:600;color:var(--brand-blue);display:inline-flex;align-items:center;gap:4px;} .loc-tkt-closed-go svg{width:12px;height:12px;}
.ph-chip.ph-chip-btn{cursor:pointer;} .ph-chip.ph-chip-btn:hover{background:rgba(255,255,255,.16);}
/* the integrator's Files area on a room */
.rf-lock{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-mute);background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:2px 8px;} .rf-lock svg{width:11px;height:11px;}
.rf-panel .rab-row:first-child{border-top:0;}
@media(max-width:700px){ .loc-tray-grid{grid-template-columns:1fr 1fr;} .loc-chip-pic{width:40px;height:40px;} .loc-pin::after{display:none;} }
@media(max-width:480px){ .loc-tray-grid{grid-template-columns:1fr;} }
/* ═══ end v1.4.10.658 ═══ */

/* ═══ v1.4.10.660 — THE DESK, READ IN GROUPS; THE LINKED TICKETS ON EVERY ROW AND IN THE WINDOW ═══════════════════════════
   Jay: "Do massive work on the support area … make sure linking of tickets show more in the main support ticket area …
   lay out the support tickets even nicer, so its easier to read and the layout is amazing." (js/03-pages.js THE ROWS, READ
   IN GROUPS and tkxLinkChips; js/06 LINKED TICKETS, REBUILT.) The later block that wins over v656's; every size a step of
   the scale, every uppercase label tracking in em. ═══ */

/* ── the linked tickets on a row: the chain glyph, then each by reference with its status as a dot and the kind of link as
   a word where it is not a plain relation; "+N" for the rest ── */
.tkx-refrow{overflow:hidden;}
.tkx-rl-links{display:inline-flex;align-items:center;gap:4px;margin-left:8px;min-width:0;flex:0 1 auto;overflow:hidden;}
.tkx-lk-ico{display:inline-flex;color:var(--text-dim);flex:none;} .tkx-lk-ico svg{width:11px;height:11px;}
.tkx-lk{display:inline-flex;align-items:center;gap:5px;flex:none;padding:0 7px 0 6px;border:1px solid var(--line);border-radius:999px;background:var(--surface);
  font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;line-height:18px;color:var(--text-mute);text-decoration:none;cursor:pointer;white-space:nowrap;}
.tkx-lk i{width:6px;height:6px;border-radius:50%;background:var(--sc,var(--text-dim));flex:none;}
.tkx-lk b{font-weight:600;color:var(--text);}
.tkx-lk small{font-family:var(--font-body);font-size:10px;font-weight:600;letter-spacing:.02em;color:var(--text-dim);}
.tkx-lk:hover,.tkx-lk:focus-visible{border-color:var(--brand-blue);outline:0;} .tkx-lk:hover b{color:var(--brand-blue);}
.tkx-lk.done b{color:var(--text-mute);font-weight:500;}
.tkx-lk.lk-duplicate,.tkx-lk.lk-duplicated_by{border-style:dashed;}
.tkx-lk.lk-duplicate small,.tkx-lk.lk-duplicated_by small{color:#9A5B00;}
.tkx-lk.lk-blocked_by small{color:var(--err);}
.tkx-lk-more{appearance:none;flex:none;border:1px solid var(--line);background:var(--surface-2);color:var(--text-mute);border-radius:999px;padding:0 7px;font:inherit;font-size:11px;font-weight:600;line-height:18px;cursor:pointer;}
.tkx-lk-more:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
.tkx-card .tc-links{margin-top:7px;display:flex;} .tkx-card .tc-links .tkx-rl-links{margin-left:0;flex-wrap:wrap;overflow:visible;row-gap:4px;}
/* in the table the linked tickets have a line of their own under the reference, wrapping rather than clipping */
.tkx-linkrow{display:flex;margin-top:4px;min-width:0;}
.tkx-linkrow .tkx-rl-links{margin-left:0;flex:1 1 auto;flex-wrap:wrap;overflow:visible;row-gap:3px;}
.tkx-dense .tkx-linkrow{margin-top:2px;}

/* ── the group heading rows (Group: status · priority · site · assignee · day) ── */
.tkx-table tr.tkx-grp,.tkx-table tbody tr.tkx-grp:hover{cursor:default;background:var(--surface);}
.tkx-table tr.tkx-grp td{padding:14px 14px 7px 12px;border-bottom:1px solid var(--line);}
.tkx-table tr.tkx-grp:first-child td{padding-top:10px;}
.tkx-grp-in{display:inline-flex;align-items:center;gap:8px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);}
.tkx-grp-in .tkx-grp-t{color:var(--text-mute);font-weight:600;}
.tkx-grp-dot{width:8px;height:8px;border-radius:50%;flex:none;}
.tkx-grp-n{font-size:10px;font-weight:700;letter-spacing:.04em;padding:1px 7px;border-radius:999px;background:var(--surface-2);border:1px solid var(--line);color:var(--text-mute);font-variant-numeric:tabular-nums;line-height:14px;}
.tkx-grp-card{display:flex;align-items:center;gap:10px;margin:12px 4px 6px;}
.tkx-grp-card::after{content:"";flex:1;height:1px;background:var(--line);}
.tkx-phone .tkx-grp-card:first-child{margin-top:4px;}

/* ── compact rows: the same row at two thirds of the height, for a desk that scans hundreds ── */
.tkx-dense .tkx-table tbody td{padding:6px 14px;}
.tkx-dense .tkx-table td.tk-subj{padding-left:12px;}
.tkx-dense .tkx-table th.tkx-th{padding:8px 14px;}
.tkx-dense .tkx-pbar{height:26px;}
.tkx-dense .tkx-refline{margin-top:0;}
.tkx-dense .tkx-table tr.tkx-grp td{padding:10px 14px 5px 12px;}

/* ── the quick actions (Take, Flag), as the pointer reaches the row or the row has focus; a raised flag always shows ── */
.tkx-table th.tkx-th-plain{width:1%;padding:10px 10px;background:var(--surface);border-bottom:1px solid var(--line);}
.tkx-table td.tk-act{width:1%;padding-left:6px;padding-right:10px;white-space:nowrap;text-align:right;}
.tkx-qa{display:inline-flex;align-items:center;gap:4px;}
.tkx-qa-b{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--text-mute);font:inherit;cursor:pointer;opacity:0;transition:opacity .12s,border-color .12s,color .12s;}
.tkx-qa-b svg{width:13px;height:13px;}
.tkx-qa-b.on,.tkx-table tbody tr:hover .tkx-qa-b,.tkx-table tbody tr:focus-within .tkx-qa-b{opacity:1;}
.tkx-qa-b:hover{border-color:var(--brand-blue);color:var(--brand-blue);}
.tkx-qa-b.on{color:var(--err);border-color:rgba(220,38,38,.3);background:rgba(220,38,38,.06);}
.tkx-qa-b:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;opacity:1;}
@media (hover:none){ .tkx-qa-b{opacity:1;} }   /* a tablet has no pointer to reach the row with */
.tkx-dense .tkx-table .tkx-qa-b{width:24px;height:24px;}

/* ── the toolbar's view controls, at the end of the filters line: Group and the density ── */
.tkx-tb-view{display:inline-flex;align-items:center;gap:6px;margin-left:auto;}
.tkx-tb2 .tkx-tb-view .tkx-select{height:28px;min-height:28px;padding:0 26px 0 10px;font-size:12px;border-radius:999px;max-width:170px;}
.tkx-tb2 .tkx-tb-view .tkx-select.on{border-color:rgba(var(--bc-accent-rgb),.4);color:var(--brand-blue);font-weight:600;}
.tkx-dense-btn{appearance:none;display:inline-flex;align-items:center;gap:6px;min-height:28px;padding:0 11px;border:1px solid var(--line);border-radius:999px;background:var(--surface);color:var(--text-mute);font:inherit;font-size:12px;font-weight:500;cursor:pointer;white-space:nowrap;}
.tkx-dense-btn svg{width:13px;height:13px;}
.tkx-dense-btn:hover{border-color:var(--line-2);color:var(--text);}
.tkx-dense-btn.on{background:var(--accent-soft,var(--bc-accent-soft));border-color:rgba(var(--bc-accent-rgb),.32);color:var(--brand-blue);font-weight:600;}
@media (max-width:700px){ .tkx-tb-view{display:none;} }   /* the phone draws cards; its toolbar keeps its budget (v455) */

/* ── the Linked tickets card: the rows read as the desk's do, under the kind of link where there is more than one ── */
.tkl-card .sbx-head .tkl-add{border-radius:6px;}
.tkl-grp-h{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);padding:10px 0 3px;}
.tkl-grp-h:first-child{padding-top:2px;}
.lk-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:4px 10px;padding:8px 0;border-bottom:1px solid var(--line);cursor:default;min-height:44px;}
.lk-row:last-child{border-bottom:0;}
.lk-row .tkx-pri{align-self:flex-start;margin-top:2px;}
.lk-row .rel-subj{display:flex;flex-direction:column;gap:2px;min-width:0;font-weight:500;letter-spacing:0;white-space:normal;overflow:visible;cursor:pointer;}
.lk-l1{display:flex;align-items:baseline;gap:7px;min-width:0;}
.lk-ref{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:600;color:var(--text-mute);flex:none;}
.lk-subj{font-size:13px;font-weight:500;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.lk-row:hover .lk-subj,.lk-row .rel-subj:focus-visible .lk-subj{color:var(--brand-blue);}
.lk-row .rel-subj:focus-visible{outline:2px solid var(--brand-blue);outline-offset:2px;border-radius:4px;}
.lk-meta{font-size:11px;color:var(--text-dim);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.lk-l2{display:flex;align-items:center;gap:8px;min-width:0;margin-top:1px;}
.lk-l2 .pill.tkx-st{font-size:10px;padding:1px 7px 1px 6px;flex:none;}
.lk-l2 .lk-meta{flex:1 1 auto;}
.lk-dot{margin:0 5px;color:var(--text-dim);}
.lk-right{display:inline-flex;align-items:center;flex:none;margin-left:auto;}   /* the kind, at the end of the second line */
.lk-rel{appearance:none;-webkit-appearance:none;border:1px solid transparent;background:transparent no-repeat right 5px center;background-size:9px;color:var(--text-mute);font:inherit;font-size:11px;font-weight:600;padding:2px 17px 2px 6px;border-radius:6px;cursor:pointer;max-width:124px;text-overflow:ellipsis;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2375899B' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><path d='M6 9l6 6 6-6'/></svg>");}
.lk-rel:hover,.lk-rel:focus-visible{border-color:var(--line);background-color:var(--surface);color:var(--text);outline:0;}
.lk-rel-t{font-size:11px;font-weight:600;color:var(--text-dim);}
.lk-row.lk-duplicate .lk-rel,.lk-row.lk-duplicate .lk-rel-t,.lk-row.lk-duplicated_by .lk-rel,.lk-row.lk-duplicated_by .lk-rel-t{color:#9A5B00;}
.lk-row.lk-blocked_by .lk-rel,.lk-row.lk-blocked_by .lk-rel-t{color:var(--err);}
.lk-row.done .lk-subj{color:var(--text-mute);} .lk-row.done .lk-ref{color:var(--text-dim);}
.lk-row .lk-x{align-self:center;}
.lk-row.lk-brief .lk-subj{font-weight:400;}
.tkl-empty{display:flex;gap:10px;align-items:flex-start;padding:6px 0 8px;font-size:12px;color:var(--text-mute);line-height:1.45;}
.tkl-empty-ico{flex:none;width:28px;height:28px;border-radius:8px;background:var(--surface-2);border:1px solid var(--line);display:inline-flex;align-items:center;justify-content:center;color:var(--text-dim);} .tkl-empty-ico svg{width:13px;height:13px;}
.tkl-empty b{display:block;color:var(--text);font-weight:600;margin-bottom:1px;}
.tkw .tkd-side .sbx.tkl-card.tkl-lit{border-color:var(--brand-blue);box-shadow:0 0 0 3px var(--accent-glow);transition:box-shadow .3s,border-color .3s;}
/* the picker: the kind first, what it means, then the search (suggestions before a word is typed) */
.tkl-pick{margin-top:8px;padding:10px;border:1px solid var(--line-2);border-radius:10px;background:var(--surface);box-shadow:var(--shadow-sm);gap:8px;}
.tkl-kinds{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:3px;padding:3px;border:1px solid var(--line);border-radius:9px;background:var(--surface-2);}   /* two by two: the side column is 337px, and "Duplicate of" must read whole */
.tkl-kind{appearance:none;border:0;background:transparent;color:var(--text-mute);font:inherit;font-size:12px;font-weight:600;padding:6px 4px;border-radius:7px;cursor:pointer;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-height:30px;}
.tkl-kind:hover{color:var(--text);}
.tkl-kind.on{background:var(--surface);color:var(--brand-blue);box-shadow:var(--shadow-sm);}
.tkl-kind:focus-visible{outline:2px solid var(--brand-blue);outline-offset:1px;}
.tkl-kind-say{font-size:11px;color:var(--text-mute);line-height:1.45;padding:0 2px;}
.tkl-pick .tkt-lklist{max-height:300px;border-radius:8px;padding:4px;}
.tkl-pick .tkl-grp-h{padding:4px 6px 4px;}
.lk-hit{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;padding:7px 8px;border-radius:7px;cursor:pointer;}
.lk-hit:hover,.lk-hit:focus-visible{background:var(--accent-soft,var(--bc-accent-soft));outline:0;}
.lk-hit-t{display:flex;flex-direction:column;gap:1px;min-width:0;}
.lk-hit .lk-meta em{font-style:normal;color:var(--brand-blue);font-weight:600;}
.lk-hit .pill.tkx-st{font-size:10px;padding:2px 8px 2px 7px;}
.tkl-pick-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;}
/* the band over the conversation: a duplicate, the duplicates of this one, a blocker still open */
.tkl-ban{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 12px;padding:10px 12px 10px 14px;border-radius:10px;border:1px solid var(--line);background:var(--surface-2);font-size:13px;}
.tkl-ban.dup{background:#FFF8EA;border-color:rgba(217,119,6,.32);}
.tkl-ban.dupby{background:var(--accent-soft,var(--bc-accent-soft));border-color:rgba(var(--bc-accent-rgb),.2);}
.tkl-ban.blocked{background:rgba(220,38,38,.05);border-color:rgba(220,38,38,.26);}
.tkl-ban-ico{flex:none;width:30px;height:30px;border-radius:9px;background:var(--surface);border:1px solid var(--line);display:inline-flex;align-items:center;justify-content:center;color:var(--text-mute);} .tkl-ban-ico svg{width:14px;height:14px;}
.tkl-ban.dup .tkl-ban-ico{color:#9A5B00;} .tkl-ban.dupby .tkl-ban-ico{color:var(--brand-blue);} .tkl-ban.blocked .tkl-ban-ico{color:var(--err);}
.tkl-ban-t{flex:1 1 200px;min-width:0;display:flex;flex-direction:column;gap:1px;line-height:1.35;}
.tkl-ban-t b{font-weight:600;color:var(--text);} .tkl-ban-t span{font-size:12px;color:var(--text-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tkl-ban-t a{color:var(--brand-blue);cursor:pointer;} .tkl-ban-t a:hover{text-decoration:underline;}
.tkl-ban-st{display:inline-flex;align-items:center;gap:5px;font-weight:600;color:var(--sc,var(--text-mute));} .tkl-ban-st::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--sc,currentColor);}
.tkl-ban-acts{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-left:auto;}
.tkl-ban-acts .btn.xs{border-radius:7px;min-height:30px;}
.tkl-ban.dup .tkl-ban-acts .btn.xs:not(.ghost){background:#9A5B00;border-color:#9A5B00;color:#fff;}
.tkl-ban.dup .tkl-ban-acts .btn.xs:not(.ghost):hover{background:#7C4A00;border-color:#7C4A00;}
/* the head's Linked chip is a way to the card */
.tkw .tkd-hero-chips .tkd-linkchip{appearance:none;font:inherit;cursor:pointer;}
.tkw .tkd-hero-chips .tkd-linkchip .ph-cdot{background:var(--brand-blue);}
.tkw .tkd-hero-chips .tkd-linkchip:hover .ph-cv,.tkw .tkd-hero-chips .tkd-linkchip:hover .ph-cl{color:var(--brand-blue);text-decoration:underline;text-underline-offset:2px;}
.tkw .tkd-hero-chips .tkd-linkchip:focus-visible{outline:2px solid var(--brand-blue);outline-offset:3px;border-radius:4px;}
/* the Details tab's Linked tickets row: each reference a way there */
.tkd-details .ex-v a{cursor:pointer;}
@media (max-width:700px){
  .tkl-kind{min-height:40px;}
  .tkl-ban-acts{margin-left:0;width:100%;} .tkl-ban-acts .btn.xs{min-height:40px;}
  .lk-rel,.lk-rel-t{display:none;}   /* the kind reads in the group heading; changing it is a desk's act */
  .tkx-lk small{display:none;}
}
/* ═══ end v1.4.10.660 ═══ */

/* ═══ v1.4.10.661 — THE DESK, A SECOND PASS: who spoke last, several at once, similar tickets as one is raised ═══════════════
   Jay: "make it even more amazing, also no bugs and structurally well done." (js/03-pages.js tkxLastLine, SEVERAL AT ONCE;
   js/06 SIMILAR OPEN TICKETS.) The later block that wins; every size a step of the scale. ═══ */

/* ── the Latest cell: the time, and under it who spoke last; amber while the requester's word is the last on an open ticket ── */
.tkx-latest{display:inline-flex;flex-direction:column;gap:2px;min-width:0;}
.tkx-last{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:110px;}
.tkx-last svg{width:11px;height:11px;flex:none;}
.tkx-last.hot{color:#9A5B00;font-weight:600;}
.tkx-unseen .tkx-last{color:var(--text-mute);}
.tkx-mini.reply{background:rgba(217,119,6,.10);color:#9A5B00;border-color:rgba(217,119,6,.3);font-weight:600;}
.tkx-mini.reply svg{width:11px;height:11px;}
.tkw .tkd-hero-chips .tkd-reply-chip .ph-cv{color:#9A5B00;}
@media (max-width:1279px){ .tkx-table .tkx-last{max-width:120px;} }

/* ── the boxes and the selected rows ── */
.tkx-table th.tkx-th-plain.tk-sel,.tkx-table td.tk-sel{width:1%;padding-left:12px;padding-right:0;}
.tkx-table td.tk-sel + td.tk-subj{padding-left:10px;}
.tkx-cb{appearance:auto;-webkit-appearance:auto;width:16px;height:16px;margin:0;accent-color:var(--brand-blue);cursor:pointer;vertical-align:middle;display:block;}
.tkx-table tbody tr.tkx-selected,.tkx-table tbody tr.tkx-selected:hover{background:var(--accent-soft,var(--bc-accent-soft));}
.tkx-table tbody tr.tkx-selected td{border-bottom-color:rgba(var(--bc-accent-rgb),.18);}
.tkx-dense .tkx-cb{width:15px;height:15px;}
/* the bulk bar over the table */
.tkx-bulk{display:flex;align-items:center;gap:10px 14px;flex-wrap:wrap;margin:0 0 10px;padding:8px 8px 8px 14px;border-radius:12px;background:var(--accent-soft,var(--bc-accent-soft));border:1px solid rgba(var(--bc-accent-rgb),.3);}
@media (prefers-reduced-motion:no-preference){ .tkx-bulk{animation:tkxDrop .2s var(--av-ease,ease);} }
.tkx-bulk-n{font-size:13px;color:var(--text);white-space:nowrap;display:inline-flex;align-items:center;gap:6px;}
.tkx-bulk-n b{color:var(--brand-blue);font-weight:600;}
.tkx-bulk-sub{font-size:12px;color:var(--text-mute);font-weight:400;}
.tkx-bulk-acts{display:flex;align-items:center;gap:6px;flex-wrap:wrap;flex:1 1 auto;min-width:0;}
.tkx-bulk-acts .btn.xs{min-height:30px;border-radius:8px;}
.tkx-bulk-acts .btn.xs:not(.ghost){background:var(--brand-blue);border-color:var(--brand-blue);color:#fff;}
.tkx-bulk-acts .btn.xs.ghost{background:var(--surface);}
.tkx-bulk-acts .ex-sel.xs{min-height:30px;font-size:12px;padding:0 26px 0 9px;border-radius:8px;background-color:var(--surface);max-width:150px;}
.tkx-bulk-acts .btn[disabled],.tkx-bulk-acts .ex-sel[disabled]{opacity:.5;cursor:default;}
.tkx-bulk-sep{width:1px;height:20px;background:rgba(var(--bc-accent-rgb),.22);margin:0 2px;flex:none;}
.tkx-bulk-x{appearance:none;flex:none;margin-left:auto;border:0;background:transparent;color:var(--text-mute);width:30px;height:30px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;}
.tkx-bulk-x:hover{background:rgba(var(--bc-accent-rgb),.1);color:var(--text);}
.tkx-bulk-x svg{width:14px;height:14px;}
@media (max-width:1023px){ .tkx-bulk-sep{display:none;} }
@media (max-width:760px){
  .tkx-bulk{padding:8px 8px 8px 12px;}
  .tkx-bulk-acts{width:100%;order:3;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding-bottom:2px;}
  .tkx-bulk-acts::-webkit-scrollbar{display:none;}
  .tkx-bulk-acts .btn.xs,.tkx-bulk-acts .ex-sel.xs{min-height:40px;flex:none;}
  .tkx-bulk-x{min-width:40px;min-height:40px;}
}

/* ── similar open tickets under the short description of a new ticket ── */
.nt-similar{display:none;}
.nt-similar.on{display:block;margin:-4px 0 12px;padding:10px 12px;border:1px solid rgba(217,119,6,.32);border-radius:10px;background:#FFF8EA;}
.nt-sim-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px;font-size:12px;color:var(--text-mute);}
.nt-sim-h svg{width:13px;height:13px;color:#9A5B00;flex:none;}
.nt-sim-h b{color:var(--text);font-weight:600;}
.nt-sim-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;align-items:center;gap:4px 10px;padding:7px 0;border-top:1px solid rgba(217,119,6,.18);}
.nt-sim-row.on{background:var(--surface);margin:0 -6px;padding-left:6px;padding-right:6px;border-radius:8px;border-top-color:transparent;}
.nt-sim-t{display:flex;flex-direction:column;gap:2px;min-width:0;}
.nt-sim-t .lk-meta em{font-style:normal;color:#9A5B00;font-weight:600;}
.nt-sim-row .pill.tkx-st{font-size:10px;padding:2px 8px 2px 7px;}
.nt-sim-acts{display:inline-flex;align-items:center;gap:4px;flex:none;}
.nt-sim-acts .btn.xs{min-height:28px;border-radius:7px;white-space:nowrap;}
.nt-sim-acts .btn.xs:not(.ghost){background:#9A5B00;border-color:#9A5B00;color:#fff;}
@media (max-width:700px){
  .nt-sim-row{grid-template-columns:auto minmax(0,1fr) auto;}
  .nt-sim-acts{grid-column:1 / -1;justify-content:flex-end;}
  .nt-sim-acts .btn.xs{min-height:40px;}
}
/* ═══ end v1.4.10.661 ═══ */

/* ═══ v1.4.10.662 — Crestron XiO Cloud ⇄ assets (js/05 aeXioRender, adXioLazy, xioOpenMapper) ═════════════════════════════
   Jay: "make Crestron (XiO Cloud) much much better integrating with assets." The editor's picker shares the Q-SYS picker's
   rows (.ae-qsys-dev); a device that matches this asset's serial, MAC or IP leads and says why. The asset record's XiO row
   and the mapper modal are their own. ═══ */
.ae-qsys-dev.ae-xio-match{border-color:rgba(var(--bc-accent-rgb),.35);background:var(--accent-soft,var(--bc-accent-soft));}
.ae-xio-why{font-style:normal;font-size:11px;font-weight:600;color:var(--brand-blue);margin-left:6px;}
/* the asset record's XiO Cloud row */
.ad-xio-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;}
.ad-xio-row .pill{font-size:11px;}
.ad-xio-t{min-width:0;overflow-wrap:anywhere;} .ad-xio-t code{font-family:var(--font-mono);font-size:12px;background:var(--surface-2);padding:1px 5px;border-radius:4px;}
.ad-xio-acts{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:6px;}
.ad-xio-acts .btn.xs{min-height:28px;border-radius:7px;text-decoration:none;}
.ad-xio-acts .btn.xs svg{width:12px;height:12px;}
/* the mapper */
.xiom-head{display:flex;flex-direction:column;gap:8px;margin-bottom:10px;}
.xiom-facts{font-size:13px;color:var(--text-mute);} .xiom-facts b{color:var(--text);font-weight:600;}
.xiom-acts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.xiom-acts .ex-sel{flex:1 1 220px;min-width:0;}
.xiom-list{border:1px solid var(--line);border-radius:10px;overflow:hidden;}
.xiom-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:6px 12px;padding:10px 12px;border-bottom:1px solid var(--line);}
.xiom-row:last-child{border-bottom:0;}
.xiom-row.on{background:var(--accent-soft,var(--bc-accent-soft));}
.xiom-row > .dot{width:8px;height:8px;}
.xiom-dev{min-width:0;} .xiom-dev-t{font-weight:600;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.xiom-link{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end;min-width:0;}
.xiom-link .btn.xs{min-height:28px;border-radius:7px;white-space:nowrap;}
.xiom-chip{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;padding:3px 9px;border:1px solid var(--line);border-radius:999px;background:var(--surface);color:var(--text);}
.xiom-chip svg{width:12px;height:12px;color:var(--text-dim);} .xiom-chip a{color:var(--brand-blue);cursor:pointer;}
.xiom-pick{display:flex;flex-direction:column;gap:6px;min-width:min(360px,100%);}
.xiom-pick-list{max-height:220px;overflow:auto;border:1px solid var(--line);border-radius:8px;background:var(--surface);padding:4px;}
.xiom-pick-row{appearance:none;display:flex;flex-direction:column;align-items:flex-start;gap:1px;width:100%;text-align:left;border:0;background:transparent;font:inherit;font-size:13px;color:var(--text);padding:7px 8px;border-radius:6px;cursor:pointer;}
.xiom-pick-row:hover,.xiom-pick-row:focus-visible{background:var(--accent-soft,var(--bc-accent-soft));outline:0;}
@media (max-width:700px){
  .xiom-row{grid-template-columns:auto minmax(0,1fr);} .xiom-link{grid-column:1 / -1;justify-content:flex-start;}
  .xiom-link .btn.xs,.ad-xio-acts .btn.xs{min-height:40px;}
}
/* ═══ end v1.4.10.662 ═══ */
/* ═══ v1.4.10.666: maintenance plans — the cadence picker, the Plans view, the scheduler, the editor's plan block ═══ */
.mp-cad{display:flex;flex-direction:column;gap:8px;}
.mp-cad-row{display:flex;flex-wrap:wrap;gap:6px;}
.mp-cad-b{appearance:none;border:1px solid var(--line);background:var(--surface);color:var(--text);font:inherit;font-size:13px;font-weight:600;padding:7px 12px;border-radius:999px;cursor:pointer;min-height:34px;transition:border-color .14s,background .14s;}
.mp-cad-b:hover{border-color:var(--line-2);background:var(--surface-2);}
.mp-cad-b.on{border-color:var(--brand-blue,var(--bc-blue-v1));background:var(--accent-glow,rgba(var(--bc-accent-rgb),.07));box-shadow:0 0 0 1px var(--brand-blue,var(--bc-blue-v1)) inset;color:var(--brand-blue,var(--bc-blue-v1));}
.mp-cad-custom{display:flex;align-items:center;gap:8px;font-size:13px;}
.mp-cad-custom input{width:84px;} .mp-cad-custom select{width:auto;min-width:110px;}
.mp-cad-prev{font-style:normal;font-size:12px;color:var(--text-mute);line-height:1.4;}
.mp-auto{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;}
.mp-ahead{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--text-mute);} .mp-ahead input{width:72px;} .mp-ahead.off{opacity:.45;pointer-events:none;}
/* the Plans view */
.mt-pstrip .mt-pchip.err .mt-cchip-n{color:var(--err);} .mt-pstrip .mt-pchip.warn .mt-cchip-n{color:var(--warn);}
.mt-ptable td{vertical-align:top;} .mt-pacts{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end;}
.mt-prow.is-overdue td:first-child{box-shadow:inset 3px 0 0 var(--err);} .mt-prow.is-due td:first-child{box-shadow:inset 3px 0 0 var(--warn);} .mt-prow.is-paused,.mt-prow.is-ended{opacity:.7;}
.mt-pcard .mt-pacts{margin-top:8px;justify-content:flex-start;}
.mt-plans-loading{padding:34px;text-align:center;color:var(--text-mute);display:flex;gap:8px;align-items:center;justify-content:center;} .mt-plans-loading svg{width:16px;height:16px;}
/* the calendar's plan-ahead chips */
.mtcal-chip.projected{opacity:.62;border-style:dashed;} .mtcal-leg i.ahead{background:transparent;border:1px dashed var(--text-mute);}
.mtv-plan-ahead{display:flex;flex-wrap:wrap;gap:6px;align-items:center;}
/* the scheduler */
#modal-inner .mps{max-width:860px;} .mps-body{display:flex;flex-direction:column;gap:18px;}
.mps-sec-h{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:10px;font-size:13px;}
.mps-filters{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px 14px;margin-bottom:10px;} .mps-filters .fld{margin:0;}
.mps-ticked{display:flex;align-items:center;gap:8px;font-size:13px;margin-bottom:10px;flex-wrap:wrap;} .mps-ticked svg{width:14px;height:14px;color:var(--ok);}
.mps-listbar{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:12px;color:var(--text-mute);margin-bottom:6px;} .mps-listbar span{display:inline-flex;gap:6px;align-items:center;flex-wrap:wrap;}
.mps-list{max-height:260px;overflow:auto;border:1px solid var(--line);border-radius:10px;background:var(--surface);padding:4px;}
.mps-list:empty{display:none;}
.mps-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:10px;align-items:center;padding:7px 8px;border-radius:7px;font-size:13px;cursor:pointer;} .mps-row:hover{background:var(--surface-2);} .mps-row.off{opacity:.5;}
.mps-row-t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .mps-row-s{font-size:12px;color:var(--text-mute);white-space:nowrap;}
.mps-empty{padding:14px 4px;}
.mps-form{padding:0;} .mps-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;} .mps-foot>div{display:flex;gap:8px;}
.mps-done{display:flex;flex-direction:column;gap:16px;} .mps-done-h{display:flex;gap:12px;align-items:flex-start;font-size:15px;} .mps-done-h svg{width:22px;height:22px;color:var(--ok);flex-shrink:0;}
.mps-skipped{display:flex;flex-direction:column;gap:6px;font-size:13px;} .mps-skip-row{display:flex;gap:8px;align-items:flex-start;}
/* the editor's plan block */
.ae-plan{margin-top:14px;padding:14px 16px;border:1px solid var(--line);border-radius:10px;background:var(--surface);display:flex;flex-direction:column;gap:10px;}
.ae-plan-h{display:flex;flex-direction:column;gap:2px;font-size:13px;} .ae-plan-h b{display:inline-flex;align-items:center;gap:6px;} .ae-plan-h svg{width:14px;height:14px;}
.ae-plan-body{display:flex;flex-direction:column;gap:8px;}
@media (max-width:700px){ .mps-filters{grid-template-columns:1fr 1fr;} .mps-row{grid-template-columns:auto minmax(0,1fr);} .mps-row-s{grid-column:2;white-space:normal;} .mp-cad-b{min-height:40px;} }
@media (max-width:480px){ .mps-filters{grid-template-columns:1fr;} }
/* ═══ end v1.4.10.666 ═══ */
/* ═══ v1.4.10.667: the Maintenance page's layout — seven tiles that fit, one Schedule button and its question, the scheduler without nested scroll ═══ */
.mt-rail.mt-rail-7{grid-template-columns:repeat(7,1fr);}
.mt-stat.mt-stat-plans{border-left:3px solid var(--brand-blue,var(--bc-blue-v1));}
@media(max-width:1280px){ .mt-rail.mt-rail-7{grid-template-columns:repeat(4,1fr);} }
@media(max-width:700px){ .mt-rail.mt-rail-7{grid-template-columns:repeat(2,1fr);} .mt-rail.mt-rail-7 .mt-stat-plans{grid-column:1 / -1;} }
/* Schedule: work or maintenance */
#modal-inner:has(> .mt-choose){max-width:640px;}
.mt-choose-body{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
.mt-choice{appearance:none;border:1px solid var(--line);background:var(--surface);border-radius:12px;padding:16px;display:flex;flex-direction:column;gap:8px;text-align:left;cursor:pointer;font:inherit;color:var(--text);min-height:132px;transition:border-color .14s,background .14s;}
.mt-choice:hover,.mt-choice:focus-visible{border-color:var(--brand-blue,var(--bc-blue-v1));background:var(--accent-glow,rgba(var(--bc-accent-rgb),.07));outline:0;}
.mt-choice-ico{display:inline-flex;width:34px;height:34px;align-items:center;justify-content:center;border-radius:9px;background:var(--surface-2);color:var(--brand-blue,var(--bc-blue-v1));} .mt-choice-ico svg{width:18px;height:18px;}
.mt-choice-t{font-weight:600;font-size:15px;letter-spacing:-.01em;} .mt-choice-d{font-size:13px;color:var(--text-mute);line-height:1.45;}
.mtcal-day-acts{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;margin-top:6px;}
/* the scheduler: wide, two columns at a desk, one scroll bar (the window's) */
#modal-inner.modal-wide.mps-wide{max-width:1080px;}
.mps .site-ed-body{max-height:none;overflow:visible;}
.mps-body{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:18px 26px;align-items:start;}
.mps-sec-assets,.mps-sec-plan{min-width:0;}
.mps-foot,.mps-done{grid-column:1 / -1;} .mps-foot{border-top:1px solid var(--line);padding-top:14px;}
.mps-list{max-height:none;overflow:visible;}
.mps-more{margin-top:8px;}
.mps-filters{grid-template-columns:repeat(2,minmax(0,1fr));}
@media (max-width:900px){ .mps-body{grid-template-columns:1fr;} }
@media (max-width:600px){ .mt-choose-body{grid-template-columns:1fr;} }
/* ═══ end v1.4.10.667 ═══ */
/* ═══ v1.4.10.668: the scheduler as two steps in the standard wide window; the asset's Schedule asks work or maintenance ═══ */
.mps-body{display:flex;flex-direction:column;gap:16px;}
.mps-steps{list-style:none;margin:0;padding:0 0 2px;display:flex;gap:22px;align-items:center;border-bottom:1px solid var(--line);padding-bottom:12px;}
.mps-steps li{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--text-mute);}
.mps-steps li span{display:inline-flex;width:22px;height:22px;align-items:center;justify-content:center;border-radius:50%;border:1px solid var(--line);font-size:12px;background:var(--surface);color:var(--text-mute);}
.mps-steps li span svg{width:12px;height:12px;}
.mps-steps li.on{color:var(--text);} .mps-steps li.on span{background:var(--brand-blue,var(--bc-blue-v1));border-color:var(--brand-blue,var(--bc-blue-v1));color:#fff;}
.mps-steps li.done span{background:var(--ok);border-color:var(--ok);color:#fff;} .mps-steps li em{font-style:normal;color:var(--text-mute);font-weight:500;}
.mps-filters{grid-template-columns:repeat(3,minmax(0,1fr));}
.mps-note{border:1px dashed var(--line-2);border-radius:10px;padding:14px 16px;font-size:13px;color:var(--text-mute);line-height:1.5;}
.mps-note.warn{border-style:solid;border-color:var(--warn);color:var(--text);margin-bottom:10px;} .mps-note b{color:var(--text);}
.mps-row{grid-template-columns:auto minmax(0,1fr);align-items:center;}
.mps-row-m{display:flex;flex-direction:column;gap:1px;min-width:0;}
.mps-row-s{grid-column:auto;}
.mps-sum{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface);font-size:13px;}
.mps-sum svg{width:14px;height:14px;color:var(--ok);flex-shrink:0;} .mps-sum .btn{margin-left:auto;}
.mps-skip{margin:0;} .mps-foot{margin-top:2px;}
.mps-form .fld{margin:0;min-width:0;} .mps-form .fld.col2{grid-column:1 / -1;}   /* the span rule lived under .ap-form alone, so Title, Repeats and Instructions sat in one column here */
.ap-choose-body{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:12px 16px 16px;}
.ap-form.ap-choose .ap-form-head{border-bottom:0;padding-bottom:4px;} .ap-choose-q{font-size:12px;}
@media (max-width:700px){ .mps-filters{grid-template-columns:1fr 1fr;} .ap-choose-body{grid-template-columns:1fr;} .mps-steps{gap:14px;} }
@media (max-width:480px){ .mps-filters{grid-template-columns:1fr;} }
/* ═══ end v1.4.10.668 ═══ */
/* ═══ v1.4.10.675: the Assets area, measured on every tab from 390 to 1920 wide ═══ */
/* 1. The grouped register between 761 and 1180 wide. The table scrolls sideways in its own box there (v618), and a box
   that scrolls is what its sticky headings stick to: they could not follow the page, but `top:64px` still moved them, so
   the heading row sat 64px below its place, over the first asset, with an empty band where it belonged. */
@media (min-width:761px) and (max-width:1180px){
  .asset-groups .ag-site table.dt.asset-dt thead th{position:static;}
}
/* 2. The register's toolbar.
   Clear all is at the chips' end at every width, as it was on a phone: in the toolbar its 68px came and went with the
   filters, and with it the view switch dropped to a line of its own. */
.asset-toolbar.ast-tb .atb-clear{display:none;}
@media (min-width:761px){
  .filter-chips .fchip-clear{display:inline-flex;align-items:center;padding:0 6px;border:0;background:none;font:inherit;font-size:12px;font-weight:600;
    color:var(--brand-blue);cursor:pointer;}
  .filter-chips .fchip-clear:hover{text-decoration:underline;}
}
/* 1400 and wider: one row. v658 widened the search (a 260px basis, 240px at least) and the row no longer added up from
   1400 to 1599, the two commonest laptop widths among them: the view switch sat alone on a second line. The search now
   starts from 200px and takes whatever the row has left; the view switch says its words from 1680. */
@media (min-width:1400px){
  .asset-toolbar.ast-tb .atb-search{flex:1 1 0;min-width:200px;}
  .asset-toolbar.ast-tb .atb-sel.atb-loc{flex:0 1 180px;}
  .asset-toolbar.ast-tb .atb-spacer{flex:0 0 4px;}
}
@media (min-width:1400px) and (max-width:1679px){
  .asset-toolbar.ast-tb .view-toggle .vt-l{display:none;}
  .asset-toolbar.ast-tb .view-toggle button{min-width:34px;}
}
/* 1280 to 1399: the row had 1px to spare at 1280, so the count on More filters wrapped it. Without the spacer it has 37. */
@media (min-width:1280px) and (max-width:1399px){ .asset-toolbar.ast-tb .atb-spacer{display:none;} }
/* 761 to 1279: two lines by design. Find on the first (the search across three columns, the sort, the view switch),
   narrow on the second (the four filters in the same columns, More filters under the view switch). It wrapped wherever
   the widths fell: the search squeezed to 163px beside four filters, the sort and the view switch alone underneath. */
@media (min-width:761px) and (max-width:1279px){
  .asset-toolbar.ast-tb{display:grid;grid-template-columns:repeat(4,minmax(0,1fr)) auto;align-items:center;}
  .asset-toolbar.ast-tb > *{min-width:0;}
  /* the five fixed places are named, row and column: the filters then fill the second line's first four cells in order */
  .asset-toolbar.ast-tb .atb-search{grid-row:1;grid-column:1 / span 3;min-width:0;}
  .asset-toolbar.ast-tb .atb-sel.atb-sort{grid-row:1;grid-column:4;}
  .asset-toolbar.ast-tb .view-toggle{grid-row:1;grid-column:5;justify-self:end;}
  .asset-toolbar.ast-tb .atb-more{grid-row:2;grid-column:5;justify-self:stretch;justify-content:center;}
  .asset-toolbar.ast-tb .atb-spacer{display:none;}
  .asset-toolbar.ast-tb .atb-row2{grid-row:3;grid-column:1 / -1;}
  .asset-toolbar.ast-tb > .atb-sel,.asset-toolbar.ast-tb > .atb-sel.atb-loc{max-width:none;min-width:0;width:100%;}
  .asset-toolbar.ast-tb > .atb-sel select{max-width:none;width:100%;}
}
/* 3. The tabs between 701 and 1227 wide take two lines, and the hairline after a line's last group hung at its end.
   The hairlines become plain gaps there, so a group still reads as a group and nothing dangles. */
@media (min-width:701px) and (max-width:1227px){ #content .seg.ast-tabs .seg-sep{background:none;margin:0 3px;} }
/* 4. The head on a tablet: the status mix takes the panel's width (it stopped at 520px with the rest of its line empty). */
@media (max-width:1099px){ .ast-mix{width:100%;} }
/* 5. A note's delete button had no style of its own (only a file row's did): it drew as the browser's grey bevelled
   button. The same bordered square as a file's Remove. */
.anote .att-del{display:inline-flex;align-items:center;justify-content:center;flex:none;width:32px;height:32px;padding:0;
  border:1px solid color-mix(in srgb,var(--err) 40%,var(--line-2));border-radius:8px;background:var(--surface);color:var(--err);cursor:pointer;}
.anote .att-del svg{width:15px;height:15px;}
.anote .att-del:hover{background:color-mix(in srgb,var(--err) 10%,var(--surface));border-color:var(--err);}
/* 6. The asset's rail: "Connected & parts" lost its end ("Connected & p…") whenever the rail had a scroll bar, which is
   every window 768px tall. 8px wider, the gaps 2px tighter. */
@media (min-width:681px){ .adt-tabs{width:234px;} .adt-tab{gap:9px;} }
/* 7. Validation between 761 and 1279 wide: the three actions wrapped into a ragged column at the head's right (one to a
   line, each its own width); they take a line of their own under the words, left to right. A tile's second line was
   cut ("Found by a scan, not yet…"): it wraps. */
@media (min-width:761px) and (max-width:1100px){
  .vq-head .panel-head{flex-wrap:wrap;}
  .vq-head .panel-head .head-actions.vq-head-acts{flex:1 1 100%;flex-wrap:wrap;justify-content:flex-start;}
}
@media (min-width:761px) and (max-width:1279px){ .vq-tile-s{white-space:normal;} }
/* 8. What needs doing: a tile's share bar sits inside the tile's sides, on a track that can be seen. It ran from the
   very corner, so a small share (4 of 96) was a 9px stub tucked into the rounded corner, on a track the colour of the
   tile: it read as a mark left on the corner, not as a bar. */
.akpi-rail.ast-rail .akpi .mini{left:12px;right:12px;height:3px;border-radius:3px 3px 0 0;background:var(--surface-3,#E9EEF6);}
.akpi-rail.ast-rail .akpi .mini > span{border-radius:3px 3px 0 0;min-width:8px;}
/* 9. A phone. The asset's inline forms (a contract, a maintenance plan, a booking) open to a fixed 900px and clip what is
   past it; in one column the contract form is 1,175px and the plan form 1,088px, so the notes and the Cancel / Save row
   were cut off with nothing to scroll: the form could not be saved. The opening height has room for them. */
@media (max-width:700px){ .ap-form.open{max-height:2600px;} }
/* Site assets on a phone: the client and the site pickers each take the row (side by side at 153px, "Choose a site…"
   and most site names were cut). */
@media (max-width:480px){ .sv-pickbar .sv-f-client,.sv-pickbar .sv-f-site{flex:1 1 100%;}
  /* and, with a site chosen, the filter box takes the row over the site sheet's button (beside it the box was 176px
     and "Filter rooms, tags, models…" was cut) */
  .sv-pickbar .sv-f-q{flex:1 1 100%;} .sv-pickbar > .btn{flex:1 1 100%;justify-content:center;min-height:40px;} }
/* 10. The asset's window: a tab's panels stand evenly apart. Each section holds one panel, a panel that is its
   section's last child has no bottom margin, and the sections were 4px apart (0 in Files & notes), so Files sat on
   Photos, Test & tag on the label, and Connected's three panels 4px from each other. In Value & costs the panels are
   spaced by the column's own 18px gap, and half of them carried the 16px margin as well: 34px in places, 18px in
   others, and the two side-by-side panels ended at different heights. */
.adt-pane .adt-sec + .adt-sec,#adt-documents .adt-sec + .adt-sec{margin-top:16px;}
.adt-pane .avv .avv-panel{margin-bottom:0;}
/* ═══ end v1.4.10.675 ═══ */

/* ═══ v1.4.10.676: the room layouts and the Rooms pages ═══ */
/* (1) A layout's picture while it arrives. The canvas took its height from the <img>, so the first showing of a layout
   (and every repaint after it) folded the panel to nothing and opened it again, the page jumping under the pointer. The
   canvas now waits at 16:9 with its pins hidden (they are placed in % of the picture, not of the placeholder), says so
   if the picture takes more than a moment, and takes the picture's own shape when it lands; the shape is kept
   (LOC_PAGE.layoutAR), so later repaints hold their height from the start. */
.loc-layout-canvas.has-plan.img-wait{aspect-ratio:16/9;overflow:hidden;}
.loc-layout-canvas.img-wait .loc-layout-img{position:absolute;left:0;top:0;opacity:0;}
.loc-layout-canvas.img-wait .loc-pin,.loc-layout-canvas.img-wait .loc-layout-tag,.loc-layout-canvas.img-wait .loc-layout-empty,.loc-layout-canvas.img-wait .loc-layout-zoom{visibility:hidden;}
.loc-layout-canvas.img-wait::after{content:'Loading the picture\2026';position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--text-mute);opacity:0;animation:locImgWait .2s linear .4s forwards;}
@keyframes locImgWait{to{opacity:1;}}
.loc-layout-canvas.img-wait.zoomable{cursor:default;}
/* a portrait picture is drawn no wider than lets the whole of it fit in the window (locLayoutShapeCss), centred on grey */
.loc-layout-stage{background:var(--surface-3);}
.loc-layout-stage > .loc-layout-canvas{margin:0 auto;}
/* (2) the note under a layout whose picture could not be loaded */
.loc-layout-note{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:9px 14px;border-top:1px solid var(--line);background:color-mix(in srgb, var(--warn) 9%, var(--surface));font-size:13px;color:var(--text);}
.loc-layout-note-ico{flex:none;display:inline-flex;color:var(--warn);} .loc-layout-note-ico svg{width:14px;height:14px;}
.loc-layout-note-t{flex:1 1 220px;min-width:0;line-height:1.45;}
/* ═══ end v1.4.10.676 ═══ */

/* ═════════════════════════════════════════════════════════════════════════
   v1.4.10.678 — WHITE LABEL: an integrator's own address
   ─────────────────────────────────────────────────────────────────────────
   Where an integrator's brand is worn (html.wl-on, js/01-core.js brandPaint)
   its name and logo take the places AVDesk's marks leave. index.html hides
   the marks (data-avd) and shows these places (data-wl) from its own inline
   rules, before this sheet has arrived; the rules here only draw them.
   An integrator's logo is drawn for a white ground: on the navy sign-in stage
   and wherever there is no logo, its name is set in words.
   ═════════════════════════════════════════════════════════════════════════ */
/* the estate drawing behind the sign-in stage carries AVDesk's mark as a rooftop sign: where an integrator's brand is
   worn, or about to be (html.wl-hide, set by index.html before the first paint), the copy without the sign is drawn */
html.wl-hide #login .lg-media,html.wl-on #login .lg-media{background-image:url(../img/login-estate-plain.svg);}
#login .lg-wl-name{font-family:var(--font-display);font-size:20px;font-weight:600;line-height:1.2;letter-spacing:-.012em;color:var(--lg-on-navy,#fff);overflow-wrap:anywhere;}
#login .lg-wl-logo{margin:0 0 26px;min-height:34px;}
#login .lg-wl-logo img.av-wordmark{height:34px;width:auto;max-width:240px;object-fit:contain;object-position:left center;}
.wl-name-text{display:inline-block;font-family:var(--font-display);font-size:18px;font-weight:600;line-height:1.2;letter-spacing:-.012em;color:var(--text);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;}
html.wl-on #brand-logo{max-width:200px;min-width:0;}
html.wl-on #brand-logo img.av-wordmark{max-width:180px;object-fit:contain;object-position:left center;}
html.wl-on #brand-logo .wl-name-text{font-size:16px;max-width:200px;}
@media (max-width:600px){ html.wl-on #brand-logo{max-width:132px;} html.wl-on #brand-logo img.av-wordmark{max-width:120px;} html.wl-on #brand-logo .wl-name-text{font-size:14px;max-width:132px;} }
/* an address under the white label domain that is nobody's (brandNotInUse) */
#login .wl-none-card h2{margin:0 0 10px;}
#login .wl-none-card .sub{margin:0;}
/* the White label panel on an integrator's profile, and its dialog (js/03-pages.js custWlPanel, custWlOpen) */
.wl-panel-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:2px 0 8px;}
.wl-state{display:inline-flex;align-items:center;gap:6px;padding:3px 9px;border-radius:999px;font-size:12px;font-weight:600;line-height:1.3;background:var(--surface-3);color:var(--text-mute);}
.wl-state.on{background:color-mix(in srgb,var(--ok) 14%,var(--surface));color:var(--ok);}
.wl-addr{font-size:13px;font-weight:600;overflow-wrap:anywhere;}
.wl-addr-box{display:flex;align-items:stretch;max-width:100%;}
.wl-addr-box input{flex:1 1 auto;min-width:0;border-top-right-radius:0;border-bottom-right-radius:0;}
.wl-addr-box .wl-addr-dom{display:inline-flex;align-items:center;padding:0 10px;border:1px solid var(--line-2);border-left:0;border-radius:0 var(--r-ctl) var(--r-ctl) 0;background:var(--surface-2);font-size:13px;color:var(--text-mute);white-space:nowrap;}
.wl-note{font-size:12px;line-height:1.5;color:var(--text-mute);margin:8px 0 0;}
.wl-note.warn{color:var(--text);background:color-mix(in srgb,var(--warn) 10%,var(--surface));border:1px solid color-mix(in srgb,var(--warn) 30%,var(--line));border-radius:6px;padding:8px 10px;}
.wl-msg{font-size:12px;line-height:1.45;margin:6px 0 0;min-height:17px;color:var(--danger,#B91C1C);}
/* ═══ end v1.4.10.678 ═══ */

/* ═════════════════════════════════════════════════════════════════════════
   v1.4.10.679 — WHITE LABEL: the brand editor, and what it adds to the page
   ─────────────────────────────────────────────────────────────────────────
   The integrator's colours themselves need no rule here: brandVarsSet
   (js/01-core.js) sets the --bc-* tokens on the page's root and the whole
   sheet follows (v1.4.10.677). What is here: the line of help under the
   sign-in form, the editor's colour boxes, and the small picture of the
   sign-in screen at its top. The picture reads the --bc-* tokens set on
   ITSELF (wlBrandPrevHtml), never the page's, so it shows what is in the
   boxes whatever the page is wearing.
   ═════════════════════════════════════════════════════════════════════════ */
/* the estate drawing behind the sign-in stage is a picture, drawn in AVDesk's blue and purple on its own navy. Under an
   integrator's own colours (html.wl-tint) it gives up its own ground and colours and keeps its light and shade, so the
   whole drawing reads in the integrator's dark colour (the stage behind it, which is isolated: nothing else is blended) */
html.wl-tint #login .lg-media{background-color:transparent;mix-blend-mode:luminosity;}
#login .lg-wl-help{margin:14px 0 0;font-size:12px;line-height:1.5;color:var(--lg-ink-3);text-align:center;}
#login .lg-wl-help:empty{display:none !important;}
#login .lg-wl-help a{color:var(--lg-ink-2);font-weight:500;}
#login .lg-legal #wl-legal a{margin-left:14px;}
.wl-panel-btns{display:inline-flex;gap:6px;flex-wrap:wrap;justify-content:flex-end;}
.myco-wl{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:12px 14px;margin:0 0 6px;border:1px solid var(--line);border-radius:6px;background:var(--surface-2);}
.myco-wl-t{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px;font-size:13px;}
.myco-wl-t a{font-weight:600;overflow-wrap:anywhere;}
.wlb-cols{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;}
.wlb-col label{display:block;font-size:12px;font-weight:600;color:var(--text-mute);margin:0 0 6px;}
.wlb-col-row{display:flex;align-items:stretch;gap:6px;}
.wlb-col-row input[type="color"]{flex:none;width:40px;height:38px;padding:2px;border:1px solid var(--line-2);border-radius:var(--r-ctl);background:var(--surface);cursor:pointer;}
.wlb-col-row input[type="color"]:disabled{cursor:default;opacity:.6;}
.wlb-col-row input:not([type="color"]){flex:1 1 auto;min-width:0;width:100%;height:38px;padding:0 10px;border:1px solid var(--line-2);border-radius:var(--r-ctl);background:var(--surface);color:var(--text);font:inherit;font-size:13px;text-transform:uppercase;}
.wlb-col-row input:not([type="color"])::placeholder{color:var(--text-dim);}
.wlb-col-msg{font-size:12px;line-height:1.45;color:var(--text-mute);margin:6px 0 0;}
.wlb-col-msg.bad{color:var(--danger,#B91C1C);}
.wlb-fix{display:inline;padding:0;border:0;background:none;font:inherit;font-weight:600;color:var(--accent);cursor:pointer;text-decoration:underline;}
@media (max-width:640px){ .wlb-cols{grid-template-columns:minmax(0,1fr);} }
/* the picture */
.wlb-prev{margin:0 0 14px;}
.wlb-pv{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fff;min-height:176px;}
.wlb-pv-stage{display:flex;flex-direction:column;gap:6px;padding:14px 16px;background:var(--bc-navy);color:#fff;min-width:0;}
.wlb-pv-stage b{font-family:var(--font-display);font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wlb-pv-h1{margin-top:auto;font-family:var(--font-display);font-size:15px;font-weight:600;line-height:1.25;letter-spacing:-.012em;overflow-wrap:anywhere;}
.wlb-pv-sub{font-size:10px;line-height:1.4;color:rgba(255,255,255,.72);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;}
.wlb-pv-stage::after{content:'';display:block;height:3px;border-radius:2px;margin-top:8px;background:linear-gradient(112deg,var(--bc-grad-a) 0%,var(--bc-grad-b) 52%,var(--bc-purple) 100%);}
.wlb-pv-card{display:flex;flex-direction:column;gap:6px;padding:14px 16px;min-width:0;}
.wlb-pv-logo{height:22px;display:flex;align-items:center;min-width:0;}
.wlb-pv-logo img{height:22px;width:auto;max-width:100%;object-fit:contain;object-position:left center;}
.wlb-pv-logo span{font-family:var(--font-display);font-size:13px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wlb-pv-t{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--text);}
.wlb-pv-f{height:18px;border:1px solid var(--line-2);border-radius:3px;background:var(--surface-2);}
.wlb-pv-r{display:flex;justify-content:space-between;gap:8px;font-size:10px;color:var(--text-mute);}
.wlb-pv-r i{font-style:normal;font-weight:600;color:var(--bc-accent);white-space:nowrap;}
.wlb-pv-b{margin-top:auto;height:24px;display:flex;align-items:center;justify-content:center;border-radius:4px;font-size:11px;font-weight:600;color:#fff;background:linear-gradient(112deg,var(--bc-grad-a) 0%,var(--bc-grad-b) 52%,var(--bc-purple) 100%);}
@media (max-width:480px){ .wlb-pv{grid-template-columns:minmax(0,1fr);} .wlb-pv-stage{min-height:96px;} }
/* ═══ end v1.4.10.679 ═══ */

/* v1.4.10.680 — white label: what happened when the integrator's subdomain was created in cPanel (custWlProvHtml) */
.wl-prov{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:10px 0 0;padding:8px 10px;border-radius:6px;font-size:12px;line-height:1.45;border:1px solid var(--line);background:var(--surface-2);color:var(--text-mute);}
.wl-prov > span{flex:1 1 180px;min-width:0;overflow-wrap:anywhere;}
.wl-prov svg{flex:none;width:14px;height:14px;}
.wl-prov.ok{color:var(--ok);background:color-mix(in srgb,var(--ok) 8%,var(--surface));border-color:color-mix(in srgb,var(--ok) 26%,var(--line));}
.wl-prov.warn{color:var(--text);background:color-mix(in srgb,var(--warn) 10%,var(--surface));border-color:color-mix(in srgb,var(--warn) 30%,var(--line));}
.wl-prov.bad{color:var(--text);background:color-mix(in srgb,var(--danger,#B91C1C) 8%,var(--surface));border-color:color-mix(in srgb,var(--danger,#B91C1C) 30%,var(--line));}
/* ═══ end v1.4.10.680 ═══ */
