/* ============================================================================
   ADMIN CONSOLE SKIN — 2026-08-16
   Everything here is scoped to body:is(.pm-admin-console,.pm-assistant-console). Nothing leaks to the
   assistant, client or kid views, which keep js/sidebar.css untouched.

   REVERT: remove the <link> to this file and the pm-admin-console class from
   <body>. The page returns to the classic 54px hover rail with no other edit.

   Sections
     1. Kill the classic rail, hand the space to .pmar
     2. The rail itself (graphite, labelled, timeline accordion)
     3. Top bar
     4. Page typography + colour tokens (Nunito · one blue · one teal)
     5. Family Portfolio — tabs become a vertical timeline (Caleb 2026-08-16)
   ============================================================================ */

/* ── 1. The classic rail steps aside ────────────────────────────────────── */
/* js/sidebar.js still runs — it owns modals and helpers the dashboard needs —
   but its visible rail is hidden and .pmar takes the gutter. Hiding rather
   than not-loading is deliberate: no dependency can go missing. */
body:is(.pm-admin-console,.pm-assistant-console) #pmSidebar,
body:is(.pm-admin-console,.pm-assistant-console) .pm-sidebar,
body:is(.pm-admin-console,.pm-assistant-console) #pmSidebarScrim { display: none !important; }

/* Pad on the class ALONE — not .pm-has-sidebar — because several admin pages
   never carry that class, and the skin must hold on every one of them. */
body:is(.pm-admin-console,.pm-assistant-console) {
  padding-left: var(--pmar-w, 250px) !important;
}
/* Pre-paint gutter: the rail's column is painted from the very first frame
   (same trick as body.pm-kid-shell::before), so the rail never pops in and
   pages never flash unpadded. .pmar renders above it at z-index 60. */
body:is(.pm-admin-console,.pm-assistant-console)::before {
  content: ''; position: fixed; top: 0; left: 0; bottom: 0;
  width: var(--pmar-w, 250px); z-index: 59; pointer-events: none;
  background: linear-gradient(180deg, #3c4a78 0%, #212b47 54%, #0e1322 100%);
}

/* ── 2. THE RAIL ────────────────────────────────────────────────────────── */
body:is(.pm-admin-console,.pm-assistant-console) {
  --pmar-w: 250px;
  --pmar-top: #3c4a78;
  --pmar-mid: #212b47;
  --pmar-bot: #0e1322;
  --pmar-teal: #17BFA0;
}

.pmar {
  position: fixed; top: 0; left: 0; bottom: 0; width: var(--pmar-w); z-index: 60;
  display: flex; flex-direction: column;
  background: linear-gradient(180deg, var(--pmar-top) 0%, var(--pmar-mid) 54%, var(--pmar-bot) 100%);
  box-shadow: 6px 0 34px -14px rgba(30,41,78,.5), inset -1px 0 0 rgba(255,255,255,.07);
  font-family: "Nunito", ui-rounded, system-ui, -apple-system, sans-serif;
}
/* Sheen */
.pmar::before {
  content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background:
    linear-gradient(150deg, rgba(255,255,255,.13) 0%, transparent 40%),
    radial-gradient(circle at 20% 6%, rgba(255,255,255,.12), transparent 46%),
    radial-gradient(circle at 84% 96%, rgba(150,170,255,.11), transparent 52%);
}
/* Drifting stars */
.pmar::after {
  content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden;
  filter: drop-shadow(0 0 2px rgba(255,255,255,.4));
  background-image:
    radial-gradient(2.2px 2.2px at 18% 12%, rgba(255,255,255,.9), transparent 62%),
    radial-gradient(1.4px 1.4px at 62% 22%, rgba(199,225,255,.85), transparent 62%),
    radial-gradient(2.5px 2.5px at 38% 33%, rgba(255,255,255,.8), transparent 62%),
    radial-gradient(1.4px 1.4px at 80% 44%, rgba(255,255,255,.75), transparent 62%),
    radial-gradient(2px 2px at 26% 55%, rgba(199,225,255,.9), transparent 62%),
    radial-gradient(1.5px 1.5px at 70% 65%, rgba(255,255,255,.8), transparent 62%),
    radial-gradient(2.3px 2.3px at 46% 77%, rgba(255,255,255,.85), transparent 62%),
    radial-gradient(1.4px 1.4px at 84% 86%, rgba(199,225,255,.8), transparent 62%),
    radial-gradient(1.9px 1.9px at 30% 92%, rgba(255,255,255,.75), transparent 62%),
    radial-gradient(1.5px 1.5px at 58% 6%, rgba(255,255,255,.8), transparent 62%);
  background-repeat: repeat; background-size: 100% 58%;
  animation: pmarTwinkle 4.4s ease-in-out infinite, pmarDrift 30s linear infinite;
}
@keyframes pmarTwinkle { 0%,100% { opacity: .5; } 50% { opacity: .95; } }
@keyframes pmarDrift   { 0% { background-position: 0 0; } 100% { background-position: 0 -58%; } }
@media (prefers-reduced-motion: reduce) { .pmar::after { animation: none; opacity: .65; } }

.pmar__brand {
  position: relative; z-index: 2; flex-shrink: 0;
  display: flex; align-items: center; gap: 12px;
  padding: 22px 20px 18px; text-decoration: none;
}
.pmar__mark {
  width: 38px; height: 38px; flex-shrink: 0; border-radius: 12px;
  background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.2);
  display: grid; place-items: center; color: #fff;
  box-shadow: 0 6px 18px -8px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.22);
}
.pmar__mark svg { width: 20px; height: 20px; stroke-width: 2; }
.pmar__wm { display: flex; flex-direction: column; line-height: 1.25; }
.pmar__wm b { font-size: 15px; font-weight: 600; color: #fff; }
.pmar__wm span { font-size: 11px; font-weight: 400; color: rgba(255,255,255,.55); letter-spacing: .06em; text-transform: uppercase; }

.pmar__scroll { position: relative; z-index: 2; flex: 1; overflow-y: auto; padding: 2px 12px 12px; }
.pmar__scroll::-webkit-scrollbar { width: 0; }
.pmar__scroll { scrollbar-width: none; }
.pmar__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 1px; }
.pmar__grp {
  font-size: 11px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
  color: rgba(255,255,255,.34); padding: 18px 12px 8px; list-style: none;
}
.pmar__row { position: relative; list-style: none; }

.pmar__item {
  display: flex; align-items: center; gap: 12px; width: 100%;
  padding: 10px 12px; border-radius: 10px;
  background: none; border: none; text-align: left; cursor: pointer;
  color: rgba(255,255,255,.76);
  font-family: inherit; font-size: 14.5px; font-weight: 400; text-decoration: none;
  transition: background .16s cubic-bezier(.4,0,.2,1), color .16s cubic-bezier(.4,0,.2,1);
}
.pmar__ico { display: grid; place-items: center; flex-shrink: 0; }
.pmar__ico svg { width: 19px; height: 19px; stroke-width: 1.7; display: block; }
.pmar__lbl { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pmar__item:hover { background: rgba(255,255,255,.09); color: #fff; }
.pmar__item.is-active {
  background: #fff; color: #1A2130; font-weight: 600;
  box-shadow: 0 6px 16px -8px rgba(0,0,0,.5);
}
.pmar__item.is-active .pmar__ico svg { color: var(--pmar-teal); }

.pmar__chev { display: grid; place-items: center; flex-shrink: 0; color: rgba(255,255,255,.4); transition: transform .24s cubic-bezier(.4,0,.2,1); }
.pmar__chev svg { width: 15px; height: 15px; stroke-width: 2; display: block; }
.pmar__row.is-open > .pmar__item .pmar__chev { transform: rotate(90deg); color: rgba(255,255,255,.85); }
.pmar__item.is-active .pmar__chev { color: #A2AAB6; }

.pmar__badge {
  flex-shrink: 0; min-width: 21px; height: 20px; padding: 0 7px; border-radius: 999px;
  background: #EF5B5B; color: #fff; font-size: 11px; font-weight: 600; line-height: 20px; text-align: center;
}

/* ── The accordion + its timeline spine ── */
.pmar__acc { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .28s cubic-bezier(.4,0,.2,1); }
.pmar__row.is-open > .pmar__acc { grid-template-rows: 1fr; }
.pmar__acc-in { overflow: hidden; }
.pmar__sub { list-style: none; margin: 3px 0 8px; padding: 0 0 0 22px; position: relative; }
.pmar__sub::before {
  content: ''; position: absolute; left: 21px; top: 2px; bottom: 10px;
  width: 1px; background: rgba(255,255,255,.18);
}
.pmar__sublink {
  position: relative; display: flex; align-items: center; gap: 8px;
  padding: 8px 10px 8px 16px; border-radius: 8px; text-decoration: none;
  color: rgba(255,255,255,.6); font-size: 13.5px; font-weight: 400;
  transition: background .15s cubic-bezier(.4,0,.2,1), color .15s cubic-bezier(.4,0,.2,1);
}
/* the node that sits on the spine */
.pmar__sublink::before {
  content: ''; position: absolute; left: -4px; top: 50%; transform: translateY(-50%);
  width: 7px; height: 7px; border-radius: 50%;
  background: rgba(255,255,255,.28); border: 1.5px solid var(--pmar-mid);
  transition: background .16s cubic-bezier(.4,0,.2,1), box-shadow .16s cubic-bezier(.4,0,.2,1);
}
.pmar__sublink:hover { color: #fff; background: rgba(255,255,255,.07); }
.pmar__sublink:hover::before { background: rgba(255,255,255,.6); }
.pmar__sublink.is-active { color: var(--pmar-teal); font-weight: 600; }
.pmar__sublink.is-active::before { background: var(--pmar-teal); box-shadow: 0 0 0 3px rgba(23,191,160,.22); }
.pmar__sublink--all { font-style: italic; color: rgba(255,255,255,.45); }
.pmar__subhead {
  padding: 11px 10px 5px 16px; font-size: 10.5px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase; color: rgba(255,255,255,.3); list-style: none;
}
.pmar__loading { padding: 8px 10px 8px 16px; font-size: 13px; color: rgba(255,255,255,.45); list-style: none; }

.pmar__foot { position: relative; z-index: 2; flex-shrink: 0; padding: 12px; }
.pmar__out {
  display: flex; align-items: center; justify-content: center; gap: 9px; width: 100%;
  padding: 11px; border-radius: 11px; cursor: pointer; font-family: inherit;
  background: rgba(255,255,255,.09); border: 1px solid rgba(255,255,255,.17);
  color: #fff; font-size: 14px; font-weight: 500;
  transition: background .16s cubic-bezier(.4,0,.2,1);
}
.pmar__out:hover { background: rgba(255,255,255,.16); }
.pmar__out[disabled] { opacity: .6; cursor: default; }
.pmar__out svg { width: 16px; height: 16px; stroke-width: 1.8; }

/* ── 3. TOP BAR ─────────────────────────────────────────────────────────── */
body:is(.pm-admin-console,.pm-assistant-console) .nx-topbar {
  background: linear-gradient(118deg, var(--pmar-bot) 0%, var(--pmar-mid) 46%, var(--pmar-top) 100%) !important;
  border-bottom: 1px solid rgba(14,19,34,.45) !important;
  box-shadow: 0 8px 22px -16px rgba(14,19,34,.65), inset 0 1px 0 rgba(255,255,255,.12) !important;
  padding: 14px 28px;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-topbar::before {
  content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background-image:
    radial-gradient(1.4px 1.4px at 6% 34%, rgba(255,255,255,.85), transparent 60%),
    radial-gradient(1.1px 1.1px at 15% 70%, rgba(199,225,255,.8), transparent 60%),
    radial-gradient(1.5px 1.5px at 25% 26%, rgba(255,255,255,.85), transparent 60%),
    radial-gradient(1.1px 1.1px at 36% 76%, rgba(255,255,255,.75), transparent 60%),
    radial-gradient(1.3px 1.3px at 48% 30%, rgba(199,225,255,.8), transparent 60%),
    radial-gradient(1.1px 1.1px at 59% 68%, rgba(255,255,255,.75), transparent 60%),
    radial-gradient(1.5px 1.5px at 70% 24%, rgba(255,255,255,.85), transparent 60%),
    radial-gradient(1.1px 1.1px at 80% 72%, rgba(199,225,255,.75), transparent 60%),
    radial-gradient(1.4px 1.4px at 91% 36%, rgba(255,255,255,.85), transparent 60%);
  background-repeat: repeat; background-size: 58% 100%;
  filter: drop-shadow(0 0 1.5px rgba(255,255,255,.4));
  animation: pmarTwinkle 4.2s ease-in-out infinite, pmarBarDrift 30s linear infinite;
}
@keyframes pmarBarDrift { from { background-position: 0 0; } to { background-position: -116% 0; } }
@media (prefers-reduced-motion: reduce) { body:is(.pm-admin-console,.pm-assistant-console) .nx-topbar::before { animation: none; } }
body:is(.pm-admin-console,.pm-assistant-console) .nx-topbar > * { position: relative; z-index: 1; }

body:is(.pm-admin-console,.pm-assistant-console) .nx-search input {
  background: rgba(255,255,255,.13) !important;
  border: 1px solid rgba(255,255,255,.2) !important;
  border-radius: 999px !important;
  color: #fff !important; font-family: inherit; font-weight: 400;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-search input::placeholder { color: rgba(255,255,255,.62) !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-search input:focus {
  background: rgba(255,255,255,.2) !important; border-color: rgba(255,255,255,.45) !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-search svg { color: rgba(255,255,255,.7) !important; }

body:is(.pm-admin-console,.pm-assistant-console) .nx-topbar [data-pm-install] {
  background: rgba(255,255,255,.14) !important;
  border: 1px solid rgba(255,255,255,.24) !important;
  border-radius: 999px !important; color: #fff !important; font-weight: 500 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-userpod {
  background: rgba(255,255,255,.13) !important;
  border: 1px solid rgba(255,255,255,.22) !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-userpod__name { color: #fff !important; font-weight: 500 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-userpod__avatar {
  background: linear-gradient(135deg, #F5DE93, #D9AE45) !important;
  color: #5A4300 !important; font-weight: 600 !important; box-shadow: none !important;
}

/* ── 4. PAGE TYPE + COLOUR ──────────────────────────────────────────────── */
/* Nunito, light weights, ONE blue and ONE teal. No indigo, no purple. */
body:is(.pm-admin-console,.pm-assistant-console) {
  --primary: #4A9FF5;
  --primary-hover: #2E86E0;
  --primary-soft: #EAF4FE;
  font-family: "Nunito", ui-rounded, system-ui, -apple-system, sans-serif;
  font-weight: 400;
  background: #F4F7FA;
  color: #2C3341;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-shell { max-width: 1400px; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-h1 {
  font-family: inherit; font-size: 26px; font-weight: 600; letter-spacing: 0; color: #1A2130;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-sub { font-size: 14px; font-weight: 400; color: #77808F; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-card__title,
body:is(.pm-admin-console,.pm-assistant-console) .adp-card__title,
body:is(.pm-admin-console,.pm-assistant-console) .ado-card__title,
body:is(.pm-admin-console,.pm-assistant-console) .ir-h {
  font-family: inherit; font-size: 17px; font-weight: 600; letter-spacing: 0; color: #1A2130;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-card__sub,
body:is(.pm-admin-console,.pm-assistant-console) .adp-card__sub,
body:is(.pm-admin-console,.pm-assistant-console) .ado-card__sub,
body:is(.pm-admin-console,.pm-assistant-console) .ir-sub { font-size: 13px; font-weight: 400; color: #A2AAB6; }

body:is(.pm-admin-console,.pm-assistant-console) .nx-card,
body:is(.pm-admin-console,.pm-assistant-console) .adp-card,
body:is(.pm-admin-console,.pm-assistant-console) .ado-card,
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats {
  border-radius: 14px;
  border: 1px solid #EDF0F4;
  box-shadow: 0 2px 8px rgba(28,41,66,.045);
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__num {
  font-family: inherit; font-size: 29px; font-weight: 700; letter-spacing: 0; color: #1A2130;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__label {
  font-size: 12.5px; font-weight: 600; letter-spacing: .05em; text-transform: uppercase; color: #77808F;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-head__cta {
  background: var(--primary); border-color: var(--primary);
  border-radius: 10px; font-family: inherit; font-weight: 600;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-head__cta:hover { background: var(--primary-hover); border-color: var(--primary-hover); }

/* ── 5. FAMILY PORTFOLIO — tabs become a vertical timeline ──────────────── */
/* Caleb 2026-08-16: "i want these to have timeline like dashboard does and
   for these to be under the header family portfolios."
   All nine tabs are preserved exactly — family-portfolio.js still renders
   .pmpf__tab buttons and still owns the click wiring. Only the axis changes:
   the strip becomes a left column with a spine, so it can never clip a label
   the way the horizontal scroller did. */
@media (min-width: 981px) {
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf {
    display: grid;
    grid-template-columns: 232px minmax(0, 1fr);
    grid-template-areas: "nav panes" "nav foot";
    align-items: start;
    column-gap: 26px;
  }
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tabswrap {
    grid-area: nav; position: relative;
    padding: 4px 0 4px 20px; margin: 0; overflow: visible;
    border-right: 1px solid #EDF0F4;
  }
  /* the spine */
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tabswrap::before {
    content: ''; position: absolute; left: 19px; top: 14px; bottom: 14px;
    width: 1px; background: #E1E6ED;
  }
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tabs {
    display: flex; flex-direction: column; gap: 2px;
    overflow: visible; width: auto; padding: 0; margin: 0; border: none;
  }
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tab {
    position: relative; width: 100%; text-align: left;
    margin: 0; padding: 9px 12px 9px 16px;
    border: none !important; border-radius: 8px !important;
    background: transparent !important; box-shadow: none !important;
    font-family: inherit; font-size: 13.5px; font-weight: 400; color: #77808F;
    white-space: normal; transform: none !important;
    transition: background .15s ease, color .15s ease;
  }
  /* the node on the spine */
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tab::before {
    content: ''; position: absolute; left: -5px; top: 50%; transform: translateY(-50%);
    width: 7px; height: 7px; border-radius: 50%;
    background: #D3DAE3; border: 1.5px solid #fff;
    transition: background .16s ease, box-shadow .16s ease;
  }
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tab::after { display: none !important; }
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tab:hover { background: #F5F8FC !important; color: #1A2130 !important; }
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tab:hover::before { background: #A9B4C2; }
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tab.is-active {
    background: #EAF4FE !important; color: #2E86E0 !important; font-weight: 600;
  }
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__tab.is-active::before {
    background: #4A9FF5; box-shadow: 0 0 0 3px rgba(74,159,245,.2);
  }
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf__panes {
    grid-area: panes; margin: 0 !important; border-radius: 12px;
    min-width: 0; overflow: hidden;
  }
  /* The prev/next dot bar was the horizontal strip's companion — the
     timeline shows every destination at once, so it has nothing left to do. */
  body:is(.pm-admin-console,.pm-assistant-console) .pmpf-sw__foot { display: none !important; }
}
/* Below 980px the timeline would eat the width — fall back to the strip
   family-portfolio.js ships by default. */

@media (max-width: 900px) {
  body:is(.pm-admin-console,.pm-assistant-console) { padding-left: 0 !important; }
  body:is(.pm-admin-console,.pm-assistant-console)::before { display: none; }
  .pmar { display: none; }
}

/* Anchor targets for the rail's Dashboard branch. scroll-margin keeps the
   sticky top bar from covering the heading you just jumped to. */
body:is(.pm-admin-console,.pm-assistant-console) { scroll-behavior: smooth; }
body:is(.pm-admin-console,.pm-assistant-console) [id^="pmar-"] { display: block; scroll-margin-top: 84px; }
@media (prefers-reduced-motion: reduce) { body:is(.pm-admin-console,.pm-assistant-console) { scroll-behavior: auto; } }

/* ════════════════════════════════════════════════════════════════════════
   6. THE BANNER STACK → compact uniform rows  (2026-08-16, stage two)

   The dashboard opens with up to six full-width bars, each a different
   colour at a different height: Installs (blue), studio (purple gradient),
   waiting lobby, counter-proposals (amber), overdue grading (amber),
   notifications (white). Nothing reads as more urgent than anything else —
   it just reads as noise.

   Done in CSS ONLY, deliberately. Every one of these bars is wired to its
   own RPC, realtime channel and click handler; rewriting the markup to
   merge them into one panel would put all of that at risk for a visual
   gain. Instead each keeps its element, its id and its JS, and is
   restyled to a 54px single-line row. Colour survives as a 3px left rule
   and the icon tint — never a full-width wash.

   They stay separate elements rather than one card because any of them can
   be [hidden] at any moment; "which one is visually last" is not something
   CSS can track reliably, and a card with a floating bottom border looks
   broken. Uniform stacked rows are robust to any combination being hidden.

   !important throughout: these bars carry inline style attributes.
   ════════════════════════════════════════════════════════════════════════ */

body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard,
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio,
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterBanner,
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueBanner {
  display: flex !important;
  align-items: center !important;
  gap: 13px !important;
  min-height: 54px !important;
  padding: 0 16px !important;
  margin: 0 0 8px !important;
  background: #fff !important;
  /* 2026-08-16 — the 3px coloured left rule that used to sit here is GONE.
     Caleb: "im nto a fav of the lateral vertical colour on stuff like this…
     it looks cheap and screams AI made this". He is right: a stripe down the
     side of a card is a decoration standing in for a meaning the row already
     states in words. The accent survives where it is doing work — the icon
     tint and the CTA — and nowhere else. */
  border: 1px solid #EDF0F4 !important;
  border-radius: 10px !important;
  box-shadow: 0 1px 2px rgba(28,41,66,.04) !important;
  color: #2C3341 !important;
  transition: border-color .15s ease, box-shadow .15s ease !important;
}

/* …but `hidden` has to actually hide.
   The rule above is `display: flex !important`, which outranks the UA
   stylesheet's `[hidden] { display: none }` — so any of these rows that the
   dashboard had marked hidden was still laid out and still painted. Measured
   on the real page 2026-08-17: #ahCounterBanner was 125px tall with
   hidden=true, i.e. a "counter-proposals" bar was on screen at a moment the
   code had decided there were none to show.
   The !important above exists because these bars carry inline style
   attributes; this rule needs the same weapon to undo it, and #id[hidden]
   outranks #id so it wins wherever both apply. */
body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard[hidden],
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio[hidden],
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterBanner[hidden],
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueBanner[hidden],
body:is(.pm-admin-console,.pm-assistant-console) #ahWaitingLobby[hidden],
body:is(.pm-admin-console,.pm-assistant-console) #adNeedsCard[hidden] {
  display: none !important;
}
body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard:hover,
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio:hover,
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterBanner:hover,
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueBanner:hover {
  box-shadow: 0 4px 14px -6px rgba(28,41,66,.16) !important;
  transform: none !important;
}

/* Per-row accent — now reaches ONLY the icon square and the CTA text.
   Studio moved off #7C3AED to the console's teal: purple has been rejected
   everywhere else in this redesign and had no business surviving here. */
body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard          { --row-accent: #4A9FF5; }
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio          { --row-accent: #17BFA0; }
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterBanner         { --row-accent: #EAB308; }
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueBanner  { --row-accent: #EF5B5B; }

/* The 38-42px gradient icon chips shrink to a flat 30px tinted square */
body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard > span:first-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio > span:first-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterBanner > div:first-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueBanner > div:first-child {
  width: 30px !important; height: 30px !important;
  border-radius: 8px !important;
  background: color-mix(in srgb, var(--row-accent) 14%, #fff) !important;
  color: var(--row-accent) !important;
  box-shadow: none !important;
  font-size: 15px !important;
  display: grid !important; place-items: center !important;
  flex-shrink: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard > span:first-child svg,
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio > span:first-child svg,
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterBanner > div:first-child svg,
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueBanner > div:first-child svg {
  width: 16px !important; height: 16px !important;
  stroke: var(--row-accent) !important;
}

/* Title + subtitle go side-by-side on one line instead of stacking */
body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard > span:nth-child(2),
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio > span:nth-child(2),
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterBanner > div:nth-child(2),
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueBanner > div:nth-child(2) {
  display: flex !important;
  align-items: baseline !important;
  gap: 10px !important;
  flex: 1 1 auto !important;
  min-width: 0 !important;
  flex-wrap: wrap !important;
}
body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard > span:nth-child(2) > span:first-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio > span:nth-child(2) > span:first-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterTitle,
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueTitle {
  font-family: inherit !important;
  font-size: 14px !important; font-weight: 600 !important;
  letter-spacing: 0 !important; color: #1A2130 !important;
  margin: 0 !important; white-space: nowrap !important;
}
body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard > span:nth-child(2) > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio > span:nth-child(2) > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterSub,
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueSub {
  font-family: inherit !important;
  font-size: 12.5px !important; font-weight: 400 !important;
  color: #77808F !important; opacity: 1 !important;
  margin: 0 !important;
  overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important;
}
/* Trailing CTA ("View →", "Join →", "REVIEW ›") */
body:is(.pm-admin-console,.pm-assistant-console) #ahInstallsCard > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahResumeStudio > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahCounterBanner > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) #ahGradingOverdueBanner > span:last-child {
  font-family: inherit !important;
  font-size: 12.5px !important; font-weight: 600 !important;
  letter-spacing: 0 !important; text-transform: none !important;
  color: var(--row-accent) !important;
  flex-shrink: 0 !important;
}

/* Waiting-lobby group + the notification bell join the same rhythm */
body:is(.pm-admin-console,.pm-assistant-console) #ahWaitingLobby { margin: 0 0 8px !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-strip { margin: 0 0 18px !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger {
  min-height: 54px; padding: 0 16px !important;
  border: 1px solid #EDF0F4 !important;   /* left rule removed — see above */
  border-radius: 10px !important;
  background: #fff !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger__title { font-size: 14px; font-weight: 600; color: #1A2130; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger__sub   { font-size: 12.5px; font-weight: 400; color: #77808F; }

/* ── 7. KPI ROW — LUNO card anatomy, without touching the markup ───────── */
/* The five cells keep their ids (kpiClients … kpiClaudeSpend) and the JS
   keeps writing into them. Only the frame changes: each cell becomes its own
   card with a coloured bar along the bottom edge, and the labels stop
   wrapping to two lines. */
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats {
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  padding: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__grid { gap: 14px !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell {
  position: relative;
  background: #fff;
  border: 1px solid #EDF0F4 !important;
  border-radius: 14px;
  padding: 18px 18px 20px !important;
  box-shadow: 0 2px 8px rgba(28,41,66,.045);
  overflow: hidden;
  transition: box-shadow .2s ease, transform .2s ease;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell:hover {
  box-shadow: 0 6px 20px -6px rgba(28,41,66,.12); transform: translateY(-2px);
}
/* the signature bottom bar */
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 4px;
  background: var(--kpi-accent, #4A9FF5);
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell:nth-child(1) { --kpi-accent: #17BFA0; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell:nth-child(2) { --kpi-accent: #EAB308; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell:nth-child(3) { --kpi-accent: #4A9FF5; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell:nth-child(4) { --kpi-accent: #17BFA0; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell:nth-child(5) { --kpi-accent: #A2AAB6; }
/* Label first, number second — LUNO's order — done with flex order so the
   markup stays exactly as the JS expects to find it. */
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell {
  display: flex; flex-direction: column;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__label {
  order: -1;
  font-size: 11px !important; font-weight: 600 !important;
  letter-spacing: .04em !important; line-height: 1.4 !important;
  color: #77808F !important; margin: 0 0 10px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__num { margin: 0 !important; line-height: 1 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__extra {
  margin-top: 12px !important; padding-top: 10px !important;
  border-top: 1px solid #EDF0F4 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__extra-row {
  font-size: 12px !important; font-weight: 400 !important; color: #77808F !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__extra-row strong { font-weight: 700 !important; color: #1A2130 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell--clickable:hover { border-color: #4A9FF5 !important; }

/* ════════════════════════════════════════════════════════════════════════
   8. QUICK BAR — the alert bars, relocated into the top bar
   (2026-08-16, Caleb: "make these horizontal buttons in the header near the
   install button and add the install button into this also… make the top
   horizontal pill look just like what the clients have")

   Deliberately the SAME recessed-glass treatment as the parent rail's
   "Child" bar (.par-actions--bar, css/parent-rail.css §N): dark inset well,
   hairline highlight, transparent icon buttons that fill on hover. Parents
   and the owner get the same component in their own colour.

   js/admin-quickbar.js MOVES the live bar nodes in here; these rules only
   dress the result. The bars keep their ids, so §6's row styling still
   applies to them inside the popovers.
   ════════════════════════════════════════════════════════════════════════ */

body:is(.pm-admin-console,.pm-assistant-console) .pmac {
  display: flex; align-items: center; gap: 2px;
  margin: 0 auto; padding: 4px; border-radius: 999px;
  background: rgba(8,12,24,.36);
  border: 1px solid rgba(255,255,255,.2);
  box-shadow: inset 0 1px 3px rgba(0,0,0,.22), 0 1px 0 rgba(255,255,255,.09);
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__lbl {
  padding: 0 11px 0 10px; font-size: 12px; font-weight: 500;
  color: rgba(255,255,255,.86); white-space: nowrap;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__slot { position: relative; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac__slot[hidden] { display: none; }

body:is(.pm-admin-console,.pm-assistant-console) .pmac__btn {
  position: relative; width: 38px; height: 34px; border-radius: 999px;
  display: grid; place-items: center; cursor: pointer;
  background: transparent; border: none; color: #EEF1FF;
  transition: background .16s ease;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__btn svg { width: 17px; height: 17px; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac__btn:hover,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__btn[aria-expanded="true"] { background: rgba(255,255,255,.2); }

/* The severity dot — the only colour in the bar. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__dot {
  position: absolute; top: 5px; right: 6px;
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--pmac-tone, #4A9FF5);
  box-shadow: 0 0 0 2px rgba(14,19,34,.55);
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__slot--blue   { --pmac-tone: #4A9FF5; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac__slot--violet { --pmac-tone: #A78BFA; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac__slot--amber  { --pmac-tone: #EAB308; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac__slot--red    { --pmac-tone: #EF5B5B; }
/* Anything urgent pulses, so a red dot is noticed without a full-width bar. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__slot--red .pmac__dot { animation: pmacPulse 1.9s ease-in-out infinite; }
@keyframes pmacPulse { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.25); opacity: .6; } }
@media (prefers-reduced-motion: reduce) { body:is(.pm-admin-console,.pm-assistant-console) .pmac__slot--red .pmac__dot { animation: none; } }

body:is(.pm-admin-console,.pm-assistant-console) .pmac__tip {
  position: absolute; bottom: -31px; left: 50%;
  transform: translateX(-50%) translateY(3px);
  background: #1A2130; color: #fff; font-size: 11.5px; font-weight: 400;
  padding: 5px 10px; border-radius: 7px; white-space: nowrap;
  opacity: 0; pointer-events: none; z-index: 60;
  transition: opacity .15s ease, transform .15s ease;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__btn:hover .pmac__tip { opacity: 1; transform: translateX(-50%) translateY(0); }
body:is(.pm-admin-console,.pm-assistant-console) .pmac__btn[aria-expanded="true"] .pmac__tip { opacity: 0; }

/* Popover — LUNO's Notifications Center shape: white card, titled, dropped
   below the bar with a soft shadow. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop {
  position: absolute; top: calc(100% + 12px); right: 0; z-index: 70;
  width: 380px; max-width: calc(100vw - 40px);
  background: #fff; border: 1px solid #E6EAF0; border-radius: 14px;
  box-shadow: 0 24px 60px -18px rgba(16,24,40,.36);
  overflow: hidden;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-hd {
  padding: 13px 16px; border-bottom: 1px solid #F1F2F6;
  font-size: 13.5px; font-weight: 600; color: #1A2130; background: #FCFCFD;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd { padding: 12px; }
/* The relocated bar fills the popover: no card-in-a-card, no left rule. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd > * {
  margin: 0 !important; border: none !important; box-shadow: none !important;
  border-radius: 8px !important; min-height: 0 !important;
  padding: 8px !important; width: 100% !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd > *:hover { background: #F7F9FC !important; }

/* ── Row layout INSIDE the popover (2026-08-16) ──────────────────────────
   Caleb: "it looks sorta messy and not clean" — the Overdue grading and
   Installs rows.

   Cause: §6 lays these rows out for the BODY, where they are 54px one-liners
   in a full-width column — title and subtitle side by side on one baseline,
   both `nowrap` with an ellipsis. Reused inside a 380px popover that runs out
   of room immediately: the title pushes the CTA onto its own line and the
   subtitle gets cut mid-word ("click Revi…").

   The popover is the surface where you actually READ the message, so here the
   row stacks — title, then the full sentence beneath it, CTA parked at the
   right. Selectors carry `.pmac__pop-bd` so they outrank §6's id rules; the
   body rows are untouched. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd > * {
  align-items: center !important;
  gap: 12px !important;
  padding: 11px 12px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahInstallsCard > span:nth-child(2),
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahResumeStudio > span:nth-child(2),
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahCounterBanner > div:nth-child(2),
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahGradingOverdueBanner > div:nth-child(2) {
  flex-direction: column !important;
  align-items: flex-start !important;
  gap: 3px !important;
  flex-wrap: nowrap !important;
}
/* Let both lines wrap — no ellipsis anywhere in here */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahInstallsCard > span:nth-child(2) > span,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahResumeStudio > span:nth-child(2) > span,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahCounterTitle,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahCounterSub,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahGradingOverdueTitle,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahGradingOverdueSub {
  white-space: normal !important;
  overflow: visible !important;
  text-overflow: clip !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahInstallsCard > span:nth-child(2) > span:first-child,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahResumeStudio > span:nth-child(2) > span:first-child,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahCounterTitle,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahGradingOverdueTitle {
  font-size: 13.5px !important; line-height: 1.35 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahInstallsCard > span:nth-child(2) > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahResumeStudio > span:nth-child(2) > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahCounterSub,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahGradingOverdueSub {
  font-size: 12px !important; line-height: 1.45 !important;
}
/* CTA sits at the right edge, vertically centred against both lines */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahInstallsCard > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahResumeStudio > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahCounterBanner > span:last-child,
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop-bd #ahGradingOverdueBanner > span:last-child {
  align-self: center !important;
  margin-left: auto !important;
  white-space: nowrap !important;
}

/* Install App joins the group as its trailing action. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__install {
  margin: 0 0 0 4px !important;
  padding: 8px 15px !important; border-radius: 999px !important;
  background: rgba(255,255,255,.16) !important;
  border: 1px solid rgba(255,255,255,.26) !important;
  color: #fff !important; font-family: inherit !important;
  font-size: 12.5px !important; font-weight: 500 !important;
}

/* The notification strip, shrunk to a bell in the bar. Same approach
   client-dashboard.html uses for parents (.nx-notif-strip--topbar). */
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-strip--topbar { margin: 0 !important; position: relative; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger {
  min-height: 0 !important; width: 38px; height: 34px;
  padding: 0 !important; border: none !important; border-radius: 999px !important;
  background: transparent !important; display: grid !important; place-items: center !important;
  cursor: pointer;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger:hover { background: rgba(255,255,255,.2) !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger__text,
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger__chev { display: none !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger__icon { position: relative; color: #EEF1FF; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger__icon svg { width: 17px; height: 17px; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-trigger__badge {
  position: absolute !important; top: -7px !important; right: -8px !important;
  min-width: 17px; height: 17px; padding: 0 4px;
  background: #EF5B5B !important; color: #fff !important; border-radius: 999px;
  font-size: 10px; font-weight: 700; line-height: 17px; text-align: center;
  border: 2px solid #1b2440;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-strip--topbar .nx-notif-panel {
  position: absolute; top: calc(100% + 12px); right: 0; z-index: 70;
  width: 380px; max-width: calc(100vw - 40px);
  background: #fff; color: #2C3341;
  border: 1px solid #E6EAF0; border-radius: 14px;
  box-shadow: 0 24px 60px -18px rgba(16,24,40,.36);
  padding: 8px;
}

/* With the bars gone from the body, the KPI row is the first thing on the
   page — give it the space the banners used to take. */
body:is(.pm-admin-console,.pm-assistant-console) .nx-head { margin-bottom: 18px; }

@media (max-width: 1180px) { body:is(.pm-admin-console,.pm-assistant-console) .pmac__lbl { display: none; } }
@media (max-width: 900px)  { body:is(.pm-admin-console,.pm-assistant-console) .pmac { display: none; } }

/* Log session — the one pill that is an action list, not a notice. Wider, and
   scrollable so a busy week cannot push the Log buttons off the bottom. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop--wide { width: 470px; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop--wide .pmac__pop-bd { max-height: 62vh; overflow-y: auto; }
/* The card carries a shimmering border + sparkles for the in-page treatment;
   inside a popover the frame is the popover, so drop them. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop #adNeedsCard { background: transparent !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop .ad-action-card__spark { display: none !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac__pop .ad-action-card__head { padding-top: 0 !important; }

/* ── Log session: the "something is waiting on you" signal ────────────────
   Caleb 2026-08-16: a premium digital cue for admins and assistants that an
   important action is pending. Three layers, all subtle on their own:
     · a radar ping expanding out of the pill, once every 2.6s
     · a slow breathing glow behind it
     · a sheen that travels across the icon
   Deliberately slow. A fast blink reads as an error state; this should read
   as "standing by", the way a live indicator does. It runs ONLY while the
   pill exists, and the pill only exists while a session is genuinely
   unlogged — so it can never nag about nothing. */
body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn {
  position: relative;
  animation: pmacBreathe 2.6s ease-in-out infinite;
}
body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn::after {
  content: ''; position: absolute; inset: -1px; border-radius: 999px;
  border: 1.5px solid #EF5B5B; pointer-events: none;
  animation: pmacPing 2.6s cubic-bezier(0,0,.2,1) infinite;
}
@keyframes pmacPing {
  0%       { transform: scale(.8);  opacity: .85; }
  70%,100% { transform: scale(1.55); opacity: 0;   }
}
@keyframes pmacBreathe {
  0%,100% { box-shadow: 0 0 0 0 rgba(239,91,91,.0),   inset 0 0 0 0 rgba(239,91,91,0); }
  50%     { box-shadow: 0 0 14px 2px rgba(239,91,91,.38), inset 0 0 8px rgba(239,91,91,.18); }
}
/* Sheen across the glyph — the "digital" note. */
body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn svg {
  position: relative; z-index: 1;
  animation: pmacSheen 2.6s ease-in-out infinite;
}
@keyframes pmacSheen {
  0%,55%,100% { filter: none; }
  70%         { filter: drop-shadow(0 0 5px rgba(255,180,180,.95)) brightness(1.25); }
}
/* Once it is open you are already dealing with it — stop asking. */
body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn[aria-expanded="true"],
body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn[aria-expanded="true"] svg { animation: none; }
body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn[aria-expanded="true"]::after { display: none; }
@media (prefers-reduced-motion: reduce) {
  body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn,
  body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn::after,
  body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn svg { animation: none; }
  body:is(.pm-admin-console,.pm-assistant-console) [data-pmac-slot="needs"] .pmac__btn { box-shadow: 0 0 0 2px rgba(239,91,91,.5); }
}

/* Quick bar: hold the space from frame one, reveal once when complete.
   visibility (not display) so the bar's width is reserved and the top bar
   never reflows around it as pills resolve. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac { visibility: hidden; opacity: 0; transition: opacity .28s ease; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac.is-ready { visibility: visible; opacity: 1; }

/* ── Shared pages: the admin console outranks the kid/parent rail ─────────
   (Caleb 2026-08-16: session-activity-log painted the BLUE parent rail.)
   Shared pages load kid-sidebar.js, whose pre-paint replays a cached
   pm.parent_shell / pm.kid_shell flag — including a stale one left over from
   piloting a family account. kid-sidebar's own reconcile clears it for staff,
   but the flash is real and it can win the first frame. When the admin
   console is active, suppress that rail and its pre-paint skeleton entirely;
   admin-rail owns the gutter here. Family viewers never have pm-admin-console
   (no flag, no class), so their rails are untouched. */
body:is(.pm-admin-console,.pm-assistant-console) #pmKidSidebar,
body:is(.pm-admin-console,.pm-assistant-console) .pmkid-nav,
body:is(.pm-admin-console,.pm-assistant-console) #parActions,
body:is(.pm-admin-console,.pm-assistant-console) #pmDemoViewSwitch { display: none !important; }
body:is(.pm-admin-console,.pm-assistant-console).pm-kid-shell::before { display: none !important; }
body:is(.pm-admin-console,.pm-assistant-console).pm-kid-shell,
body:is(.pm-admin-console,.pm-assistant-console).pm-kid-shell.pm-parent-rail {
  padding-left: var(--pmar-w, 250px) !important;
  background: #F4F7FA !important;
}

/* ════════════════════════════════════════════════════════════════════════
   9. CALENDAR — LUNO structure  (2026-08-16, v3)

   Caleb: "build this style calendar design exactly instead" (LUNO
   app-calendar.html). Two earlier dark passes are gone — LUNO's calendar is
   LIGHT, and that is the whole character: white cells, hairline rules, day
   numbers top-right, a cream "today", and events as compact solid bars.

   What makes it read as LUNO rather than "a calendar":
     · Borders, not gaps. One continuous 1px #DEE2E6 lattice; cells share
       edges via a single outer border + right/bottom on each cell.
     · Day numbers sit TOP-RIGHT, regular weight, muted — never bold.
     · Today is a soft cream wash (#FFF9DB), not a coloured pill.
     · Events are solid, small-radius bars with white text — flat, no shadow,
       no gradient. Compact rows, generous cell height around them.
     · Type is calm: 15px headers, 13px events, weights 400/600. No 800s.

   ACCENT IS TOKENISED so the palette button still works: swap --cal-accent
   and every bar, dot and active state follows. See §9b.
   ════════════════════════════════════════════════════════════════════════ */

body:is(.pm-admin-console,.pm-assistant-console) {
  --line: #E8EAF0;        /* shared hairline — §11 consumes it */
  --cal-line: #DEE2E6;
  --cal-ink: #495057;
  --cal-ink-mute: #ADB5BD;
  --cal-today: #FFF9DB;
  --cal-accent: #4A9FF5;
  --cal-accent-ink: #FFFFFF;
}

/* Month title + controls */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-title {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 27px !important; font-weight: 500 !important;
  letter-spacing: 0 !important; color: #212529 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-sub {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 13.5px !important; font-weight: 400 !important; color: #868E96 !important;
}
/* "today" = grey pill, arrows = dark navy block — LUNO's exact pairing */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-nav button,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-controls button {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 14px !important; font-weight: 400 !important;
  background: #E9ECEF !important; color: #495057 !important;
  border: none !important; border-radius: 7px !important;
  padding: 9px 18px !important;
  transition: background .15s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-nav button:hover,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-controls button:hover { background: #DEE2E6 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-vtoggle {
  background: transparent !important; border: none !important; padding: 0 !important; gap: 2px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-vtoggle__btn {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 14px !important; font-weight: 400 !important;
  background: #343A40 !important; color: #fff !important;
  border: none !important; border-radius: 7px !important; padding: 9px 16px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-vtoggle__btn:not(.is-active) {
  background: #E9ECEF !important; color: #495057 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-vtoggle__btn.is-active { background: #343A40 !important; color: #fff !important; }

/* ── The lattice ── */
/* ════════════════════════════════════════════════════════════════════════
   CALENDAR STRUCTURE — must not wait for JavaScript.  2026-08-17

   `.pmcal-grid { display:grid; grid-template-columns:repeat(7,1fr) }` was
   declared ONLY inside js/session-calendar.js (~line 1706), in a string that
   the script injects as <style id="pmcal-styles"> at runtime. Everything
   below in this file styles that grid but none of it CREATES it.

   So there is a window on every load — from the moment calendar markup exists
   until that script has run and injected its sheet — where the calendar has no
   grid at all. It falls back to block layout: the seven weekday names and
   every day cell stacked vertically, each full width. Caleb photographed
   exactly that on 2026-08-17, twice, on a slow admin load.

   The window is normally invisible. It stops being invisible when the page is
   slow, and it is guaranteed to be hit on a warm load, because the cached
   calendar HTML is painted synchronously from pmCache during parse — before
   js/session-calendar.js has even been fetched.

   These two declarations are duplicated from that JS string deliberately, and
   the duplication is the point: this file is a <link> in <head>, so the grid
   exists in the very first frame. The injected sheet still arrives later with
   identical values and the rest of the calendar's styling.

   STILL OWED: the family and parent consoles render the same calendar from
   their own stylesheets and have the same gap. Scoping here is honest about
   what has actually been fixed rather than pretending it is global. */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-grid,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-weekdays {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
}

body:is(.pm-admin-console,.pm-assistant-console) .pmcal-grid {
  background: #fff !important;
  border: 1px solid var(--cal-line) !important;
  border-right: none !important; border-bottom: none !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  gap: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-weekdays > * {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 15px !important; font-weight: 400 !important;
  letter-spacing: 0 !important; text-transform: none !important;
  color: var(--cal-ink) !important;
  background: #fff !important;
  padding: 13px 0 !important; text-align: center !important;
  border: none !important;
  border-right: 1px solid var(--cal-line) !important;
  border-bottom: 1px solid var(--cal-line) !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-cell {
  background: #fff !important;
  border: none !important;
  border-right: 1px solid var(--cal-line) !important;
  border-bottom: 1px solid var(--cal-line) !important;
  min-height: 138px !important;
  padding: 6px !important;
  transition: background .14s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-cell:hover { background: #FBFCFD !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-cell.is-out { background: #fff !important; }

/* Day number: top-right, muted, never bold */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-day {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 15px !important; font-weight: 400 !important;
  color: var(--cal-ink) !important;
  display: block !important; text-align: right !important;
  padding: 6px 8px 2px !important;
  background: none !important; border-radius: 0 !important;
  width: auto !important; height: auto !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-cell.is-out .pmcal-day { color: var(--cal-ink-mute) !important; }

/* Today: cream wash, number stays plain — LUNO does not badge it */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-cell.is-today { background: var(--cal-today) !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-cell.is-today:hover { background: #FFF6C9 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-cell.is-today .pmcal-day {
  color: var(--cal-ink) !important; font-weight: 400 !important;
  background: none !important; border-radius: 0 !important;
}

/* ── Events: flat solid bars ── */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event {
  display: block !important;
  background: var(--cal-accent) !important;
  color: var(--cal-accent-ink) !important;
  border: none !important; border-radius: 4px !important;
  padding: 4px 8px !important;
  margin: 0 0 3px !important;
  box-shadow: none !important;
  transition: filter .14s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event:hover { filter: brightness(.93) !important; transform: none !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__title {
  color: var(--cal-accent-ink) !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 13px !important; font-weight: 600 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__clients {
  color: rgba(255,255,255,.88) !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 12px !important; font-weight: 400 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__count {
  color: rgba(255,255,255,.72) !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 11px !important; font-weight: 400 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__time,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__time--centered {
  color: rgba(255,255,255,.95) !important;
  background: transparent !important; padding: 0 !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 12px !important; font-weight: 400 !important;
  font-variant-numeric: tabular-nums !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event.is-cancelled { opacity: .5 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event.is-completed { filter: saturate(.6) !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event-more {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 12px !important; font-weight: 400 !important;
  color: #868E96 !important; padding: 2px 4px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event-more:hover { color: var(--cal-accent) !important; }

/* Holiday + renewal keep LUNO's flat-chip language */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-holiday {
  background: #E9ECEF !important; color: #495057 !important;
  border: none !important; border-radius: 4px !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 12px !important; font-weight: 400 !important; padding: 3px 8px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-renewal {
  background: #FFA94D !important; color: #fff !important;
  border: none !important; border-radius: 4px !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 11.5px !important; font-weight: 600 !important;
  letter-spacing: 0 !important; box-shadow: none !important; padding: 3px 8px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-renewal__dot { background: #fff !important; }

/* Week view — same lattice + bars */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-body,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-cols,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-timeaxis { background: #fff !important; border-color: var(--cal-line) !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-col { background: #fff !important; border-color: var(--cal-line) !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-col.is-today { background: var(--cal-today) !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-dayhead__wd,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-timecell,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-dayhead__num {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-weight: 400 !important; color: var(--cal-ink) !important; background: transparent !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-dayhead.is-today .pmcal-week-dayhead__num { color: #212529 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-event {
  background: var(--cal-accent) !important; color: #fff !important;
  border: none !important; border-radius: 4px !important; box-shadow: none !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-event__title { color: #fff !important; font-weight: 600 !important; font-size: 13px !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-week-event__time  { color: rgba(255,255,255,.9) !important; font-weight: 400 !important; }

/* ── 9b. Accent palettes — DELETED 2026-08-16 ────────────────────────────
   The five `html[data-caltheme="…"]` overrides lived here, driven by the
   palette button in the header. Caleb: "delete the colour pallet it not
   needed anymore". Nothing else read the attribute, and the calendar's real
   accent is the base `--cal-accent: #4A9FF5` declared on body:is(.pm-admin-console,.pm-assistant-console)
   in §9 — so removing these changes nothing visually, it just removes a
   setting that existed only because a button existed. */

/* ════════════════════════════════════════════════════════════════════════
   10. KPI ROW — LUNO's inline stat  (2026-08-16)

   Supersedes §7's card treatment. LUNO's stat is not a card at all: a big
   number, an optional delta beside it, and a small muted uppercase label
   underneath, sitting directly on the page. No border, no fill, no shadow,
   no accent bar. The restraint IS the design — the numbers carry it.

   §7 moved the label ABOVE the number with `order:-1`; LUNO puts it BELOW,
   so that is reset here rather than edited in place, keeping §7 intact as
   the card variant should it ever be wanted back.

   HONEST NOTE ON THE DELTAS: LUNO's mock shows "▲1.3%" beside every figure.
   Three of these tiles (clients / hours / applications) have NO period-over-
   period number behind them in the data — inventing one would be fabricating
   a business metric on a financial dashboard, so nothing is shown where
   nothing is known. `.nx-stats__delta` is styled and ready for whenever a
   real comparison exists.
   ════════════════════════════════════════════════════════════════════════ */

body:is(.pm-admin-console,.pm-assistant-console) .nx-stats,
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__grid {
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  padding: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats { margin-bottom: 26px !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__grid { gap: 12px 40px !important; }

body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell {
  display: block !important;
  background: transparent !important;
  border: none !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  padding: 0 !important;
  overflow: visible !important;
  transition: none !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell:hover { transform: none !important; box-shadow: none !important; }
/* §7's accent bar along the bottom edge — gone */
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell::after { display: none !important; content: none !important; }

body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__num {
  order: 0 !important;
  display: inline-flex !important; align-items: baseline !important; gap: 7px !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 24px !important; font-weight: 600 !important;
  line-height: 1.15 !important; letter-spacing: -.01em !important;
  color: #212529 !important;
  font-variant-numeric: tabular-nums !important;
  margin: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__label {
  order: 0 !important;
  display: block !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 12px !important; font-weight: 400 !important;
  letter-spacing: .04em !important; text-transform: uppercase !important;
  color: #ADB5BD !important;
  margin: 5px 0 0 !important;
}

/* Delta, for the tiles that genuinely have one */
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__delta {
  display: inline-flex; align-items: center; gap: 3px;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif;
  font-size: 13px; font-weight: 400; letter-spacing: 0;
  font-variant-numeric: tabular-nums;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__delta--up   { color: #12B3A0; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__delta--down { color: #FA5252; }

/* MRR's breakdown: quiet supporting rows, not a boxed table */
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__extra {
  margin: 10px 0 0 !important; padding: 0 !important; border: none !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__extra-row {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 12.5px !important; font-weight: 400 !important;
  color: #868E96 !important; padding: 1px 0 !important;
  max-width: 230px;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__extra-row strong {
  font-weight: 600 !important; color: #495057 !important;
}
/* Clickable tiles keep their affordance without a card to hover */
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell--clickable { cursor: pointer !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-stats__cell--clickable:hover .nx-stats__num { color: var(--cal-accent, #4A9FF5) !important; }

/* ── 9c. Chip internals (2026-08-16) ─────────────────────────────────────
   Caleb: "the information in the blue is messy with the line how its laid
   out and its not professional."

   The parts are plain inline <span>s emitted one after another by
   session-calendar.js, so they ran together as text: "(1 appt)9:30 a.m." with
   no separator, and the time then broke mid-value onto a second line —
   "9:30" above "a.m." That is what read as messy; it was never a colour
   problem.

   Fixed with a 2-column grid on the chip. Name and family span the full
   width; the time sits bottom-left and the appointment count bottom-right,
   on one shared baseline row. Both are nowrap so a time can never split.
   No JS change — grid placement is assigned per existing class. */

body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event {
  display: grid !important;
  grid-template-columns: 1fr auto !important;
  align-items: baseline !important;
  column-gap: 8px !important; row-gap: 1px !important;
  padding: 6px 8px 7px !important;
  text-align: left !important;
}
/* 2026-08-17 - `white-space: nowrap !important` here was silently defeating the
   wrap added in js/session-calendar.js, which is why names still chopped
   mid-word ("NO APPOI...", "Education..."). An !important in a console sheet
   beats a plain rule in the component that owns the chip, so the fix has to
   live here. Two lines, then ellipsis. */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__title {
  grid-column: 1 / -1 !important;
  line-height: 1.35 !important;
  overflow: hidden !important; text-overflow: ellipsis !important;
  white-space: normal !important;
  display: -webkit-box !important;
  -webkit-line-clamp: 2 !important; -webkit-box-orient: vertical !important;
  word-break: break-word !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__clients {
  grid-column: 1 / -1 !important;
  display: block !important;
  line-height: 1.35 !important;
  margin: 0 0 3px !important;
}
/* Bottom row: time left, count right — never touching, never wrapping */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__time,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__time--centered {
  grid-column: 1 !important;
  justify-self: start !important;
  white-space: nowrap !important;
  line-height: 1.2 !important;
  text-align: left !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event__count {
  grid-column: 2 !important;
  justify-self: end !important;
  white-space: nowrap !important;
  line-height: 1.2 !important;
  opacity: .8 !important;
}
/* Aggregate chips list several families — let those wrap, keep them tidy */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event--agg .pmcal-event__clients {
  white-space: normal !important;
  display: -webkit-box !important; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden !important;
}


/* ── 9d. No load-time veil over the calendar (2026-08-16) ────────────────
   Caleb: "when i reload, its like theres a grey thing over the calendar…
   get rid of that."

   The washed-out first paint is the calendar rendering BEFORE its data
   settles — the page is waiting on queries that, per the console, can time
   out entirely (`57014 canceling statement due to statement timeout` on
   v_appointment_with_lesson). While that is outstanding the chips fall back
   to the pale inline tint the JS ships and the whole grid reads greyed.

   This pins the finished appearance so there is no half-painted state to
   look at: chip surface, text and grid colours are asserted regardless of
   what the JS has or has not applied yet, and nothing in the calendar is
   allowed to render at partial opacity or under a filter. It cannot fix the
   slow query — that is a database problem, flagged separately — but it
   removes the visible "grey thing".  */

body:is(.pm-admin-console,.pm-assistant-console) .pmcal-grid,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-cell,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-events,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__panes {
  opacity: 1 !important;
  filter: none !important;
  transition: none !important;
}
/* Cancelled sessions are the ONE thing allowed to look faded. */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-event.is-cancelled { opacity: .5 !important; }
/* Any skeleton left mounted behind the real grid must not show through. */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-skeleton { display: none !important; }

/* ── 9e. Stop the calendar header reflowing (2026-08-16) ─────────────────
   Caleb: "it takes a minute for it to get situated… things are jumping and
   loading and i feel nauseous when it does that."

   `.pmcal-header` is `display:flex; flex-wrap:wrap` with the title block on
   the left and Day/Week/Month + nav on the right. The subtitle text CHANGES
   once data resolves ("Click an assistant to see their day" →
   "Every session on the platform this month — coloured by assistant…"), and
   the longer string pushes the controls past the available width so they WRAP
   onto a second row. The header grows taller, and the entire calendar below
   it jumps down. That is the movement, not a slow render.

   Fix: reserve the taller of the two states from the first frame and keep the
   control cluster on its own line, so the text can change freely underneath
   without ever moving anything. */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-header {
  align-items: flex-start !important;
  min-height: 74px;                 /* the two-line state, held from frame 1 */
  row-gap: 10px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-header > *:first-child { flex: 1 1 100%; min-width: 0; }
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-sub {
  display: block;
  min-height: 2.6em;                /* both subtitle strings fit; no growth */
  margin: 3px 0 0 !important;
}
/* Controls never wrap mid-cluster — they sit as one row under the title. */
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-controls,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-nav,
body:is(.pm-admin-console,.pm-assistant-console) .pmcal-vtoggle { flex-wrap: nowrap !important; }


/* ── The bell is PERMANENT chrome (2026-08-16) ───────────────────────────
   Caleb: "fix this so it's permanently there and not disappearing then
   loading, disappearing, then loading, then settling."

   Root cause of the blink, for the record: the strip ships [hidden]; the
   quick bar un-hides it from cache instantly; then the dashboard's own
   refresh() (admin-dashboard.html ~3859) sets strip.hidden = true whenever a
   fetch round returns empty — including transiently, mid-boot — and a later
   round un-hides it again. Three writers, visible tug-of-war.

   Decision instead of another timer: a notification bell EXISTS whether or
   not there are notifications, like any professional app. Under the admin
   console the strip is always displayed; refresh()'s hidden-toggles become
   inert here (they still govern every non-console surface). Zero state =
   bell, no badge, panel shows its existing "Nothing pending right now."
   The badge only ever changes its NUMBER — textContent updates don't
   remove nodes, so there is nothing left that can flicker. */
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-strip--topbar,
body:is(.pm-admin-console,.pm-assistant-console) .nx-notif-strip--topbar[hidden] {
  display: flex !important;
}

/* ════════════════════════════════════════════════════════════════════════
   11. FAMILY PORTFOLIO TABS — matched to the console  (2026-08-16)

   Caleb's list: purple pills on Assistant/Client Calendar, heavy bold rows
   on Hours & Billing, and the Education tab. Everything below is scoped to
   body:is(.pm-admin-console,.pm-assistant-console), so the SAME components keep their existing look for
   parents and assistants — this is the owner console's skin, not a rewrite.

   family-portfolio.js is untouched: its rows are built with INLINE styles
   (Inter, weight 500-600), which is why nearly everything here needs
   !important — an inline style outranks a normal rule, but not this.
   ════════════════════════════════════════════════════════════════════════ */

/* Nunito everywhere inside the portfolio, over the inline `font:` shorthands */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane * {
  font-family: "Nunito", ui-rounded, system-ui, -apple-system, sans-serif !important;
}

/* ── 2 & 3. The family / assistant picker: outlined, not purple ── */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__subchip {
  background: #fff !important;
  border: 1px solid var(--line, #E8EAF0) !important;
  border-radius: 999px !important;
  padding: 7px 15px 7px 8px !important;
  box-shadow: none !important;
  transition: border-color .15s ease, background .15s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__subchip:hover {
  background: #FAFBFD !important;
  border-color: #CDD3DE !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__subchip.is-active {
  background: #fff !important;
  border-color: #4A9FF5 !important;
  box-shadow: 0 0 0 2px rgba(74,159,245,.13) !important;
}
/* The purple gradient avatar → a quiet neutral initial */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__subchip-avatar {
  background: #F1F4F8 !important;
  color: #6B7280 !important;
  font-weight: 600 !important;
  font-size: 11.5px !important;
  box-shadow: none !important;
  border: none !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__subchip.is-active .pmpf__subchip-avatar {
  background: #EAF4FE !important;
  color: #2E86E0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__subchip-name {
  font-size: 13.5px !important;
  font-weight: 400 !important;
  color: #4B5563 !important;
  letter-spacing: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__subchip.is-active .pmpf__subchip-name {
  color: #1A2130 !important;
  font-weight: 600 !important;
}

/* ── 5. Hours & Billing: entries, not headlines ──
   Every row ships `font:500 14px/1.35 Inter` on the title. At that weight a
   ledger reads like a list of headlines. Entries want to be readable and
   quiet; the NUMBERS are what should carry weight, so they keep theirs. */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:500 14px/1.35"] {
  font-size: 13.5px !important;
  font-weight: 400 !important;
  color: #2C3341 !important;
  letter-spacing: 0 !important;
}
/* The date · type line — drop the italics, it fights the rounded face */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:italic 400 12px/1.3"],
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:italic 400 12.5px"] {
  font-style: normal !important;
  font-size: 12px !important;
  color: #8A93A2 !important;
}
/* Card + section headings inside the statement */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:600 16px"] {
  font-size: 15px !important;
  font-weight: 600 !important;
  color: #1A2130 !important;
  letter-spacing: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:400 12px"] {
  font-size: 12.5px !important;
  color: #8A93A2 !important;
}
/* The +/- hours and running balance stay tabular and confident */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:500 13.5px"] {
  font-weight: 600 !important;
  font-size: 13px !important;
}
/* Softer rules between entries */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="border-top:1px solid rgba(0,0,0,.05)"] {
  border-top-color: #F1F2F6 !important;
}

/* ── 11. Education: cards on a page, not boxes in a row ── */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__cards { gap: 14px !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__card {
  background: #fff !important;
  border: 1px solid var(--line, #E8EAF0) !important;
  border-radius: 14px !important;
  padding: 20px !important;
  box-shadow: 0 1px 2px rgba(16,24,40,.04) !important;
  transition: border-color .16s ease, box-shadow .16s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__card:not(.pmpf-edu__card--soon):hover {
  border-color: #4A9FF5 !important;
  box-shadow: 0 6px 18px -6px rgba(74,159,245,.22) !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__cardTitle {
  font-size: 15.5px !important; font-weight: 600 !important;
  color: #1A2130 !important; letter-spacing: 0 !important; margin-bottom: 6px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__cardDesc {
  font-size: 13px !important; font-weight: 400 !important;
  color: #77808F !important; line-height: 1.55 !important;
}
/* "Coming soon" reads as deliberate, not broken */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__card--soon {
  opacity: 1 !important;
  background: #FBFCFD !important;
  border-style: dashed !important;
  border-color: #E2E6EE !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__card--soon .pmpf-edu__cardTitle { color: #8A93A2 !important; }
/* The big emoji glyphs shrink into quiet marks */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__icon { font-size: 22px !important; margin-bottom: 12px !important; opacity: .9; }
/* Assignment rows */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__row {
  border: 1px solid var(--line, #E8EAF0) !important;
  border-radius: 11px !important;
  padding: 13px 15px !important;
  background: #fff !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__rowTitle {
  font-size: 13.5px !important; font-weight: 600 !important; color: #1A2130 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__rowMeta {
  font-size: 12px !important; font-weight: 400 !important; color: #8A93A2 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__status {
  border-radius: 999px !important; font-size: 11px !important;
  font-weight: 600 !important; padding: 3px 10px !important; letter-spacing: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__btn {
  border-radius: 9px !important; font-size: 12.5px !important;
  font-weight: 600 !important; letter-spacing: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__btn--primary {
  background: #4A9FF5 !important; border-color: #4A9FF5 !important; color: #fff !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__empty,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-edu__loading {
  font-size: 13.5px !important; font-weight: 400 !important; color: #8A93A2 !important;
}

/* ════════════════════════════════════════════════════════════════════════
   12. PORTFOLIO — final consistency pass  (2026-08-16)

   Caleb: Hours & Billing and Education are now the standard; bring every
   other pane to the same weight and scale.

   The rule applied throughout: ONE heading size per level across all panes
   (19px/600 section, 15px/600 card, 13.5px/400 body, 12px/400 meta). Before
   this, each pane invented its own — the calendar shouted at 27px while the
   Hours header sat at 15px, so moving between tabs felt like moving between
   products.

   Everything stays scoped to body:is(.pm-admin-console,.pm-assistant-console); parents and assistants
   see these components unchanged.
   ════════════════════════════════════════════════════════════════════════ */

/* ── Section headings: one scale everywhere ── */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane .pmcal-title,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane .pmcal-sub {
  font-size: 13px !important;
  font-weight: 400 !important;
  color: #77808F !important;
}

/* ── Family Editor ──
   The four cards are a PREVIEW of what the editor produces, so the poster
   faces (Anton / Playfair) are left alone deliberately — flattening them
   would misrepresent the tool's output. What changes is the CHROME around
   them and the small caps labels, which were 800-weight on 13px text. */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:800 13px/1.2"] {
  font-weight: 600 !important;
  letter-spacing: .01em !important;
  color: #1A2130 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:500 12px/1.55"] {
  font-weight: 400 !important;
  color: #4B5563 !important;
}
/* Card frames match Education's */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-fe-card {
  border: 1px solid var(--line) !important;
  border-radius: 14px !important;
  box-shadow: 0 1px 2px rgba(16,24,40,.04) !important;
  transition: border-color .16s ease, box-shadow .16s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf-fe-card:hover {
  border-color: #4A9FF5 !important;
  box-shadow: 0 6px 18px -6px rgba(74,159,245,.22) !important;
  transform: none !important;
}
/* The magenta CTA joins the console's single accent */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane a[href*="family-editor"],
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane button[data-href*="family-editor"]:not(.pmpf-fe-card) {
  background: #4A9FF5 !important;
  border-color: #4A9FF5 !important;
  color: #fff !important;
  font-weight: 600 !important;
  border-radius: 10px !important;
  box-shadow: none !important;
  letter-spacing: 0 !important;
}

/* ── Blanket weight relief across every pane ──
   family-portfolio.js emits 700-900 weights inline in several places. At
   these text sizes that reads as shouting, not emphasis. Anything 700+ on
   BODY-sized text drops to 600; the poster mock above is exempt because it
   is deliberately display type, and numbers keep their weight because a
   ledger should be led by its figures. */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:700"],
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font:800"],
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font-weight:700"],
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="font-weight:800"] {
  font-weight: 600 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane h1,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane h2,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane h3,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane h4 {
  font-weight: 600 !important;
  letter-spacing: 0 !important;
  color: #1A2130 !important;
}
/* Restore the display faces the editor preview needs */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="Anton"],
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="Playfair"] {
  font-weight: inherit !important;
}

/* ── Cards + rows: one frame language ── */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane .nx-card,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane .pmpf-jcard {
  border: 1px solid var(--line) !important;
  border-radius: 12px !important;
  box-shadow: 0 1px 2px rgba(16,24,40,.04) !important;
}
/* Uppercase micro-labels stop being heavy */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [style*="text-transform:uppercase"] {
  font-weight: 600 !important;
  letter-spacing: .06em !important;
}

/* ── Assistant Availability legend + grid ── */
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane .availability-legend,
body:is(.pm-admin-console,.pm-assistant-console) .pmpf__pane [class*="legend"] {
  font-size: 12.5px !important;
  font-weight: 400 !important;
  color: #77808F !important;
}

/* ════════════════════════════════════════════════════════════════════════
   13. LOWER DASHBOARD — Operations, charts, roster, tools  (2026-08-16)

   Caleb: everything below the fold to match the KPI strip and portfolio.
   Same scale as §12 — 19px/600 section · 15px/600 card · 13.5px/400 body ·
   12px/400 meta — plus the KPI strip's own idiom for figures: number first,
   small muted uppercase label under it, no heavy chrome.
   ════════════════════════════════════════════════════════════════════════ */

/* ── Operations: tabs become a quiet underline row ── */
body:is(.pm-admin-console,.pm-assistant-console) .ado-card__title { font-size: 19px !important; font-weight: 600 !important; letter-spacing: 0 !important; color: #1A2130 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .ado-card__sub   { font-size: 13px !important; font-weight: 400 !important; color: #77808F !important; }
body:is(.pm-admin-console,.pm-assistant-console) .ado-tabs {
  border-bottom: 1px solid var(--line) !important;
  gap: 2px !important; padding: 0 !important; background: transparent !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .ado-tab {
  background: transparent !important;
  border: none !important;
  border-bottom: 2px solid transparent !important;
  border-radius: 0 !important;
  margin-bottom: -1px !important;
  padding: 11px 15px 12px !important;
  font-size: 13.5px !important; font-weight: 400 !important;
  color: #77808F !important; letter-spacing: 0 !important;
  box-shadow: none !important;
  transition: color .15s ease, border-color .15s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .ado-tab:hover { color: #1A2130 !important; background: transparent !important; }
body:is(.pm-admin-console,.pm-assistant-console) .ado-tab.is-active {
  color: #4A9FF5 !important; border-bottom-color: #4A9FF5 !important;
  font-weight: 600 !important; background: transparent !important;
}
/* Counts sit beside the label as plain figures, not filled blobs */
body:is(.pm-admin-console,.pm-assistant-console) .ado-tab__badge {
  background: #F1F4F8 !important; color: #77808F !important;
  border: none !important; border-radius: 999px !important;
  min-width: 20px !important; height: 19px !important; padding: 0 7px !important;
  font-size: 11px !important; font-weight: 600 !important; line-height: 19px !important;
  box-shadow: none !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .ado-tab.is-active .ado-tab__badge { background: #EAF4FE !important; color: #2E86E0 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .ado-pane__empty { font-size: 13.5px !important; font-weight: 400 !important; color: #8A93A2 !important; }

/* ── Chart footers: the KPI strip's idiom, not bold blocks ──
   These were the loudest numbers on the page below the fold, competing with
   the real KPIs at the top. Same treatment, one step smaller — they are a
   footnote to the chart, not a headline. */
body:is(.pm-admin-console,.pm-assistant-console) .nx-chart-foot { gap: 40px !important; border-top: 1px solid var(--line) !important; padding-top: 14px !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-chart-foot__label {
  font-size: 11px !important; font-weight: 600 !important;
  letter-spacing: .09em !important; text-transform: uppercase !important;
  color: #A2AAB6 !important; margin: 0 0 4px !important; background: none !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-chart-foot__value {
  font-size: 21px !important; font-weight: 600 !important;
  letter-spacing: 0 !important; color: #1A2130 !important;
  font-variant-numeric: tabular-nums !important; margin: 0 !important; background: none !important;
}

/* ── Client roster: cards that read, not shout ── */
body:is(.pm-admin-console,.pm-assistant-console) .nx-client {
  border: 1px solid var(--line) !important; border-radius: 12px !important;
  box-shadow: 0 1px 2px rgba(16,24,40,.04) !important;
  transition: border-color .16s ease, box-shadow .16s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-client:hover {
  border-color: #4A9FF5 !important;
  box-shadow: 0 6px 18px -6px rgba(74,159,245,.20) !important;
  transform: none !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-client__avatar {
  background: #F1F4F8 !important; color: #6B7280 !important;
  font-size: 12.5px !important; font-weight: 600 !important; box-shadow: none !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-client__name  { font-size: 14.5px !important; font-weight: 600 !important; color: #1A2130 !important; letter-spacing: 0 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-client__email { font-size: 12px !important; font-weight: 400 !important; color: #8A93A2 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-client__stat-label {
  font-size: 10.5px !important; font-weight: 600 !important;
  letter-spacing: .09em !important; text-transform: uppercase !important; color: #A2AAB6 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-client__stat-value { font-size: 16px !important; font-weight: 600 !important; color: #1A2130 !important; letter-spacing: 0 !important; }

/* ── 15. Management tools — rebuilt ──
   The old grid was fifteen saturated gradient tiles, each shouting a
   different hue. At that count colour stops being a signal and becomes
   wallpaper. Reconstructed as one calm set: neutral monoline icons at rest,
   the console blue arriving only on hover, and the tone classes reduced to a
   quiet tint so the icons stay distinguishable without competing. */
body:is(.pm-admin-console,.pm-assistant-console) .nx-tools {
  grid-template-columns: repeat(auto-fill, minmax(232px, 1fr)) !important;
  gap: 12px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool {
  position: relative !important;
  display: block !important;
  background: #fff !important;
  border: 1px solid var(--line) !important;
  border-radius: 14px !important;
  padding: 18px !important;
  box-shadow: 0 1px 2px rgba(16,24,40,.04) !important;
  transition: border-color .16s ease, box-shadow .16s ease, transform .16s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool:hover {
  border-color: #4A9FF5 !important;
  box-shadow: 0 8px 22px -8px rgba(74,159,245,.24) !important;
  transform: translateY(-2px) !important;
}
/* Icon: a tinted square, not a saturated gradient chip */
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__icon {
  width: 38px !important; height: 38px !important;
  border-radius: 11px !important;
  background: #F3F5F9 !important;
  color: #6B7280 !important;
  box-shadow: none !important;
  margin-bottom: 14px !important;
  display: grid !important; place-items: center !important;
  transition: background .16s ease, color .16s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__icon svg { width: 18px !important; height: 18px !important; stroke-width: 1.7 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool:hover .nx-tool__icon { background: #EAF4FE !important; color: #2E86E0 !important; }
/* Every tone variant collapses to the same calm treatment */
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__icon--blue,
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__icon--green,
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__icon--indigo,
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__icon--orange,
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__icon--pink,
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__icon--purple {
  background: #F3F5F9 !important; color: #6B7280 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__title {
  font-size: 15px !important; font-weight: 600 !important;
  color: #1A2130 !important; letter-spacing: 0 !important; margin: 0 0 5px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__sub {
  font-size: 12.5px !important; font-weight: 400 !important;
  color: #8A93A2 !important; line-height: 1.5 !important; margin: 0 !important;
}
/* "1 OPEN" — the one badge that should still catch the eye, quietly */
body:is(.pm-admin-console,.pm-assistant-console) .nx-tool__badge {
  position: absolute !important; top: 16px !important; right: 16px !important;
  background: #FDEDED !important; color: #DA3B3B !important;
  border: none !important; border-radius: 999px !important;
  padding: 3px 9px !important; font-size: 10.5px !important;
  font-weight: 600 !important; letter-spacing: .03em !important;
  text-transform: uppercase !important; box-shadow: none !important;
}

/* ============================================================================
   §14 — ASSISTANT AVAILABILITY CALENDAR (owner console only)   2026-08-16
   Caleb: "the calendar days 1234 are very bold and thick i want it more clean
   and not soo bold and heavy weight please".

   js/availability-mini-calendar.js injects its own <style> at runtime and is
   SHARED with client-dashboard.html (families see the same component). So every
   rule here is scoped to body:is(.pm-admin-console,.pm-assistant-console) — families keep the calendar
   exactly as it is — and carries !important, because the component's styles are
   injected into <head> after this stylesheet loads.

   Weights only, plus the purple today-ring → console blue (Caleb has rejected
   purple throughout this redesign). The blackout tints are LEFT ALONE: they are
   the legend's meaning, not decoration.
   ========================================================================== */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-head__title {
  font: 600 15px Nunito, Inter, sans-serif !important;
  color: #1A2130 !important; letter-spacing: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-head__sub {
  font: 400 12.5px Nunito, Inter, sans-serif !important; color: #8A93A2 !important;
}

/* Month label + arrows — regular weight, quiet chrome */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-nav__label {
  font: 600 14px Nunito, Inter, sans-serif !important;
  color: #1A2130 !important; letter-spacing: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-nav__btn {
  font-weight: 400 !important; color: #77808F !important;
  border-color: #E7EAF0 !important; border-radius: 8px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-nav__btn:hover {
  background: #EAF4FE !important; border-color: #BFD9F8 !important; color: #2E86E0 !important;
}

/* Weekday header row — uppercase micro-label, same idiom as the KPI labels */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-dayhead {
  font: 500 10px Nunito, Inter, sans-serif !important;
  color: #98A1B0 !important; letter-spacing: .1em !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-dayhead-row { background: #FBFCFD !important; }

/* THE FIX Caleb asked for: 700 → 400. Day numbers are a coordinate, not a
   headline — nothing on a month grid needs bold to be found. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-cell__num {
  font: 400 13px Nunito, Inter, sans-serif !important;
  color: #4A5261 !important; line-height: 1 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-cell--outside .pmac-cell__num {
  font-weight: 400 !important; color: #C7CDD6 !important;
}

/* Today: console blue ring, and the only day number that steps up in weight */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-cell--today { box-shadow: inset 0 0 0 1.5px #4A9FF5 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-cell--today .pmac-cell__num {
  color: #2E86E0 !important; font-weight: 600 !important;
}

/* Legend + in-cell time pills — lighter, no all-caps shouting */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-legend {
  font-weight: 400 !important; font-size: 11.5px !important;
  color: #77808F !important; border-color: #EDF0F4 !important;
  background: #FBFCFD !important; border-radius: 8px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-cell__chip {
  font: 500 10px Nunito, Inter, sans-serif !important; letter-spacing: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-cell__chip--more { font-weight: 400 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-empty__title {
  font: 600 14px Nunito, Inter, sans-serif !important; color: #1A2130 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-popover__title {
  font: 600 13.5px Nunito, Inter, sans-serif !important; color: #1A2130 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-popover__sentence { font-weight: 400 !important; }

/* ════════════════════════════════════════════════════════════════════════
   §15 — SETTINGS GEAR + the Log-session pill standing alone   2026-08-16

   Caleb: "put this in a setting gear icon nicely beside calebs name … however
   i do wnat the log sesison when it does pop up to be noticable on the header."

   js/admin-quickbar.js moves every pill EXCEPT [data-pmac-slot="needs"] into
   the gear. The split is by consequence, not by category: Log session is the
   only item that costs money while it waits (unlogged session = family not
   charged, assistant not paid), so it stays where the eye lands and keeps its
   radar ping. Everything else is an alert you read when you choose to.
   ════════════════════════════════════════════════════════════════════════ */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear { position: relative; margin-left: 4px; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__btn {
  position: relative;
  width: 38px; height: 34px; display: grid; place-items: center;
  border: none; border-radius: 999px; background: transparent;
  color: #EEF1FF; cursor: pointer; transition: background .16s ease;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__btn svg { width: 18px; height: 18px; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__btn:hover,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__btn[aria-expanded="true"] { background: rgba(255,255,255,.2); }
/* Tucked away must not mean unseen: a dot whenever anything inside is live. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__dot {
  position: absolute; top: 6px; right: 7px;
  width: 8px; height: 8px; border-radius: 50%;
  background: #EF5B5B; border: 2px solid #1b2440;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__dot[hidden] { display: none; }

body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__pop {
  position: absolute; top: calc(100% + 10px); right: 0; z-index: 70;
  width: 288px; padding: 6px 6px 8px;
  background: #fff; border: 1px solid #E6EAF0; border-radius: 14px;
  box-shadow: 0 24px 60px -18px rgba(16,24,40,.36);
}
/* A small pointer back to the gear — it reads as attached to the button
   rather than floating loose under it. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__pop::after {
  content: ''; position: absolute; top: -5px; right: 15px;
  width: 9px; height: 9px; background: #fff;
  border-left: 1px solid #E6EAF0; border-top: 1px solid #E6EAF0;
  transform: rotate(45deg); border-radius: 2px 0 0 0;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__pop[hidden] { display: none; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__hd {
  padding: 8px 10px 8px;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif;
  font-size: 10.5px; font-weight: 600; letter-spacing: .1em;
  text-transform: uppercase; color: #A2AAB6;
  border-bottom: 1px solid #F1F3F7; margin-bottom: 4px;
}
/* ── Inside the menu: a proper settings list ───────────────────────────────
   Caleb: "the 3 options in gear setting arent alligned and nice its messy…
   make sure its nice and clean as a norma lsetting button to select optios."

   The first pass under-specified. §8 styles the header pill as a 38×34 GRID
   with `place-items:center` and an ABSOLUTELY positioned severity dot — so
   inside the menu the icon and its label stacked vertically and the dot
   floated over the corner. That is the whole mess. Fixed by undoing both
   explicitly: the button becomes a real flex ROW, and the dot returns to the
   normal flow so `margin-left:auto` can park it at the right edge. Every row
   is the same height and the three columns line up: icon · label · status. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd { display: flex; flex-direction: column; gap: 1px; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__lbl { display: none !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__slot { position: relative; width: 100%; }

body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__btn,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger {
  display: flex !important;            /* was grid — the stacking culprit */
  align-items: center !important;
  justify-content: flex-start !important;
  gap: 11px !important;
  width: 100% !important; height: 40px !important;
  min-height: 40px !important;
  padding: 0 10px !important;
  border-radius: 9px !important;
  background: transparent !important; border: none !important;
  color: #2C3341 !important; text-align: left !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  cursor: pointer !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__btn:hover,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger:hover { background: #F4F7FA !important; }

/* icon column — fixed width so every label starts on the same x */
/* The bell's markup nests its badge INSIDE the icon span, so the span was
   holding icon+badge as one column — that is why the bell row's label started
   19px left of the others and its badge sat 12px short of the right edge.
   `display:contents` dissolves the span so the svg and the badge become
   direct flex children of the row, and the three columns line up with the
   pill rows exactly. Measured before/after; this is the only row that needed it. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__icon { display: contents !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__btn > svg,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__icon > svg {
  width: 18px !important; height: 18px !important;
  flex: 0 0 18px !important; color: #6B7280 !important;
  position: static !important;
}

/* label column — the tooltip text does the job; make it a normal label */
/* ORDER, for both row types. The pill's markup is  svg · dot · tip  and the
   bell's is  svg · badge · text  — in BOTH the status element precedes the
   label, so `margin-left:auto` parked it mid-row and pushed the label right by
   the dot's width. Ordering label=2 / status=3 puts every row in the same
   icon · label · status sequence, and the labels finally share an x. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__tip { order: 2 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__dot { order: 3 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__tip,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__title {
  position: static !important; opacity: 1 !important; transform: none !important;
  flex: 1 1 auto !important; min-width: 0 !important;
  background: none !important; box-shadow: none !important;
  color: #2C3341 !important; font-size: 13.5px !important; font-weight: 400 !important;
  padding: 0 !important; margin: 0 !important; white-space: nowrap !important;
  overflow: hidden !important; text-overflow: ellipsis !important;
  pointer-events: none; text-align: left !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__sub,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__chev { display: none !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__text {
  display: flex !important; align-items: center !important; flex: 1 1 auto !important; min-width: 0 !important;
}

/* status column — back into the flow, parked right, same size for all */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__dot {
  position: static !important; margin-left: auto !important; flex: 0 0 auto !important;
  width: 8px !important; height: 8px !important; border-radius: 50% !important;
  animation: none !important;
}
/* `display:contents` exposes the bell's children in SOURCE order — svg, badge,
   text — which put the badge second and shoved the label 24px right of every
   other row. `order` re-sequences them without touching the markup that
   admin-notifications.js writes into. Measured: label and badge now land on
   the same x as the pill rows. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__text { order: 2 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__badge {
  order: 3 !important;
  position: static !important; margin-left: auto !important; flex: 0 0 auto !important;
  min-width: 20px !important; height: 18px !important; padding: 0 6px !important;
  border: none !important; border-radius: 999px !important;
  font-size: 10.5px !important; font-weight: 600 !important; line-height: 18px !important;
}
/* Popovers open to the LEFT so they clear the menu's edge. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__pop { right: calc(100% + 10px) !important; left: auto !important; top: -6px !important; }

/* Install App — a real primary action, separated by a rule, not another row */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__install {
  order: 99; margin: 8px 2px 2px !important; width: calc(100% - 4px) !important;
  display: flex !important; align-items: center !important; justify-content: center !important;
  gap: 8px !important; height: 40px !important; border-radius: 9px !important;
  background: var(--pmar-teal, #17BFA0) !important; border: none !important;
  color: #fff !important; font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 13.5px !important; font-weight: 600 !important;
}
/* THE LINE THROUGH THE GREEN BUTTON (Caleb, 2026-08-16). This separator was
   `position:absolute` with no positioned ancestor, so it resolved against the
   popover and painted straight across the button. Anchored to the button
   itself and pushed clear above it. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__install { position: relative !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__install::before {
  content: ''; position: absolute; top: -7px; left: 0; right: 0;
  height: 1px; background: #EDF0F4;
}

/* ── The Log-session pill, now standing alone ──────────────────────────────
   With five neighbours gone it can afford to be a labelled pill rather than
   a bare icon — which is the point: Caleb has to SEE it. The existing radar
   ping (§8's [data-pmac-slot="needs"] rules) still applies on top of this. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac--solo {
  background: rgba(239,91,91,.14) !important;
  border: 1px solid rgba(239,91,91,.35) !important;
  padding: 4px 6px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac--solo .pmac__btn { color: #FFD9D9 !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac--solo .pmac__tip { opacity: 0; }   /* keep hover tip behaviour */
/* When there is nothing to log the pill hides itself, and the empty shell
   should not sit there as a red outline around nothing. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac--solo:not(:has(.pmac__slot:not([hidden]))) {
  background: transparent !important; border-color: transparent !important;
}

/* ════════════════════════════════════════════════════════════════════════
   NEEDS-YOUR-ATTENTION ROWS — match the dashboard   2026-08-18 (rev e)
   ────────────────────────────────────────────────────────────────────────
   rev d conformed the type + alignment to the dashboard (Nunito, one aligned
   118px label column, CTA bottom-left). rev e is Caleb's finishing touch: each
   entry is now a contained card — a thin blue line + soft blue fill — so the
   information for one family reads as one held-together unit. The animated CTA
   and the internal receipt|hours divider are unchanged from rev d.

   The base rows (Phase NX3.2, inline in each page) force transparent bg / no
   border with !important, so the card treatment has to answer !important — the
   #adNeedsList prefix keeps the higher specificity so it wins cleanly.

   Scoped to #adNeedsList — the dashboard is not touched. Verified in a faithful
   standalone render against the live shipped stylesheet.
   ════════════════════════════════════════════════════════════════════════ */
#adNeedsList{ display:flex; flex-direction:column; gap:11px; }
#adNeedsList .ad-action-row *{ font-family:"Nunito", ui-rounded, system-ui, -apple-system, sans-serif; }
/* each entry — a contained card: thin blue line, soft blue fill */
#adNeedsList .ad-action-row{
  background:#F5F8FE !important;
  border:1px solid #D8E4FA !important;
  border-radius:14px !important;
  padding:15px 17px !important;
  box-shadow:0 1px 2px rgba(37,99,235,0.04) !important;
}
#adNeedsList .ad-action-row:hover{ background:#EFF4FE !important; border-color:#C4D8F7 !important; }
#adNeedsList .ad-action-row__line{ display:flex; flex-wrap:wrap; }
#adNeedsList .ad-action-row__identity{
  flex:1 1 100%; min-width:0;
  padding-bottom:13px; border-bottom:1px solid rgba(37,99,235,0.13);
}
#adNeedsList .ad-action-row__name{ font-size:14.5px; font-weight:700; letter-spacing:-.005em; color:var(--ink-2); }
/* receipt + hours share ONE 118px label column so every value aligns */
#adNeedsList .ad-action-row__meta{
  display:grid; grid-template-columns:118px minmax(0,1fr); gap:7px 12px;
  margin-top:11px; padding-left:17px;
}
#adNeedsList .ad-meta-item{ display:contents; }
#adNeedsList .ad-meta-item__k,
#adNeedsList .ad-stat-line__label{ font-size:12.5px; font-weight:500; color:var(--ink-mute); letter-spacing:0; }
#adNeedsList .ad-meta-item__k::after{ content:''; }
#adNeedsList .ad-meta-item__v,
#adNeedsList .ad-stat-line__value{ font-size:12.5px; font-weight:600; color:var(--ink-2); font-variant-numeric:tabular-nums; }
#adNeedsList .ad-meta-item--overdue .ad-meta-item__v{ color:#DC2626; font-weight:700; }
#adNeedsList .ad-meta-item--warning .ad-meta-item__v{ color:#B45309; }
/* the redundant kebab — removed (rev c) */
#adNeedsList [data-owner-orbital]{ display:none; }
/* hours block — same aligned grid, directly under the divider */
#adNeedsList .ad-action-row__line > div:nth-child(3){ order:2; flex:1 1 100%; margin-top:12px; padding-left:17px; }
#adNeedsList .ad-action-row__stats{
  display:grid; grid-template-columns:118px minmax(0,1fr); gap:7px 12px; align-items:baseline; width:100%;
}
#adNeedsList .ad-stat-line{ display:contents; }
/* the animated CTA — bottom, left-aligned with the content */
#adNeedsList .ad-action-row__cta-col{ order:3; flex:0 0 auto; margin:14px 0 0 17px; }

/* ── Gear popover: the "View assistants" link ─────────────────────────────
   2026-08-18. Caleb asked for a way into the unfinished assistant directory
   from his own admin gear, with the public mega-menu entry left locked — so
   this is the only door. The page behind it is already restricted by
   js/pm-soon-gate.js (isCurrentUserAdminOrOwner), which is a real gate; this
   link just makes it reachable without typing a URL.
   Matches the pill rows above it exactly: same 40px height, same 11px gap,
   same 18px icon column, so the menu reads as one list rather than a list
   with something bolted underneath. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__link {
  display: flex; align-items: center; gap: 11px;
  width: 100%; height: 40px; min-height: 40px;
  padding: 0 10px; margin-top: 2px;
  border-radius: 9px; text-decoration: none;
  color: #2C3341;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif;
  font-size: 13.5px; font-weight: 600;
}
/* Only the FIRST preview link carries the divider. Three hairlines in a row
   would read as three separate menus rather than one group. The earlier
   attempt reset border-top BEFORE this block and lost to it on source order —
   the fix is to not set it here at all. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__link--first {
  border-top: 1px solid #F1F3F7; margin-top: 6px;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__link:hover { background: #F4F7FA; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__link > svg {
  width: 18px; height: 18px; flex: 0 0 18px; color: #6B7280;
}

/* ── GEAR MENU, second pass (Caleb, 2026-08-28) ────────────────────────────
   "it looks tight and all grey ... nicer icons and seperation from stuff
   inside the gear."

   Three things were wrong. The notification row kept its full-page styling
   because every rule above targeted `.nx-notif-strip--topbar`, a modifier the
   admin strip does not carry — so that row alone kept a 14px/18px padded,
   bordered, gradient-filled treatment and towered over the others. Second, ten
   rows ran together with nothing marking where alerts stopped and pages began.
   Third, the icons were bare strokes floating at the left margin.

   Everything below is scoped to the popover, so nothing here can reach the
   dashboard behind it. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__pop {
  width: 420px !important;
  padding: 8px !important;
  border-radius: 16px !important;
  box-shadow: 0 1px 2px rgba(15,23,42,.05), 0 18px 44px -22px rgba(15,23,42,.34) !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__hd {
  padding: 10px 12px 12px !important;
  font-size: 12px !important;
  letter-spacing: .02em !important;
  color: #7A8595 !important;
  border-bottom: 1px solid #EEF1F5 !important;
  margin-bottom: 6px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd { gap: 2px !important; }

/* the break between the two halves */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__sect {
  margin: 12px 12px 5px;
  padding-top: 11px;
  border-top: 1px solid #EEF1F5;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif;
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .015em;
  color: #93A0B0;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__sect--first {
  margin-top: 2px; padding-top: 0; border-top: none;
}

/* one row shape for every child, whatever script wrote it */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__btn,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__link {
  display: flex !important;
  align-items: center !important;
  gap: 12px !important;
  width: 100% !important;
  min-height: 42px !important;
  padding: 8px 10px !important;
  border: none !important;
  border-radius: 10px !important;
  background: transparent !important;
  box-shadow: none !important;
  text-align: left !important;
  transition: background .13s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__btn:hover,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger:hover,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__link:hover {
  background: #F5F7FA !important;
}

/* icons sit in a tile so they read as deliberate rather than as loose strokes */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__btn > svg,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__icon > svg,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__link > svg {
  width: 30px !important; height: 30px !important;
  flex: 0 0 30px !important;
  padding: 6px !important;
  box-sizing: border-box !important;
  border-radius: 8px !important;
  background: #F2F5F9 !important;
  color: #5A6675 !important;
  stroke-width: 1.8 !important;
  transition: background .13s ease, color .13s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__btn:hover > svg,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__link:hover > svg,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger:hover .nx-notif-trigger__icon > svg {
  background: rgba(99,102,241,.10) !important;
  color: #4F52C9 !important;
}

/* labels: one size, one weight, allowed to wrap to a second line rather than
   being cut off with an ellipsis the way the old rules did */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .pmac__tip,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__title,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__link > span {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 13.5px !important;
  font-weight: 500 !important;
  line-height: 1.35 !important;
  color: #2C3341 !important;
  white-space: normal !important;
  overflow: visible !important;
  text-overflow: clip !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-gear__bd .nx-notif-trigger__title {
  font-weight: 500 !important;
}

/* ── THE BELL, BACK IN THE HEADER (Caleb, 2026-08-28) ──────────────────────
   "just move the notifications on the left side of the gear wheel ... nicely
   on the side in a small bell."

   It is the same live node the strip has always been — moved, not rebuilt —
   so its panel, badge and realtime count still work. Here it only has to look
   like a header control: a 38x34 target matching the gear beside it, the title,
   sub-line and chevron hidden, and the count as a small badge on the corner.
   Everything the gear-menu rules did to it is scoped to `.pmac-gear__bd`, so
   none of that follows it out here. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell {
  position: relative;
  margin: 0 !important;
  flex: 0 0 auto;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell[hidden] { display: none !important; }
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger {
  width: 38px !important; height: 34px !important;
  display: grid !important; place-items: center !important;
  gap: 0 !important; padding: 0 !important;
  border: none !important; border-radius: 999px !important;
  background: transparent !important; box-shadow: none !important;
  color: #EEF1FF !important; cursor: pointer;
  transition: background .16s ease !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger:hover,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger[aria-expanded="true"] {
  background: rgba(255,255,255,.2) !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger__icon {
  display: grid !important; place-items: center !important;
  background: none !important; padding: 0 !important; border-radius: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger__icon > svg {
  width: 18px !important; height: 18px !important;
  background: none !important; padding: 0 !important; border-radius: 0 !important;
  color: inherit !important; stroke-width: 1.9 !important;
}
/* the label, its sub-line and the chevron are what a header icon does not need */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger__text,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger__title,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger__sub,
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger__chev {
  display: none !important;
}
/* the count, on the corner, ringed so it reads against the dark header */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-trigger__badge {
  position: absolute !important; top: 1px !important; right: 0 !important;
  min-width: 17px !important; height: 17px !important; padding: 0 5px !important;
  display: grid !important; place-items: center !important;
  border-radius: 999px !important; border: 2px solid #1b2440 !important;
  background: #EF5B5B !important; color: #fff !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 10px !important; font-weight: 700 !important; line-height: 1 !important;
}
/* the panel hangs from the bell, not from wherever it used to sit */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-panel {
  position: absolute !important; top: calc(100% + 10px) !important;
  right: 0 !important; left: auto !important; z-index: 70 !important;
  width: 360px !important; max-height: 70vh !important; overflow: auto !important;
  margin: 0 !important;
  box-shadow: 0 24px 60px -18px rgba(16,24,40,.36) !important;
}

/* ── The bell's panel, matched to the gear menu (Caleb, 2026-08-28) ────────
   "why is all the ntfcaitons so much bigger than the setting gear when i open
   it?"

   The two panels are neighbours in the same header and were built by different
   hands, so they disagreed on every measurement: title, sub, icon, padding and
   corner radius. Set explicitly here rather than left to whatever each page's
   own stylesheet happens to say, so the two read as one system. Scoped to
   `.pmac-bell`, so the notification list anywhere else is untouched. */
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-panel {
  padding: 6px !important;
  border-radius: 14px !important;
  border: 1px solid #E6EAF0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-group-head {
  padding: 12px 10px 5px !important;
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 10.5px !important; font-weight: 600 !important;
  letter-spacing: .1em !important; text-transform: uppercase !important;
  color: #A2AAB6 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-item {
  gap: 12px !important;
  padding: 9px 10px !important;
  border-radius: 10px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-item:hover {
  background: #F5F7FA !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-item__icon {
  width: 30px !important; height: 30px !important; flex: 0 0 30px !important;
  border-radius: 8px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-item__icon svg {
  width: 15px !important; height: 15px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-item__title {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 13.5px !important; font-weight: 500 !important;
  line-height: 1.35 !important; color: #2C3341 !important;
  margin: 0 0 2px !important; letter-spacing: 0 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-item__sub {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 12px !important; font-weight: 400 !important;
  line-height: 1.45 !important; color: #7A8595 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-item__time {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 11px !important; font-weight: 500 !important; color: #A2AAB6 !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-item__unread-dot {
  width: 6px !important; height: 6px !important; margin-right: 6px !important;
}
body:is(.pm-admin-console,.pm-assistant-console) .pmac-bell .nx-notif-panel-empty {
  font-family: "Nunito", ui-rounded, system-ui, sans-serif !important;
  font-size: 12.5px !important; color: #A2AAB6 !important;
}
